HLSL: Implicit bool conversions for conditional expressions and related.

Covers if(cond), while(cond), do-while(cond), for(;cond;), and (cond ? :).
Fixes #778.
This commit is contained in:
John Kessenich 2017-03-30 22:09:30 -06:00
parent 8f9fdc986a
commit 7e997e2612
12 changed files with 887 additions and 263 deletions

View File

@ -9,7 +9,7 @@ gl_FragCoord origin is upper left
0:11 Test condition and select ( temp void) 0:11 Test condition and select ( temp void)
0:11 Condition 0:11 Condition
0:11 Constant: 0:11 Constant:
0:11 0 (const int) 0:11 false (const bool)
0:11 true case is null 0:11 true case is null
0:2 Function Definition: PixelShaderFunction( ( temp void) 0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters: 0:2 Function Parameters:
@ -36,7 +36,7 @@ gl_FragCoord origin is upper left
0:11 Test condition and select ( temp void) 0:11 Test condition and select ( temp void)
0:11 Condition 0:11 Condition
0:11 Constant: 0:11 Constant:
0:11 0 (const int) 0:11 false (const bool)
0:11 true case is null 0:11 true case is null
0:2 Function Definition: PixelShaderFunction( ( temp void) 0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters: 0:2 Function Parameters:
@ -71,8 +71,8 @@ gl_FragCoord origin is upper left
7: TypeVector 6(float) 4 7: TypeVector 6(float) 4
8: TypePointer Function 7(fvec4) 8: TypePointer Function 7(fvec4)
9: TypeFunction 2 8(ptr) 9: TypeFunction 2 8(ptr)
13: TypeInt 32 1 13: TypeBool
14: 13(int) Constant 0 14: 13(bool) ConstantFalse
18: TypePointer Input 7(fvec4) 18: TypePointer Input 7(fvec4)
19(input): 18(ptr) Variable Input 19(input): 18(ptr) Variable Input
4(PixelShaderFunction): 2 Function None 3 4(PixelShaderFunction): 2 Function None 3

View File

@ -55,7 +55,8 @@ gl_FragCoord origin is upper left
0:12 'a' ( temp int) 0:12 'a' ( temp int)
0:12 Test condition and select ( temp int) 0:12 Test condition and select ( temp int)
0:12 Condition 0:12 Condition
0:12 'b' ( temp int) 0:12 Convert int to bool ( temp bool)
0:12 'b' ( temp int)
0:12 true case 0:12 true case
0:12 move second child to first child ( temp int) 0:12 move second child to first child ( temp int)
0:12 'c' ( temp int) 0:12 'c' ( temp int)
@ -67,7 +68,8 @@ gl_FragCoord origin is upper left
0:12 'b' ( temp int) 0:12 'b' ( temp int)
0:12 Test condition and select ( temp int) 0:12 Test condition and select ( temp int)
0:12 Condition 0:12 Condition
0:12 'a' ( temp int) 0:12 Convert int to bool ( temp bool)
0:12 'a' ( temp int)
0:12 true case 0:12 true case
0:12 move second child to first child ( temp int) 0:12 move second child to first child ( temp int)
0:12 'd' ( temp int) 0:12 'd' ( temp int)
@ -179,7 +181,8 @@ gl_FragCoord origin is upper left
0:12 'a' ( temp int) 0:12 'a' ( temp int)
0:12 Test condition and select ( temp int) 0:12 Test condition and select ( temp int)
0:12 Condition 0:12 Condition
0:12 'b' ( temp int) 0:12 Convert int to bool ( temp bool)
0:12 'b' ( temp int)
0:12 true case 0:12 true case
0:12 move second child to first child ( temp int) 0:12 move second child to first child ( temp int)
0:12 'c' ( temp int) 0:12 'c' ( temp int)
@ -191,7 +194,8 @@ gl_FragCoord origin is upper left
0:12 'b' ( temp int) 0:12 'b' ( temp int)
0:12 Test condition and select ( temp int) 0:12 Test condition and select ( temp int)
0:12 Condition 0:12 Condition
0:12 'a' ( temp int) 0:12 Convert int to bool ( temp bool)
0:12 'a' ( temp int)
0:12 true case 0:12 true case
0:12 move second child to first child ( temp int) 0:12 move second child to first child ( temp int)
0:12 'd' ( temp int) 0:12 'd' ( temp int)
@ -245,12 +249,12 @@ gl_FragCoord origin is upper left
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 100 // Id's are bound by 102
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 93 96 EntryPoint Fragment 4 "PixelShaderFunction" 95 98
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Name 4 "PixelShaderFunction" Name 4 "PixelShaderFunction"
Name 11 "@PixelShaderFunction(vf4;" Name 11 "@PixelShaderFunction(vf4;"
@ -261,13 +265,13 @@ gl_FragCoord origin is upper left
Name 21 "d" Name 21 "d"
Name 22 "ret" Name 22 "ret"
Name 42 "e" Name 42 "e"
Name 59 "f" Name 64 "f"
Name 91 "input"
Name 93 "input" Name 93 "input"
Name 96 "@entryPointOutput" Name 95 "input"
Name 97 "param" Name 98 "@entryPointOutput"
Decorate 93(input) Location 0 Name 99 "param"
Decorate 96(@entryPointOutput) Location 0 Decorate 95(input) Location 0
Decorate 98(@entryPointOutput) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -279,27 +283,27 @@ gl_FragCoord origin is upper left
16: 13(int) Constant 5 16: 13(int) Constant 5
18: 13(int) Constant 6 18: 13(int) Constant 6
20: 13(int) Constant 7 20: 13(int) Constant 7
49: 13(int) Constant 10 45: TypeBool
57: 13(int) Constant 11 46: TypeInt 32 0
61: TypeInt 32 0 47: 46(int) Constant 0
62: 61(int) Constant 0 53: 13(int) Constant 10
63: TypePointer Function 6(float) 62: 13(int) Constant 11
66: 61(int) Constant 1 66: TypePointer Function 6(float)
69: TypeBool 69: 46(int) Constant 1
92: TypePointer Input 7(fvec4) 94: TypePointer Input 7(fvec4)
93(input): 92(ptr) Variable Input 95(input): 94(ptr) Variable Input
95: TypePointer Output 7(fvec4) 97: TypePointer Output 7(fvec4)
96(@entryPointOutput): 95(ptr) Variable Output 98(@entryPointOutput): 97(ptr) Variable Output
4(PixelShaderFunction): 2 Function None 3 4(PixelShaderFunction): 2 Function None 3
5: Label 5: Label
91(input): 8(ptr) Variable Function 93(input): 8(ptr) Variable Function
97(param): 8(ptr) Variable Function 99(param): 8(ptr) Variable Function
94: 7(fvec4) Load 93(input) 96: 7(fvec4) Load 95(input)
Store 91(input) 94 Store 93(input) 96
98: 7(fvec4) Load 91(input) 100: 7(fvec4) Load 93(input)
Store 97(param) 98 Store 99(param) 100
99: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 97(param) 101: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 99(param)
Store 96(@entryPointOutput) 99 Store 98(@entryPointOutput) 101
Return Return
FunctionEnd FunctionEnd
11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9 11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9
@ -312,9 +316,9 @@ gl_FragCoord origin is upper left
22(ret): 8(ptr) Variable Function 22(ret): 8(ptr) Variable Function
42(e): 14(ptr) Variable Function 42(e): 14(ptr) Variable Function
43: 14(ptr) Variable Function 43: 14(ptr) Variable Function
51: 14(ptr) Variable Function 55: 14(ptr) Variable Function
59(f): 8(ptr) Variable Function 64(f): 8(ptr) Variable Function
60: 8(ptr) Variable Function 65: 8(ptr) Variable Function
Store 15(a) 16 Store 15(a) 16
Store 17(b) 18 Store 17(b) 18
Store 19(c) 20 Store 19(c) 20
@ -340,63 +344,65 @@ gl_FragCoord origin is upper left
41: 7(fvec4) FAdd 36 40 41: 7(fvec4) FAdd 36 40
Store 22(ret) 41 Store 22(ret) 41
44: 13(int) Load 17(b) 44: 13(int) Load 17(b)
SelectionMerge 46 None 48: 45(bool) INotEqual 44 47
BranchConditional 44 45 48 SelectionMerge 50 None
45: Label BranchConditional 48 49 52
47: 13(int) Load 21(d) 49: Label
Store 19(c) 47 51: 13(int) Load 21(d)
Store 43 47 Store 19(c) 51
Branch 46 Store 43 51
48: Label Branch 50
Store 43 49 52: Label
Branch 46 Store 43 53
46: Label Branch 50
50: 13(int) Load 43 50: Label
Store 15(a) 50 54: 13(int) Load 43
Store 42(e) 50 Store 15(a) 54
52: 13(int) Load 15(a) Store 42(e) 54
SelectionMerge 54 None 56: 13(int) Load 15(a)
BranchConditional 52 53 56 57: 45(bool) INotEqual 56 47
53: Label SelectionMerge 59 None
55: 13(int) Load 19(c) BranchConditional 57 58 61
Store 21(d) 55 58: Label
Store 51 55 60: 13(int) Load 19(c)
Branch 54 Store 21(d) 60
56: Label Store 55 60
Store 51 57 Branch 59
Branch 54 61: Label
54: Label Store 55 62
58: 13(int) Load 51 Branch 59
Store 17(b) 58 59: Label
64: 63(ptr) AccessChain 22(ret) 62 63: 13(int) Load 55
65: 6(float) Load 64 Store 17(b) 63
67: 63(ptr) AccessChain 10(input) 66 67: 66(ptr) AccessChain 22(ret) 47
68: 6(float) Load 67 68: 6(float) Load 67
70: 69(bool) FOrdLessThan 65 68 70: 66(ptr) AccessChain 10(input) 69
SelectionMerge 72 None 71: 6(float) Load 70
BranchConditional 70 71 77 72: 45(bool) FOrdLessThan 68 71
71: Label SelectionMerge 74 None
73: 13(int) Load 19(c) BranchConditional 72 73 79
74: 6(float) ConvertSToF 73 73: Label
75: 7(fvec4) Load 10(input) 75: 13(int) Load 19(c)
76: 7(fvec4) VectorTimesScalar 75 74 76: 6(float) ConvertSToF 75
Store 60 76 77: 7(fvec4) Load 10(input)
Branch 72 78: 7(fvec4) VectorTimesScalar 77 76
77: Label Store 65 78
78: 13(int) Load 21(d) Branch 74
79: 6(float) ConvertSToF 78 79: Label
80: 7(fvec4) Load 10(input) 80: 13(int) Load 21(d)
81: 7(fvec4) VectorTimesScalar 80 79 81: 6(float) ConvertSToF 80
Store 60 81 82: 7(fvec4) Load 10(input)
Branch 72 83: 7(fvec4) VectorTimesScalar 82 81
72: Label Store 65 83
82: 7(fvec4) Load 60 Branch 74
Store 59(f) 82 74: Label
83: 13(int) Load 42(e) 84: 7(fvec4) Load 65
84: 6(float) ConvertSToF 83 Store 64(f) 84
85: 7(fvec4) Load 22(ret) 85: 13(int) Load 42(e)
86: 7(fvec4) VectorTimesScalar 85 84 86: 6(float) ConvertSToF 85
87: 7(fvec4) Load 59(f) 87: 7(fvec4) Load 22(ret)
88: 7(fvec4) FAdd 86 87 88: 7(fvec4) VectorTimesScalar 87 86
ReturnValue 88 89: 7(fvec4) Load 64(f)
90: 7(fvec4) FAdd 88 89
ReturnValue 90
FunctionEnd FunctionEnd

View File

@ -25,10 +25,11 @@ gl_FragCoord origin is upper left
0:9 2 (const int) 0:9 2 (const int)
0:10 Test condition and select ( temp void) 0:10 Test condition and select ( temp void)
0:10 Condition 0:10 Condition
0:10 direct index ( temp float) 0:10 Convert float to bool ( temp bool)
0:10 'input' ( in 4-component vector of float) 0:10 direct index ( temp float)
0:10 Constant: 0:10 'input' ( in 4-component vector of float)
0:10 0 (const int) 0:10 Constant:
0:10 0 (const int)
0:10 true case 0:10 true case
0:11 Branch: Kill 0:11 Branch: Kill
0:12 Sequence 0:12 Sequence
@ -80,10 +81,11 @@ gl_FragCoord origin is upper left
0:9 2 (const int) 0:9 2 (const int)
0:10 Test condition and select ( temp void) 0:10 Test condition and select ( temp void)
0:10 Condition 0:10 Condition
0:10 direct index ( temp float) 0:10 Convert float to bool ( temp bool)
0:10 'input' ( in 4-component vector of float) 0:10 direct index ( temp float)
0:10 Constant: 0:10 'input' ( in 4-component vector of float)
0:10 0 (const int) 0:10 Constant:
0:10 0 (const int)
0:10 true case 0:10 true case
0:11 Branch: Kill 0:11 Branch: Kill
0:12 Sequence 0:12 Sequence
@ -107,12 +109,12 @@ gl_FragCoord origin is upper left
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 48 // Id's are bound by 50
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 43 EntryPoint Fragment 4 "PixelShaderFunction" 45
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Name 4 "PixelShaderFunction" Name 4 "PixelShaderFunction"
Name 10 "foo(f1;" Name 10 "foo(f1;"
@ -120,11 +122,11 @@ gl_FragCoord origin is upper left
Name 16 "@PixelShaderFunction(vf4;" Name 16 "@PixelShaderFunction(vf4;"
Name 15 "input" Name 15 "input"
Name 25 "param" Name 25 "param"
Name 37 "f" Name 39 "f"
Name 41 "input"
Name 43 "input" Name 43 "input"
Name 45 "param" Name 45 "input"
Decorate 43(input) Location 0 Name 47 "param"
Decorate 45(input) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -138,17 +140,18 @@ gl_FragCoord origin is upper left
26: TypeInt 32 0 26: TypeInt 32 0
27: 26(int) Constant 2 27: 26(int) Constant 2
31: 26(int) Constant 0 31: 26(int) Constant 0
42: TypePointer Input 12(fvec4) 34: 6(float) Constant 0
43(input): 42(ptr) Variable Input 44: TypePointer Input 12(fvec4)
45(input): 44(ptr) Variable Input
4(PixelShaderFunction): 2 Function None 3 4(PixelShaderFunction): 2 Function None 3
5: Label 5: Label
41(input): 13(ptr) Variable Function 43(input): 13(ptr) Variable Function
45(param): 13(ptr) Variable Function 47(param): 13(ptr) Variable Function
44: 12(fvec4) Load 43(input) 46: 12(fvec4) Load 45(input)
Store 41(input) 44 Store 43(input) 46
46: 12(fvec4) Load 41(input) 48: 12(fvec4) Load 43(input)
Store 45(param) 46 Store 47(param) 48
47: 2 FunctionCall 16(@PixelShaderFunction(vf4;) 45(param) 49: 2 FunctionCall 16(@PixelShaderFunction(vf4;) 47(param)
Return Return
FunctionEnd FunctionEnd
10(foo(f1;): 2 Function None 8 10(foo(f1;): 2 Function None 8
@ -167,20 +170,21 @@ gl_FragCoord origin is upper left
15(input): 13(ptr) FunctionParameter 15(input): 13(ptr) FunctionParameter
17: Label 17: Label
25(param): 7(ptr) Variable Function 25(param): 7(ptr) Variable Function
37(f): 7(ptr) Variable Function 39(f): 7(ptr) Variable Function
28: 7(ptr) AccessChain 15(input) 27 28: 7(ptr) AccessChain 15(input) 27
29: 6(float) Load 28 29: 6(float) Load 28
Store 25(param) 29 Store 25(param) 29
30: 2 FunctionCall 10(foo(f1;) 25(param) 30: 2 FunctionCall 10(foo(f1;) 25(param)
32: 7(ptr) AccessChain 15(input) 31 32: 7(ptr) AccessChain 15(input) 31
33: 6(float) Load 32 33: 6(float) Load 32
SelectionMerge 35 None 35: 20(bool) FOrdNotEqual 33 34
BranchConditional 33 34 35 SelectionMerge 37 None
34: Label BranchConditional 35 36 37
36: Label
Kill Kill
35: Label 37: Label
38: 7(ptr) AccessChain 15(input) 31 40: 7(ptr) AccessChain 15(input) 31
39: 6(float) Load 38 41: 6(float) Load 40
Store 37(f) 39 Store 39(f) 41
Kill Kill
FunctionEnd FunctionEnd

View File

@ -69,12 +69,13 @@ gl_FragCoord origin is upper left
0:26 'input' ( in 4-component vector of float) 0:26 'input' ( in 4-component vector of float)
0:30 Test condition and select ( temp void) 0:30 Test condition and select ( temp void)
0:30 Condition 0:30 Condition
0:30 move second child to first child ( temp float) 0:30 Convert float to bool ( temp bool)
0:30 'ii' ( temp float) 0:30 move second child to first child ( temp float)
0:30 direct index ( temp float) 0:30 'ii' ( temp float)
0:30 'input' ( in 4-component vector of float) 0:30 direct index ( temp float)
0:30 Constant: 0:30 'input' ( in 4-component vector of float)
0:30 2 (const int) 0:30 Constant:
0:30 2 (const int)
0:30 true case 0:30 true case
0:31 Pre-Increment ( temp float) 0:31 Pre-Increment ( temp float)
0:31 'ii' ( temp float) 0:31 'ii' ( temp float)
@ -178,12 +179,13 @@ gl_FragCoord origin is upper left
0:26 'input' ( in 4-component vector of float) 0:26 'input' ( in 4-component vector of float)
0:30 Test condition and select ( temp void) 0:30 Test condition and select ( temp void)
0:30 Condition 0:30 Condition
0:30 move second child to first child ( temp float) 0:30 Convert float to bool ( temp bool)
0:30 'ii' ( temp float) 0:30 move second child to first child ( temp float)
0:30 direct index ( temp float) 0:30 'ii' ( temp float)
0:30 'input' ( in 4-component vector of float) 0:30 direct index ( temp float)
0:30 Constant: 0:30 'input' ( in 4-component vector of float)
0:30 2 (const int) 0:30 Constant:
0:30 2 (const int)
0:30 true case 0:30 true case
0:31 Pre-Increment ( temp float) 0:31 Pre-Increment ( temp float)
0:31 'ii' ( temp float) 0:31 'ii' ( temp float)
@ -215,24 +217,24 @@ gl_FragCoord origin is upper left
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 101 // Id's are bound by 103
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 94 97 EntryPoint Fragment 4 "PixelShaderFunction" 96 99
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Name 4 "PixelShaderFunction" Name 4 "PixelShaderFunction"
Name 11 "@PixelShaderFunction(vf4;" Name 11 "@PixelShaderFunction(vf4;"
Name 10 "input" Name 10 "input"
Name 68 "ii" Name 68 "ii"
Name 80 "ii" Name 82 "ii"
Name 92 "input"
Name 94 "input" Name 94 "input"
Name 97 "@entryPointOutput" Name 96 "input"
Name 98 "param" Name 99 "@entryPointOutput"
Decorate 94(input) Location 0 Name 100 "param"
Decorate 97(@entryPointOutput) Location 0 Decorate 96(input) Location 0
Decorate 99(@entryPointOutput) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -244,31 +246,32 @@ gl_FragCoord origin is upper left
67: TypePointer Function 6(float) 67: TypePointer Function 6(float)
69: TypeInt 32 0 69: TypeInt 32 0
70: 69(int) Constant 2 70: 69(int) Constant 2
76: 6(float) Constant 1065353216 73: 6(float) Constant 0
78: TypeInt 32 1 78: 6(float) Constant 1065353216
79: TypePointer Function 78(int) 80: TypeInt 32 1
82: 78(int) Constant 1 81: TypePointer Function 80(int)
93: TypePointer Input 7(fvec4) 84: 80(int) Constant 1
94(input): 93(ptr) Variable Input 95: TypePointer Input 7(fvec4)
96: TypePointer Output 7(fvec4) 96(input): 95(ptr) Variable Input
97(@entryPointOutput): 96(ptr) Variable Output 98: TypePointer Output 7(fvec4)
99(@entryPointOutput): 98(ptr) Variable Output
4(PixelShaderFunction): 2 Function None 3 4(PixelShaderFunction): 2 Function None 3
5: Label 5: Label
92(input): 8(ptr) Variable Function 94(input): 8(ptr) Variable Function
98(param): 8(ptr) Variable Function 100(param): 8(ptr) Variable Function
95: 7(fvec4) Load 94(input) 97: 7(fvec4) Load 96(input)
Store 92(input) 95 Store 94(input) 97
99: 7(fvec4) Load 92(input) 101: 7(fvec4) Load 94(input)
Store 98(param) 99 Store 100(param) 101
100: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 98(param) 102: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 100(param)
Store 97(@entryPointOutput) 100 Store 99(@entryPointOutput) 102
Return Return
FunctionEnd FunctionEnd
11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9 11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9
10(input): 8(ptr) FunctionParameter 10(input): 8(ptr) FunctionParameter
12: Label 12: Label
68(ii): 67(ptr) Variable Function 68(ii): 67(ptr) Variable Function
80(ii): 79(ptr) Variable Function 82(ii): 81(ptr) Variable Function
13: 7(fvec4) Load 10(input) 13: 7(fvec4) Load 10(input)
14: 7(fvec4) Load 10(input) 14: 7(fvec4) Load 10(input)
17: 16(bvec4) FOrdEqual 13 14 17: 16(bvec4) FOrdEqual 13 14
@ -338,28 +341,29 @@ gl_FragCoord origin is upper left
71: 67(ptr) AccessChain 10(input) 70 71: 67(ptr) AccessChain 10(input) 70
72: 6(float) Load 71 72: 6(float) Load 71
Store 68(ii) 72 Store 68(ii) 72
SelectionMerge 74 None 74: 15(bool) FOrdNotEqual 72 73
BranchConditional 72 73 74 SelectionMerge 76 None
73: Label BranchConditional 74 75 76
75: 6(float) Load 68(ii) 75: Label
77: 6(float) FAdd 75 76 77: 6(float) Load 68(ii)
Store 68(ii) 77 79: 6(float) FAdd 77 78
Branch 74 Store 68(ii) 79
74: Label Branch 76
81: 78(int) Load 80(ii) 76: Label
83: 78(int) IAdd 81 82 83: 80(int) Load 82(ii)
Store 80(ii) 83 85: 80(int) IAdd 83 84
84: 78(int) Load 80(ii) Store 82(ii) 85
85: 6(float) ConvertSToF 84 86: 80(int) Load 82(ii)
86: 15(bool) FOrdEqual 85 76 87: 6(float) ConvertSToF 86
SelectionMerge 88 None 88: 15(bool) FOrdEqual 87 78
BranchConditional 86 87 88 SelectionMerge 90 None
87: Label BranchConditional 88 89 90
89: 78(int) Load 80(ii) 89: Label
90: 78(int) IAdd 89 82 91: 80(int) Load 82(ii)
Store 80(ii) 90 92: 80(int) IAdd 91 84
Branch 88 Store 82(ii) 92
88: Label Branch 90
91: 7(fvec4) Undef 90: Label
ReturnValue 91 93: 7(fvec4) Undef
ReturnValue 93
FunctionEnd FunctionEnd

View File

@ -0,0 +1,549 @@
hlsl.implicitBool.frag
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:7 Function Definition: @main( ( temp 4-component vector of float)
0:7 Function Parameters:
0:? Sequence
0:8 Sequence
0:8 move second child to first child ( temp 4-component vector of float)
0:8 'a' ( temp 4-component vector of float)
0:? Constant:
0:? 2.000000
0:? 2.000000
0:? 2.000000
0:? 2.000000
0:9 Test condition and select ( temp void)
0:9 Condition
0:9 Convert int to bool ( temp bool)
0:9 condi: direct index for structure ( uniform int)
0:9 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:9 Constant:
0:9 1 (const uint)
0:9 true case
0:10 Branch: Return with expression
0:10 add ( temp 4-component vector of float)
0:10 'a' ( temp 4-component vector of float)
0:10 Constant:
0:10 1.000000
0:11 Test condition and select ( temp void)
0:11 Condition
0:11 Convert float to bool ( temp bool)
0:11 condf: direct index for structure ( uniform float)
0:11 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:11 Constant:
0:11 0 (const uint)
0:11 true case
0:12 Branch: Return with expression
0:12 add ( temp 4-component vector of float)
0:12 'a' ( temp 4-component vector of float)
0:12 Constant:
0:12 2.000000
0:13 Test condition and select ( temp void)
0:13 Condition
0:13 Convert float to bool ( temp bool)
0:13 condf1: direct index for structure ( uniform 1-component vector of float)
0:13 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:13 Constant:
0:13 2 (const uint)
0:13 true case
0:14 Branch: Return with expression
0:14 add ( temp 4-component vector of float)
0:14 'a' ( temp 4-component vector of float)
0:14 Constant:
0:14 3.000000
0:15 Test condition and select ( temp void)
0:15 Condition
0:15 Convert int to bool ( temp bool)
0:15 condi1: direct index for structure ( uniform 1-component vector of int)
0:15 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:15 Constant:
0:15 3 (const uint)
0:15 true case
0:16 Branch: Return with expression
0:16 add ( temp 4-component vector of float)
0:16 'a' ( temp 4-component vector of float)
0:16 Constant:
0:16 4.000000
0:17 Test condition and select ( temp void)
0:17 Condition
0:17 logical-or ( temp bool)
0:17 logical-and ( temp bool)
0:17 Convert int to bool ( temp bool)
0:17 condi: direct index for structure ( uniform int)
0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:17 Constant:
0:17 1 (const uint)
0:17 Convert int to bool ( temp bool)
0:17 Convert float to int ( temp int)
0:17 condf: direct index for structure ( uniform float)
0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:17 Constant:
0:17 0 (const uint)
0:17 Convert float to bool ( temp bool)
0:17 condf1: direct index for structure ( uniform 1-component vector of float)
0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:17 Constant:
0:17 2 (const uint)
0:17 true case
0:18 Branch: Return with expression
0:18 add ( temp 4-component vector of float)
0:18 'a' ( temp 4-component vector of float)
0:18 Constant:
0:18 5.000000
0:20 Sequence
0:20 move second child to first child ( temp float)
0:20 'f' ( temp float)
0:20 condf: direct index for structure ( uniform float)
0:20 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:20 Constant:
0:20 0 (const uint)
0:21 Loop with condition tested first
0:21 Loop Condition
0:21 Convert float to bool ( temp bool)
0:21 'f' ( temp float)
0:21 Loop Body
0:? Sequence
0:21 Pre-Decrement ( temp float)
0:21 'f' ( temp float)
0:23 Sequence
0:23 move second child to first child ( temp int)
0:23 'i' ( temp int)
0:23 condi: direct index for structure ( uniform int)
0:23 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:23 Constant:
0:23 1 (const uint)
0:24 Loop with condition not tested first
0:24 Loop Condition
0:24 Convert int to bool ( temp bool)
0:24 'i' ( temp int)
0:24 Loop Body
0:24 Pre-Decrement ( temp int)
0:24 'i' ( temp int)
0:? Sequence
0:26 Loop with condition tested first
0:26 Loop Condition
0:26 Convert int to bool ( temp bool)
0:26 'i' ( temp int)
0:26 Loop Body
0:? Sequence
0:26 Pre-Decrement ( temp int)
0:26 'i' ( temp int)
0:28 Sequence
0:28 move second child to first child ( temp float)
0:28 'g' ( temp float)
0:28 Test condition and select ( temp float)
0:28 Condition
0:28 Convert float to bool ( temp bool)
0:28 condf: direct index for structure ( uniform float)
0:28 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:28 Constant:
0:28 0 (const uint)
0:28 true case
0:28 Constant:
0:28 7.000000
0:28 false case
0:28 Constant:
0:28 8.000000
0:29 add second child into first child ( temp 4-component vector of float)
0:29 'a' ( temp 4-component vector of float)
0:29 'g' ( temp float)
0:31 Branch: Return with expression
0:31 subtract ( temp 4-component vector of float)
0:31 'a' ( temp 4-component vector of float)
0:31 Constant:
0:31 1.000000
0:7 Function Definition: main( ( temp void)
0:7 Function Parameters:
0:? Sequence
0:7 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:7 Function Call: @main( ( temp 4-component vector of float)
0:? Linker Objects
0:? 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
Linked fragment stage:
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:7 Function Definition: @main( ( temp 4-component vector of float)
0:7 Function Parameters:
0:? Sequence
0:8 Sequence
0:8 move second child to first child ( temp 4-component vector of float)
0:8 'a' ( temp 4-component vector of float)
0:? Constant:
0:? 2.000000
0:? 2.000000
0:? 2.000000
0:? 2.000000
0:9 Test condition and select ( temp void)
0:9 Condition
0:9 Convert int to bool ( temp bool)
0:9 condi: direct index for structure ( uniform int)
0:9 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:9 Constant:
0:9 1 (const uint)
0:9 true case
0:10 Branch: Return with expression
0:10 add ( temp 4-component vector of float)
0:10 'a' ( temp 4-component vector of float)
0:10 Constant:
0:10 1.000000
0:11 Test condition and select ( temp void)
0:11 Condition
0:11 Convert float to bool ( temp bool)
0:11 condf: direct index for structure ( uniform float)
0:11 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:11 Constant:
0:11 0 (const uint)
0:11 true case
0:12 Branch: Return with expression
0:12 add ( temp 4-component vector of float)
0:12 'a' ( temp 4-component vector of float)
0:12 Constant:
0:12 2.000000
0:13 Test condition and select ( temp void)
0:13 Condition
0:13 Convert float to bool ( temp bool)
0:13 condf1: direct index for structure ( uniform 1-component vector of float)
0:13 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:13 Constant:
0:13 2 (const uint)
0:13 true case
0:14 Branch: Return with expression
0:14 add ( temp 4-component vector of float)
0:14 'a' ( temp 4-component vector of float)
0:14 Constant:
0:14 3.000000
0:15 Test condition and select ( temp void)
0:15 Condition
0:15 Convert int to bool ( temp bool)
0:15 condi1: direct index for structure ( uniform 1-component vector of int)
0:15 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:15 Constant:
0:15 3 (const uint)
0:15 true case
0:16 Branch: Return with expression
0:16 add ( temp 4-component vector of float)
0:16 'a' ( temp 4-component vector of float)
0:16 Constant:
0:16 4.000000
0:17 Test condition and select ( temp void)
0:17 Condition
0:17 logical-or ( temp bool)
0:17 logical-and ( temp bool)
0:17 Convert int to bool ( temp bool)
0:17 condi: direct index for structure ( uniform int)
0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:17 Constant:
0:17 1 (const uint)
0:17 Convert int to bool ( temp bool)
0:17 Convert float to int ( temp int)
0:17 condf: direct index for structure ( uniform float)
0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:17 Constant:
0:17 0 (const uint)
0:17 Convert float to bool ( temp bool)
0:17 condf1: direct index for structure ( uniform 1-component vector of float)
0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:17 Constant:
0:17 2 (const uint)
0:17 true case
0:18 Branch: Return with expression
0:18 add ( temp 4-component vector of float)
0:18 'a' ( temp 4-component vector of float)
0:18 Constant:
0:18 5.000000
0:20 Sequence
0:20 move second child to first child ( temp float)
0:20 'f' ( temp float)
0:20 condf: direct index for structure ( uniform float)
0:20 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:20 Constant:
0:20 0 (const uint)
0:21 Loop with condition tested first
0:21 Loop Condition
0:21 Convert float to bool ( temp bool)
0:21 'f' ( temp float)
0:21 Loop Body
0:? Sequence
0:21 Pre-Decrement ( temp float)
0:21 'f' ( temp float)
0:23 Sequence
0:23 move second child to first child ( temp int)
0:23 'i' ( temp int)
0:23 condi: direct index for structure ( uniform int)
0:23 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:23 Constant:
0:23 1 (const uint)
0:24 Loop with condition not tested first
0:24 Loop Condition
0:24 Convert int to bool ( temp bool)
0:24 'i' ( temp int)
0:24 Loop Body
0:24 Pre-Decrement ( temp int)
0:24 'i' ( temp int)
0:? Sequence
0:26 Loop with condition tested first
0:26 Loop Condition
0:26 Convert int to bool ( temp bool)
0:26 'i' ( temp int)
0:26 Loop Body
0:? Sequence
0:26 Pre-Decrement ( temp int)
0:26 'i' ( temp int)
0:28 Sequence
0:28 move second child to first child ( temp float)
0:28 'g' ( temp float)
0:28 Test condition and select ( temp float)
0:28 Condition
0:28 Convert float to bool ( temp bool)
0:28 condf: direct index for structure ( uniform float)
0:28 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:28 Constant:
0:28 0 (const uint)
0:28 true case
0:28 Constant:
0:28 7.000000
0:28 false case
0:28 Constant:
0:28 8.000000
0:29 add second child into first child ( temp 4-component vector of float)
0:29 'a' ( temp 4-component vector of float)
0:29 'g' ( temp float)
0:31 Branch: Return with expression
0:31 subtract ( temp 4-component vector of float)
0:31 'a' ( temp 4-component vector of float)
0:31 Constant:
0:31 1.000000
0:7 Function Definition: main( ( temp void)
0:7 Function Parameters:
0:? Sequence
0:7 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:7 Function Call: @main( ( temp 4-component vector of float)
0:? Linker Objects
0:? 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1})
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 145
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 143
ExecutionMode 4 OriginUpperLeft
Name 4 "main"
Name 9 "@main("
Name 12 "a"
Name 16 "$Global"
MemberName 16($Global) 0 "condf"
MemberName 16($Global) 1 "condi"
MemberName 16($Global) 2 "condf1"
MemberName 16($Global) 3 "condi1"
Name 18 ""
Name 93 "f"
Name 106 "i"
Name 126 "g"
Name 143 "@entryPointOutput"
MemberDecorate 16($Global) 0 Offset 0
MemberDecorate 16($Global) 1 Offset 4
MemberDecorate 16($Global) 2 Offset 16
MemberDecorate 16($Global) 3 Offset 32
Decorate 16($Global) Block
Decorate 18 DescriptorSet 0
Decorate 143(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeVector 6(float) 4
8: TypeFunction 7(fvec4)
11: TypePointer Function 7(fvec4)
13: 6(float) Constant 1073741824
14: 7(fvec4) ConstantComposite 13 13 13 13
15: TypeInt 32 1
16($Global): TypeStruct 6(float) 15(int) 6(float) 15(int)
17: TypePointer Uniform 16($Global)
18: 17(ptr) Variable Uniform
19: 15(int) Constant 1
20: TypePointer Uniform 15(int)
23: TypeBool
24: TypeInt 32 0
25: 24(int) Constant 0
30: 6(float) Constant 1065353216
34: 15(int) Constant 0
35: TypePointer Uniform 6(float)
38: 6(float) Constant 0
46: 15(int) Constant 2
53: 6(float) Constant 1077936128
57: 15(int) Constant 3
64: 6(float) Constant 1082130432
88: 6(float) Constant 1084227584
92: TypePointer Function 6(float)
105: TypePointer Function 15(int)
130: 6(float) Constant 1088421888
131: 6(float) Constant 1090519040
142: TypePointer Output 7(fvec4)
143(@entryPointOutput): 142(ptr) Variable Output
4(main): 2 Function None 3
5: Label
144: 7(fvec4) FunctionCall 9(@main()
Store 143(@entryPointOutput) 144
Return
FunctionEnd
9(@main(): 7(fvec4) Function None 8
10: Label
12(a): 11(ptr) Variable Function
93(f): 92(ptr) Variable Function
106(i): 105(ptr) Variable Function
126(g): 92(ptr) Variable Function
Store 12(a) 14
21: 20(ptr) AccessChain 18 19
22: 15(int) Load 21
26: 23(bool) INotEqual 22 25
SelectionMerge 28 None
BranchConditional 26 27 28
27: Label
29: 7(fvec4) Load 12(a)
31: 7(fvec4) CompositeConstruct 30 30 30 30
32: 7(fvec4) FAdd 29 31
ReturnValue 32
28: Label
36: 35(ptr) AccessChain 18 34
37: 6(float) Load 36
39: 23(bool) FOrdNotEqual 37 38
SelectionMerge 41 None
BranchConditional 39 40 41
40: Label
42: 7(fvec4) Load 12(a)
43: 7(fvec4) CompositeConstruct 13 13 13 13
44: 7(fvec4) FAdd 42 43
ReturnValue 44
41: Label
47: 35(ptr) AccessChain 18 46
48: 6(float) Load 47
49: 23(bool) FOrdNotEqual 48 38
SelectionMerge 51 None
BranchConditional 49 50 51
50: Label
52: 7(fvec4) Load 12(a)
54: 7(fvec4) CompositeConstruct 53 53 53 53
55: 7(fvec4) FAdd 52 54
ReturnValue 55
51: Label
58: 20(ptr) AccessChain 18 57
59: 15(int) Load 58
60: 23(bool) INotEqual 59 25
SelectionMerge 62 None
BranchConditional 60 61 62
61: Label
63: 7(fvec4) Load 12(a)
65: 7(fvec4) CompositeConstruct 64 64 64 64
66: 7(fvec4) FAdd 63 65
ReturnValue 66
62: Label
68: 20(ptr) AccessChain 18 19
69: 15(int) Load 68
70: 23(bool) INotEqual 69 25
SelectionMerge 72 None
BranchConditional 70 71 72
71: Label
73: 35(ptr) AccessChain 18 34
74: 6(float) Load 73
75: 15(int) ConvertFToS 74
76: 23(bool) INotEqual 75 25
Branch 72
72: Label
77: 23(bool) Phi 70 62 76 71
78: 23(bool) LogicalNot 77
SelectionMerge 80 None
BranchConditional 78 79 80
79: Label
81: 35(ptr) AccessChain 18 46
82: 6(float) Load 81
83: 23(bool) FOrdNotEqual 82 38
Branch 80
80: Label
84: 23(bool) Phi 77 72 83 79
SelectionMerge 86 None
BranchConditional 84 85 86
85: Label
87: 7(fvec4) Load 12(a)
89: 7(fvec4) CompositeConstruct 88 88 88 88
90: 7(fvec4) FAdd 87 89
ReturnValue 90
86: Label
94: 35(ptr) AccessChain 18 34
95: 6(float) Load 94
Store 93(f) 95
Branch 96
96: Label
LoopMerge 98 99 None
Branch 100
100: Label
101: 6(float) Load 93(f)
102: 23(bool) FOrdNotEqual 101 38
BranchConditional 102 97 98
97: Label
103: 6(float) Load 93(f)
104: 6(float) FSub 103 30
Store 93(f) 104
Branch 99
99: Label
Branch 96
98: Label
107: 20(ptr) AccessChain 18 19
108: 15(int) Load 107
Store 106(i) 108
Branch 109
109: Label
LoopMerge 111 112 None
Branch 110
110: Label
113: 15(int) Load 106(i)
114: 15(int) ISub 113 19
Store 106(i) 114
Branch 112
112: Label
115: 15(int) Load 106(i)
116: 23(bool) INotEqual 115 25
BranchConditional 116 109 111
111: Label
Branch 117
117: Label
LoopMerge 119 120 None
Branch 121
121: Label
122: 15(int) Load 106(i)
123: 23(bool) INotEqual 122 25
BranchConditional 123 118 119
118: Label
124: 15(int) Load 106(i)
125: 15(int) ISub 124 19
Store 106(i) 125
Branch 120
120: Label
Branch 117
119: Label
127: 35(ptr) AccessChain 18 34
128: 6(float) Load 127
129: 23(bool) FOrdNotEqual 128 38
132: 6(float) Select 129 130 131
Store 126(g) 132
133: 6(float) Load 126(g)
134: 7(fvec4) Load 12(a)
135: 7(fvec4) CompositeConstruct 133 133 133 133
136: 7(fvec4) FAdd 134 135
Store 12(a) 136
137: 7(fvec4) Load 12(a)
138: 7(fvec4) CompositeConstruct 30 30 30 30
139: 7(fvec4) FSub 137 138
ReturnValue 139
FunctionEnd

View File

@ -31,17 +31,19 @@ gl_FragCoord origin is upper left
0:17 3 (const uint) 0:17 3 (const uint)
0:19 Test condition and select ( temp void) 0:19 Test condition and select ( temp void)
0:19 Condition 0:19 Condition
0:19 ival: direct index for structure ( uniform int) 0:19 Convert int to bool ( temp bool)
0:19 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:19 ival: direct index for structure ( uniform int)
0:19 Constant: 0:19 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4})
0:19 0 (const uint) 0:19 Constant:
0:19 0 (const uint)
0:19 true case is null 0:19 true case is null
0:20 Test condition and select ( temp void) 0:20 Test condition and select ( temp void)
0:20 Condition 0:20 Condition
0:20 fval: direct index for structure ( uniform float) 0:20 Convert float to bool ( temp bool)
0:20 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:20 fval: direct index for structure ( uniform float)
0:20 Constant: 0:20 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4})
0:20 2 (const uint) 0:20 Constant:
0:20 2 (const uint)
0:20 true case is null 0:20 true case is null
0:21 Test condition and select ( temp void) 0:21 Test condition and select ( temp void)
0:21 Condition 0:21 Condition
@ -123,17 +125,19 @@ gl_FragCoord origin is upper left
0:17 3 (const uint) 0:17 3 (const uint)
0:19 Test condition and select ( temp void) 0:19 Test condition and select ( temp void)
0:19 Condition 0:19 Condition
0:19 ival: direct index for structure ( uniform int) 0:19 Convert int to bool ( temp bool)
0:19 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:19 ival: direct index for structure ( uniform int)
0:19 Constant: 0:19 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4})
0:19 0 (const uint) 0:19 Constant:
0:19 0 (const uint)
0:19 true case is null 0:19 true case is null
0:20 Test condition and select ( temp void) 0:20 Test condition and select ( temp void)
0:20 Condition 0:20 Condition
0:20 fval: direct index for structure ( uniform float) 0:20 Convert float to bool ( temp bool)
0:20 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:20 fval: direct index for structure ( uniform float)
0:20 Constant: 0:20 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4})
0:20 2 (const uint) 0:20 Constant:
0:20 2 (const uint)
0:20 true case is null 0:20 true case is null
0:21 Test condition and select ( temp void) 0:21 Test condition and select ( temp void)
0:21 Condition 0:21 Condition
@ -181,12 +185,12 @@ gl_FragCoord origin is upper left
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 82 // Id's are bound by 84
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 79 EntryPoint Fragment 4 "main" 81
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Name 4 "main" Name 4 "main"
Name 8 "PS_OUTPUT" Name 8 "PS_OUTPUT"
@ -198,15 +202,15 @@ gl_FragCoord origin is upper left
MemberName 14($Global) 2 "fval" MemberName 14($Global) 2 "fval"
MemberName 14($Global) 3 "fval4" MemberName 14($Global) 3 "fval4"
Name 16 "" Name 16 ""
Name 70 "psout" Name 72 "psout"
Name 79 "Color" Name 81 "Color"
MemberDecorate 14($Global) 0 Offset 0 MemberDecorate 14($Global) 0 Offset 0
MemberDecorate 14($Global) 1 Offset 16 MemberDecorate 14($Global) 1 Offset 16
MemberDecorate 14($Global) 2 Offset 32 MemberDecorate 14($Global) 2 Offset 32
MemberDecorate 14($Global) 3 Offset 48 MemberDecorate 14($Global) 3 Offset 48
Decorate 14($Global) Block Decorate 14($Global) Block
Decorate 16 DescriptorSet 0 Decorate 16 DescriptorSet 0
Decorate 79(Color) Location 0 Decorate 81(Color) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -234,22 +238,22 @@ gl_FragCoord origin is upper left
42: 12(int) Constant 3 42: 12(int) Constant 3
43: TypePointer Uniform 7(fvec4) 43: TypePointer Uniform 7(fvec4)
46: 7(fvec4) ConstantComposite 39 39 39 39 46: 7(fvec4) ConstantComposite 39 39 39 39
69: TypePointer Function 8(PS_OUTPUT) 71: TypePointer Function 8(PS_OUTPUT)
71: 6(float) Constant 1065353216 73: 6(float) Constant 1065353216
72: 7(fvec4) ConstantComposite 71 71 71 71 74: 7(fvec4) ConstantComposite 73 73 73 73
73: TypePointer Function 7(fvec4) 75: TypePointer Function 7(fvec4)
78: TypePointer Output 7(fvec4) 80: TypePointer Output 7(fvec4)
79(Color): 78(ptr) Variable Output 81(Color): 80(ptr) Variable Output
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
80:8(PS_OUTPUT) FunctionCall 10(@main() 82:8(PS_OUTPUT) FunctionCall 10(@main()
81: 7(fvec4) CompositeExtract 80 0 83: 7(fvec4) CompositeExtract 82 0
Store 79(Color) 81 Store 81(Color) 83
Return Return
FunctionEnd FunctionEnd
10(@main():8(PS_OUTPUT) Function None 9 10(@main():8(PS_OUTPUT) Function None 9
11: Label 11: Label
70(psout): 69(ptr) Variable Function 72(psout): 71(ptr) Variable Function
19: 18(ptr) AccessChain 16 17 19: 18(ptr) AccessChain 16 17
20: 12(int) Load 19 20: 12(int) Load 19
24: 21(bool) INotEqual 20 23 24: 21(bool) INotEqual 20 23
@ -268,38 +272,40 @@ gl_FragCoord origin is upper left
48: 30(bvec4) LogicalNot 47 48: 30(bvec4) LogicalNot 47
49: 18(ptr) AccessChain 16 17 49: 18(ptr) AccessChain 16 17
50: 12(int) Load 49 50: 12(int) Load 49
SelectionMerge 52 None 51: 21(bool) INotEqual 50 23
BranchConditional 50 51 52 SelectionMerge 53 None
51: Label BranchConditional 51 52 53
Branch 52 52: Label
52: Label Branch 53
53: 36(ptr) AccessChain 16 35 53: Label
54: 6(float) Load 53 54: 36(ptr) AccessChain 16 35
SelectionMerge 56 None 55: 6(float) Load 54
BranchConditional 54 55 56 56: 21(bool) FOrdNotEqual 55 39
55: Label SelectionMerge 58 None
Branch 56 BranchConditional 56 57 58
56: Label 57: Label
57: 18(ptr) AccessChain 16 17 Branch 58
58: 12(int) Load 57 58: Label
59: 21(bool) INotEqual 58 23 59: 18(ptr) AccessChain 16 17
60: 21(bool) LogicalNot 59 60: 12(int) Load 59
SelectionMerge 62 None 61: 21(bool) INotEqual 60 23
BranchConditional 60 61 62 62: 21(bool) LogicalNot 61
61: Label SelectionMerge 64 None
Branch 62 BranchConditional 62 63 64
62: Label 63: Label
63: 36(ptr) AccessChain 16 35 Branch 64
64: 6(float) Load 63 64: Label
65: 21(bool) FOrdNotEqual 64 39 65: 36(ptr) AccessChain 16 35
66: 21(bool) LogicalNot 65 66: 6(float) Load 65
SelectionMerge 68 None 67: 21(bool) FOrdNotEqual 66 39
BranchConditional 66 67 68 68: 21(bool) LogicalNot 67
67: Label SelectionMerge 70 None
Branch 68 BranchConditional 68 69 70
68: Label 69: Label
74: 73(ptr) AccessChain 70(psout) 17 Branch 70
Store 74 72 70: Label
75:8(PS_OUTPUT) Load 70(psout) 76: 75(ptr) AccessChain 72(psout) 17
ReturnValue 75 Store 76 74
77:8(PS_OUTPUT) Load 72(psout)
ReturnValue 77
FunctionEnd FunctionEnd

32
Test/hlsl.implicitBool.frag Executable file
View File

@ -0,0 +1,32 @@
float condf;
int condi;
float1 condf1;
int1 condi1;
float4 main() : SV_Target0
{
float4 a = float4(2.0, 2.0, 2.0, 2.0);
if (condi)
return a + 1.0;
if (condf)
return a + 2.0;
if (condf1)
return a + 3.0;
if (condi1)
return a + 4.0;
if (condi && condf || condf1)
return a + 5.0;
float f = condf;
while (f) { --f; }
int i = condi;
do { --i; } while (i);
for (; i; ) { --i; }
float g = condf ? 7.0 : 8.0;
a += g;
return a - 1.0;
}

View File

@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run). // For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "Overload400-PrecQual.1946" #define GLSLANG_REVISION "Overload400-PrecQual.1947"
#define GLSLANG_DATE "30-Mar-2017" #define GLSLANG_DATE "30-Mar-2017"

View File

@ -127,6 +127,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.hull.void.tesc", "main"}, {"hlsl.hull.void.tesc", "main"},
{"hlsl.identifier.sample.frag", "main"}, {"hlsl.identifier.sample.frag", "main"},
{"hlsl.if.frag", "PixelShaderFunction"}, {"hlsl.if.frag", "PixelShaderFunction"},
{"hlsl.implicitBool.frag", "main"},
{"hlsl.inoutquals.frag", "main"}, {"hlsl.inoutquals.frag", "main"},
{"hlsl.init.frag", "ShaderFunction"}, {"hlsl.init.frag", "ShaderFunction"},
{"hlsl.init2.frag", "main"}, {"hlsl.init2.frag", "main"},

View File

@ -2527,6 +2527,10 @@ bool HlslGrammar::acceptConditionalExpression(TIntermTyped*& node)
if (! acceptTokenClass(EHTokQuestion)) if (! acceptTokenClass(EHTokQuestion))
return true; return true;
node = parseContext.convertConditionalExpression(token.loc, node);
if (node == nullptr)
return false;
TIntermTyped* trueNode = nullptr; TIntermTyped* trueNode = nullptr;
if (! acceptExpression(trueNode)) { if (! acceptExpression(trueNode)) {
expected("expression after ?"); expected("expression after ?");
@ -3197,6 +3201,9 @@ bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement)
TIntermTyped* condition; TIntermTyped* condition;
if (! acceptParenExpression(condition)) if (! acceptParenExpression(condition))
return false; return false;
condition = parseContext.convertConditionalExpression(loc, condition);
if (condition == nullptr)
return false;
// create the child statements // create the child statements
TIntermNodePair thenElse = { nullptr, nullptr }; TIntermNodePair thenElse = { nullptr, nullptr };
@ -3280,6 +3287,9 @@ bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement)
// LEFT_PAREN condition RIGHT_PAREN // LEFT_PAREN condition RIGHT_PAREN
if (! acceptParenExpression(condition)) if (! acceptParenExpression(condition))
return false; return false;
condition = parseContext.convertConditionalExpression(loc, condition);
if (condition == nullptr)
return false;
// statement // statement
if (! acceptScopedStatement(statement)) { if (! acceptScopedStatement(statement)) {
@ -3319,6 +3329,9 @@ bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement)
TIntermTyped* condition; TIntermTyped* condition;
if (! acceptParenExpression(condition)) if (! acceptParenExpression(condition))
return false; return false;
condition = parseContext.convertConditionalExpression(loc, condition);
if (condition == nullptr)
return false;
if (! acceptTokenClass(EHTokSemicolon)) if (! acceptTokenClass(EHTokSemicolon))
expected(";"); expected(";");
@ -3356,6 +3369,11 @@ bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement)
acceptExpression(condition); acceptExpression(condition);
if (! acceptTokenClass(EHTokSemicolon)) if (! acceptTokenClass(EHTokSemicolon))
expected(";"); expected(";");
if (condition != nullptr) {
condition = parseContext.convertConditionalExpression(loc, condition);
if (condition == nullptr)
return false;
}
// iterator SEMI_COLON // iterator SEMI_COLON
TIntermTyped* iterator = nullptr; TIntermTyped* iterator = nullptr;

View File

@ -4285,6 +4285,18 @@ void HlslParseContext::handleRegister(const TSourceLoc& loc, TQualifier& qualifi
} }
} }
// Convert to a scalar boolean, or if not allowed by HLSL semantics,
// report an error and return nullptr.
TIntermTyped* HlslParseContext::convertConditionalExpression(const TSourceLoc& loc, TIntermTyped* condition)
{
if (!condition->getType().isScalarOrVec1()) {
error(loc, "requires a scalar", "conditional expression", "");
return nullptr;
}
return intermediate.addConversion(EOpConstructBool, TType(EbtBool), condition);
}
// //
// Same error message for all places assignments don't work. // Same error message for all places assignments don't work.
// //
@ -4607,13 +4619,6 @@ bool HlslParseContext::voidErrorCheck(const TSourceLoc& loc, const TString& iden
return false; return false;
} }
// Checks to see if the node (for the expression) contains a scalar boolean expression or not
void HlslParseContext::boolCheck(const TSourceLoc& loc, const TIntermTyped* type)
{
if (type->getBasicType() != EbtBool || type->isArray() || type->isMatrix() || type->isVector())
error(loc, "boolean expression expected", "", "");
}
// //
// Fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level. // Fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level.
// //

View File

@ -101,7 +101,7 @@ public:
const glslang::TString* component); const glslang::TString* component);
void handleRegister(const TSourceLoc&, TQualifier&, const glslang::TString* profile, const glslang::TString& desc, void handleRegister(const TSourceLoc&, TQualifier&, const glslang::TString* profile, const glslang::TString& desc,
int subComponent, const glslang::TString*); int subComponent, const glslang::TString*);
TIntermTyped* convertConditionalExpression(const TSourceLoc&, TIntermTyped*);
TIntermAggregate* handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex, TIntermTyped* argSampler); TIntermAggregate* handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex, TIntermTyped* argSampler);
bool parseMatrixSwizzleSelector(const TSourceLoc&, const TString&, int cols, int rows, TSwizzleSelectors<TMatrixSelector>&); bool parseMatrixSwizzleSelector(const TSourceLoc&, const TString&, int cols, int rows, TSwizzleSelectors<TMatrixSelector>&);
@ -120,7 +120,6 @@ public:
void structArrayCheck(const TSourceLoc&, const TType& structure); void structArrayCheck(const TSourceLoc&, const TType& structure);
void arrayDimMerge(TType& type, const TArraySizes* sizes); void arrayDimMerge(TType& type, const TArraySizes* sizes);
bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType); bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType);
void boolCheck(const TSourceLoc&, const TIntermTyped*);
void globalQualifierFix(const TSourceLoc&, TQualifier&); void globalQualifierFix(const TSourceLoc&, TQualifier&);
bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType); bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
void mergeQualifiers(TQualifier& dst, const TQualifier& src); void mergeQualifiers(TQualifier& dst, const TQualifier& src);