skia2/tests/sksl/intrinsics/Modf.metal
John Stiles 4a3ec173b3 Add tests to demonstrate SPIR-V error with intrinsics.
When SPIR-V generates function calls to an intrinsic, it assumes that
it can get a pointer to out-parameters referenced by the intrinsic.
This does not account for swizzled out-parameters; these are valid
lvalues, but do not work with getPointer().

The two intrinsics supported by SkSL which have an out-parameter are
frexp and modf, so these tests were fleshed out to trigger the error.
Neither of these are supported in ES2, though, so we cannot test them
via Runtime Effects.

Change-Id: Ib92707a28ba6d1c282d20e29a2a387bddf74ad23
Bug: skia:11052
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/370116
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-16 15:46:01 +00:00

58 lines
1.7 KiB
Metal

#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Uniforms {
float4 colorGreen;
float4 colorRed;
};
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float _skOutParamHelper0_modf(float _var0, thread float4& whole) {
float _var1;
float _skResult = modf(_var0, _var1);
whole.x = _var1;
return _skResult;
}
float2 _skOutParamHelper1_modf(float2 _var0, thread float4& whole) {
float2 _var1;
float2 _skResult = modf(_var0, _var1);
whole.xy = _var1;
return _skResult;
}
float3 _skOutParamHelper2_modf(float3 _var0, thread float4& whole) {
float3 _var1;
float3 _skResult = modf(_var0, _var1);
whole.xyz = _var1;
return _skResult;
}
float4 _skOutParamHelper3_modf(float4 _var0, thread float4& whole) {
float4 _var1;
float4 _skResult = modf(_var0, _var1);
whole = _var1;
return _skResult;
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
float4 value = _uniforms.colorGreen.yyyy * 2.5;
float4 whole;
float4 fraction;
bool4 ok;
fraction.x = _skOutParamHelper0_modf(value.x, whole);
ok.x = whole.x == 2.0 && fraction.x == 0.5;
fraction.xy = _skOutParamHelper1_modf(value.xy, whole);
ok.y = whole.y == 2.0 && fraction.y == 0.5;
fraction.xyz = _skOutParamHelper2_modf(value.xyz, whole);
ok.z = whole.z == 2.0 && fraction.z == 0.5;
fraction.xyzw = _skOutParamHelper3_modf(value, whole);
ok.w = whole.w == 2.0 && fraction.w == 0.5;
_out.sk_FragColor = all(ok) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}