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