yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type 2//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_0 -output-using-type 3//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -cuda -shaderobj -output-using-type 4//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -cpu -shaderobj -output-using-type 5//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -wgpu -output-using-type 6 7 8interface IFoo 9{ 10 associatedtype FooType : IFoo; 11} 12 13extension float : IFoo 14{ 15 typedef float FooType; 16} 17 18__generic<T:IFoo, let N:int> 19extension Array<T, N> : IFoo 20{ 21 typedef Array<T.FooType, N> FooType; 22} 23 24__generic<T:IFoo, let N:int> 25extension vector<T, N> : IFoo 26{ 27 typedef vector<T.FooType, N> FooType; 28} 29 30__generic<T:IFoo, let N:int, let M:int> 31extension matrix<T, N, M> : IFoo 32{ 33 typedef matrix<T.FooType, N, M> FooType; 34} 35 36struct WrappedBuffer<T : IFoo> 37{ 38 StructuredBuffer<T> buffer; 39 int shape; 40 41 T get(int idx) { return buffer[idx]; } 42} 43 44 45struct GradInBuffer<T : IFoo> 46{ 47 WrappedBuffer<T.FooType> wrapBuffer; 48} 49 50struct CallData 51{ 52 GradInBuffer<float[2]> grad_in1; 53 GradInBuffer<vector<float, 2>> grad_in2; 54 GradInBuffer<float2x2> grad_in3; 55} 56 57 58//TEST_INPUT: set call_data.grad_in1.wrapBuffer.buffer = ubuffer(data=[1.0 2.0 3.0 4.0], stride=4); 59//TEST_INPUT: set call_data.grad_in2.wrapBuffer.buffer = ubuffer(data=[5.0 6.0 7.0 8.0], stride=4); 60//TEST_INPUT: set call_data.grad_in3.wrapBuffer.buffer = ubuffer(data=[1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0], stride=4); 61ParameterBlock<CallData> call_data; 62 63 64//TEST_INPUT:ubuffer(data=[0.0 0.0 0.0 0.0 0.0 0.0 0.0], stride=4):out, name outputBuffer 65RWStructuredBuffer<float> outputBuffer; 66 67 68[shader("compute")] 69[numthreads(1, 1, 1)] 70void computeMain() 71{ 72 float[2] data1 = call_data.grad_in1.wrapBuffer.buffer[0]; 73 float[2] data2 = call_data.grad_in1.wrapBuffer.get(1); 74 outputBuffer[0] = data1[0]; 75 outputBuffer[1] = data2[0]; 76 77 vector<float, 2> data3 = call_data.grad_in2.wrapBuffer.buffer[0]; 78 vector<float, 2> data4 = call_data.grad_in2.wrapBuffer.get(1); 79 outputBuffer[2] = data3[0]; 80 outputBuffer[3] = data4[0]; 81 82 float2x2 data5 = call_data.grad_in3.wrapBuffer.buffer[0]; 83 float2x2 data6 = call_data.grad_in3.wrapBuffer.get(1); 84 outputBuffer[4] = data5[0][0]; 85 outputBuffer[5] = data6[0][0]; 86}