yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1//TEST(compute):SIMPLE(filecheck=CHECK_SPV): -target spirv 2//TEST(compute):SIMPLE(filecheck=CHECK_GLSL): -target glsl 3//TEST(compute):SIMPLE(filecheck=CHECK_METAL): -target metal 4//TEST(compute):SIMPLE(filecheck=CHECK_WGSL): -target wgsl 5 6//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -emit-spirv-via-glsl -output-using-type 7//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -emit-spirv-directly -output-using-type -allow-glsl 8//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -profile cs_6_6 -dx12 -shaderobj -render-feature hardware-device -output-using-type 9//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-metal -compute -shaderobj -output-using-type 10//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cpu -compute -shaderobj -output-using-type -allow-glsl 11 12// 16 bit variants are not supported by WGSL. 13//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-wgpu -compute -shaderobj -xslang -DWGSL -render-feature half -output-using-type 14// Debug info for inlining errors can be given out, so disable them for this test. 15//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cuda -compute -g0 -output-using-type 16 17//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer 18RWStructuredBuffer<uint> outputBuffer; 19 20bool verifyResult<T: IFloat> (T expected, T actual, T tolerance) 21{ 22 return (expected - tolerance) <= actual && actual <= (expected + tolerance); 23} 24 25bool verifyResultVector<T: IFloat, let N: int>(vector<T, N> expected, vector<T, N> actual, T tolerance = T(0.01)) 26{ 27 bool isValid = true; 28 for (int i = 0; i < N; ++i) 29 isValid = isValid && verifyResult(expected[i], actual[i], tolerance); 30 return isValid; 31} 32 33[numthreads(1, 1, 1)] 34void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) 35{ 36 uint index = 0U; 37 38 // 39 // Unorm4x8 40 // 41 // CHECK_SPV: OpExtInst{{.*}} PackUnorm4x8 42 // CHECK_SPV: OpExtInst{{.*}} UnpackUnorm4x8 43 // 44 // CHECK_GLSL: (unpackUnorm4x8 45 // CHECK_GLSL: (packUnorm4x8 46 // 47 // CHECK_METAL: unpack_unorm4x8_to_float 48 // CHECK_METAL: pack_float_to_unorm4x8 49 // CHECK_METAL: unpack_unorm4x8_to_half 50 // CHECK_METAL: pack_half_to_unorm4x8 51 // 52 // CHECK_WGSL: (unpack4x8unorm 53 // CHECK_WGSL: (pack4x8unorm 54 // 55 float4 unorm4x8Expected = float4(0.777, 0.233, 0.931, 0.777); 56 uint unorm4x8Packed = packUnorm4x8(unorm4x8Expected); 57 float4 unorm4x8Actual = unpackUnorm4x8ToFloat(unorm4x8Packed); 58 // BUF: 1 59 outputBuffer[index++] = verifyResultVector(unorm4x8Expected, unorm4x8Actual); 60 61 half4 unorm4x8HalfExpected = half4(0.123h, 0.456h, 0.789h, 0.321h); 62 uint unorm4x8HalfPacked = packUnorm4x8(unorm4x8HalfExpected); 63 half4 unorm4x8HalfActual = unpackUnorm4x8ToHalf(unorm4x8HalfPacked); 64 // BUF-NEXT: 1 65 outputBuffer[index++] = verifyResultVector(unorm4x8HalfExpected, unorm4x8HalfActual); 66 67 // 68 // Snorm4x8 69 // 70 // CHECK_SPV: OpExtInst{{.*}} PackSnorm4x8 71 // CHECK_SPV: OpExtInst{{.*}} UnpackSnorm4x8 72 // 73 // CHECK_GLSL: (unpackSnorm4x8 74 // CHECK_GLSL: (packSnorm4x8 75 // 76 // CHECK_METAL: unpack_snorm4x8_to_float 77 // CHECK_METAL: pack_float_to_snorm4x8 78 // CHECK_METAL: unpack_snorm4x8_to_half 79 // CHECK_METAL: pack_half_to_snorm4x8 80 // 81 // CHECK_WGSL: (unpack4x8snorm 82 // CHECK_WGSL: (pack4x8snorm 83 // 84 float4 snorm4x8Expected = float4(-0.500, 0.250, -0.750, 0.999); 85 uint snorm4x8Packed = packSnorm4x8(snorm4x8Expected); 86 float4 snorm4x8Actual = unpackSnorm4x8ToFloat(snorm4x8Packed); 87 // BUF-NEXT: 1 88 outputBuffer[index++] = verifyResultVector(snorm4x8Expected, snorm4x8Actual); 89 90 half4 snorm4x8HalfExpected = half4(-0.333h, 0.666h, -1.000h, 0.500h); 91 uint snorm4x8HalfPacked = packSnorm4x8(snorm4x8HalfExpected); 92 half4 snorm4x8HalfActual = unpackSnorm4x8ToHalf(snorm4x8HalfPacked); 93 // BUF-NEXT: 1 94 outputBuffer[index++] = verifyResultVector(snorm4x8HalfExpected, snorm4x8HalfActual); 95 96 // 97 // Unorm2x16 98 // 99 // CHECK_SPV: OpExtInst{{.*}} PackUnorm2x16 100 // CHECK_SPV: OpExtInst{{.*}} UnpackUnorm2x16 101 // 102 // CHECK_GLSL: (unpackUnorm2x16 103 // CHECK_GLSL: (packUnorm2x16 104 // 105 // CHECK_METAL: unpack_unorm2x16_to_float 106 // CHECK_METAL: pack_float_to_unorm2x16 107 // CHECK_METAL: unpack_unorm2x16_to_half 108 // CHECK_METAL: pack_half_to_unorm2x16 109 // 110 // CHECK_WGSL: (unpack2x16unorm 111 // CHECK_WGSL: (pack2x16unorm 112 // 113 float2 unorm2x16Expected = float2(0.1234, 0.8765); 114 uint unorm2x16Packed = packUnorm2x16(unorm2x16Expected); 115 float2 unorm2x16Actual = unpackUnorm2x16ToFloat(unorm2x16Packed); 116 // BUF-NEXT: 1 117 outputBuffer[index++] = verifyResultVector(unorm2x16Expected, unorm2x16Actual); 118 119 half2 unorm2x16HalfExpected = half2(0.7777h, 0.7777h); 120 uint unorm2x16HalfPacked = packUnorm2x16(unorm2x16HalfExpected); 121 half2 unorm2x16HalfActual = unpackUnorm2x16ToHalf(unorm2x16HalfPacked); 122 // BUF-NEXT: 1 123 outputBuffer[index++] = verifyResultVector(unorm2x16HalfExpected, unorm2x16HalfActual); 124 125 // 126 // Snorm2x16 127 // 128 // CHECK_SPV: OpExtInst{{.*}} UnpackSnorm2x16 129 // CHECK_SPV: OpExtInst{{.*}} PackSnorm2x16 130 // 131 // CHECK_GLSL: (unpackSnorm2x16 132 // CHECK_GLSL: (packSnorm2x16 133 // 134 // CHECK_METAL: unpack_snorm2x16_to_float 135 // CHECK_METAL: pack_float_to_snorm2x16 136 // CHECK_METAL: unpack_snorm2x16_to_half 137 // CHECK_METAL: pack_half_to_snorm2x16 138 // 139 // CHECK_WGSL: (unpack2x16snorm 140 // CHECK_WGSL: (pack2x16snorm 141 // 142 float2 snorm2x16Expected = float2(-0.4444, 0.8888); 143 uint snorm2x16Packed = packSnorm2x16(snorm2x16Expected); 144 float2 snorm2x16Actual = unpackSnorm2x16ToFloat(snorm2x16Packed); 145 // BUF-NEXT: 1 146 outputBuffer[index++] = verifyResultVector(snorm2x16Expected, snorm2x16Actual); 147 148 half2 snorm2x16HalfExpected = half2(-0.9999h, 0.3333h); 149 uint snorm2x16HalfPacked = packSnorm2x16(snorm2x16HalfExpected); 150 half2 snorm2x16HalfActual = unpackSnorm2x16ToHalf(snorm2x16HalfPacked); 151 // BUF-NEXT: 1 152 outputBuffer[index++] = verifyResultVector(snorm2x16HalfExpected, snorm2x16HalfActual); 153 154 // 155 // Half2x16 156 // 157 // CHECK_SPV: OpExtInst{{.*}} UnpackHalf2x16 158 // CHECK_SPV: OpExtInst{{.*}} PackHalf2x16 159 // 160 // CHECK_GLSL: (unpackHalf2x16 161 // CHECK_GLSL: (packHalf2x16 162 // 163 // CHECK_WGSL: (unpack2x16float 164 // CHECK_WGSL: (pack2x16float 165 // 166 float2 half2x16Expected = float2(130.32, -12.12); 167 uint half2x16Packed = packHalf2x16(half2x16Expected); 168 float2 half2x16Actual = unpackHalf2x16ToFloat(half2x16Packed); 169 // BUF-NEXT: 1 170 outputBuffer[index++] = verifyResultVector(half2x16Expected.x, half2x16Actual.x, 0.1); 171 172 half2 half2x16HalfExpected = half2(-2.1111h, 4450.9999h); 173 uint half2x16HalfPacked = packHalf2x16(half2x16HalfExpected); 174 half2 half2x16HalfActual = unpackHalf2x16ToHalf(half2x16HalfPacked); 175 // BUF-NEXT: 1 176 outputBuffer[index++] = verifyResultVector(half2x16HalfExpected, half2x16HalfActual); 177}