yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
d10732742
master
1//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type 2//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type 3//TEST(compute):COMPARE_COMPUTE_EX:-wgpu -compute -output-using-type 4//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type 5 6//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer 7RWStructuredBuffer<float> outputBuffer; 8 9typedef DifferentialPair<float> dpfloat; 10typedef DifferentialPair<float2> dpfloat2; 11 12[BackwardDifferentiable] 13float diffCopysign(float x, float y) 14{ 15 return copysign(x, y); 16} 17 18[BackwardDifferentiable] 19float2 diffCopysign(float2 x, float2 y) 20{ 21 return copysign(x, y); 22} 23 24[numthreads(1, 1, 1)] 25void computeMain(uint3 dispatchThreadID: SV_DispatchThreadID) 26{ 27 // Test 1: forward diff copysign(3.0, -1.0) with dx=2.0, dy=1.0 28 { 29 dpfloat dpx = dpfloat(3.0, 2.0); 30 dpfloat dpy = dpfloat(-1.0, 1.0); 31 dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy); 32 outputBuffer[0] = res.p; 33 outputBuffer[1] = res.d; 34 } 35 36 // Test 2: forward diff copysign(-2.0, 4.0) with dx=1.5, dy=-0.5 37 { 38 dpfloat dpx = dpfloat(-2.0, 1.5); 39 dpfloat dpy = dpfloat(4.0, -0.5); 40 dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy); 41 outputBuffer[2] = res.p; 42 outputBuffer[3] = res.d; 43 } 44 45 // Test 3: forward diff copysign(0.0, -1.0) with dx=3.0, dy=2.0 46 { 47 dpfloat dpx = dpfloat(0.0, 3.0); 48 dpfloat dpy = dpfloat(-1.0, 2.0); 49 dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy); 50 outputBuffer[4] = res.p; 51 outputBuffer[5] = res.d; 52 } 53 54 // Test 4: vector forward diff 55 { 56 dpfloat2 dpx = dpfloat2(float2(5.0, -3.0), float2(1.0, 2.0)); 57 dpfloat2 dpy = dpfloat2(float2(-2.0, 4.0), float2(0.5, -1.0)); 58 dpfloat2 res = __fwd_diff(diffCopysign)(dpx, dpy); 59 outputBuffer[6] = res.p[0]; 60 outputBuffer[7] = res.d[0]; 61 outputBuffer[8] = res.p[1]; 62 outputBuffer[9] = res.d[1]; 63 } 64 65 // Test 5: backward diff copysign(4.0, -2.0) 66 { 67 dpfloat dpx = dpfloat(4.0, 0.0); 68 dpfloat dpy = dpfloat(-2.0, 0.0); 69 __bwd_diff(diffCopysign)(dpx, dpy, 1.0); 70 outputBuffer[10] = dpx.d; 71 outputBuffer[11] = dpy.d; 72 } 73 74 // Test 6: backward diff copysign(-3.0, 5.0) 75 { 76 dpfloat dpx = dpfloat(-3.0, 0.0); 77 dpfloat dpy = dpfloat(5.0, 0.0); 78 __bwd_diff(diffCopysign)(dpx, dpy, 2.0); 79 outputBuffer[12] = dpx.d; 80 outputBuffer[13] = dpy.d; 81 } 82 83 // Test 7: copysign with y=0 - derivative should be 0 84 { 85 dpfloat dpx = dpfloat(3.0, 2.0); 86 dpfloat dpy = dpfloat(0.0, 1.0); 87 dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy); 88 outputBuffer[14] = res.p; 89 outputBuffer[15] = res.d; 90 } 91 92 // Test 8: copysign with x=0 - derivative should be 0 93 { 94 dpfloat dpx = dpfloat(0.0, 2.0); 95 dpfloat dpy = dpfloat(-1.0, 1.0); 96 dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy); 97 outputBuffer[16] = res.p; 98 outputBuffer[17] = res.d; 99 } 100 101 // Test 9: vector backward diff 102 { 103 dpfloat2 dpx = dpfloat2(float2(2.0, -1.0), float2(0.0, 0.0)); 104 dpfloat2 dpy = dpfloat2(float2(-3.0, 4.0), float2(0.0, 0.0)); 105 __bwd_diff(diffCopysign)(dpx, dpy, float2(1.0, 3.0)); 106 outputBuffer[18] = dpx.d[0]; 107 outputBuffer[19] = dpx.d[1]; 108 } 109}