summaryrefslogtreecommitdiffstats
path: root/source/slang/emit.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2019-03-10 15:31:38 -0700
committerYong He <yonghe@outlook.com>2019-03-10 15:35:44 -0700
commitfbba2775eb381caba23dac1c36869b6ce11c6357 (patch)
tree9f44be5afceb2dfe216645e2719680867d2cc6bc /source/slang/emit.cpp
parentd5492155d6d8b16f262c09f72d8653e3e675b616 (diff)
Fix GLSL emit logic for select expr
Diffstat (limited to 'source/slang/emit.cpp')
-rw-r--r--source/slang/emit.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index dcc99fc0d..9b1ebc91b 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -3959,14 +3959,29 @@ struct EmitVisitor
case kIROp_Select:
{
- auto prec = kEOp_Conditional;
- needClose = maybeEmitParens(outerPrec, prec);
-
- emitIROperand(ctx, inst->getOperand(0), mode, leftSide(outerPrec, prec));
- emit(" ? ");
- emitIROperand(ctx, inst->getOperand(1), mode, prec);
- emit(" : ");
- emitIROperand(ctx, inst->getOperand(2), mode, rightSide(prec, outerPrec));
+ if (getTarget(ctx) == CodeGenTarget::GLSL &&
+ inst->getOperand(0)->getDataType()->op != kIROp_BoolType)
+ {
+ // For GLSL, emit a call to `mix` if condition is a vector
+ emit("mix(");
+ emitIROperand(ctx, inst->getOperand(2), mode, leftSide(kEOp_General, kEOp_General));
+ emit(", ");
+ emitIROperand(ctx, inst->getOperand(1), mode, leftSide(kEOp_General, kEOp_General));
+ emit(", ");
+ emitIROperand(ctx, inst->getOperand(0), mode, leftSide(kEOp_General, kEOp_General));
+ emit(")");
+ }
+ else
+ {
+ auto prec = kEOp_Conditional;
+ needClose = maybeEmitParens(outerPrec, prec);
+
+ emitIROperand(ctx, inst->getOperand(0), mode, leftSide(outerPrec, prec));
+ emit(" ? ");
+ emitIROperand(ctx, inst->getOperand(1), mode, prec);
+ emit(" : ");
+ emitIROperand(ctx, inst->getOperand(2), mode, rightSide(prec, outerPrec));
+ }
}
break;