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:
parent
509177d136
commit
433e9ff896
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user