Commit ba00f67d by John Kessenich

Merge pull request #251 from amdrexu/bugfix

SPV: Use OpLogicalEqual/OpLogicalNotEqual for boolean type comparison.
parents d6abcee1 c7d3656d
...@@ -2633,6 +2633,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv ...@@ -2633,6 +2633,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
{ {
bool isUnsigned = typeProxy == glslang::EbtUint; bool isUnsigned = typeProxy == glslang::EbtUint;
bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
bool isBool = typeProxy == glslang::EbtBool;
spv::Op binOp = spv::OpNop; spv::Op binOp = spv::OpNop;
bool needMatchingVectors = true; // for non-matrix ops, would a scalar need to smear to match a vector? bool needMatchingVectors = true; // for non-matrix ops, would a scalar need to smear to match a vector?
...@@ -2820,6 +2821,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv ...@@ -2820,6 +2821,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
case glslang::EOpVectorEqual: case glslang::EOpVectorEqual:
if (isFloat) if (isFloat)
binOp = spv::OpFOrdEqual; binOp = spv::OpFOrdEqual;
else if (isBool)
binOp = spv::OpLogicalEqual;
else else
binOp = spv::OpIEqual; binOp = spv::OpIEqual;
break; break;
...@@ -2827,6 +2830,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv ...@@ -2827,6 +2830,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
case glslang::EOpVectorNotEqual: case glslang::EOpVectorNotEqual:
if (isFloat) if (isFloat)
binOp = spv::OpFOrdNotEqual; binOp = spv::OpFOrdNotEqual;
else if (isBool)
binOp = spv::OpLogicalNotEqual;
else else
binOp = spv::OpINotEqual; binOp = spv::OpINotEqual;
break; break;
......
...@@ -470,7 +470,7 @@ Linked fragment stage: ...@@ -470,7 +470,7 @@ Linked fragment stage:
339: Label 339: Label
341: 179(bvec4) Load 181(ub41) 341: 179(bvec4) Load 181(ub41)
343: 179(bvec4) Load 342(ub42) 343: 179(bvec4) Load 342(ub42)
344: 179(bvec4) IEqual 341 343 344: 179(bvec4) LogicalEqual 341 343
345: 178(bool) Any 344 345: 178(bool) Any 344
Branch 340 Branch 340
340: Label 340: Label
...@@ -482,7 +482,7 @@ Linked fragment stage: ...@@ -482,7 +482,7 @@ Linked fragment stage:
348: Label 348: Label
350: 179(bvec4) Load 181(ub41) 350: 179(bvec4) Load 181(ub41)
351: 179(bvec4) Load 342(ub42) 351: 179(bvec4) Load 342(ub42)
352: 179(bvec4) INotEqual 350 351 352: 179(bvec4) LogicalNotEqual 350 351
353: 178(bool) Any 352 353: 178(bool) Any 352
Branch 349 Branch 349
349: Label 349: Label
......
...@@ -91,6 +91,6 @@ Linked vertex stage: ...@@ -91,6 +91,6 @@ Linked vertex stage:
9(b): 7(ptr) FunctionParameter 9(b): 7(ptr) FunctionParameter
11: Label 11: Label
12: 6(bool) Load 9(b) 12: 6(bool) Load 9(b)
14: 6(bool) INotEqual 12 13 14: 6(bool) LogicalNotEqual 12 13
ReturnValue 14 ReturnValue 14
FunctionEnd FunctionEnd
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment