diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 31 |
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; |
