Skip to content

Commit b1082c1

Browse files
Merge pull request #1410 from KhronosGroup/fix-1406
GLSL: Support switch more properly in legacy ESSL
2 parents 42096ca + 4d79d63 commit b1082c1

8 files changed

Lines changed: 334 additions & 18 deletions

File tree

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#version 100
2+
precision mediump float;
3+
precision highp int;
4+
5+
varying highp float vIndexF;
6+
7+
void main()
8+
{
9+
int _13 = int(vIndexF);
10+
highp vec4 _65;
11+
highp vec4 _66;
12+
highp vec4 _68;
13+
for (int SPIRV_Cross_Dummy = 0; SPIRV_Cross_Dummy < 1; SPIRV_Cross_Dummy++)
14+
{
15+
if (_13 == 2)
16+
{
17+
_68 = vec4(0.0, 2.0, 3.0, 4.0);
18+
break;
19+
}
20+
else if ((_13 == 4) || (_13 == 5))
21+
{
22+
_68 = vec4(1.0, 2.0, 3.0, 4.0);
23+
break;
24+
}
25+
else if ((_13 == 8) || (_13 == 9))
26+
{
27+
_68 = vec4(40.0, 20.0, 30.0, 40.0);
28+
break;
29+
}
30+
else if (_13 == 10)
31+
{
32+
_65 = vec4(10.0);
33+
highp vec4 _45 = _65 + vec4(1.0);
34+
_66 = _45;
35+
highp vec4 _48 = _66 + vec4(2.0);
36+
_68 = _48;
37+
break;
38+
}
39+
else if (_13 == 11)
40+
{
41+
_65 = vec4(0.0);
42+
highp vec4 _45 = _65 + vec4(1.0);
43+
_66 = _45;
44+
highp vec4 _48 = _66 + vec4(2.0);
45+
_68 = _48;
46+
break;
47+
}
48+
else if (_13 == 12)
49+
{
50+
_66 = vec4(0.0);
51+
highp vec4 _48 = _66 + vec4(2.0);
52+
_68 = _48;
53+
break;
54+
}
55+
else
56+
{
57+
_68 = vec4(10.0, 20.0, 30.0, 40.0);
58+
break;
59+
}
60+
}
61+
highp vec4 _70;
62+
for (int SPIRV_Cross_Dummy = 0; SPIRV_Cross_Dummy < 1; SPIRV_Cross_Dummy++)
63+
{
64+
if ((_13 == 10) || (_13 == 20))
65+
{
66+
_70 = vec4(40.0);
67+
break;
68+
}
69+
else
70+
{
71+
_70 = vec4(20.0);
72+
break;
73+
}
74+
}
75+
gl_FragData[0] = _68 + _70;
76+
}
77+

