yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
d10732742
master
1//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type 2//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type 3//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type 4 5//TEST_INPUT:ubuffer(data=[0 0 0], stride=4):out,name=outputBuffer 6RWStructuredBuffer<float> outputBuffer; 7 8struct A : IDifferentiable 9{ 10 float data[3]; 11 12 [Differentiable] 13 __init() 14 { 15 [ForceUnroll] for (uint i = 0; i < 3; i++) data[i] = 0.f; 16 } 17 18 [mutating] 19 [Differentiable] 20 void write(float value, inout uint offset) 21 { 22 data[offset++] = value; 23 } 24 25 [mutating] 26 [Differentiable] 27 void write<let N : int>(vector<float, N> value, inout uint offset) 28 { 29 [ForceUnroll] for (uint i = 0; i < N; i++) write(value[i], offset); 30 } 31} 32 33[Differentiable] 34float3 run(float3 x) 35{ 36 A a = A(); 37 uint offset = 0; 38 a.write(x, offset); 39 return float3(a.data[0], a.data[1], a.data[2]); 40} 41 42[numthreads(1, 1, 1)] 43void computeMain(uint3 dispatchThreadID: SV_DispatchThreadID) 44{ 45 DifferentialPair<float3> dp = diffPair(float3(1.f, 2.f, 3.f), float3(0.f)); 46 float3 dOut = float3(1.f, 0.5f, 0.1f); 47 bwd_diff(run)(dp, dOut); 48 outputBuffer[0] = dp.d[0]; 49 outputBuffer[1] = dp.d[1]; 50 outputBuffer[2] = dp.d[2]; 51}