Turn on SpecConstantOpMode based on node qualifier
Move SpecConstantOpModeGuard from makeSpvConstantFromConstSubTree() to visitbinary() and visitunary(). Checking if the visiting node is a spec constants, if so, turn on the SpecConstantOpMode, otherwise, stay in the normal mode.
This commit is contained in:
parent
4c9126153d
commit
408876600f
5 changed files with 32 additions and 32 deletions
|
|
@ -72,12 +72,14 @@ public:
|
||||||
SpecConstantOpModeGuard(spv::Builder* builder)
|
SpecConstantOpModeGuard(spv::Builder* builder)
|
||||||
: builder_(builder) {
|
: builder_(builder) {
|
||||||
previous_flag_ = builder->isInSpecConstCodeGenMode();
|
previous_flag_ = builder->isInSpecConstCodeGenMode();
|
||||||
builder->setToSpecConstCodeGenMode();
|
|
||||||
}
|
}
|
||||||
~SpecConstantOpModeGuard() {
|
~SpecConstantOpModeGuard() {
|
||||||
previous_flag_ ? builder_->setToSpecConstCodeGenMode()
|
previous_flag_ ? builder_->setToSpecConstCodeGenMode()
|
||||||
: builder_->setToNormalCodeGenMode();
|
: builder_->setToNormalCodeGenMode();
|
||||||
}
|
}
|
||||||
|
void turnOnSpecConstantOpMode() {
|
||||||
|
builder_->setToSpecConstCodeGenMode();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
spv::Builder* builder_;
|
spv::Builder* builder_;
|
||||||
|
|
@ -813,6 +815,10 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
|
||||||
|
|
||||||
bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
|
bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
|
||||||
{
|
{
|
||||||
|
SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
|
||||||
|
if (node->getType().getQualifier().isSpecConstant())
|
||||||
|
spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
|
||||||
|
|
||||||
// First, handle special cases
|
// First, handle special cases
|
||||||
switch (node->getOp()) {
|
switch (node->getOp()) {
|
||||||
case glslang::EOpAssign:
|
case glslang::EOpAssign:
|
||||||
|
|
@ -985,6 +991,10 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
|
||||||
|
|
||||||
bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)
|
bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)
|
||||||
{
|
{
|
||||||
|
SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
|
||||||
|
if (node->getType().getQualifier().isSpecConstant())
|
||||||
|
spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
|
||||||
|
|
||||||
spv::Id result = spv::NoResult;
|
spv::Id result = spv::NoResult;
|
||||||
|
|
||||||
// try texturing first
|
// try texturing first
|
||||||
|
|
@ -1946,7 +1956,7 @@ spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arra
|
||||||
glslang::TIntermTyped* specNode = arraySizes.getDimNode(dim);
|
glslang::TIntermTyped* specNode = arraySizes.getDimNode(dim);
|
||||||
if (specNode != nullptr) {
|
if (specNode != nullptr) {
|
||||||
builder.clearAccessChain();
|
builder.clearAccessChain();
|
||||||
SpecConstantOpModeGuard set_to_spec_const_mode(&builder);
|
// SpecConstantOpModeGuard set_to_spec_const_mode(&builder);
|
||||||
specNode->traverse(this);
|
specNode->traverse(this);
|
||||||
return accessChainLoad(specNode->getAsTyped()->getType());
|
return accessChainLoad(specNode->getAsTyped()->getType());
|
||||||
}
|
}
|
||||||
|
|
@ -3920,22 +3930,12 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstSubTree(
|
||||||
} else if (glslang::TIntermBinary* bn = subTree->getAsBinaryNode()) {
|
} else if (glslang::TIntermBinary* bn = subTree->getAsBinaryNode()) {
|
||||||
// Binary operation node, we should generate OpSpecConstantOp <binary op>
|
// Binary operation node, we should generate OpSpecConstantOp <binary op>
|
||||||
// This case should only happen when Specialization Constants are involved.
|
// This case should only happen when Specialization Constants are involved.
|
||||||
|
|
||||||
// Spec constants defined with binary operations and other constants requires
|
|
||||||
// OpSpecConstantOp instruction.
|
|
||||||
SpecConstantOpModeGuard set_to_spec_const_mode(&builder);
|
|
||||||
|
|
||||||
bn->traverse(this);
|
bn->traverse(this);
|
||||||
return accessChainLoad(bn->getType());
|
return accessChainLoad(bn->getType());
|
||||||
|
|
||||||
} else if (glslang::TIntermUnary* un = subTree->getAsUnaryNode()) {
|
} else if (glslang::TIntermUnary* un = subTree->getAsUnaryNode()) {
|
||||||
// Unary operation node, similar to binary operation node, should only
|
// Unary operation node, similar to binary operation node, should only
|
||||||
// happen when specialization constants are involved.
|
// happen when specialization constants are involved.
|
||||||
|
|
||||||
// Spec constants defined with unary operations and other constants requires
|
|
||||||
// OpSpecConstantOp instruction.
|
|
||||||
SpecConstantOpModeGuard set_to_spec_const_mode(&builder);
|
|
||||||
|
|
||||||
un->traverse(this);
|
un->traverse(this);
|
||||||
return accessChainLoad(un->getType());
|
return accessChainLoad(un->getType());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,16 +39,16 @@ Linked compute stage:
|
||||||
15: TypeVector 6(int) 3
|
15: TypeVector 6(int) 3
|
||||||
16: 15(ivec3) SpecConstantComposite 12 13 14
|
16: 15(ivec3) SpecConstantComposite 12 13 14
|
||||||
17: 6(int) Constant 0
|
17: 6(int) Constant 0
|
||||||
|
18: 6(int) SpecConstantOp 81 16 0
|
||||||
19: 6(int) Constant 1
|
19: 6(int) Constant 1
|
||||||
|
20: 6(int) SpecConstantOp 81 16 1(GLSL.std.450)
|
||||||
|
21: 6(int) SpecConstantOp 132 18 20
|
||||||
22: 6(int) Constant 2
|
22: 6(int) Constant 2
|
||||||
|
23: 6(int) SpecConstantOp 81 16 2
|
||||||
|
24: 6(int) SpecConstantOp 132 21 23
|
||||||
25: TypePointer Uniform 6(int)
|
25: TypePointer Uniform 6(int)
|
||||||
4(main): 2 Function None 3
|
4(main): 2 Function None 3
|
||||||
5: Label
|
5: Label
|
||||||
18: 6(int) CompositeExtract 16 0
|
|
||||||
20: 6(int) CompositeExtract 16 1
|
|
||||||
21: 6(int) IMul 18 20
|
|
||||||
23: 6(int) CompositeExtract 16 2
|
|
||||||
24: 6(int) IMul 21 23
|
|
||||||
26: 25(ptr) AccessChain 9(bi) 11
|
26: 25(ptr) AccessChain 9(bi) 11
|
||||||
Store 26 24
|
Store 26 24
|
||||||
Return
|
Return
|
||||||
|
|
|
||||||
|
|
@ -58,17 +58,25 @@ Linked vertex stage:
|
||||||
30: 29(bool) SpecConstantTrue
|
30: 29(bool) SpecConstantTrue
|
||||||
33: TypeInt 32 0
|
33: TypeInt 32 0
|
||||||
34: 33(int) SpecConstant 2
|
34: 33(int) SpecConstant 2
|
||||||
|
35: 6(float) SpecConstantOp 112 34
|
||||||
38: TypeFloat 64
|
38: TypeFloat 64
|
||||||
39: 38(float) SpecConstant 1413754136 1074340347
|
39: 38(float) SpecConstant 1413754136 1074340347
|
||||||
40: 6(float) SpecConstant 1078523331
|
40: 6(float) SpecConstant 1078523331
|
||||||
|
41: 38(float) SpecConstantOp 115 40
|
||||||
|
42: 38(float) SpecConstantOp 136 39 41
|
||||||
|
43: 6(float) SpecConstantOp 115 42
|
||||||
50: 8(int) SpecConstant 12
|
50: 8(int) SpecConstant 12
|
||||||
51: TypeArray 7(fvec4) 50
|
51: TypeArray 7(fvec4) 50
|
||||||
52: TypePointer Input 51
|
52: TypePointer Input 51
|
||||||
53(dupUcol): 52(ptr) Variable Input
|
53(dupUcol): 52(ptr) Variable Input
|
||||||
60: 29(bool) SpecConstantTrue
|
60: 29(bool) SpecConstantTrue
|
||||||
63: 33(int) SpecConstant 2
|
63: 33(int) SpecConstant 2
|
||||||
|
64: 6(float) SpecConstantOp 112 63
|
||||||
67: 38(float) SpecConstant 1413754136 1074340347
|
67: 38(float) SpecConstant 1413754136 1074340347
|
||||||
68: 6(float) SpecConstant 1078523331
|
68: 6(float) SpecConstant 1078523331
|
||||||
|
69: 38(float) SpecConstantOp 115 68
|
||||||
|
70: 38(float) SpecConstantOp 136 67 69
|
||||||
|
71: 6(float) SpecConstantOp 115 70
|
||||||
75: TypePointer Function 8(int)
|
75: TypePointer Function 8(int)
|
||||||
77: 8(int) SpecConstant 8
|
77: 8(int) SpecConstant 8
|
||||||
4(main): 2 Function None 3
|
4(main): 2 Function None 3
|
||||||
|
|
@ -81,15 +89,11 @@ Linked vertex stage:
|
||||||
SelectionMerge 32 None
|
SelectionMerge 32 None
|
||||||
BranchConditional 30 31 32
|
BranchConditional 30 31 32
|
||||||
31: Label
|
31: Label
|
||||||
35: 6(float) ConvertUToF 34
|
|
||||||
36: 7(fvec4) Load 20(color)
|
36: 7(fvec4) Load 20(color)
|
||||||
37: 7(fvec4) VectorTimesScalar 36 35
|
37: 7(fvec4) VectorTimesScalar 36 35
|
||||||
Store 20(color) 37
|
Store 20(color) 37
|
||||||
Branch 32
|
Branch 32
|
||||||
32: Label
|
32: Label
|
||||||
41: 38(float) FConvert 40
|
|
||||||
42: 38(float) FDiv 39 41
|
|
||||||
43: 6(float) FConvert 42
|
|
||||||
44: 7(fvec4) Load 20(color)
|
44: 7(fvec4) Load 20(color)
|
||||||
45: 7(fvec4) CompositeConstruct 43 43 43 43
|
45: 7(fvec4) CompositeConstruct 43 43 43 43
|
||||||
46: 7(fvec4) FAdd 44 45
|
46: 7(fvec4) FAdd 44 45
|
||||||
|
|
@ -113,15 +117,11 @@ Linked vertex stage:
|
||||||
SelectionMerge 62 None
|
SelectionMerge 62 None
|
||||||
BranchConditional 60 61 62
|
BranchConditional 60 61 62
|
||||||
61: Label
|
61: Label
|
||||||
64: 6(float) ConvertUToF 63
|
|
||||||
65: 7(fvec4) Load 20(color)
|
65: 7(fvec4) Load 20(color)
|
||||||
66: 7(fvec4) VectorTimesScalar 65 64
|
66: 7(fvec4) VectorTimesScalar 65 64
|
||||||
Store 20(color) 66
|
Store 20(color) 66
|
||||||
Branch 62
|
Branch 62
|
||||||
62: Label
|
62: Label
|
||||||
69: 38(float) FConvert 68
|
|
||||||
70: 38(float) FDiv 67 69
|
|
||||||
71: 6(float) FConvert 70
|
|
||||||
72: 7(fvec4) Load 20(color)
|
72: 7(fvec4) Load 20(color)
|
||||||
73: 7(fvec4) CompositeConstruct 71 71 71 71
|
73: 7(fvec4) CompositeConstruct 71 71 71 71
|
||||||
74: 7(fvec4) FAdd 72 73
|
74: 7(fvec4) FAdd 72 73
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ Linked vertex stage:
|
||||||
26: TypePointer Output 25(fvec4)
|
26: TypePointer Output 25(fvec4)
|
||||||
27(color): 26(ptr) Variable Output
|
27(color): 26(ptr) Variable Output
|
||||||
28: 14(int) SpecConstant 3
|
28: 14(int) SpecConstant 3
|
||||||
|
29: 24(float) SpecConstantOp 111 28
|
||||||
32: 24(float) SpecConstant 1078523331
|
32: 24(float) SpecConstant 1078523331
|
||||||
33: 25(fvec4) SpecConstantComposite 32 32 32 32
|
33: 25(fvec4) SpecConstantComposite 32 32 32 32
|
||||||
36: 24(float) Constant 1133908460
|
36: 24(float) Constant 1133908460
|
||||||
|
|
@ -76,6 +77,7 @@ Linked vertex stage:
|
||||||
70: 68 SpecConstantComposite 28 28 63 46 69
|
70: 68 SpecConstantComposite 28 28 63 46 69
|
||||||
71: TypePointer Function 68
|
71: TypePointer Function 68
|
||||||
73: TypePointer Function 14(int)
|
73: TypePointer Function 14(int)
|
||||||
|
79: 24(float) SpecConstantOp 111 78
|
||||||
87: 24(float) Constant 1106321080
|
87: 24(float) Constant 1106321080
|
||||||
88:41(flat_struct) SpecConstantComposite 69 87 43 21
|
88:41(flat_struct) SpecConstantComposite 69 87 43 21
|
||||||
89: 14(int) Constant 10
|
89: 14(int) Constant 10
|
||||||
|
|
@ -99,7 +101,6 @@ Linked vertex stage:
|
||||||
SelectionMerge 23 None
|
SelectionMerge 23 None
|
||||||
BranchConditional 21 22 23
|
BranchConditional 21 22 23
|
||||||
22: Label
|
22: Label
|
||||||
29: 24(float) ConvertSToF 28
|
|
||||||
30: 25(fvec4) Load 27(color)
|
30: 25(fvec4) Load 27(color)
|
||||||
31: 25(fvec4) VectorTimesScalar 30 29
|
31: 25(fvec4) VectorTimesScalar 30 29
|
||||||
Store 27(color) 31
|
Store 27(color) 31
|
||||||
|
|
@ -146,7 +147,6 @@ Linked vertex stage:
|
||||||
Store 76(indexable) 70
|
Store 76(indexable) 70
|
||||||
77: 73(ptr) AccessChain 76(indexable) 75
|
77: 73(ptr) AccessChain 76(indexable) 75
|
||||||
78: 14(int) Load 77
|
78: 14(int) Load 77
|
||||||
79: 24(float) ConvertSToF 78
|
|
||||||
80: 25(fvec4) Load 27(color)
|
80: 25(fvec4) Load 27(color)
|
||||||
81: 25(fvec4) CompositeConstruct 79 79 79 79
|
81: 25(fvec4) CompositeConstruct 79 79 79 79
|
||||||
82: 25(fvec4) FDiv 80 81
|
82: 25(fvec4) FDiv 80 81
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ Linked vertex stage:
|
||||||
13: TypeArray 6(int) 12
|
13: TypeArray 6(int) 12
|
||||||
14: TypePointer Function 13
|
14: TypePointer Function 13
|
||||||
16: 6(int) Constant 1
|
16: 6(int) Constant 1
|
||||||
|
17: 6(int) SpecConstantOp 128 10 16
|
||||||
18: TypePointer Function 6(int)
|
18: TypePointer Function 6(int)
|
||||||
23: TypeFloat 32
|
23: TypeFloat 32
|
||||||
24: 23(float) SpecConstant 1078530010
|
24: 23(float) SpecConstant 1078530010
|
||||||
|
|
@ -111,20 +112,19 @@ Linked vertex stage:
|
||||||
98: 68(ivec4) ConstantComposite 97 97 97 97
|
98: 68(ivec4) ConstantComposite 97 97 97 97
|
||||||
99: 68(ivec4) SpecConstantOp 198 71 98
|
99: 68(ivec4) SpecConstantOp 198 71 98
|
||||||
100: 25(int) Constant 0
|
100: 25(int) Constant 0
|
||||||
101: 6(int) SpecConstantOp 81 67 0
|
|
||||||
102: TypeVector 6(int) 2
|
102: TypeVector 6(int) 2
|
||||||
103: 102(ivec2) SpecConstantOp 79 67 67 1(GLSL.std.450) 0
|
|
||||||
104: TypeVector 6(int) 3
|
104: TypeVector 6(int) 3
|
||||||
105: 104(ivec3) SpecConstantOp 79 67 67 2 1(GLSL.std.450) 0
|
|
||||||
106: 65(ivec4) SpecConstantOp 79 67 67 1(GLSL.std.450) 2 0 3
|
|
||||||
4(main): 2 Function None 3
|
4(main): 2 Function None 3
|
||||||
5: Label
|
5: Label
|
||||||
Return
|
Return
|
||||||
|
101: 6(int) CompositeExtract 67 0
|
||||||
|
103: 102(ivec2) VectorShuffle 67 67 1 0
|
||||||
|
105: 104(ivec3) VectorShuffle 67 67 2 1 0
|
||||||
|
106: 65(ivec4) VectorShuffle 67 67 1 2 0 3
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
8(non_const_array_size_from_spec_const(): 6(int) Function None 7
|
8(non_const_array_size_from_spec_const(): 6(int) Function None 7
|
||||||
9: Label
|
9: Label
|
||||||
15(array): 14(ptr) Variable Function
|
15(array): 14(ptr) Variable Function
|
||||||
17: 6(int) IAdd 10 16
|
|
||||||
19: 18(ptr) AccessChain 15(array) 17
|
19: 18(ptr) AccessChain 15(array) 17
|
||||||
20: 6(int) Load 19
|
20: 6(int) Load 19
|
||||||
ReturnValue 20
|
ReturnValue 20
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue