Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

17.06.2014, 13:54

AMD Radeon: Internal Compilation Failure (GLSL)

Hi,
mal wieder habe ich Schwierigkeiten einen GLSL Shader auf meinem Laptop, mit AMD Radeon zum Laufen zu bringen.
Diesmal ist es soga ein interner Compiler Fehler. Hier die Fehlermeldung:

Quellcode

1
2
3
4
Internal compilation failure. Possibly caused by GSA not supporting a GLSL feature used in shader.

ERROR: 0:6: error(#132) Syntax error: ';' parse error
ERROR: error(#273) 1 compilation errors.  No code generated

Ich teste den Shader gerade mit AMDs GPU Shader Analyzer (v.1.59).

Hier der Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#version 330

#define MAX_NUM_IMAGES 2048

struct ImageEntry
{
    vec4 positionSizeLayer;     // xy: Position, z: Size, w: Image Array Layer.
    vec4 color;                 // rgba: Color.
};

layout(std140) uniform vertexParam
{
    mat4 wvpMatrix;
    vec4 basePositionAndSize;   // xy: Base Position, zw: Base Size.
    vec4 baseColor;
};

layout(std140) uniform imageArrayEntries
{
    ImageEntry entries[MAX_NUM_IMAGES];
};

out vec4 vertexColor;
out vec3 vertexTexCoord;

void main()
{
    int id = gl_InstanceID;
    
    /* Extract position, size and layer */
    ImageEntry entry = entries[id];
    
    vec4 posSizeLayer   = entry.positionSizeLayer;
    
    vec2 position       = basePositionAndSize.xy + posSizeLayer.xy;
    vec2 size           = basePositionAndSize.zw * vec2(posSizeLayer.z);
    float layer         = posSizeLayer.w;
    
    /* Compute vertex coordinate */
    vec4 coord = vec4(0.0);
    vec2 texCoord = vec2(0.0);
    
    switch (gl_VertexID)
    {
        case 0:
            coord       = vec4(position.x, position.y, 0.0, 1.0);
            texCoord    = vec2(0.0, 0.0);
            break;
        case 1:
            coord       = vec4(position.x + size.x, position.y, 0.0, 1.0);
            texCoord    = vec2(1.0, 0.0);
            break;
        case 2:
            coord       = vec4(position.x, position.y + size.y, 0.0, 1.0);
            texCoord    = vec2(0.0, 1.0);
            break;
        case 3:
            coord       = vec4(position.x + size.x, position.y + size.y, 0.0, 1.0);
            texCoord    = vec2(1.0, 1.0);
            break;
    }
    
    gl_Position = wvpMatrix * coord;
    
    /* Compute color and texture coordinate */
    vertexColor = baseColor * entry.color;
    
    vertexTexCoord = vec3(texCoord, layer);
}

Mit 2048 "ImageEntry" Elementen sollte der Uniform (bzw. Constant-) Buffer "imageArrayEntries" genau das maximum eines ConstantBuffers haben - nämlich 4096 Vektoren, je 4 mal 32-bit groß.
Aber mit weniger Elementen kommt der selbe Fehler.

GLSL Version ist auf 330 gesetzt, daher verstehe ich nicht, welches Feature hier nicht unterstützt wird.

Kann mir da einer weiter helfen?
Aber bei internen Fehlern ist das wohl eher schwierig schätze ich :|

Aber vielleicht kann mir ja schon mal einer sagen was mit "GSA" (in der Fehlermeldung) gemeint ist.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (17.06.2014, 14:26)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

17.06.2014, 14:20

GSA = GPU ShaderAnalyzer
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

17.06.2014, 14:27

Dass ich da nicht selbst drauf gekommen bin :dash:
Dennoch wundert mich der Fehler sehr, da der Shader nicht wirklich komplex ist oder besonders neue Features verwendet.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

4

17.06.2014, 15:12

"It supports Direct3D (D3D9.0 – D3D11) and OpenGL (GLSL 1.50, arb_fp and arb_vp) shaders."
Steht so auf der Website zum GSA. GLSL 1.50 < 330, insofern liegt da vermutlich schon das Problem?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

17.06.2014, 15:52

Hab grad mal auf "#version 150" umgestellt, was eigentlich gehen sollte, da gl_InstnaceID und gl_VertexID in 1.50 unterstützt werden, aber es kommt der selbe Fehler.
Selbst bei "#version 120" passiert das gleiche, und da sollte er eigenltich melden, dass gl_InstanceID in dieser Version nicht verfügbar ist.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

17.06.2014, 16:42

In 1.2 gibt es noch nichtmal das heutige "in" "out" oder Uniform Buffers. Tatsächlich ist das Problem vermutlich auch nicht direkt das etwas nicht unterstützt wird sondern dass etwas das eigentlich unterstützt werden sollte, buggy ist.

Ich würde erstmal durch teilweises auskommentieren herausfinden, was genau den Fehler verursacht. Das "switch" würde ich außerdem mal in eine kleine Tabelle umformen. Soetwas mag die GPU(performance) und der Shadercompiler in der Regel wesentlich lieber und ist auch noch kompakter. Bestimmte Kontrollkonstrukte können jedenfalls scheinbar auch heute noch viele GLSL-Compiler zum Absturz bringen, auch wenn ich nicht glaube, dass das hier das Problem ist.

HLSL-Quelltext

1
2
3
4
const vec2 Vertices[4] = (vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0));
//... in main ...
texCoord = Vertices[gl_VertexID];
coord = vec4(size * texCoord + position, 0.0, 1.0);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (17.06.2014, 16:48)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

17.06.2014, 20:01

Danke für die Tipps.
Der GSA ist offensichtlich nur für HLSL hilfreich, da - wie bereits erwähnt wurde - nicht mal in, out oder gar uniform buffer unterstützt werden.
In meiner eigenen Anwendung kompiliert der Shader jetzt endlich, nach dem ich die Array Größe reduziert habe.
Vermutlich war das mit 2048 Einträgen dann doch etwas zu groß.
Nur Schade, dass auch da AMDs OpenGL Implementierung keine gescheite Fehlermeldung (via 'glGetShaderInfoLog' etc.) liefert.

Werbeanzeige