yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1// bit-cast-16-bit.slang 2 3//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_2 -shaderobj 4//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature int16,half 5//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj 6 7//TEST_INPUT:ubuffer(data=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16], stride=4):name inputBuffer 8RWStructuredBuffer<int> inputBuffer; 9 10int16_t readI(inout int index) { return int16_t(inputBuffer[(index++) & 0xF]); } 11uint16_t readU(inout int index) { return int16_t(inputBuffer[(index++) & 0xF]); } 12float16_t readF(inout int index) { return float16_t(float(inputBuffer[(index++) & 0xF])); } 13 14//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer 15RWStructuredBuffer<int> outputBuffer; 16 17void write(int initial, inout int index, uint value) 18{ 19 let tmp = index++; 20 if((tmp & 3) == initial) 21 { 22 outputBuffer[tmp & 0xF] = int(value); 23 } 24} 25 26void write(int initial, inout int index, uint16_t value) 27{ 28 write(initial, index, uint(value)); 29} 30 31void write(int initial, inout int index, int16_t value) 32{ 33 write(initial, index, uint(int(value))); 34} 35 36void write(int initial, inout int index, float16_t value) 37{ 38 write(initial, index, asuint(float(value))); 39} 40 41 42void test(int initial) 43{ 44 int input = initial; 45 int output = 0; 46 47 // Scalar 48 { 49 let i = readI(input); 50 let u = readU(input); 51 let f = readF(input); 52 53 // int->float 54 let a = asfloat16(i); 55 write(initial, output, a); 56 57 // float->uint 58 let b = asuint16(f); 59 write(initial, output, b); 60 61 // uint->int 62 let c = asint16(u); 63 write(initial, output, c); 64 65 // float->float 66 let d = asfloat16(f); 67 write(initial, output, d); 68 } 69 70 // Vector 71 { 72 let i = int16_t2(readI(input), readI(input)); 73 let u = uint16_t2(readU(input), readU(input)); 74 let f = float16_t2(readF(input), readF(input)); 75 76 // uint->float 77 let a = asfloat16(u); 78 write(initial, output, a.x); 79 write(initial, output, a.y); 80 81 // float->int 82 let b = asint16(f); 83 write(initial, output, b.x); 84 write(initial, output, b.y); 85 86 // int->uint 87 let c = asuint16(i); 88 write(initial, output, c.x); 89 write(initial, output, c.y); 90 91 // int->int 92 let d = asint16(i); 93 write(initial, output, d.x); 94 write(initial, output, d.y); 95 } 96 97} 98 99 100[numthreads(4, 1, 1)] 101void computeMain(int3 dispatchThreadID : SV_DispatchThreadID) 102{ 103 test(dispatchThreadID.x); 104}