GLSL: Fix #1833: Don't constant fold integer mix to a float.
diff --git a/Test/310.frag b/Test/310.frag
old mode 100644
new mode 100755
index a0525ea..8a11f67
--- a/Test/310.frag
+++ b/Test/310.frag
@@ -58,8 +58,8 @@
b1 = mix(b2, b3, b);
uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b));
ivec4 im4 = mix(ivec4(i), ivec4(i), bvec4(b));
+ 1 << mix(1u, 1u, false); // does not require folding
}
-
layout(binding=3) uniform sampler2D s1;
layout(binding=3) uniform sampler2D s2; // ERROR: overlapping bindings? Don't see that in the 310 spec.
highp layout(binding=2) uniform writeonly image2D i2D;
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 6763c0a..fab3d46 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -337,6 +337,16 @@
0:60 'i' ( uniform mediump int)
0:60 Construct bvec4 ( temp 4-component vector of bool)
0:60 'b' ( temp bool)
+0:61 left-shift ( temp int)
+0:61 Constant:
+0:61 1 (const int)
+0:61 mix ( global uint)
+0:61 Constant:
+0:61 1 (const uint)
+0:61 Constant:
+0:61 1 (const uint)
+0:61 Constant:
+0:61 false (const bool)
0:98 Function Definition: foots( ( global void)
0:98 Function Parameters:
0:100 Sequence
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
old mode 100644
new mode 100755
index b75e3ef..e0f3d55
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -415,8 +415,8 @@
case EOpEmitStreamVertex:
case EOpEndStreamPrimitive:
- // These don't actually fold
- return 0;
+ // These don't fold
+ return nullptr;
case EOpPackSnorm2x16:
case EOpPackUnorm2x16:
@@ -491,8 +491,6 @@
break;
}
- // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
-
case EOpPackSnorm2x16:
case EOpPackUnorm2x16:
case EOpPackHalf2x16:
@@ -510,7 +508,7 @@
case EOpDeterminant:
case EOpMatrixInverse:
case EOpTranspose:
- return 0;
+ return nullptr;
default:
assert(componentWise);
@@ -538,7 +536,7 @@
case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break;
case EbtUint64: newConstArray[i].setU64Const(static_cast<unsigned long long>(-static_cast<long long>(unionArray[i].getU64Const()))); break;
default:
- return 0;
+ return nullptr;
}
break;
case EOpLogicalNot:
@@ -546,7 +544,7 @@
switch (getType().getBasicType()) {
case EbtBool: newConstArray[i].setBConst(!unionArray[i].getBConst()); break;
default:
- return 0;
+ return nullptr;
}
break;
case EOpBitwiseNot:
@@ -970,7 +968,7 @@
case EOpInt16BitsToFloat16:
case EOpUint16BitsToFloat16:
default:
- return 0;
+ return nullptr;
}
}
@@ -1201,12 +1199,17 @@
newConstArray[comp].setBConst(childConstUnions[0][arg0comp] != childConstUnions[1][arg1comp]);
break;
case EOpMix:
- if (children[2]->getAsTyped()->getBasicType() == EbtBool)
- newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst() ? childConstUnions[1][arg1comp].getDConst() :
- childConstUnions[0][arg0comp].getDConst());
- else
- newConstArray[comp].setDConst(childConstUnions[0][arg0comp].getDConst() * (1.0 - childConstUnions[2][arg2comp].getDConst()) +
- childConstUnions[1][arg1comp].getDConst() * childConstUnions[2][arg2comp].getDConst());
+ if (!children[0]->getAsTyped()->isFloatingDomain())
+ return aggrNode;
+ if (children[2]->getAsTyped()->getBasicType() == EbtBool) {
+ newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst()
+ ? childConstUnions[1][arg1comp].getDConst()
+ : childConstUnions[0][arg0comp].getDConst());
+ } else {
+ newConstArray[comp].setDConst(
+ childConstUnions[0][arg0comp].getDConst() * (1.0 - childConstUnions[2][arg2comp].getDConst()) +
+ childConstUnions[1][arg1comp].getDConst() * childConstUnions[2][arg2comp].getDConst());
+ }
break;
case EOpStep:
newConstArray[comp].setDConst(childConstUnions[1][arg1comp].getDConst() < childConstUnions[0][arg0comp].getDConst() ? 0.0 : 1.0);