xref: /aosp_15_r20/external/angle/third_party/glslang/src/Test/spv.nvAtomicFp16Vec.frag (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1#version 430
2
3#extension GL_NV_shader_atomic_fp16_vector : enable
4#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
5
6layout(binding = 0) buffer Buffer
7{
8    f16vec2 dataf16v2;
9    f16vec4 dataf16v4;
10
11    f16vec2 resf16v2;
12    f16vec4 resf16v4;
13
14}buf;
15
16layout(binding = 0, rg16f) volatile coherent uniform image1D        fimage1D;
17layout(binding = 1, rg16f) volatile coherent uniform image1DArray   fimage1DArray;
18layout(binding = 2, rg16f) volatile coherent uniform image2D        fimage2D;
19layout(binding = 3, rg16f) volatile coherent uniform image2DArray   fimage2DArray;
20layout(binding = 5, rg16f) volatile coherent uniform imageCube      fimageCube;
21layout(binding = 6, rg16f) volatile coherent uniform imageCubeArray fimageCubeArray;
22layout(binding = 9, rg16f) volatile coherent uniform image3D        fimage3D;
23
24layout(binding = 10, rgba16f) volatile coherent uniform image1D       fimage1Dv4;
25layout(binding = 11, rgba16f) volatile coherent uniform image1DArray   fimage1DArrayv4;
26layout(binding = 12, rgba16f) volatile coherent uniform image2D        fimage2Dv4;
27layout(binding = 13, rgba16f) volatile coherent uniform image2DArray   fimage2DArrayv4;
28layout(binding = 15, rgba16f) volatile coherent uniform imageCube      fimageCubev4;
29layout(binding = 16, rgba16f) volatile coherent uniform imageCubeArray fimageCubeArrayv4;
30layout(binding = 19, rgba16f) volatile coherent uniform image3D        fimage3Dv4;
31
32void main()
33{
34    // atomic* functions supported with f16vec2
35    buf.resf16v2 = atomicAdd(buf.dataf16v2, f16vec2(3));
36    buf.resf16v2 += atomicMin(buf.dataf16v2, f16vec2(3));
37    buf.resf16v2 += atomicMax(buf.dataf16v2, f16vec2(3));
38    buf.resf16v2 += atomicExchange(buf.dataf16v2, f16vec2(3));
39
40    // atomic* functions supported with f16vec4
41    buf.resf16v4 = atomicAdd(buf.dataf16v4, f16vec4(3));
42    buf.resf16v4 += atomicMin(buf.dataf16v4, f16vec4(3));
43    buf.resf16v4 += atomicMax(buf.dataf16v4, f16vec4(3));
44    buf.resf16v4 += atomicExchange(buf.dataf16v4, f16vec4(3));
45
46    // imageAtomic* functions supported with f16vec2 and only format supported is rg16f
47    f16vec2 constVec2 = f16vec2(2.0);
48    buf.resf16v2 += imageAtomicAdd(fimage1D, int(0), constVec2);
49    buf.resf16v2 += imageAtomicAdd(fimage1DArray, ivec2(0,0), constVec2);
50    buf.resf16v2 += imageAtomicAdd(fimage2D, ivec2(0,0), constVec2);
51    buf.resf16v2 += imageAtomicAdd(fimage2DArray, ivec3(0,0, 0), constVec2);
52    buf.resf16v2 += imageAtomicAdd(fimageCube, ivec3(0,0,0), constVec2);
53    buf.resf16v2 += imageAtomicAdd(fimageCubeArray, ivec3(0,0,0), constVec2);
54    buf.resf16v2 += imageAtomicAdd(fimage3D, ivec3(0,0,0), constVec2);
55
56    buf.resf16v2 += imageAtomicMin(fimage1D, int(0), constVec2);
57    buf.resf16v2 += imageAtomicMin(fimage1DArray, ivec2(0,0), constVec2);
58    buf.resf16v2 += imageAtomicMin(fimage2D, ivec2(0,0), constVec2);
59    buf.resf16v2 += imageAtomicMin(fimage2DArray, ivec3(0,0, 0), constVec2);
60    buf.resf16v2 += imageAtomicMin(fimageCube, ivec3(0,0,0), constVec2);
61    buf.resf16v2 += imageAtomicMin(fimageCubeArray, ivec3(0,0,0), constVec2);
62    buf.resf16v2 += imageAtomicMin(fimage3D, ivec3(0,0,0), constVec2);
63
64    buf.resf16v2 += imageAtomicMax(fimage1D, int(0), constVec2);
65    buf.resf16v2 += imageAtomicMax(fimage1DArray, ivec2(0,0), constVec2);
66    buf.resf16v2 += imageAtomicMax(fimage2D, ivec2(0,0), constVec2);
67    buf.resf16v2 += imageAtomicMax(fimage2DArray, ivec3(0,0, 0), constVec2);
68    buf.resf16v2 += imageAtomicMax(fimageCube, ivec3(0,0,0), constVec2);
69    buf.resf16v2 += imageAtomicMax(fimageCubeArray, ivec3(0,0,0), constVec2);
70    buf.resf16v2 += imageAtomicMax(fimage3D, ivec3(0,0,0), constVec2);
71
72    buf.resf16v2 += imageAtomicExchange(fimage1D, int(0), constVec2);
73    buf.resf16v2 += imageAtomicExchange(fimage1DArray, ivec2(0,0), constVec2);
74    buf.resf16v2 += imageAtomicExchange(fimage2D, ivec2(0,0), constVec2);
75    buf.resf16v2 += imageAtomicExchange(fimage2DArray, ivec3(0,0, 0), constVec2);
76    buf.resf16v2 += imageAtomicExchange(fimageCube, ivec3(0,0,0), constVec2);
77    buf.resf16v2 += imageAtomicExchange(fimageCubeArray, ivec3(0,0,0), constVec2);
78    buf.resf16v2 += imageAtomicExchange(fimage3D, ivec3(0,0,0), constVec2);
79
80    // imageAtomic* functions supported with f16vec4 and only format supported is rgba16f
81    f16vec4 constVec4 = f16vec4(2.0);
82    buf.resf16v4 += imageAtomicAdd(fimage1Dv4, int(0), constVec4);
83    buf.resf16v4 += imageAtomicAdd(fimage1DArrayv4, ivec2(0,0), constVec4);
84    buf.resf16v4 += imageAtomicAdd(fimage2Dv4, ivec2(0,0), constVec4);
85    buf.resf16v4 += imageAtomicAdd(fimage2DArrayv4, ivec3(0,0, 0), constVec4);
86    buf.resf16v4 += imageAtomicAdd(fimageCubev4, ivec3(0,0,0), constVec4);
87    buf.resf16v4 += imageAtomicAdd(fimageCubeArrayv4, ivec3(0,0,0), constVec4);
88    buf.resf16v4 += imageAtomicAdd(fimage3Dv4, ivec3(0,0,0), constVec4);
89
90    buf.resf16v4 += imageAtomicMin(fimage1Dv4, int(0), constVec4);
91    buf.resf16v4 += imageAtomicMin(fimage1DArrayv4, ivec2(0,0), constVec4);
92    buf.resf16v4 += imageAtomicMin(fimage2Dv4, ivec2(0,0), constVec4);
93    buf.resf16v4 += imageAtomicMin(fimage2DArrayv4, ivec3(0,0, 0), constVec4);
94    buf.resf16v4 += imageAtomicMin(fimageCubev4, ivec3(0,0,0), constVec4);
95    buf.resf16v4 += imageAtomicMin(fimageCubeArrayv4, ivec3(0,0,0), constVec4);
96    buf.resf16v4 += imageAtomicMin(fimage3Dv4, ivec3(0,0,0), constVec4);
97
98    buf.resf16v4 += imageAtomicMax(fimage1Dv4, int(0), constVec4);
99    buf.resf16v4 += imageAtomicMax(fimage1DArrayv4, ivec2(0,0), constVec4);
100    buf.resf16v4 += imageAtomicMax(fimage2Dv4, ivec2(0,0), constVec4);
101    buf.resf16v4 += imageAtomicMax(fimage2DArrayv4, ivec3(0,0, 0), constVec4);
102    buf.resf16v4 += imageAtomicMax(fimageCubev4, ivec3(0,0,0), constVec4);
103    buf.resf16v4 += imageAtomicMax(fimageCubeArrayv4, ivec3(0,0,0), constVec4);
104    buf.resf16v4 += imageAtomicMax(fimage3Dv4, ivec3(0,0,0), constVec4);
105
106    buf.resf16v4 += imageAtomicExchange(fimage1Dv4, int(0), constVec4);
107    buf.resf16v4 += imageAtomicExchange(fimage1DArrayv4, ivec2(0,0), constVec4);
108    buf.resf16v4 += imageAtomicExchange(fimage2Dv4, ivec2(0,0), constVec4);
109    buf.resf16v4 += imageAtomicExchange(fimage2DArrayv4, ivec3(0,0, 0), constVec4);
110    buf.resf16v4 += imageAtomicExchange(fimageCubev4, ivec3(0,0,0), constVec4);
111    buf.resf16v4 += imageAtomicExchange(fimageCubeArrayv4, ivec3(0,0,0), constVec4);
112    buf.resf16v4 += imageAtomicExchange(fimage3Dv4, ivec3(0,0,0), constVec4);
113}
114