9685e524d3
findMSB has one special trick that Metal doesn't naturally have an equivalent for, specifically in its treatment of negative numbers. findMSB searches negative numbers for a zero bit, not a one bit! We emulate this behavior in Metal using select(n, ~n, n<0). Change-Id: I861c6b8fb3dc5427643cd8c68a39a53f1959bff3 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/343996 Commit-Queue: John Stiles <johnstiles@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Auto-Submit: John Stiles <johnstiles@google.com>
23 lines
725 B
Metal
23 lines
725 B
Metal
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
using namespace metal;
|
|
struct Inputs {
|
|
int a;
|
|
uint b;
|
|
};
|
|
struct Outputs {
|
|
float4 sk_FragColor [[color(0)]];
|
|
};
|
|
|
|
|
|
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
|
Outputs _outputStruct;
|
|
thread Outputs* _out = &_outputStruct;
|
|
int _skTemp0;
|
|
int _skTemp1;
|
|
uint _skTemp2;
|
|
_out->sk_FragColor.x = float((_skTemp0 = (_in.a), _skTemp1 = (select(_skTemp0, ~_skTemp0, _skTemp0 < 0)), select(int(clz(_skTemp1)), int(-1), _skTemp1 == int(0))));
|
|
_out->sk_FragColor.y = float((_skTemp2 = (_in.b), select(int(clz(_skTemp2)), int(-1), _skTemp2 == uint(0))));
|
|
return *_out;
|
|
}
|