|
|
@@ -9164,14 +9164,19 @@ void CompilerMSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop,
|
|
|
break;
|
|
|
|
|
|
case GLSLstd450Normalize:
|
|
|
+ {
|
|
|
+ auto &exp_type = expression_type(args[0]);
|
|
|
// MSL does not support scalar versions here.
|
|
|
+ // MSL has no implementation for normalize in the fast:: namespace for half2 and half3
|
|
|
// Returns -1 or 1 for valid input, sign() does the job.
|
|
|
- if (expression_type(args[0]).vecsize == 1)
|
|
|
+ if (exp_type.vecsize == 1)
|
|
|
emit_unary_func_op(result_type, id, args[0], "sign");
|
|
|
+ else if (exp_type.vecsize <= 3 && exp_type.basetype == SPIRType::Half)
|
|
|
+ emit_unary_func_op(result_type, id, args[0], "normalize");
|
|
|
else
|
|
|
emit_unary_func_op(result_type, id, args[0], "fast::normalize");
|
|
|
break;
|
|
|
-
|
|
|
+ }
|
|
|
case GLSLstd450Reflect:
|
|
|
if (get<SPIRType>(result_type).vecsize == 1)
|
|
|
emit_binary_func_op(result_type, id, args[0], args[1], "spvReflect");
|