GLSL: Fix #1833: Don't constant fold integer mix to a float.

This commit is contained in:
John Kessenich 2019-07-13 12:22:10 -06:00
parent 25a508cc73
commit 1a6e8534ce
3 changed files with 28 additions and 15 deletions

2
Test/310.frag Normal file → Executable file
View File

@ -58,8 +58,8 @@ void foo23()
b1 = mix(b2, b3, b); b1 = mix(b2, b3, b);
uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b)); uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b));
ivec4 im4 = mix(ivec4(i), ivec4(i), bvec4(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 s1;
layout(binding=3) uniform sampler2D s2; // ERROR: overlapping bindings? Don't see that in the 310 spec. 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; highp layout(binding=2) uniform writeonly image2D i2D;

View File

@ -337,6 +337,16 @@ ERROR: node is still EOpNull!
0:60 'i' ( uniform mediump int) 0:60 'i' ( uniform mediump int)
0:60 Construct bvec4 ( temp 4-component vector of bool) 0:60 Construct bvec4 ( temp 4-component vector of bool)
0:60 'b' ( temp 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 Definition: foots( ( global void)
0:98 Function Parameters: 0:98 Function Parameters:
0:100 Sequence 0:100 Sequence

29
glslang/MachineIndependent/Constant.cpp Normal file → Executable file
View File

@ -415,8 +415,8 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
case EOpEmitStreamVertex: case EOpEmitStreamVertex:
case EOpEndStreamPrimitive: case EOpEndStreamPrimitive:
// These don't actually fold // These don't fold
return 0; return nullptr;
case EOpPackSnorm2x16: case EOpPackSnorm2x16:
case EOpPackUnorm2x16: case EOpPackUnorm2x16:
@ -491,8 +491,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
break; break;
} }
// TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
case EOpPackSnorm2x16: case EOpPackSnorm2x16:
case EOpPackUnorm2x16: case EOpPackUnorm2x16:
case EOpPackHalf2x16: case EOpPackHalf2x16:
@ -510,7 +508,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
case EOpDeterminant: case EOpDeterminant:
case EOpMatrixInverse: case EOpMatrixInverse:
case EOpTranspose: case EOpTranspose:
return 0; return nullptr;
default: default:
assert(componentWise); assert(componentWise);
@ -538,7 +536,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break; 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; case EbtUint64: newConstArray[i].setU64Const(static_cast<unsigned long long>(-static_cast<long long>(unionArray[i].getU64Const()))); break;
default: default:
return 0; return nullptr;
} }
break; break;
case EOpLogicalNot: case EOpLogicalNot:
@ -546,7 +544,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
switch (getType().getBasicType()) { switch (getType().getBasicType()) {
case EbtBool: newConstArray[i].setBConst(!unionArray[i].getBConst()); break; case EbtBool: newConstArray[i].setBConst(!unionArray[i].getBConst()); break;
default: default:
return 0; return nullptr;
} }
break; break;
case EOpBitwiseNot: case EOpBitwiseNot:
@ -970,7 +968,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
case EOpInt16BitsToFloat16: case EOpInt16BitsToFloat16:
case EOpUint16BitsToFloat16: case EOpUint16BitsToFloat16:
default: default:
return 0; return nullptr;
} }
} }
@ -1201,12 +1199,17 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode)
newConstArray[comp].setBConst(childConstUnions[0][arg0comp] != childConstUnions[1][arg1comp]); newConstArray[comp].setBConst(childConstUnions[0][arg0comp] != childConstUnions[1][arg1comp]);
break; break;
case EOpMix: case EOpMix:
if (children[2]->getAsTyped()->getBasicType() == EbtBool) if (!children[0]->getAsTyped()->isFloatingDomain())
newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst() ? childConstUnions[1][arg1comp].getDConst() : return aggrNode;
childConstUnions[0][arg0comp].getDConst()); if (children[2]->getAsTyped()->getBasicType() == EbtBool) {
else newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst()
newConstArray[comp].setDConst(childConstUnions[0][arg0comp].getDConst() * (1.0 - childConstUnions[2][arg2comp].getDConst()) + ? 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()); childConstUnions[1][arg1comp].getDConst() * childConstUnions[2][arg2comp].getDConst());
}
break; break;
case EOpStep: case EOpStep:
newConstArray[comp].setDConst(childConstUnions[1][arg1comp].getDConst() < childConstUnions[0][arg0comp].getDConst() ? 0.0 : 1.0); newConstArray[comp].setDConst(childConstUnions[1][arg1comp].getDConst() < childConstUnions[0][arg0comp].getDConst() ? 0.0 : 1.0);