skia2/tests/sksl/intrinsics/Frexp.metal
Brian Osman 58134e1408 Fix const globals in Metal
We were emitting this at global scope (not in Globals). That would lead
to errors about the variable needing to be in the constant address
space. (You can see the result in ConstArray.metal - the old code was
invalid). Also, we were already making references use _globals, so the
code was double-wrong (or half-right, depending on your perspective).

After the core change, writeVarDeclaration was only used for local
scope, and writeModifiers never used the 'globalContext' parameter.

The removal of finishLine() changed every test output, unfortunately.

Change-Id: Icc1356ba2cc3c339b2f5759b3d18523fd39395bc
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/408356
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-05-13 21:11:10 +00:00

55 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_frexp(float _var0, thread int4& exp) {
int _var1;
float _skResult = frexp(_var0, _var1);
exp.x = _var1;
return _skResult;
}
float2 _skOutParamHelper1_frexp(float2 _var0, thread int4& exp) {
int2 _var1;
float2 _skResult = frexp(_var0, _var1);
exp.xy = _var1;
return _skResult;
}
float3 _skOutParamHelper2_frexp(float3 _var0, thread int4& exp) {
int3 _var1;
float3 _skResult = frexp(_var0, _var1);
exp.xyz = _var1;
return _skResult;
}
float4 _skOutParamHelper3_frexp(float4 _var0, thread int4& exp) {
int4 _var1;
float4 _skResult = frexp(_var0, _var1);
exp = _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 * 6.0;
int4 exp;
float4 result;
bool4 ok;
result.x = _skOutParamHelper0_frexp(value.x, exp);
ok.x = result.x == 0.75 && exp.x == 3;
result.xy = _skOutParamHelper1_frexp(value.xy, exp);
ok.y = result.y == 0.75 && exp.y == 3;
result.xyz = _skOutParamHelper2_frexp(value.xyz, exp);
ok.z = result.z == 0.75 && exp.z == 3;
result = _skOutParamHelper3_frexp(value, exp);
ok.w = result.w == 0.75 && exp.w == 3;
_out.sk_FragColor = all(ok) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}