yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
ffd58977b
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:SIMPLE(filecheck=CHECK_HLSL): -allow-glsl -stage compute -entry computeMain -target hlsl -DTARGET_HLSL 4 5// not testing cuda due to missing impl 6//DISABLE_TEST:SIMPLE(filecheck=CHECK_CUDA): -allow-glsl -stage compute -entry computeMain -target cuda -DTARGET_CUDA 7// not testing cpp due to missing impl 8//DISABLE_TEST:SIMPLE(filecheck=CHECK_CPP): -allow-glsl -stage compute -entry computeMain -target cpp -DTARGET_CPP 9 10//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl 11//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl -emit-spirv-directly 12//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF):-wgpu -compute -entry computeMain -allow-glsl -xslang -DWGPU 13 14// Not testing because CI runners may not support Metal's intrinsics. 15//DISABLE_TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF):-metal -compute -entry computeMain -allow-glsl -xslang -DMETAL 16 17#version 430 18 19//TEST_INPUT:ubuffer(data=[9], stride=4):name=inputBuffer 20buffer MyBlockName 21{ 22 uint data[]; 23} inputBuffer; 24 25//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer 26buffer MyBlockName2 27{ 28 uint data[]; 29} outputBuffer; 30 31layout(local_size_x = 32) in; 32 33__generic<T : __BuiltinLogicalType> 34bool test1AllEqual() { 35 return true 36 & subgroupAllEqual(T(1)) == true 37 & subgroupAllEqual(T(gl_GlobalInvocationID.x)) == false 38 ; 39} 40__generic<T : __BuiltinLogicalType, let N : int> 41bool testVAllEqual() { 42 typealias gvec = vector<T, N>; 43 44 return true 45 & subgroupAllEqual(gvec(T(1))) == true 46 & subgroupAllEqual(gvec(T(gl_GlobalInvocationID.x))) == false 47 ; 48} 49 50__generic<T : __BuiltinFloatingPointType> 51bool test1AllEqual() { 52 return true 53 & subgroupAllEqual(T(1)) == true 54 & subgroupAllEqual(T(gl_GlobalInvocationID.x)) == false 55 ; 56} 57__generic<T : __BuiltinFloatingPointType, let N : int> 58bool testVAllEqual() { 59 typealias gvec = vector<T, N>; 60 61 return true 62 & subgroupAllEqual(gvec(T(1))) == true 63 & subgroupAllEqual(gvec(T(gl_GlobalInvocationID.x))) == false 64 ; 65} 66bool testAllEqual() { 67 return true 68 & test1AllEqual<float>() 69 & testVAllEqual<float, 2>() 70 & testVAllEqual<float, 3>() 71 & testVAllEqual<float, 4>() 72 & test1AllEqual<double>() // WARNING: intel GPU's lack FP64 support 73 & testVAllEqual<double, 2>() 74 & testVAllEqual<double, 3>() 75 & testVAllEqual<double, 4>() 76 & test1AllEqual<half>() 77 & testVAllEqual<half, 2>() 78 & testVAllEqual<half, 3>() 79 & testVAllEqual<half, 4>() 80 & test1AllEqual<int>() 81 & testVAllEqual<int, 2>() 82 & testVAllEqual<int, 3>() 83 & testVAllEqual<int, 4>() 84 & test1AllEqual<int8_t>() 85 & testVAllEqual<int8_t, 2>() 86 & testVAllEqual<int8_t, 3>() 87 & testVAllEqual<int8_t, 4>() 88 & test1AllEqual<int16_t>() 89 & testVAllEqual<int16_t, 2>() 90 & testVAllEqual<int16_t, 3>() 91 & testVAllEqual<int16_t, 4>() 92 & test1AllEqual<int64_t>() 93 & testVAllEqual<int64_t, 2>() 94 & testVAllEqual<int64_t, 3>() 95 & testVAllEqual<int64_t, 4>() 96 & test1AllEqual<uint>() 97 & testVAllEqual<uint, 2>() 98 & testVAllEqual<uint, 3>() 99 & testVAllEqual<uint, 4>() 100 & test1AllEqual<uint8_t>() 101 & testVAllEqual<uint8_t, 2>() 102 & testVAllEqual<uint8_t, 3>() 103 & testVAllEqual<uint8_t, 4>() 104 & test1AllEqual<uint16_t>() 105 & testVAllEqual<uint16_t, 2>() 106 & testVAllEqual<uint16_t, 3>() 107 & testVAllEqual<uint16_t, 4>() 108 & test1AllEqual<uint64_t>() 109 & testVAllEqual<uint64_t, 2>() 110 & testVAllEqual<uint64_t, 3>() 111 & testVAllEqual<uint64_t, 4>() 112 & test1AllEqual<bool>() 113 & testVAllEqual<bool, 2>() 114 & testVAllEqual<bool, 3>() 115 & testVAllEqual<bool, 4>() 116 ; 117} 118 119[[ForceInline]] 120void MyBarrier() 121{ 122#if defined(WGPU) 123 GroupMemoryBarrier(); 124#else 125 subgroupBarrier(); 126#endif 127} 128 129[shader("compute")] 130void computeMain() 131{ 132 //seperate tests since testing concurrency 133 134 // one is true, rest false, positive 135 outputBuffer.data[0] = 1; 136 137#if defined(WGPU) 138 // There is no subgroup barrier for WGSL. 139 // And workgroup barrier requries non uniform control flow. 140 bool t1 = true; 141#else 142 bool t1 = inputBuffer.data[0] == gl_GlobalInvocationID.x; 143#endif 144 145 if (subgroupAny(t1)) 146 { 147 outputBuffer.data[0] = 2; 148 } 149 MyBarrier(); 150 151 // all false, negative 152 outputBuffer.data[1] = 1; 153 t1 = false; 154 if (!subgroupAny(t1)) 155 { 156 outputBuffer.data[1] = 2; 157 } 158 MyBarrier(); 159 160 // all true, positive 161 outputBuffer.data[2] = 1; 162 t1 = true; 163 if (subgroupAll(t1)) 164 { 165 outputBuffer.data[2] = 2; 166 } 167 MyBarrier(); 168 169 // all false, negative 170 outputBuffer.data[3] = 1; 171 t1 = false; 172 if (!subgroupAll(t1)) 173 { 174 outputBuffer.data[3] = 2; 175 } 176 MyBarrier(); 177 178 outputBuffer.data[4] = 1; 179 // All equal intrinsic is not supported on WGSL as of time of writing. 180#if !defined(WGPU) && !defined(METAL) 181 if (testAllEqual()) 182#endif 183 { 184 outputBuffer.data[4] = 2; 185 } 186 MyBarrier(); 187 188 // CHECK_GLSL: void main( 189 // CHECK_SPV: OpEntryPoint 190 // CHECK_HLSL: void computeMain( 191 // CHECK_CUDA: void computeMain( 192 // CHECK_CPP: void _computeMain( 193 // BUF: 2 194 // BUF-NEXT: 2 195 // BUF-NEXT: 2 196 // BUF-NEXT: 2 197 // BUF-NEXT: 2 198}