diff options
| author | Yong He <yonghe@outlook.com> | 2019-03-10 15:31:38 -0700 |
|---|---|---|
| committer | Yong He <yonghe@outlook.com> | 2019-03-10 15:35:44 -0700 |
| commit | fbba2775eb381caba23dac1c36869b6ce11c6357 (patch) | |
| tree | 9f44be5afceb2dfe216645e2719680867d2cc6bc /source/slang/emit.cpp | |
| parent | d5492155d6d8b16f262c09f72d8653e3e675b616 (diff) | |
Fix GLSL emit logic for select expr
Diffstat (limited to 'source/slang/emit.cpp')
| -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; |
