SPV: Emit OpSelect when a selection node is simple enough.

Also, ensures it has a type, no disallowed side effects,
or performance trade offs.
This commit is contained in:
John Kessenich 2017-01-26 20:31:11 -07:00
parent 509177d136
commit 433e9ff896
6 changed files with 321 additions and 322 deletions

View File

@ -1748,42 +1748,94 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
}
}
// This path handles both if-then-else and ?:
// The if-then-else has a node type of void, while
// ?: has either a void or a non-void node type
//
// Leaving the result, when not void:
// GLSL only has r-values as the result of a :?, but
// if we have an l-value, that can be more efficient if it will
// become the base of a complex r-value expression, because the
// next layer copies r-values into memory to use the access-chain mechanism
bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node)
{
// This path handles both if-then-else and ?:
// The if-then-else has a node type of void, while
// ?: has a non-void node type
spv::Id result = 0;
if (node->getBasicType() != glslang::EbtVoid) {
// don't handle this as just on-the-fly temporaries, because there will be two names
// and better to leave SSA to later passes
result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
// See if it simple and safe to generate OpSelect instead of using control flow.
// Crucially, side effects must be avoided, and there are performance trade-offs.
// Return true if good idea (and safe) for OpSelect, false otherwise.
const auto selectPolicy = [&]() -> bool {
if (node->getBasicType() == glslang::EbtVoid)
return false;
if (node->getTrueBlock() == nullptr ||
node->getFalseBlock() == nullptr)
return false;
assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() &&
node->getType() == node->getFalseBlock()->getAsTyped()->getType());
// return true if a single operand to ? : is okay for OpSelect
const auto operandOkay = [](glslang::TIntermTyped* node) {
return node->getAsSymbolNode() || node->getAsConstantUnion();
};
return operandOkay(node->getTrueBlock() ->getAsTyped()) &&
operandOkay(node->getFalseBlock()->getAsTyped());
};
// Emit OpSelect for this selection.
const auto handleAsOpSelect = [&]() {
node->getCondition()->traverse(this);
spv::Id condition = accessChainLoad(node->getCondition()->getType());
node->getTrueBlock()->traverse(this);
spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
node->getFalseBlock()->traverse(this);
spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
spv::Id select = builder.createTriOp(spv::OpSelect, convertGlslangToSpvType(node->getType()), condition, trueValue, falseValue);
builder.clearAccessChain();
builder.setAccessChainRValue(select);
};
// Try for OpSelect
if (selectPolicy()) {
handleAsOpSelect();
return false;
}
// Instead, emit control flow...
// Don't handle results as temporaries, because there will be two names
// and better to leave SSA to later passes.
spv::Id result = (node->getBasicType() == glslang::EbtVoid)
? spv::NoResult
: builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
// emit the condition before doing anything with selection
node->getCondition()->traverse(this);
// make an "if" based on the value created by the condition
spv::Builder::If ifBuilder(accessChainLoad(node->getCondition()->getType()), builder);
if (node->getTrueBlock()) {
// emit the "then" statement
// emit the "then" statement
if (node->getTrueBlock() != nullptr) {
node->getTrueBlock()->traverse(this);
if (result)
builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result);
if (result != spv::NoResult)
builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result);
}
if (node->getFalseBlock()) {
if (node->getFalseBlock() != nullptr) {
ifBuilder.makeBeginElse();
// emit the "else" statement
node->getFalseBlock()->traverse(this);
if (result)
if (result != spv::NoResult)
builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result);
}
// finish off the control flow
ifBuilder.makeEndIf();
if (result) {
if (result != spv::NoResult) {
// GLSL only has r-values as the result of a :?, but
// if we have an l-value, that can be more efficient if it will
// become the base of a complex r-value expression, because the

View File

@ -1,7 +1,7 @@
spv.140.frag
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 101
// Id's are bound by 96
Capability Shader
Capability ClipDistance
@ -10,168 +10,157 @@ spv.140.frag
Capability ImageQuery
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 16 28 33 43
EntryPoint Fragment 4 "main" 14 23 28 38
ExecutionMode 4 OriginUpperLeft
Source GLSL 140
Name 4 "main"
Name 8 "foo("
Name 11 "i1"
Name 16 "gl_FrontFacing"
Name 24 "i2"
Name 28 "o"
Name 33 "gl_ClipDistance"
Name 43 "k"
Name 55 "sampR"
Name 63 "sampB"
Name 87 "samp2Da"
Name 92 "bn"
MemberName 92(bn) 0 "matra"
MemberName 92(bn) 1 "matca"
MemberName 92(bn) 2 "matr"
MemberName 92(bn) 3 "matc"
MemberName 92(bn) 4 "matrdef"
Name 94 ""
Name 97 "bi"
MemberName 97(bi) 0 "v"
Name 100 "bname"
Decorate 16(gl_FrontFacing) BuiltIn FrontFacing
Decorate 33(gl_ClipDistance) BuiltIn ClipDistance
Decorate 55(sampR) DescriptorSet 0
Decorate 63(sampB) DescriptorSet 0
Decorate 87(samp2Da) DescriptorSet 0
Decorate 90 ArrayStride 64
Decorate 91 ArrayStride 64
MemberDecorate 92(bn) 0 RowMajor
MemberDecorate 92(bn) 0 Offset 0
MemberDecorate 92(bn) 0 MatrixStride 16
MemberDecorate 92(bn) 1 ColMajor
MemberDecorate 92(bn) 1 Offset 256
MemberDecorate 92(bn) 1 MatrixStride 16
MemberDecorate 92(bn) 2 RowMajor
MemberDecorate 92(bn) 2 Offset 512
MemberDecorate 92(bn) 2 MatrixStride 16
MemberDecorate 92(bn) 3 ColMajor
MemberDecorate 92(bn) 3 Offset 576
MemberDecorate 92(bn) 3 MatrixStride 16
MemberDecorate 92(bn) 4 RowMajor
MemberDecorate 92(bn) 4 Offset 640
MemberDecorate 92(bn) 4 MatrixStride 16
Decorate 92(bn) Block
Decorate 94 DescriptorSet 0
Decorate 96 ArrayStride 16
MemberDecorate 97(bi) 0 Offset 0
Decorate 97(bi) Block
Decorate 100(bname) DescriptorSet 0
Name 14 "gl_FrontFacing"
Name 19 "i2"
Name 23 "o"
Name 28 "gl_ClipDistance"
Name 38 "k"
Name 50 "sampR"
Name 58 "sampB"
Name 82 "samp2Da"
Name 87 "bn"
MemberName 87(bn) 0 "matra"
MemberName 87(bn) 1 "matca"
MemberName 87(bn) 2 "matr"
MemberName 87(bn) 3 "matc"
MemberName 87(bn) 4 "matrdef"
Name 89 ""
Name 92 "bi"
MemberName 92(bi) 0 "v"
Name 95 "bname"
Decorate 14(gl_FrontFacing) BuiltIn FrontFacing
Decorate 28(gl_ClipDistance) BuiltIn ClipDistance
Decorate 50(sampR) DescriptorSet 0
Decorate 58(sampB) DescriptorSet 0
Decorate 82(samp2Da) DescriptorSet 0
Decorate 85 ArrayStride 64
Decorate 86 ArrayStride 64
MemberDecorate 87(bn) 0 RowMajor
MemberDecorate 87(bn) 0 Offset 0
MemberDecorate 87(bn) 0 MatrixStride 16
MemberDecorate 87(bn) 1 ColMajor
MemberDecorate 87(bn) 1 Offset 256
MemberDecorate 87(bn) 1 MatrixStride 16
MemberDecorate 87(bn) 2 RowMajor
MemberDecorate 87(bn) 2 Offset 512
MemberDecorate 87(bn) 2 MatrixStride 16
MemberDecorate 87(bn) 3 ColMajor
MemberDecorate 87(bn) 3 Offset 576
MemberDecorate 87(bn) 3 MatrixStride 16
MemberDecorate 87(bn) 4 RowMajor
MemberDecorate 87(bn) 4 Offset 640
MemberDecorate 87(bn) 4 MatrixStride 16
Decorate 87(bn) Block
Decorate 89 DescriptorSet 0
Decorate 91 ArrayStride 16
MemberDecorate 92(bi) 0 Offset 0
Decorate 92(bi) Block
Decorate 95(bname) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeFunction 6(float)
10: TypePointer Private 6(float)
11(i1): 10(ptr) Variable Private
12: TypePointer Function 6(float)
14: TypeBool
15: TypePointer Input 14(bool)
16(gl_FrontFacing): 15(ptr) Variable Input
20: 6(float) Constant 3221225472
22: 6(float) Constant 1073741824
24(i2): 10(ptr) Variable Private
25: 6(float) Constant 1120665600
26: TypeVector 6(float) 4
27: TypePointer Output 26(fvec4)
28(o): 27(ptr) Variable Output
29: TypeInt 32 0
30: 29(int) Constant 5
31: TypeArray 6(float) 30
32: TypePointer Input 31
33(gl_ClipDistance): 32(ptr) Variable Input
34: TypeInt 32 1
35: 34(int) Constant 2
36: TypePointer Input 6(float)
39: 29(int) Constant 1
40: TypePointer Output 6(float)
42: TypePointer Input 26(fvec4)
43(k): 42(ptr) Variable Input
45: TypeVector 34(int) 4
50: 29(int) Constant 2
52: TypeImage 6(float) Rect sampled format:Unknown
53: TypeSampledImage 52
54: TypePointer UniformConstant 53
55(sampR): 54(ptr) Variable UniformConstant
58: TypeVector 34(int) 2
60: TypeImage 34(int) Buffer sampled format:Unknown
61: TypeSampledImage 60
62: TypePointer UniformConstant 61
63(sampB): 62(ptr) Variable UniformConstant
69: TypeVector 6(float) 2
72: 6(float) Constant 1120403456
74: 29(int) Constant 3
83: TypeImage 6(float) 2D sampled format:Unknown
84: TypeSampledImage 83
85: TypeArray 84 74
86: TypePointer UniformConstant 85
87(samp2Da): 86(ptr) Variable UniformConstant
88: TypeMatrix 26(fvec4) 4
89: 29(int) Constant 4
90: TypeArray 88 89
91: TypeArray 88 89
92(bn): TypeStruct 90 91 88 88 88
93: TypePointer Uniform 92(bn)
94: 93(ptr) Variable Uniform
95: TypeVector 6(float) 3
96: TypeArray 95(fvec3) 50
97(bi): TypeStruct 96
98: TypeArray 97(bi) 89
99: TypePointer Uniform 98
100(bname): 99(ptr) Variable Uniform
12: TypeBool
13: TypePointer Input 12(bool)
14(gl_FrontFacing): 13(ptr) Variable Input
16: 6(float) Constant 3221225472
17: 6(float) Constant 1073741824
19(i2): 10(ptr) Variable Private
20: 6(float) Constant 1120665600
21: TypeVector 6(float) 4
22: TypePointer Output 21(fvec4)
23(o): 22(ptr) Variable Output
24: TypeInt 32 0
25: 24(int) Constant 5
26: TypeArray 6(float) 25
27: TypePointer Input 26
28(gl_ClipDistance): 27(ptr) Variable Input
29: TypeInt 32 1
30: 29(int) Constant 2
31: TypePointer Input 6(float)
34: 24(int) Constant 1
35: TypePointer Output 6(float)
37: TypePointer Input 21(fvec4)
38(k): 37(ptr) Variable Input
40: TypeVector 29(int) 4
45: 24(int) Constant 2
47: TypeImage 6(float) Rect sampled format:Unknown
48: TypeSampledImage 47
49: TypePointer UniformConstant 48
50(sampR): 49(ptr) Variable UniformConstant
53: TypeVector 29(int) 2
55: TypeImage 29(int) Buffer sampled format:Unknown
56: TypeSampledImage 55
57: TypePointer UniformConstant 56
58(sampB): 57(ptr) Variable UniformConstant
64: TypeVector 6(float) 2
67: 6(float) Constant 1120403456
69: 24(int) Constant 3
78: TypeImage 6(float) 2D sampled format:Unknown
79: TypeSampledImage 78
80: TypeArray 79 69
81: TypePointer UniformConstant 80
82(samp2Da): 81(ptr) Variable UniformConstant
83: TypeMatrix 21(fvec4) 4
84: 24(int) Constant 4
85: TypeArray 83 84
86: TypeArray 83 84
87(bn): TypeStruct 85 86 83 83 83
88: TypePointer Uniform 87(bn)
89: 88(ptr) Variable Uniform
90: TypeVector 6(float) 3
91: TypeArray 90(fvec3) 45
92(bi): TypeStruct 91
93: TypeArray 92(bi) 84
94: TypePointer Uniform 93
95(bname): 94(ptr) Variable Uniform
4(main): 2 Function None 3
5: Label
13: 12(ptr) Variable Function
17: 14(bool) Load 16(gl_FrontFacing)
SelectionMerge 19 None
BranchConditional 17 18 21
18: Label
Store 13 20
Branch 19
21: Label
Store 13 22
Branch 19
19: Label
23: 6(float) Load 13
Store 11(i1) 23
Store 24(i2) 25
37: 36(ptr) AccessChain 33(gl_ClipDistance) 35
38: 6(float) Load 37
41: 40(ptr) AccessChain 28(o) 39
Store 41 38
44: 26(fvec4) Load 43(k)
46: 45(ivec4) ConvertFToS 44
47: 34(int) CompositeExtract 46 0
48: 36(ptr) AccessChain 33(gl_ClipDistance) 47
49: 6(float) Load 48
51: 40(ptr) AccessChain 28(o) 50
Store 51 49
56: 53 Load 55(sampR)
57: 52 Image 56
59: 58(ivec2) ImageQuerySize 57
64: 61 Load 63(sampB)
65: 60 Image 64
66: 34(int) ImageQuerySize 65
67: 58(ivec2) CompositeConstruct 66 66
68: 58(ivec2) IAdd 59 67
70: 69(fvec2) ConvertSToF 68
71: 6(float) CompositeExtract 70 0
73: 6(float) FDiv 71 72
75: 40(ptr) AccessChain 28(o) 74
Store 75 73
76: 6(float) FunctionCall 8(foo()
77: 40(ptr) AccessChain 28(o) 50
Store 77 76
15: 12(bool) Load 14(gl_FrontFacing)
18: 6(float) Select 15 16 17
Store 11(i1) 18
Store 19(i2) 20
32: 31(ptr) AccessChain 28(gl_ClipDistance) 30
33: 6(float) Load 32
36: 35(ptr) AccessChain 23(o) 34
Store 36 33
39: 21(fvec4) Load 38(k)
41: 40(ivec4) ConvertFToS 39
42: 29(int) CompositeExtract 41 0
43: 31(ptr) AccessChain 28(gl_ClipDistance) 42
44: 6(float) Load 43
46: 35(ptr) AccessChain 23(o) 45
Store 46 44
51: 48 Load 50(sampR)
52: 47 Image 51
54: 53(ivec2) ImageQuerySize 52
59: 56 Load 58(sampB)
60: 55 Image 59
61: 29(int) ImageQuerySize 60
62: 53(ivec2) CompositeConstruct 61 61
63: 53(ivec2) IAdd 54 62
65: 64(fvec2) ConvertSToF 63
66: 6(float) CompositeExtract 65 0
68: 6(float) FDiv 66 67
70: 35(ptr) AccessChain 23(o) 69
Store 70 68
71: 6(float) FunctionCall 8(foo()
72: 35(ptr) AccessChain 23(o) 45
Store 72 71
Return
FunctionEnd
8(foo(): 6(float) Function None 7
9: Label
78: 6(float) Load 11(i1)
79: 6(float) Load 24(i2)
80: 6(float) FAdd 78 79
ReturnValue 80
73: 6(float) Load 11(i1)
74: 6(float) Load 19(i2)
75: 6(float) FAdd 73 74
ReturnValue 75
FunctionEnd

View File

@ -3,7 +3,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 49
// Id's are bound by 44
Capability Shader
1: ExtInstImport "GLSL.std.450"
@ -19,18 +19,18 @@ Warning, version 450 is not yet complete; most version-specific features are pre
MemberName 22(gl_PerVertex) 2 "gl_ClipDistance"
MemberName 22(gl_PerVertex) 3 "gl_CullDistance"
Name 24 ""
Name 29 "ubname"
MemberName 29(ubname) 0 "b"
Name 31 "ubinst"
Name 32 "param"
Name 27 "ubname"
MemberName 27(ubname) 0 "b"
Name 29 "ubinst"
Name 30 "param"
MemberDecorate 22(gl_PerVertex) 0 BuiltIn Position
MemberDecorate 22(gl_PerVertex) 1 BuiltIn PointSize
MemberDecorate 22(gl_PerVertex) 2 BuiltIn ClipDistance
MemberDecorate 22(gl_PerVertex) 3 BuiltIn CullDistance
Decorate 22(gl_PerVertex) Block
MemberDecorate 29(ubname) 0 Offset 0
Decorate 29(ubname) Block
Decorate 31(ubinst) DescriptorSet 0
MemberDecorate 27(ubname) 0 Offset 0
Decorate 27(ubname) Block
Decorate 29(ubinst) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
6: TypeBool
@ -47,38 +47,27 @@ Warning, version 450 is not yet complete; most version-specific features are pre
24: 23(ptr) Variable Output
25: TypeInt 32 1
26: 25(int) Constant 0
27: TypePointer Function 18(fvec4)
29(ubname): TypeStruct 19(int)
30: TypePointer Uniform 29(ubname)
31(ubinst): 30(ptr) Variable Uniform
33: TypePointer Uniform 19(int)
36: 19(int) Constant 0
41: 17(float) Constant 0
42: 18(fvec4) ConstantComposite 41 41 41 41
44: 17(float) Constant 1065353216
45: 18(fvec4) ConstantComposite 44 44 44 44
47: TypePointer Output 18(fvec4)
27(ubname): TypeStruct 19(int)
28: TypePointer Uniform 27(ubname)
29(ubinst): 28(ptr) Variable Uniform
31: TypePointer Uniform 19(int)
34: 19(int) Constant 0
37: 17(float) Constant 0
38: 18(fvec4) ConstantComposite 37 37 37 37
39: 17(float) Constant 1065353216
40: 18(fvec4) ConstantComposite 39 39 39 39
42: TypePointer Output 18(fvec4)
4(main): 2 Function None 3
5: Label
28: 27(ptr) Variable Function
32(param): 7(ptr) Variable Function
34: 33(ptr) AccessChain 31(ubinst) 26
35: 19(int) Load 34
37: 6(bool) INotEqual 35 36
Store 32(param) 37
38: 6(bool) FunctionCall 10(foo(b1;) 32(param)
SelectionMerge 40 None
BranchConditional 38 39 43
39: Label
Store 28 42
Branch 40
43: Label
Store 28 45
Branch 40
40: Label
46: 18(fvec4) Load 28
48: 47(ptr) AccessChain 24 26
Store 48 46
30(param): 7(ptr) Variable Function
32: 31(ptr) AccessChain 29(ubinst) 26
33: 19(int) Load 32
35: 6(bool) INotEqual 33 34
Store 30(param) 35
36: 6(bool) FunctionCall 10(foo(b1;) 30(param)
41: 18(fvec4) Select 36 38 40
43: 42(ptr) AccessChain 24 26
Store 43 41
Return
FunctionEnd
10(foo(b1;): 6(bool) Function None 8

View File

@ -1,12 +1,12 @@
spv.deepRvalue.frag
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 155
// Id's are bound by 150
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 149
EntryPoint Fragment 4 "main" 144
ExecutionMode 4 OriginUpperLeft
Source GLSL 330
Name 4 "main"
@ -21,12 +21,12 @@ spv.deepRvalue.frag
Name 106 "h"
Name 107 "i"
Name 111 "samp2D"
Name 134 "str"
MemberName 134(str) 0 "a"
MemberName 134(str) 1 "b"
MemberName 134(str) 2 "c"
Name 136 "t"
Name 149 "gl_FragColor"
Name 129 "str"
MemberName 129(str) 0 "a"
MemberName 129(str) 1 "b"
MemberName 129(str) 2 "c"
Name 131 "t"
Name 144 "gl_FragColor"
Decorate 111(samp2D) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
@ -75,22 +75,21 @@ spv.deepRvalue.frag
113: TypeVector 6(float) 2
114: 6(float) Constant 1056964608
115: 113(fvec2) ConstantComposite 114 114
118: TypePointer Function 7(fvec4)
121: 6(float) Constant 1036831949
122: TypeBool
133: TypeArray 113(fvec2) 84
134(str): TypeStruct 81(int) 133 122(bool)
135: TypePointer Function 134(str)
137: 113(fvec2) ConstantComposite 10 11
138: 6(float) Constant 1082130432
139: 113(fvec2) ConstantComposite 138 12
140: 6(float) Constant 1086324736
141: 113(fvec2) ConstantComposite 140 13
142: 133 ConstantComposite 137 139 141
143: 122(bool) ConstantTrue
144: 134(str) ConstantComposite 82 142 143
148: TypePointer Output 7(fvec4)
149(gl_FragColor): 148(ptr) Variable Output
119: 6(float) Constant 1036831949
120: TypeBool
128: TypeArray 113(fvec2) 84
129(str): TypeStruct 81(int) 128 120(bool)
130: TypePointer Function 129(str)
132: 113(fvec2) ConstantComposite 10 11
133: 6(float) Constant 1082130432
134: 113(fvec2) ConstantComposite 133 12
135: 6(float) Constant 1086324736
136: 113(fvec2) ConstantComposite 135 13
137: 128 ConstantComposite 132 134 136
138: 120(bool) ConstantTrue
139: 129(str) ConstantComposite 82 137 138
143: TypePointer Output 7(fvec4)
144(gl_FragColor): 143(ptr) Variable Output
4(main): 2 Function None 3
5: Label
35(m): 34(ptr) Variable Function
@ -99,8 +98,7 @@ spv.deepRvalue.frag
87(g): 79(ptr) Variable Function
106(h): 79(ptr) Variable Function
107(i): 79(ptr) Variable Function
119: 118(ptr) Variable Function
136(t): 135(ptr) Variable Function
131(t): 130(ptr) Variable Function
Store 9(v1) 14
Store 15(v2) 20
Store 21(v3) 26
@ -172,34 +170,25 @@ spv.deepRvalue.frag
116: 7(fvec4) ImageSampleImplicitLod 112 115
117: 6(float) CompositeExtract 116 1
Store 107(i) 117
120: 6(float) Load 107(i)
123: 122(bool) FOrdGreaterThan 120 121
SelectionMerge 125 None
BranchConditional 123 124 127
124: Label
126: 7(fvec4) Load 9(v1)
Store 119 126
Branch 125
127: Label
128: 7(fvec4) Load 15(v2)
Store 119 128
Branch 125
125: Label
129: 79(ptr) AccessChain 119 84
130: 6(float) Load 129
131: 6(float) Load 107(i)
132: 6(float) FAdd 131 130
Store 107(i) 132
Store 136(t) 144
145: 6(float) CompositeExtract 144 1 2 1
146: 6(float) Load 107(i)
147: 6(float) FAdd 146 145
Store 107(i) 147
150: 6(float) Load 80(f)
151: 6(float) Load 87(g)
152: 6(float) Load 106(h)
153: 6(float) Load 107(i)
154: 7(fvec4) CompositeConstruct 150 151 152 153
Store 149(gl_FragColor) 154
118: 6(float) Load 107(i)
121: 120(bool) FOrdGreaterThan 118 119
122: 7(fvec4) Load 9(v1)
123: 7(fvec4) Load 15(v2)
124: 7(fvec4) Select 121 122 123
125: 6(float) CompositeExtract 124 3
126: 6(float) Load 107(i)
127: 6(float) FAdd 126 125
Store 107(i) 127
Store 131(t) 139
140: 6(float) CompositeExtract 139 1 2 1
141: 6(float) Load 107(i)
142: 6(float) FAdd 141 140
Store 107(i) 142
145: 6(float) Load 80(f)
146: 6(float) Load 87(g)
147: 6(float) Load 106(h)
148: 6(float) Load 107(i)
149: 7(fvec4) CompositeConstruct 145 146 147 148
Store 144(gl_FragColor) 149
Return
FunctionEnd

View File

@ -3,38 +3,37 @@ Warning, version 450 is not yet complete; most version-specific features are pre
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 35
// Id's are bound by 31
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 18 31
EntryPoint Vertex 4 "main" 17 27
Source GLSL 450
Name 4 "main"
Name 8 "i"
Name 18 "flag"
Name 31 "r"
Decorate 18(flag) RelaxedPrecision
Decorate 18(flag) Location 0
Decorate 19 RelaxedPrecision
Decorate 31(r) Location 0
Name 17 "flag"
Name 27 "r"
Decorate 17(flag) RelaxedPrecision
Decorate 17(flag) Location 0
Decorate 18 RelaxedPrecision
Decorate 27(r) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
17: TypePointer Input 6(int)
18(flag): 17(ptr) Variable Input
20: 6(int) Constant 1
21: TypeBool
25: 6(int) Constant 10
27: 6(int) Constant 15
30: TypePointer Output 6(int)
31(r): 30(ptr) Variable Output
16: TypePointer Input 6(int)
17(flag): 16(ptr) Variable Input
19: 6(int) Constant 1
20: TypeBool
22: 6(int) Constant 10
23: 6(int) Constant 15
26: TypePointer Output 6(int)
27(r): 26(ptr) Variable Output
4(main): 2 Function None 3
5: Label
8(i): 7(ptr) Variable Function
16: 7(ptr) Variable Function
Store 8(i) 9
Branch 10
10: Label
@ -42,29 +41,20 @@ Warning, version 450 is not yet complete; most version-specific features are pre
Branch 14
14: Label
15: 6(int) Load 8(i)
19: 6(int) Load 18(flag)
22: 21(bool) IEqual 19 20
SelectionMerge 24 None
BranchConditional 22 23 26
23: Label
Store 16 25
Branch 24
26: Label
Store 16 27
Branch 24
24: Label
28: 6(int) Load 16
29: 21(bool) SLessThan 15 28
BranchConditional 29 11 12
11: Label
32: 6(int) Load 8(i)
Store 31(r) 32
Branch 13
13: Label
33: 6(int) Load 8(i)
34: 6(int) IAdd 33 20
Store 8(i) 34
Branch 10
18: 6(int) Load 17(flag)
21: 20(bool) IEqual 18 19
24: 6(int) Select 21 22 23
25: 20(bool) SLessThan 15 24
BranchConditional 25 11 12
11: Label
28: 6(int) Load 8(i)
Store 27(r) 28
Branch 13
13: Label
29: 6(int) Load 8(i)
30: 6(int) IAdd 29 19
Store 8(i) 30
Branch 10
12: Label
Return
FunctionEnd

View File

@ -3,7 +3,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 378
// Id's are bound by 374
Capability Shader
Capability SampledRect
@ -16,7 +16,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
Capability StorageImageWriteWithoutFormat
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 132 142 152 248 362 377
EntryPoint Fragment 4 "main" 132 142 152 248 362 373
ExecutionMode 4 OriginUpperLeft
Source GLSL 450
Name 4 "main"
@ -42,7 +42,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
Name 248 "value"
Name 357 "wo2D"
Name 362 "fragData"
Name 377 "ic4D"
Name 373 "ic4D"
Decorate 15(i1D) DescriptorSet 0
Decorate 15(i1D) Binding 0
Decorate 27(i2D) DescriptorSet 0
@ -76,7 +76,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
Decorate 357(wo2D) DescriptorSet 0
Decorate 357(wo2D) Binding 1
Decorate 357(wo2D) NonReadable
Decorate 377(ic4D) Flat
Decorate 373(ic4D) Flat
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
@ -163,16 +163,15 @@ Warning, version 450 is not yet complete; most version-specific features are pre
357(wo2D): 356(ptr) Variable UniformConstant
361: TypePointer Output 125(fvec4)
362(fragData): 361(ptr) Variable Output
368: TypeBool
375: TypeVector 6(int) 4
376: TypePointer Input 375(ivec4)
377(ic4D): 376(ptr) Variable Input
367: TypeBool
371: TypeVector 6(int) 4
372: TypePointer Input 371(ivec4)
373(ic4D): 372(ptr) Variable Input
4(main): 2 Function None 3
5: Label
9(iv): 8(ptr) Variable Function
127(v): 126(ptr) Variable Function
229(ui): 228(ptr) Variable Function
363: 126(ptr) Variable Function
Store 9(iv) 11
16: 13 Load 15(i1D)
17: 6(int) ImageQuerySize 16
@ -498,22 +497,13 @@ Warning, version 450 is not yet complete; most version-specific features are pre
359: 29(ivec2) Load 142(ic2D)
360: 125(fvec4) Load 127(v)
ImageWrite 358 359 360
364: 18(int) Load 229(ui)
365: 20(ptr) AccessChain 9(iv) 237
366: 6(int) Load 365
367: 18(int) Bitcast 366
369: 368(bool) INotEqual 364 367
SelectionMerge 371 None
BranchConditional 369 370 373
370: Label
372: 125(fvec4) Load 127(v)
Store 363 372
Branch 371
373: Label
Store 363 129
Branch 371
371: Label
374: 125(fvec4) Load 363
Store 362(fragData) 374
363: 18(int) Load 229(ui)
364: 20(ptr) AccessChain 9(iv) 237
365: 6(int) Load 364
366: 18(int) Bitcast 365
368: 367(bool) INotEqual 363 366
369: 125(fvec4) Load 127(v)
370: 125(fvec4) Select 368 369 129
Store 362(fragData) 370
Return
FunctionEnd