yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
ae1a5e408
master
1//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage compute -entry computeMain -target glsl 2//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -stage compute -entry computeMain -target spirv -emit-spirv-directly 3//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl 4//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl -emit-spirv-directly 5 6// shader_atomic_float2 is currently a very new extension; most hardware lacks 7// this extension and will fail this test if attempting to use atomic_float2 8// operations. 9// #define TEST_when_shader_atomic_float2_is_available 10 11//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer 12buffer MyBlockName2 13{ 14 uint data[1]; 15} outputBuffer; 16 17layout(local_size_x = 1) in; 18 19//TEST_INPUT: set image_1d = RWTexture1D(format=R32Float, size=4, content=one, mipMaps = 1) 20uniform layout(binding=0,r32f) image1D image_1d; 21//TEST_INPUT: set image_buffer = RWTextureBuffer(format=R32Float, stride=4, data=[1.0f 1.0f 1.0f 1.0f]) 22uniform layout(binding=1,r32f) imageBuffer image_buffer; 23//TEST_INPUT: set image_1dArray = RWTexture1D(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2) 24uniform layout(binding=2,r32f) image1DArray image_1dArray; 25//TEST_INPUT: set image_2d = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1) 26uniform layout(binding=3,r32f) image2D image_2d; 27//TEST_INPUT: set image_2dRect = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1) 28uniform layout(binding=4,r32f) image2DRect image_2dRect; 29//TEST_INPUT: set image_2dMultiSample = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1, sampleCount = two) 30uniform layout(binding=5,r32f) image2DMS image_2dMultiSample; 31//TEST_INPUT: set image_2dArray = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2) 32uniform layout(binding=6,r32f) image2DArray image_2dArray; 33//TEST_INPUT: set image_3d = RWTexture3D(format=R32Float, size=4, content=one, mipMaps = 1) 34uniform layout(binding=7,r32f) image3D image_3d; 35//TEST_INPUT: set image_cube = RWTextureCube(format=R32Float, size=4, content=one, mipMaps = 1) 36uniform layout(binding=8,r32f) imageCube image_cube; 37//TEST_INPUT: set image_cubeArray = RWTextureCube(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2) 38uniform layout(binding=9,r32f) imageCubeArray image_cubeArray; 39//TEST_INPUT: set image_2dMultiSampleArray = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2, sampleCount = two) 40uniform layout(binding=10,r32f) image2DMSArray image_2dMultiSampleArray; 41 42bool checkAllImageSize() 43{ 44 return true 45 && imageSize(image_1d) == int(4) 46 && imageSize(image_buffer) == int(4) 47 && imageSize(image_1dArray) == ivec2(4, 2) 48 && imageSize(image_2d) == ivec2(4) 49 && imageSize(image_2dArray) == ivec3(4, 4, 2) 50 && imageSize(image_2dRect) == ivec2(4) 51 && imageSize(image_2dMultiSample) == ivec2(4) 52 && imageSize(image_3d) == ivec3(4) 53 && imageSize(image_cube) == ivec2(4) 54 && imageSize(image_cubeArray) == ivec3(4, 4, 2) 55 && imageSize(image_2dMultiSampleArray) == ivec3(4, 4, 2) 56 ; 57} 58bool checkAllImageLoad() 59{ 60 return true 61 && imageLoad(image_1d, 0).x == 1 62 && imageLoad(image_buffer, 0).x == 1 63 && imageLoad(image_1dArray, ivec2(0)).x == 1 64 && imageLoad(image_2d, ivec2(0)).x == 1 65 && imageLoad(image_2dRect, ivec2(0)).x == 1 66 && imageLoad(image_2dMultiSample, ivec2(0), 1).x == 1 67 && imageLoad(image_2dArray, ivec3(0)).x == 1 68 && imageLoad(image_3d, ivec3(0)).x == 1 69 && imageLoad(image_cube, ivec3(0)).x == 1 70 && imageLoad(image_cubeArray, ivec3(0)).x == 1 71 && imageLoad(image_cubeArray, ivec3(0)).x == 1 72 && imageLoad(image_2dMultiSampleArray, ivec3(0), 1).x == 1 73 ; 74} 75bool resetAllImageValues() 76{ 77 imageStore(image_1d, 0, vec4(1)); 78 imageStore(image_buffer, 0, vec4(1)); 79 imageStore(image_1dArray, ivec2(0), vec4(1)); 80 imageStore(image_2d, ivec2(0), vec4(1)); 81 imageStore(image_2dRect, ivec2(0), vec4(1)); 82 imageStore(image_2dMultiSample, ivec2(0), 1, vec4(1)); 83 imageStore(image_2dArray, ivec3(0), vec4(1)); 84 imageStore(image_3d, ivec3(0), vec4(1)); 85 imageStore(image_cube, ivec3(0), vec4(1)); 86 imageStore(image_cubeArray, ivec3(0), vec4(1)); 87 imageStore(image_2dMultiSampleArray, ivec3(0), 1, vec4(1)); 88 return true; 89} 90float load_image_1d() 91{ 92 return imageLoad(image_1d, 0).x; 93} 94float load_image_buffer() 95{ 96 return imageLoad(image_buffer, 0).x; 97} 98float load_image_1dArray() 99{ 100 return imageLoad(image_1dArray, ivec2(0)).x; 101} 102float load_image_2d() 103{ 104 return imageLoad(image_2d, ivec2(0)).x; 105} 106float load_image_2dRect() 107{ 108 return imageLoad(image_2dRect, ivec2(0)).x; 109} 110float load_image_2dMultiSample() 111{ 112 return imageLoad(image_2dMultiSample, ivec2(0), 1).x; 113} 114float load_image_2dArray() 115{ 116 return imageLoad(image_2dArray, ivec3(0)).x; 117} 118float load_image_3d() 119{ 120 return imageLoad(image_3d, ivec3(0)).x; 121} 122float load_image_cube() 123{ 124 return imageLoad(image_cube, ivec3(0)).x; 125} 126float load_image_cubeArray() 127{ 128 return imageLoad(image_cubeArray, ivec3(0)).x; 129} 130float load_image_2dMultiSampleArray() 131{ 132 return imageLoad(image_2dMultiSampleArray, ivec3(0), 1).x; 133} 134// requires ImageLoad test to pass 135bool checkAllImageStore() 136{ 137 bool loadCheck = true; 138 imageStore(image_1d, 0, vec4(0)); 139 loadCheck = loadCheck && load_image_1d() == 0; 140 imageStore(image_buffer, 0, vec4(0)); 141 loadCheck = loadCheck && load_image_buffer() == 0; 142 imageStore(image_1dArray, ivec2(0), vec4(0)); 143 loadCheck = loadCheck && load_image_1dArray() == 0; 144 imageStore(image_2d, ivec2(0), vec4(0)); 145 loadCheck = loadCheck && load_image_2d() == 0; 146 imageStore(image_2dRect, ivec2(0), vec4(0)); 147 loadCheck = loadCheck && load_image_2dRect() == 0; 148 imageStore(image_2dMultiSample, ivec2(0), 1, vec4(0)); 149 loadCheck = loadCheck && load_image_2dMultiSample() == 0; 150 imageStore(image_2dArray, ivec3(0), vec4(0)); 151 loadCheck = loadCheck && load_image_2dArray() == 0; 152 imageStore(image_3d, ivec3(0), vec4(0)); 153 loadCheck = loadCheck && load_image_3d() == 0; 154 imageStore(image_cube, ivec3(0), vec4(0)); 155 loadCheck = loadCheck && load_image_cube() == 0; 156 imageStore(image_cubeArray, ivec3(0), vec4(0)); 157 loadCheck = loadCheck && load_image_cubeArray() == 0; 158 imageStore(image_2dMultiSampleArray, ivec3(0), 1, vec4(0)); 159 loadCheck = loadCheck && load_image_2dMultiSampleArray() == 0; 160 resetAllImageValues(); 161 return loadCheck; 162} 163bool checkAllImageSamples() 164{ 165 resetAllImageValues(); 166 return true 167 && imageSamples(image_2dMultiSample) == 2 168 && imageSamples(image_2dMultiSampleArray) == 2 169 ; 170} 171bool checkAllImageAtomicAdd() 172{ 173 resetAllImageValues(); 174 return true 175 && imageAtomicAdd(image_1d, 0, 0.0f) == 1 176 && load_image_1d() == 1 177 && imageAtomicAdd(image_buffer, 0, 2.0f) == 1 178 && load_image_buffer() == 3 179 && imageAtomicAdd(image_1dArray, ivec2(0), 0.0f) == 1 180 && load_image_1dArray() == 1 181 && imageAtomicAdd(image_2d, ivec2(0), 2.0f) == 1 182 && load_image_2d() == 3 183 && imageAtomicAdd(image_2dRect, ivec2(0), 2.0f) == 1 184 && load_image_2dRect() == 3 185 && imageAtomicAdd(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1 186 && load_image_2dMultiSample() == 3 187 && imageAtomicAdd(image_2dArray, ivec3(0), 0.0f) == 1 188 && load_image_2dArray() == 1 189 && imageAtomicAdd(image_3d, ivec3(0), 2.0f) == 1 190 && load_image_3d() == 3 191 && imageAtomicAdd(image_cube, ivec3(0), 2.0f) == 1 192 && load_image_cube() == 3 193 && imageAtomicAdd(image_cubeArray, ivec3(0), 2.0f) == 1 194 && load_image_cubeArray() == 3 195 && imageAtomicAdd(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1 196 && load_image_2dMultiSampleArray() == 3 197 ; 198} 199bool checkAllImageAtomicExchange() 200{ 201 resetAllImageValues(); 202 return true 203 && imageAtomicExchange(image_1d, 0, 0.0f) == 1 204 && load_image_1d() == 0 205 && imageAtomicExchange(image_buffer, 0, 2.0f) == 1 206 && load_image_buffer() == 2 207 && imageAtomicExchange(image_1dArray, ivec2(0), 0.0f) == 1 208 && load_image_1dArray() == 0 209 && imageAtomicExchange(image_2d, ivec2(0), 2.0f) == 1 210 && load_image_2d() == 2 211 && imageAtomicExchange(image_2dRect, ivec2(0), 2.0f) == 1 212 && load_image_2dRect() == 2 213 && imageAtomicExchange(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1 214 && load_image_2dMultiSample() == 2 215 && imageAtomicExchange(image_2dArray, ivec3(0), 0.0f) == 1 216 && load_image_2dArray() == 0 217 && imageAtomicExchange(image_3d, ivec3(0), 2.0f) == 1 218 && load_image_3d() == 2 219 && imageAtomicExchange(image_cube, ivec3(0), 2.0f) == 1 220 && load_image_cube() == 2 221 && imageAtomicExchange(image_cubeArray, ivec3(0), 2.0f) == 1 222 && load_image_cubeArray() == 2 223 && imageAtomicExchange(image_2dMultiSampleArray, ivec3(0), 1, 2.0f) == 1 224 && load_image_2dMultiSampleArray() == 2 225 ; 226} 227#ifdef TEST_when_shader_atomic_float2_is_available 228bool checkAllImageAtomicMin() 229{ 230 resetAllImageValues(); 231 return true 232 && imageAtomicMin(image_1d, 0, 0.0f) == 1 233 && load_image_1d() == 0 234 && imageAtomicMin(image_buffer, 0, 2.0f) == 1 235 && load_image_buffer() == 1 236 && imageAtomicMin(image_1dArray, ivec2(0), 0.0f) == 1 237 && load_image_1dArray() == 0 238 && imageAtomicMin(image_2d, ivec2(0), 2.0f) == 1 239 && load_image_2d() == 1 240 && imageAtomicMin(image_2dRect, ivec2(0), 2.0f) == 1 241 && load_image_2dRect() == 1 242 && imageAtomicMin(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1 243 && load_image_2dMultiSample() == 1 244 && imageAtomicMin(image_2dArray, ivec3(0), 0.0f) == 1 245 && load_image_2dArray() == 0 246 && imageAtomicMin(image_3d, ivec3(0), 2.0f) == 1 247 && load_image_3d() == 1 248 && imageAtomicMin(image_cube, ivec3(0), 2.0f) == 1 249 && load_image_cube() == 1 250 && imageAtomicMin(image_cubeArray, ivec3(0), 2.0f) == 1 251 && load_image_cubeArray() == 1 252 && imageAtomicMin(image_2dMultiSampleArray, ivec3(0), 1, 2.0f) == 1 253 && load_image_2dMultiSampleArray() == 1 254 ; 255} 256bool checkAllImageAtomicMax() 257{ 258 resetAllImageValues(); 259 return true 260 && imageAtomicMax(image_1d, 0, 0) == 1 261 && load_image_1d() == 1 262 && imageAtomicMax(image_buffer, 0, 2) == 1 263 && load_image_buffer() == 2 264 && imageAtomicMax(image_1dArray, ivec2(0), 0.0f) == 1 265 && load_image_1dArray() == 1 266 && imageAtomicMax(image_2d, ivec2(0), 2.0f) == 1 267 && load_image_2d() == 2 268 && imageAtomicMax(image_2dRect, ivec2(0), 2.0f) == 1 269 && load_image_2dRect() == 2 270 && imageAtomicMax(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1 271 && load_image_2dMultiSample() == 2 272 && imageAtomicMax(image_2dArray, ivec3(0), 0.0f) == 1 273 && load_image_2dArray() == 1 274 && imageAtomicMax(image_3d, ivec3(0), 2.0f) == 1 275 && load_image_3d() == 2 276 && imageAtomicMax(image_cube, ivec3(0), 2.0f) == 1 277 && load_image_cube() == 2 278 && imageAtomicMax(image_cubeArray, ivec3(0), 2.0f) == 1 279 && load_image_cubeArray() == 2 280 && imageAtomicMax(image_2dMultiSampleArray, ivec3(0), 1, 2.0f) == 1 281 && load_image_2dMultiSampleArray() == 2 282 ; 283} 284#endif // #ifdef TEST_when_shader_atomic_float2_is_available 285 286// CHECK_GLSL: void main( 287// CHECK_SPV: OpEntryPoint 288void computeMain() 289{ 290 outputBuffer.data[0] = true 291 && checkAllImageSize() 292 && checkAllImageLoad() 293 && checkAllImageStore() 294 && checkAllImageSamples() 295 && checkAllImageAtomicAdd() 296 && checkAllImageAtomicExchange() 297#ifdef TEST_when_shader_atomic_float2_is_available 298 && checkAllImageAtomicMin() 299 && checkAllImageAtomicMax() 300#endif // #ifdef TEST_when_shader_atomic_float2_is_available 301 ; 302 // BUF: 1 303}