reference/shaders-hlsl-no-opt/asm/frag/switch-block-case-fallthrough.asm.invalid.frag

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,6 @@ void frag_main()
1717
int j;
1818
int _30;
1919
int _31;
20-
if (vIndex != 0 && vIndex != 1 && vIndex != 11 && vIndex != 2 && vIndex != 3 && vIndex != 4 && vIndex != 5)
21-
{
22-
_30 = 2;
23-
}
24-
if (vIndex == 1 || vIndex == 11)
25-
{
26-
_31 = 1;
27-
}
2820
switch (vIndex)
2921
{
3022
case 0:
@@ -37,6 +29,7 @@ void frag_main()
3729
}
3830
default:
3931
{
32+
_30 = 2;
4033
j = _30;
4134
_31 = 0;
4235
j = _31;
@@ -45,6 +38,7 @@ void frag_main()
4538
case 1:
4639
case 11:
4740
{
41+
_31 = 1;
4842
j = _31;
4943
break;
5044
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#version 100
2+
precision mediump float;
3+
precision highp int;
4+
5+
vec2 _19;
6+
7+
void main()
8+
{
9+
highp vec2 _30;
10+
for (int SPIRV_Cross_Dummy = 0; SPIRV_Cross_Dummy < 1; SPIRV_Cross_Dummy++)
11+
{
12+
if (gl_FragCoord.x != gl_FragCoord.x)
13+
{
14+
_30 = _19;
15+
break;
16+
}
17+
highp vec2 _29 = _19;
18+
_29.y = _19.y;
19+
_30 = _29;
20+
break;
21+
}
22+
gl_FragData[0] = vec4(_30, 1.0, 1.0);
23+
}
24+
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#version 100
2+
precision mediump float;
3+
precision highp int;
4+
5+
varying highp float vIndexF;
6+
7+
void main()
8+
{
9+
int vIndex = int(vIndexF);
10+
highp vec4 v = vec4(0.0);
11+
for (int SPIRV_Cross_Dummy = 0; SPIRV_Cross_Dummy < 1; SPIRV_Cross_Dummy++)
12+
{
13+
if (vIndex == 2)
14+
{
15+
v = vec4(0.0, 2.0, 3.0, 4.0);
16+
break;
17+
}
18+
else if ((vIndex == 4) || (vIndex == 5))
19+
{
20+
v = vec4(1.0, 2.0, 3.0, 4.0);
21+
break;
22+
}
23+
else if ((vIndex == 8) || (vIndex == 9))
24+
{
25+
v = vec4(40.0, 20.0, 30.0, 40.0);
26+
break;
27+
}
28+
else if (vIndex == 10)
29+
{
30+
v = vec4(10.0);
31+
highp vec4 _43 = v;
32+
highp vec4 _44 = vec4(1.0);
33+
highp vec4 _45 = _43 + _44;
34+
v = _45;
35+
highp vec4 _46 = v;
36+
highp vec4 _47 = vec4(2.0);
37+
highp vec4 _48 = _46 + _47;
38+
v = _48;
39+
break;
40+
}
41+
else if (vIndex == 11)
42+
{
43+
highp vec4 _43 = v;
44+
highp vec4 _44 = vec4(1.0);
45+
highp vec4 _45 = _43 + _44;
46+
v = _45;
47+
highp vec4 _46 = v;
48+
highp vec4 _47 = vec4(2.0);
49+
highp vec4 _48 = _46 + _47;
50+
v = _48;
51+
break;
52+
}
53+
else if (vIndex == 12)
54+
{
55+
highp vec4 _46 = v;
56+
highp vec4 _47 = vec4(2.0);
57+
highp vec4 _48 = _46 + _47;
58+
v = _48;
59+
break;
60+
}
61+
else
62+
{
63+
v = vec4(10.0, 20.0, 30.0, 40.0);
64+
break;
65+
}
66+
}
67+
highp vec4 w = vec4(20.0);
68+
for (int SPIRV_Cross_Dummy = 0; SPIRV_Cross_Dummy < 1; SPIRV_Cross_Dummy++)
69+
{
70+
if ((vIndex == 10) || (vIndex == 20))
71+
{
72+
w = vec4(40.0);
73+
break;
74+
}
75+
}
76+
gl_FragData[0] = v + w;
77+
}
78+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
; SPIR-V
2+
; Version: 1.0
3+
; Generator: Khronos Glslang Reference Front End; 7
4+
; Bound: 54
5+
; Schema: 0
6+
OpCapability Shader
7+
%1 = OpExtInstImport "GLSL.std.450"
8+
OpMemoryModel Logical GLSL450
9+
OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
10+
OpExecutionMode %main OriginUpperLeft
11+
OpSource ESSL 310
12+
OpName %main "main"
13+
OpName %gl_FragCoord "gl_FragCoord"
14+
OpName %_GLF_color "_GLF_color"
15+
OpDecorate %gl_FragCoord BuiltIn FragCoord
16+
OpDecorate %_GLF_color Location 0
17+
%void = OpTypeVoid
18+
%3 = OpTypeFunction %void
19+
%int = OpTypeInt 32 1
20+
%int_0 = OpConstant %int 0
21+
%float = OpTypeFloat 32
22+
%v4float = OpTypeVector %float 4
23+
%_ptr_Input_v4float = OpTypePointer Input %v4float
24+
%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
25+
%uint = OpTypeInt 32 0
26+
%uint_0 = OpConstant %uint 0
27+
%_ptr_Input_float = OpTypePointer Input %float
28+
%bool = OpTypeBool
29+
%v2float = OpTypeVector %float 2
30+
%_ptr_Output_v4float = OpTypePointer Output %v4float
31+
%_GLF_color = OpVariable %_ptr_Output_v4float Output
32+
%float_1 = OpConstant %float 1
33+
%52 = OpUndef %v2float
34+
%main = OpFunction %void None %3
35+
%5 = OpLabel
36+
OpSelectionMerge %9 None
37+
OpSwitch %int_0 %8
38+
%8 = OpLabel
39+
%17 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
40+
%18 = OpLoad %float %17
41+
%22 = OpFOrdNotEqual %bool %18 %18
42+
OpSelectionMerge %24 None
43+
OpBranchConditional %22 %23 %24
44+
%23 = OpLabel
45+
OpBranch %9
46+
%24 = OpLabel
47+
%33 = OpCompositeExtract %float %52 1
48+
%51 = OpCompositeInsert %v2float %33 %52 1
49+
OpBranch %9
50+
%9 = OpLabel
51+
%53 = OpPhi %v2float %52 %23 %51 %24
52+
%42 = OpCompositeExtract %float %53 0
53+
%43 = OpCompositeExtract %float %53 1
54+
%48 = OpCompositeConstruct %v4float %42 %43 %float_1 %float_1
55+
OpStore %_GLF_color %48
56+
OpReturn
57+
OpFunctionEnd
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#version 450
2+
3+
layout(location = 0) out vec4 FragColor;
4+
layout(location = 0) in float vIndexF;
5+
6+
void main()
7+
{
8+
int vIndex = int(vIndexF);
9+
vec4 v = vec4(0.0);
10+
switch (vIndex)
11+
{
12+
case 2:
13+
v = vec4(0, 2, 3, 4);
14+
break;
15+
case 4:
16+
case 5:
17+
v = vec4(1, 2, 3, 4);
18+
break;
19+
case 8:
20+
case 9:
21+
v = vec4(40, 20, 30, 40);
22+
break;
23+
case 10:
24+
v = vec4(10.0);
25+
case 11:
26+
v += 1.0;
27+
case 12:
28+
v += 2.0;
29+
break;
30+
default:
31+
v = vec4(10, 20, 30, 40);
32+
break;
33+
}
34+
35+
vec4 w = vec4(20.0);
36+
switch (vIndex)
37+
{
38+
case 10:
39+
case 20:
40+
w = vec4(40.0);
41+
}
42+
FragColor = v + w;
43+
}

0 commit comments

Comments
 (0)