зеркало из https://github.com/stride3d/xkslang.git
Fix C++ portability, non-deterministic order of argument evaluation.
This commit is contained in:
Родитель
80f92a190a
Коммит
b6cabc4f24
|
@ -2590,20 +2590,25 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I
|
||||||
if (builder.isScalarType(nominalTypeId)) {
|
if (builder.isScalarType(nominalTypeId)) {
|
||||||
// Conversion for bool
|
// Conversion for bool
|
||||||
spv::Id boolType = builder.makeBoolType();
|
spv::Id boolType = builder.makeBoolType();
|
||||||
if (nominalTypeId != boolType)
|
if (nominalTypeId != boolType) {
|
||||||
rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, builder.makeUintConstant(1),
|
// keep these outside arguments, for determinant order-of-evaluation
|
||||||
builder.makeUintConstant(0));
|
spv::Id one = builder.makeUintConstant(1);
|
||||||
else if (builder.getTypeId(rvalue) != boolType)
|
spv::Id zero = builder.makeUintConstant(0);
|
||||||
|
rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, one, zero);
|
||||||
|
} else if (builder.getTypeId(rvalue) != boolType)
|
||||||
rvalue = builder.createBinOp(spv::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0));
|
rvalue = builder.createBinOp(spv::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0));
|
||||||
} else if (builder.isVectorType(nominalTypeId)) {
|
} else if (builder.isVectorType(nominalTypeId)) {
|
||||||
// Conversion for bvec
|
// Conversion for bvec
|
||||||
int vecSize = builder.getNumTypeComponents(nominalTypeId);
|
int vecSize = builder.getNumTypeComponents(nominalTypeId);
|
||||||
spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize);
|
spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize);
|
||||||
if (nominalTypeId != bvecType)
|
if (nominalTypeId != bvecType) {
|
||||||
|
// keep these outside arguments, for determinant order-of-evaluation
|
||||||
|
spv::Id one = builder.makeUintConstant(1);
|
||||||
|
spv::Id zero = builder.makeUintConstant(0);
|
||||||
rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue,
|
rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue,
|
||||||
makeSmearedConstant(builder.makeUintConstant(1), vecSize),
|
makeSmearedConstant(one, vecSize),
|
||||||
makeSmearedConstant(builder.makeUintConstant(0), vecSize));
|
makeSmearedConstant(zero, vecSize));
|
||||||
else if (builder.getTypeId(rvalue) != bvecType)
|
} else if (builder.getTypeId(rvalue) != bvecType)
|
||||||
rvalue = builder.createBinOp(spv::OpINotEqual, bvecType, rvalue,
|
rvalue = builder.createBinOp(spv::OpINotEqual, bvecType, rvalue,
|
||||||
makeSmearedConstant(builder.makeUintConstant(0), vecSize));
|
makeSmearedConstant(builder.makeUintConstant(0), vecSize));
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,17 +52,17 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
||||||
28: 27(int) Constant 0
|
28: 27(int) Constant 0
|
||||||
29: 6(bool) ConstantFalse
|
29: 6(bool) ConstantFalse
|
||||||
30: 9(bvec2) ConstantComposite 29 29
|
30: 9(bvec2) ConstantComposite 29 29
|
||||||
31: 22(int) Constant 0
|
31: 22(int) Constant 1
|
||||||
32: 22(int) Constant 1
|
32: 22(int) Constant 0
|
||||||
33: 23(ivec2) ConstantComposite 31 31
|
33: 23(ivec2) ConstantComposite 32 32
|
||||||
34: 23(ivec2) ConstantComposite 32 32
|
34: 23(ivec2) ConstantComposite 31 31
|
||||||
36: TypePointer Uniform 23(ivec2)
|
36: TypePointer Uniform 23(ivec2)
|
||||||
38: TypeVector 22(int) 4
|
38: TypeVector 22(int) 4
|
||||||
39(Uniform): TypeStruct 38(ivec4)
|
39(Uniform): TypeStruct 38(ivec4)
|
||||||
40: TypePointer Uniform 39(Uniform)
|
40: TypePointer Uniform 39(Uniform)
|
||||||
41: 40(ptr) Variable Uniform
|
41: 40(ptr) Variable Uniform
|
||||||
42: TypePointer Uniform 38(ivec4)
|
42: TypePointer Uniform 38(ivec4)
|
||||||
65: 38(ivec4) ConstantComposite 31 31 31 31
|
65: 38(ivec4) ConstantComposite 32 32 32 32
|
||||||
72: TypeFloat 32
|
72: TypeFloat 32
|
||||||
73: TypeVector 72(float) 4
|
73: TypeVector 72(float) 4
|
||||||
74: TypePointer Output 73(fvec4)
|
74: TypePointer Output 73(fvec4)
|
||||||
|
@ -79,14 +79,14 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
||||||
43: 42(ptr) AccessChain 41 28
|
43: 42(ptr) AccessChain 41 28
|
||||||
44: 38(ivec4) Load 43
|
44: 38(ivec4) Load 43
|
||||||
45: 22(int) CompositeExtract 44 2
|
45: 22(int) CompositeExtract 44 2
|
||||||
46: 6(bool) INotEqual 45 31
|
46: 6(bool) INotEqual 45 32
|
||||||
SelectionMerge 48 None
|
SelectionMerge 48 None
|
||||||
BranchConditional 46 47 48
|
BranchConditional 46 47 48
|
||||||
47: Label
|
47: Label
|
||||||
49: 42(ptr) AccessChain 41 28
|
49: 42(ptr) AccessChain 41 28
|
||||||
50: 38(ivec4) Load 49
|
50: 38(ivec4) Load 49
|
||||||
51: 22(int) CompositeExtract 50 0
|
51: 22(int) CompositeExtract 50 0
|
||||||
52: 6(bool) INotEqual 51 31
|
52: 6(bool) INotEqual 51 32
|
||||||
53: 9(bvec2) CompositeConstruct 52 52
|
53: 9(bvec2) CompositeConstruct 52 52
|
||||||
54: 23(ivec2) Select 53 34 33
|
54: 23(ivec2) Select 53 34 33
|
||||||
55: 36(ptr) AccessChain 26 28
|
55: 36(ptr) AccessChain 26 28
|
||||||
|
@ -96,7 +96,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
||||||
56: 36(ptr) AccessChain 26 28
|
56: 36(ptr) AccessChain 26 28
|
||||||
57: 23(ivec2) Load 56
|
57: 23(ivec2) Load 56
|
||||||
58: 22(int) CompositeExtract 57 0
|
58: 22(int) CompositeExtract 57 0
|
||||||
59: 6(bool) INotEqual 58 31
|
59: 6(bool) INotEqual 58 32
|
||||||
SelectionMerge 61 None
|
SelectionMerge 61 None
|
||||||
BranchConditional 59 60 61
|
BranchConditional 59 60 61
|
||||||
60: Label
|
60: Label
|
||||||
|
@ -114,14 +114,14 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
||||||
76: 42(ptr) AccessChain 41 28
|
76: 42(ptr) AccessChain 41 28
|
||||||
77: 38(ivec4) Load 76
|
77: 38(ivec4) Load 76
|
||||||
78: 22(int) CompositeExtract 77 0
|
78: 22(int) CompositeExtract 77 0
|
||||||
79: 6(bool) INotEqual 78 31
|
79: 6(bool) INotEqual 78 32
|
||||||
SelectionMerge 81 None
|
SelectionMerge 81 None
|
||||||
BranchConditional 79 80 81
|
BranchConditional 79 80 81
|
||||||
80: Label
|
80: Label
|
||||||
82: 42(ptr) AccessChain 41 28
|
82: 42(ptr) AccessChain 41 28
|
||||||
83: 38(ivec4) Load 82
|
83: 38(ivec4) Load 82
|
||||||
84: 22(int) CompositeExtract 83 1
|
84: 22(int) CompositeExtract 83 1
|
||||||
85: 6(bool) INotEqual 84 31
|
85: 6(bool) INotEqual 84 32
|
||||||
Branch 81
|
Branch 81
|
||||||
81: Label
|
81: Label
|
||||||
86: 6(bool) Phi 79 61 85 80
|
86: 6(bool) Phi 79 61 85 80
|
||||||
|
@ -131,7 +131,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
||||||
91: 42(ptr) AccessChain 41 28
|
91: 42(ptr) AccessChain 41 28
|
||||||
92: 38(ivec4) Load 91
|
92: 38(ivec4) Load 91
|
||||||
93: 22(int) CompositeExtract 92 0
|
93: 22(int) CompositeExtract 92 0
|
||||||
94: 6(bool) INotEqual 93 31
|
94: 6(bool) INotEqual 93 32
|
||||||
95: 6(bool) LogicalNot 94
|
95: 6(bool) LogicalNot 94
|
||||||
SelectionMerge 97 None
|
SelectionMerge 97 None
|
||||||
BranchConditional 95 96 97
|
BranchConditional 95 96 97
|
||||||
|
@ -139,7 +139,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
||||||
98: 42(ptr) AccessChain 41 28
|
98: 42(ptr) AccessChain 41 28
|
||||||
99: 38(ivec4) Load 98
|
99: 38(ivec4) Load 98
|
||||||
100: 22(int) CompositeExtract 99 1
|
100: 22(int) CompositeExtract 99 1
|
||||||
101: 6(bool) INotEqual 100 31
|
101: 6(bool) INotEqual 100 32
|
||||||
Branch 97
|
Branch 97
|
||||||
97: Label
|
97: Label
|
||||||
102: 6(bool) Phi 94 81 101 96
|
102: 6(bool) Phi 94 81 101 96
|
||||||
|
|
Загрузка…
Ссылка в новой задаче