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