GLSL: Fix #1833: Don't constant fold integer mix to a float.
This commit is contained in:
parent
25a508cc73
commit
1a6e8534ce
2
Test/310.frag
Normal file → Executable file
2
Test/310.frag
Normal file → Executable file
@ -58,8 +58,8 @@ void foo23()
|
||||
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;
|
||||
|
@ -337,6 +337,16 @@ ERROR: node is still EOpNull!
|
||||
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
|
||||
|
29
glslang/MachineIndependent/Constant.cpp
Normal file → Executable file
29
glslang/MachineIndependent/Constant.cpp
Normal file → Executable file
@ -415,8 +415,8 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
||||
|
||||
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 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
||||
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 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
||||
case EOpDeterminant:
|
||||
case EOpMatrixInverse:
|
||||
case EOpTranspose:
|
||||
return 0;
|
||||
return nullptr;
|
||||
|
||||
default:
|
||||
assert(componentWise);
|
||||
@ -538,7 +536,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
||||
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 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
||||
switch (getType().getBasicType()) {
|
||||
case EbtBool: newConstArray[i].setBConst(!unionArray[i].getBConst()); break;
|
||||
default:
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
break;
|
||||
case EOpBitwiseNot:
|
||||
@ -970,7 +968,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
||||
case EOpInt16BitsToFloat16:
|
||||
case EOpUint16BitsToFloat16:
|
||||
default:
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1201,12 +1199,17 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode)
|
||||
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()) +
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user