summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-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;