From b6cabc4f248b47509c8b863a2e9e069a03374132 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Fri, 19 May 2017 23:29:50 -0600 Subject: [PATCH] Fix C++ portability, non-deterministic order of argument evaluation. --- SPIRV/GlslangToSpv.cpp | 21 ++++++++++++-------- Test/baseResults/spv.boolInBlock.frag.out | 24 +++++++++++------------ 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 31f7aabb..10c2f922 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -2590,20 +2590,25 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I if (builder.isScalarType(nominalTypeId)) { // Conversion for bool spv::Id boolType = builder.makeBoolType(); - if (nominalTypeId != boolType) - rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, builder.makeUintConstant(1), - builder.makeUintConstant(0)); - else if (builder.getTypeId(rvalue) != boolType) + if (nominalTypeId != boolType) { + // 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, one, zero); + } else if (builder.getTypeId(rvalue) != boolType) rvalue = builder.createBinOp(spv::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0)); } else if (builder.isVectorType(nominalTypeId)) { // Conversion for bvec int vecSize = builder.getNumTypeComponents(nominalTypeId); 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, - makeSmearedConstant(builder.makeUintConstant(1), vecSize), - makeSmearedConstant(builder.makeUintConstant(0), vecSize)); - else if (builder.getTypeId(rvalue) != bvecType) + makeSmearedConstant(one, vecSize), + makeSmearedConstant(zero, vecSize)); + } else if (builder.getTypeId(rvalue) != bvecType) rvalue = builder.createBinOp(spv::OpINotEqual, bvecType, rvalue, makeSmearedConstant(builder.makeUintConstant(0), vecSize)); } diff --git a/Test/baseResults/spv.boolInBlock.frag.out b/Test/baseResults/spv.boolInBlock.frag.out index 4742dad3..30490fed 100644 --- a/Test/baseResults/spv.boolInBlock.frag.out +++ b/Test/baseResults/spv.boolInBlock.frag.out @@ -52,17 +52,17 @@ Warning, version 450 is not yet complete; most version-specific features are pre 28: 27(int) Constant 0 29: 6(bool) ConstantFalse 30: 9(bvec2) ConstantComposite 29 29 - 31: 22(int) Constant 0 - 32: 22(int) Constant 1 - 33: 23(ivec2) ConstantComposite 31 31 - 34: 23(ivec2) ConstantComposite 32 32 + 31: 22(int) Constant 1 + 32: 22(int) Constant 0 + 33: 23(ivec2) ConstantComposite 32 32 + 34: 23(ivec2) ConstantComposite 31 31 36: TypePointer Uniform 23(ivec2) 38: TypeVector 22(int) 4 39(Uniform): TypeStruct 38(ivec4) 40: TypePointer Uniform 39(Uniform) 41: 40(ptr) Variable Uniform 42: TypePointer Uniform 38(ivec4) - 65: 38(ivec4) ConstantComposite 31 31 31 31 + 65: 38(ivec4) ConstantComposite 32 32 32 32 72: TypeFloat 32 73: TypeVector 72(float) 4 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 44: 38(ivec4) Load 43 45: 22(int) CompositeExtract 44 2 - 46: 6(bool) INotEqual 45 31 + 46: 6(bool) INotEqual 45 32 SelectionMerge 48 None BranchConditional 46 47 48 47: Label 49: 42(ptr) AccessChain 41 28 50: 38(ivec4) Load 49 51: 22(int) CompositeExtract 50 0 - 52: 6(bool) INotEqual 51 31 + 52: 6(bool) INotEqual 51 32 53: 9(bvec2) CompositeConstruct 52 52 54: 23(ivec2) Select 53 34 33 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 57: 23(ivec2) Load 56 58: 22(int) CompositeExtract 57 0 - 59: 6(bool) INotEqual 58 31 + 59: 6(bool) INotEqual 58 32 SelectionMerge 61 None BranchConditional 59 60 61 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 77: 38(ivec4) Load 76 78: 22(int) CompositeExtract 77 0 - 79: 6(bool) INotEqual 78 31 + 79: 6(bool) INotEqual 78 32 SelectionMerge 81 None BranchConditional 79 80 81 80: Label 82: 42(ptr) AccessChain 41 28 83: 38(ivec4) Load 82 84: 22(int) CompositeExtract 83 1 - 85: 6(bool) INotEqual 84 31 + 85: 6(bool) INotEqual 84 32 Branch 81 81: Label 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 92: 38(ivec4) Load 91 93: 22(int) CompositeExtract 92 0 - 94: 6(bool) INotEqual 93 31 + 94: 6(bool) INotEqual 93 32 95: 6(bool) LogicalNot 94 SelectionMerge 97 None 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 99: 38(ivec4) Load 98 100: 22(int) CompositeExtract 99 1 - 101: 6(bool) INotEqual 100 31 + 101: 6(bool) INotEqual 100 32 Branch 97 97: Label 102: 6(bool) Phi 94 81 101 96 -- 2.34.1