xref: /aosp_15_r20/external/skia/tests/sksl/intrinsics/Unpack.hlsl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workercbuffer _UniformBuffer : register(b0, space0)
2*c8dee2aaSAndroid Build Coastguard Worker{
3*c8dee2aaSAndroid Build Coastguard Worker    uint _7_a : packoffset(c0);
4*c8dee2aaSAndroid Build Coastguard Worker};
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Workerstatic float4 sk_FragColor;
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Workerstruct SPIRV_Cross_Output
10*c8dee2aaSAndroid Build Coastguard Worker{
11*c8dee2aaSAndroid Build Coastguard Worker    float4 sk_FragColor : SV_Target0;
12*c8dee2aaSAndroid Build Coastguard Worker};
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard Workeruint spvPackHalf2x16(float2 value)
15*c8dee2aaSAndroid Build Coastguard Worker{
16*c8dee2aaSAndroid Build Coastguard Worker    uint2 Packed = f32tof16(value);
17*c8dee2aaSAndroid Build Coastguard Worker    return Packed.x | (Packed.y << 16);
18*c8dee2aaSAndroid Build Coastguard Worker}
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Workerfloat2 spvUnpackHalf2x16(uint value)
21*c8dee2aaSAndroid Build Coastguard Worker{
22*c8dee2aaSAndroid Build Coastguard Worker    return f16tof32(uint2(value & 0xffff, value >> 16));
23*c8dee2aaSAndroid Build Coastguard Worker}
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Workeruint spvPackUnorm4x8(float4 value)
26*c8dee2aaSAndroid Build Coastguard Worker{
27*c8dee2aaSAndroid Build Coastguard Worker    uint4 Packed = uint4(round(saturate(value) * 255.0));
28*c8dee2aaSAndroid Build Coastguard Worker    return Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24);
29*c8dee2aaSAndroid Build Coastguard Worker}
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Workerfloat4 spvUnpackUnorm4x8(uint value)
32*c8dee2aaSAndroid Build Coastguard Worker{
33*c8dee2aaSAndroid Build Coastguard Worker    uint4 Packed = uint4(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, value >> 24);
34*c8dee2aaSAndroid Build Coastguard Worker    return float4(Packed) / 255.0;
35*c8dee2aaSAndroid Build Coastguard Worker}
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Workeruint spvPackSnorm4x8(float4 value)
38*c8dee2aaSAndroid Build Coastguard Worker{
39*c8dee2aaSAndroid Build Coastguard Worker    int4 Packed = int4(round(clamp(value, -1.0, 1.0) * 127.0)) & 0xff;
40*c8dee2aaSAndroid Build Coastguard Worker    return uint(Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24));
41*c8dee2aaSAndroid Build Coastguard Worker}
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Workerfloat4 spvUnpackSnorm4x8(uint value)
44*c8dee2aaSAndroid Build Coastguard Worker{
45*c8dee2aaSAndroid Build Coastguard Worker    int SignedValue = int(value);
46*c8dee2aaSAndroid Build Coastguard Worker    int4 Packed = int4(SignedValue << 24, SignedValue << 16, SignedValue << 8, SignedValue) >> 24;
47*c8dee2aaSAndroid Build Coastguard Worker    return clamp(float4(Packed) / 127.0, -1.0, 1.0);
48*c8dee2aaSAndroid Build Coastguard Worker}
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Workeruint spvPackUnorm2x16(float2 value)
51*c8dee2aaSAndroid Build Coastguard Worker{
52*c8dee2aaSAndroid Build Coastguard Worker    uint2 Packed = uint2(round(saturate(value) * 65535.0));
53*c8dee2aaSAndroid Build Coastguard Worker    return Packed.x | (Packed.y << 16);
54*c8dee2aaSAndroid Build Coastguard Worker}
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Workerfloat2 spvUnpackUnorm2x16(uint value)
57*c8dee2aaSAndroid Build Coastguard Worker{
58*c8dee2aaSAndroid Build Coastguard Worker    uint2 Packed = uint2(value & 0xffff, value >> 16);
59*c8dee2aaSAndroid Build Coastguard Worker    return float2(Packed) / 65535.0;
60*c8dee2aaSAndroid Build Coastguard Worker}
61*c8dee2aaSAndroid Build Coastguard Worker
62*c8dee2aaSAndroid Build Coastguard Workeruint spvPackSnorm2x16(float2 value)
63*c8dee2aaSAndroid Build Coastguard Worker{
64*c8dee2aaSAndroid Build Coastguard Worker    int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
65*c8dee2aaSAndroid Build Coastguard Worker    return uint(Packed.x | (Packed.y << 16));
66*c8dee2aaSAndroid Build Coastguard Worker}
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Workerfloat2 spvUnpackSnorm2x16(uint value)
69*c8dee2aaSAndroid Build Coastguard Worker{
70*c8dee2aaSAndroid Build Coastguard Worker    int SignedValue = int(value);
71*c8dee2aaSAndroid Build Coastguard Worker    int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
72*c8dee2aaSAndroid Build Coastguard Worker    return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
73*c8dee2aaSAndroid Build Coastguard Worker}
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Workervoid frag_main()
76*c8dee2aaSAndroid Build Coastguard Worker{
77*c8dee2aaSAndroid Build Coastguard Worker    float2 _14 = spvUnpackHalf2x16(_7_a);
78*c8dee2aaSAndroid Build Coastguard Worker    sk_FragColor = float4(_14.x, _14.y, sk_FragColor.z, sk_FragColor.w);
79*c8dee2aaSAndroid Build Coastguard Worker    float2 _23 = spvUnpackUnorm2x16(_7_a);
80*c8dee2aaSAndroid Build Coastguard Worker    sk_FragColor = float4(_23.x, _23.y, sk_FragColor.z, sk_FragColor.w);
81*c8dee2aaSAndroid Build Coastguard Worker    float2 _28 = spvUnpackSnorm2x16(_7_a);
82*c8dee2aaSAndroid Build Coastguard Worker    sk_FragColor = float4(_28.x, _28.y, sk_FragColor.z, sk_FragColor.w);
83*c8dee2aaSAndroid Build Coastguard Worker    sk_FragColor = spvUnpackUnorm4x8(_7_a);
84*c8dee2aaSAndroid Build Coastguard Worker    sk_FragColor = spvUnpackSnorm4x8(_7_a);
85*c8dee2aaSAndroid Build Coastguard Worker}
86*c8dee2aaSAndroid Build Coastguard Worker
87*c8dee2aaSAndroid Build Coastguard WorkerSPIRV_Cross_Output main()
88*c8dee2aaSAndroid Build Coastguard Worker{
89*c8dee2aaSAndroid Build Coastguard Worker    frag_main();
90*c8dee2aaSAndroid Build Coastguard Worker    SPIRV_Cross_Output stage_output;
91*c8dee2aaSAndroid Build Coastguard Worker    stage_output.sk_FragColor = sk_FragColor;
92*c8dee2aaSAndroid Build Coastguard Worker    return stage_output;
93*c8dee2aaSAndroid Build Coastguard Worker}
94