yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
5c672cef1
master
1//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type 2//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX11):-slang -compute -dx11 -shaderobj -output-using-type -render-feature hardware-device 3//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX12):-slang -compute -dx12 -shaderobj -output-using-type 4//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX12CS6):-slang -compute -dx12 -profile cs_6_0 -shaderobj -output-using-type -xslang -DCS60 5//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=VK):-vk -emit-spirv-directly -compute -shaderobj -output-using-type -render-feature hardware-device -xslang -DVK 6//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type 7 8//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one):name t1D 9Texture1D<float> t1D; 10//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one):name t2D 11Texture2D<float> t2D; 12//TEST_INPUT: Texture3D(size=4, format=D32Float, content = one):name t3D 13Texture3D<float> t3D; 14//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one):name tCube 15TextureCube<float> tCube; 16 17//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one, arrayLength=2):name t1DArray 18Texture1DArray<float> t1DArray; 19//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one, arrayLength=2):name t2DArray 20Texture2DArray<float> t2DArray; 21//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one, arrayLength=2):name tCubeArray 22TextureCubeArray<float> tCubeArray; 23 24//TEST_INPUT: Texture2D(size=4, content = one):name t2D_RGBA 25Texture2D<float> t2D_RGBA; 26//TEST_INPUT: Texture2D(size=4, content = one, arrayLength=2):name t2DArray_RGBA 27Texture2DArray<float> t2DArray_RGBA; 28//TEST_INPUT: TextureCube(size=4, content = one):name tCube_RGBA 29TextureCube<float> tCube_RGBA; 30//TEST_INPUT: TextureCube(size=4, content = one, arrayLength=2):name tCubeArray_RGBA 31TextureCubeArray<float> tCubeArray_RGBA; 32 33//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one):name d1D 34DepthTexture1D d1D; 35//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one):name d2D 36DepthTexture2D d2D; 37//TEST_INPUT: Texture3D(size=4, format=D32Float, content = one):name d3D 38DepthTexture3D d3D; 39//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one):name dCube 40DepthTextureCube dCube; 41 42//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one, arrayLength=2):name d1DArray 43DepthTexture1DArray d1DArray; 44//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one, arrayLength=2):name d2DArray 45DepthTexture2DArray d2DArray; 46//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one, arrayLength=2):name dCubeArray 47DepthTextureCubeArray dCubeArray; 48 49//TEST_INPUT: Sampler:name samplerState 50SamplerState samplerState; 51//TEST_INPUT: Sampler(depthCompare):name shadowSampler 52SamplerComparisonState shadowSampler; 53 54 55//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer 56RWStructuredBuffer<float> outputBuffer; 57 58// note: the RGBA texture types are not parameterized, since the depth 59// texture element is always 'float' 60float testOperations<let isShadow : int>( 61 int idx, 62 _Texture<float, __Shape1D, 0, 0, 0, 0, isShadow, 0, 0> x1D, 63 _Texture<float, __Shape2D, 0, 0, 0, 0, isShadow, 0, 0> x2D, 64 _Texture<float, __Shape3D, 0, 0, 0, 0, isShadow, 0, 0> x3D, 65 _Texture<float, __ShapeCube, 0, 0, 0, 0, isShadow, 0, 0> xCube, 66 _Texture<float, __Shape1D, 1, 0, 0, 0, isShadow, 0, 0> x1DArray, 67 _Texture<float, __Shape2D, 1, 0, 0, 0, isShadow, 0, 0> x2DArray, 68 _Texture<float, __ShapeCube, 1, 0, 0, 0, isShadow, 0, 0> xCubeArray 69) 70{ 71 float u = idx * (1.0f / 4); 72 73 float val = 0.0f; 74 75 uint width = 0, height = 0, depth = 0; 76 float fwidth = 0.0f, fheight = 0.0f, fdepth = 0.0f; 77 uint numLevels = 0, elements = 0; 78 float fnumLevels = 0.0f, felements = 0.0f; 79 80 float clamp = 0.0f; 81 float bias = 0.0f; 82 83 uint status; 84 85 /* 86 <Template Type> Object.SampleLevel() 87 */ 88 val += x1D.SampleLevel(samplerState, u, 0); 89 val += x2D.SampleLevel(samplerState, float2(u, u), 0); 90 val += x3D.SampleLevel(samplerState, float3(u, u, u), 0); 91 val += xCube.SampleLevel(samplerState, normalize(float3(u, 1 - u, u)), 0); 92 93 val += x1DArray.SampleLevel(samplerState, float2(u, 0), 0); 94 val += x2DArray.SampleLevel(samplerState, float3(u, u, 0), 0); 95 val += xCubeArray.SampleLevel(samplerState, float4(u, u, u, 0), 0); 96 97 // Offset variant 98 // NOTE: The "cpu" profile does not like these, so it's disabled for now 99 val += x1D.SampleLevel(samplerState, u, 0, 1); 100 val += x2D.SampleLevel(samplerState, float2(u, u), 0, int2(1, 1)); 101 val += x3D.SampleLevel(samplerState, float3(u, u, u), 0, int3(1, 1, 1)); 102 103 val += x1DArray.SampleLevel(samplerState, float2(u, 0), 0, 1); 104 val += x2DArray.SampleLevel(samplerState, float3(u, u, 0), 0, int2(1, 1)); 105 106 // Status variant 107#if !defined(VK) 108 val += x1D.SampleLevel(samplerState, u, 0, 1, status); 109 val += x2D.SampleLevel(samplerState, float2(u, u), 0, int2(1, 1), status); 110 val += x3D.SampleLevel(samplerState, float3(u, u, u), 0, int3(1, 1, 1), status); 111 112 val += x1DArray.SampleLevel(samplerState, float2(u, 0), 0, 1, status); 113 val += x2DArray.SampleLevel(samplerState, float3(u, u, 0), 0, int2(1, 1), status); 114#endif 115 116 /* 117 float Object.SampleCmpLevelZero() 118 */ 119 // NOTE: These are having issues with vulkan (glsl) 120 // SampleCmpLevelZero() requires format with VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT. 121 val += x1D.SampleCmpLevelZero(shadowSampler, u, 0); 122 val += x2D.SampleCmpLevelZero(shadowSampler, float2(u, u), 0); 123 val += x1DArray.SampleCmpLevelZero(shadowSampler, float2(u, u), 0); 124 val += xCube.SampleCmpLevelZero(shadowSampler, normalize(float3(u, 1 - u, u)), 0); 125 val += x2DArray.SampleCmpLevelZero(shadowSampler, normalize(float3(u, 1 - u, u)), 0); 126 val += xCubeArray.SampleCmpLevelZero(shadowSampler, normalize(float4(u, 1-u, u, u)), 0); 127 128 // Offset variant 129 val += x1D.SampleCmpLevelZero(shadowSampler, u, 0, 0); 130 val += x2D.SampleCmpLevelZero(shadowSampler, float2(u, u), 0, int2(0, 0)); 131 // TextureCube does not have an offset version of this 132 133 // Status variant 134 #if !defined(VK) 135 136 val += x1D.SampleCmpLevelZero(shadowSampler, u, 0, 0, status); 137 val += x2D.SampleCmpLevelZero(shadowSampler, float2(u, u), 0, int2(0, 0), status); 138 139 val += x1DArray.SampleCmpLevelZero(shadowSampler, float2(u, u), 0, 0, status); 140 val += x2DArray.SampleCmpLevelZero(shadowSampler, normalize(float3(u, 1 - u, u)), 0, int2(0, 0), status); 141#endif 142 143 /* 144 float Object.SampleCmpLevel(). 145 These require SM 6.7 for dx12 but functional compute tests currently do not run with the cs_6_7, 146 hence only enable these for vk. 147 */ 148#if defined(VK) 149 float level = 1.0; 150 val += x1D.SampleCmpLevel(shadowSampler, u, 0, level); 151 val += x2D.SampleCmpLevel(shadowSampler, float2(u, u), 0, level); 152 val += x1DArray.SampleCmpLevel(shadowSampler, float2(u, u), 0, level); 153 val += xCube.SampleCmpLevel(shadowSampler, normalize(float3(u, 1 - u, u)), 0, level); 154 val += x2DArray.SampleCmpLevel(shadowSampler, normalize(float3(u, 1 - u, u)), 0, level); 155 val += xCubeArray.SampleCmpLevel(shadowSampler, normalize(float4(u, 1-u, u, u)), 0, level); 156 157 // Offset variant 158 val += x1D.SampleCmpLevel(shadowSampler, u, 0, level, 0); 159 val += x2D.SampleCmpLevel(shadowSampler, float2(u, u), 0, level, int2(0, 0)); 160#endif 161 162 /* 163 void Object.GetDimensions() 164 */ 165 x1D.GetDimensions(width); 166 val += width; 167 168 x1D.GetDimensions(fwidth); 169 val += fwidth; 170 171 x1D.GetDimensions(0, width, numLevels); 172 val += width; 173 val += numLevels; 174 175 x1D.GetDimensions(0, fwidth, fnumLevels); 176 val += fwidth; 177 val += fnumLevels; 178 179 x2D.GetDimensions(width, height); 180 val += width; 181 val += height; 182 183 x2D.GetDimensions(fwidth, fheight); 184 val += fwidth; 185 val += fheight; 186 187 x2D.GetDimensions(0, width, height, numLevels); 188 val += width; 189 val += height; 190 val += numLevels; 191 192 x2D.GetDimensions(0, fwidth, fheight, fnumLevels); 193 val += fwidth; 194 val += fheight; 195 val += fnumLevels; 196 197 x3D.GetDimensions(width, height, depth); 198 val += width; 199 val += height; 200 val += depth; 201 202 x3D.GetDimensions(fwidth, fheight, fdepth); 203 val += fwidth; 204 val += fheight; 205 val += fdepth; 206 207 x3D.GetDimensions(0, width, height, depth, numLevels); 208 val += width; 209 val += height; 210 val += depth; 211 val += numLevels; 212 213 x3D.GetDimensions(0, fwidth, fheight, fdepth, fnumLevels); 214 val += fwidth; 215 val += fheight; 216 val += fdepth; 217 val += fnumLevels; 218 219 xCube.GetDimensions(width, height); 220 val += width; 221 val += height; 222 223 xCube.GetDimensions(fwidth, fheight); 224 val += fwidth; 225 val += fheight; 226 227 xCube.GetDimensions(0, width, height, numLevels); 228 val += width; 229 val += height; 230 val += numLevels; 231 232 xCube.GetDimensions(0, fwidth, fheight, fnumLevels); 233 val += fwidth; 234 val += fheight; 235 val += fnumLevels; 236 237 x1DArray.GetDimensions(width, elements); 238 val += width; 239 val += elements; 240 241 x1DArray.GetDimensions(fwidth, felements); 242 val += fwidth; 243 val += felements; 244 245 x1DArray.GetDimensions(0, width, elements, numLevels); 246 val += width; 247 val += elements; 248 val += numLevels; 249 250 x1DArray.GetDimensions(0, fwidth, felements, fnumLevels); 251 val += fwidth; 252 val += felements; 253 val += fnumLevels; 254 255 x2DArray.GetDimensions(width, height, elements); 256 val += width; 257 val += height; 258 val += elements; 259 260 x2DArray.GetDimensions(fwidth, fheight, felements); 261 val += fwidth; 262 val += fheight; 263 val += felements; 264 265 x2DArray.GetDimensions(0, width, height, elements, numLevels); 266 val += width; 267 val += height; 268 val += elements; 269 val += numLevels; 270 271 x2DArray.GetDimensions(0, fwidth, fheight, felements, fnumLevels); 272 val += fwidth; 273 val += fheight; 274 val += felements; 275 val += fnumLevels; 276 277 xCubeArray.GetDimensions(width, height, elements); 278 val += width; 279 val += height; 280 val += elements; 281 282 // fxc 47.0: (95): error X4598: The array element count of GetDimensions on TextureCubeArray objects is unavailable on cs_5_0 283#if defined(CS60) || defined(VK) 284 xCubeArray.GetDimensions(fwidth, fheight, felements); 285 val += fwidth; 286 val += fheight; 287 val += felements; 288#endif 289 290 xCubeArray.GetDimensions(0, width, height, elements, numLevels); 291 val += width; 292 val += height; 293 val += elements; 294 val += numLevels; 295 296#if defined(CS60) || defined(VK) 297 xCubeArray.GetDimensions(0, fwidth, fheight, felements, fnumLevels); 298 val += fwidth; 299 val += fheight; 300 val += felements; 301 val += fnumLevels; 302#endif 303 304 /* 305 <Template Type>4 Object.Gather() 306 */ 307 float4 f4 = t2D_RGBA.Gather(samplerState, float2(u, u)); 308 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 309 310 f4 = tCube_RGBA.Gather(samplerState, normalize(float3(u, 1 - u, u))); 311 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 312 313 f4 = t2DArray_RGBA.Gather(samplerState, float3(u, u, 0)); 314 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 315 316 f4 = tCubeArray_RGBA.Gather(samplerState, float4(normalize(float3(u, 1 - u, u)), 0)); 317 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 318 319 // Offset variant 320 f4 = t2D_RGBA.Gather(samplerState, float2(u, u), int2(0, 0)); 321 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 322 323 f4 = t2DArray_RGBA.Gather(samplerState, float3(u, u, 0), int2(0, 0)); 324 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 325 326 // Object.GatherGreen() 327 f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2)); 328 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 329 330 f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2), int2(3, 4), int2(5, 6), int2(7, 8)); 331 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 332 333 f4 = tCubeArray_RGBA.GatherGreen(samplerState, float4(1.5, 1.5, 1.5, 1.5)); 334 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 335 336 // status variant 337#if !defined(VK) 338 f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2), status); 339 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 340 341 f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2), int2(3, 4), int2(5, 6), int2(7, 8), status); 342 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 343 344 f4 = tCubeArray_RGBA.GatherGreen(samplerState, float4(1.5, 1.5, 1.5, 1.5), status); 345 val += f4.x; val += f4.y; val += f4.z; val += f4.w; 346#endif 347 348 /* 349 ret Object.Load() 350 */ 351 val += x1D.Load(int2(0, 0)); 352 val += x2D.Load(int3(0, 0, 0)); 353 val += x3D.Load(int4(0, 0, 0, 0)); 354 355 val += x1DArray.Load(int3(0, 0, 0)); 356 val += x2DArray.Load(int4(0, 0, 0, 0)); 357 358 // Offset variant 359 val += x1D.Load(int2(0, 0), 0); 360 val += x2D.Load(int3(0, 0, 0), int2(0,0)); 361 val += x3D.Load(int4(0, 0, 0, 0), int3(0, 0, 0)); 362 363 val += x1DArray.Load(int3(0, 0, 0), 0); 364 val += x2DArray.Load(int4(0, 0, 0, 0), int2(0, 0)); 365 366 /* 367 <Template Type> Object.SampleGrad() 368 */ 369 float _ddx = 0.0f, _ddy = 0.0f; 370 371 val += x1D.SampleGrad(samplerState, 0.0f, _ddx, _ddy); 372 val += x2D.SampleGrad(samplerState, float2(u, u), float2(_ddx, _ddx), float2(_ddy, _ddy)); 373 val += x3D.SampleGrad(samplerState, float3(u, u, u), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy)); 374 val += xCube.SampleGrad(samplerState, normalize(float3(u, 1 - u, u)), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy)); 375 376 val += x1DArray.SampleGrad(samplerState, float2(0.0f, 0.0f), _ddx, _ddy); 377 val += x2DArray.SampleGrad(samplerState, float3(u, u, 0.0f), float2(_ddx, _ddx), float2(_ddy, _ddy)); 378 379 // Offset variant 380 val += x1D.SampleGrad(samplerState, 0.0f, _ddx, _ddy, 0); 381 val += x2D.SampleGrad(samplerState, float2(u, u), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0)); 382 val += x3D.SampleGrad(samplerState, float3(u, u, u), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy), int3(0, 0, 0)); 383 384 val += x1DArray.SampleGrad(samplerState, float2(0.0f, 0.0f), _ddx, _ddy, 0); 385 val += x2DArray.SampleGrad(samplerState, float3(u, u, 0.0f), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0)); 386 387 // Status variant 388#if !defined(VK) 389 val += x1D.SampleGrad(samplerState, 0.0f, _ddx, _ddy, 0, clamp, status); 390 val += x2D.SampleGrad(samplerState, float2(u, u), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0), clamp, status); 391 val += x3D.SampleGrad(samplerState, float3(u, u, u), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy), int3(0, 0, 0), clamp, status); 392 393 val += x1DArray.SampleGrad(samplerState, float2(0.0f, 0.0f), _ddx, _ddy, 0, clamp, status); 394 val += x2DArray.SampleGrad(samplerState, float3(u, u, 0.0f), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0), clamp, status); 395#endif 396 397 return val; 398} 399 400[numthreads(4, 1, 1)] 401void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) 402{ 403 int idx = dispatchThreadID.x; 404 float val = 0.0f; 405 406 val += testOperations<0>(idx, t1D, t2D, t3D, tCube, t1DArray, t2DArray, tCubeArray); 407 val += testOperations<1>(idx, d1D, d2D, d3D, dCube, d1DArray, d2DArray, dCubeArray); 408 409 outputBuffer[idx] = val; 410} 411 412// DX11: 708 413// DX11: 708 414// DX11: 708 415// DX11: 708 416// DX12: 708 417// DX12: 708 418// DX12: 708 419// DX12: 708 420// DX12CS6: 754 421// DX12CS6: 754 422// DX12CS6: 754 423// DX12CS6: 754 424// VK: 718 425// VK: 718 426// VK: 718 427// VK: 718