yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -compile-arg -skip-spirv-validation -emit-spirv-directly 2//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-dx12 3//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-mtl 4//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cpu 5//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cuda 6//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-wgpu 7 8// CHECK: 1 9// CHECK-NEXT: 2 10// CHECK-NEXT: 3 11// CHECK-NEXT: 4 12// CHECK-NEXT: 5 13// CHECK-NEXT: 6 14// CHECK-NEXT: 7 15// CHECK-NEXT: 8 16// CHECK-NEXT: 21 17// CHECK-NEXT: 7A 18// CHECK-NEXT: FFFFFFFA 19// CHECK-NEXT: A 20// CHECK-NEXT: 67 21// CHECK-NEXT: FFFFFFEF 22// CHECK-NEXT: 32 23// CHECK-NEXT: FFFFFFA9 24 25//TEST_INPUT:ubuffer(data=[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1], stride=4):out,name=i32Buffer 26RWStructuredBuffer<int> i32Buffer; 27 28[numthreads(1, 1, 1)] 29void computeMain() 30{ 31 // 32-bit tests 32 { 33 // Simple hex extraction to test, varying the offset. 34 uint value = 0x87654321; 35 i32Buffer[0] = bitfieldExtract(value, 4 * 0, 4); 36 i32Buffer[1] = bitfieldExtract(value, 4 * 1, 4); 37 i32Buffer[2] = bitfieldExtract(value, 4 * 2, 4); 38 i32Buffer[3] = bitfieldExtract(value, 4 * 3, 4); 39 i32Buffer[4] = bitfieldExtract(value, 4 * 4, 4); 40 i32Buffer[5] = bitfieldExtract(value, 4 * 5, 4); 41 i32Buffer[6] = bitfieldExtract(value, 4 * 6, 4); 42 i32Buffer[7] = bitfieldExtract(value, 4 * 7, 4); 43 44 // Now varying the bit length 45 value = 0b00111011111011110001111010100001; 46 i32Buffer[8] = bitfieldExtract(value, 0, 6); 47 i32Buffer[9] = bitfieldExtract(value, 6, 8); 48 49 // Sign extension case 50 // - For unsigned data types, the most significant bits of the result will be set to zero. 51 // - For signed data types, the most significant bits will be set to the value of bit offset + base - 1 52 // (i.e., it is sign extended to the width of the return type). 53 i32Buffer[10] = bitfieldExtract(0b1010111, 3, 4); // 0b1010 -> 0b11111111111111111111111111111010 54 i32Buffer[11] = bitfieldExtract(0b1010111u, 3, 4); // 0b1111 -> 0b00000000000000000000000000001010 55 56 // Component-wise extraction 57 int4 val4 = int4(0x12345678, 0x9abcdef0, 0x87654321, 0xfedcba98); 58 int4 ext4 = bitfieldExtract(val4, 4, 8); 59 i32Buffer[12] = ext4.x; 60 i32Buffer[13] = ext4.y; 61 i32Buffer[14] = ext4.z; 62 i32Buffer[15] = ext4.w; 63 } 64}