yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
d58243d90
master
1//TEST(compute):SIMPLE(filecheck=SPIRV):-target spirv-asm -entry computeMain -stage compute 2//TEST(compute):SIMPLE(filecheck=SPIRV_BL):-target spirv-asm -entry computeMain -stage compute -DBLOCK_LOAD 3 4//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -render-feature cooperative-matrix-tensor-addressing 5//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -render-feature cooperative-matrix-tensor-addressing -Xslang -DRW 6 7//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK_BL):-vk -output-using-type -emit-spirv-directly -Xslang -DBLOCK_LOAD -render-feature cooperative-matrix-block-loads 8//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK_BL):-vk -output-using-type -emit-spirv-directly -Xslang -DBLOCK_LOAD -render-feature cooperative-matrix-block-loads -Xslang -DRW 9 10//CHECK: 2 11//CHECK-NEXT: 2 12//CHECK-NEXT: 2 13//CHECK-NEXT: 2 14//CHECK-NEXT: 12 15//CHECK-NEXT: 12 16//CHECK-NEXT: 12 17//CHECK-NEXT: 12 18//CHECK-NEXT: 0 19 20//CHECK_BL: 7 21//CHECK_BL-NEXT: 1 22//CHECK_BL-NEXT: 1 23//CHECK_BL-NEXT: 1 24//CHECK_BL-NEXT: 18 25//CHECK_BL-NEXT: 1 26//CHECK_BL-NEXT: 1 27//CHECK_BL-NEXT: 1 28//CHECK_BL-NEXT: 0 29 30//TEST_INPUT:ubuffer(data=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24], stride=4, count=256),name=buf 31 32#if defined(RW) 33 RWByteAddressBuffer inputBuffer; 34#else // #if defined(RW) 35 ByteAddressBuffer inputBuffer; 36#endif // #else // #if defined(RW) 37 38//TEST_INPUT:ubuffer(stride=4, count=256):out,name=outputBuffer 39RWByteAddressBuffer outputBuffer; 40 41using namespace linalg; 42 43typealias CoopMatType = CoopMat<int32_t, MemoryScope.Subgroup, 16, 16, CoopMatMatrixUse.MatrixAccumulator>; 44 45int32_t decodeFunc(uint32_t* encoded, uint32_t blockCoord[2], uint32_t coordInBlock[2]) 46{ 47 uint32_t coord = blockCoord[1] * 4 + blockCoord[0]; 48 uint32_t mask = (0xff << (coordInBlock[0] * 8)); 49 return int32_t(encoded[coord] & mask) + 1; 50} 51 52[numthreads(32, 1, 1)] 53void computeMain() 54{ 55 TensorLayout<2, CoopMatClampMode.Undefined> tl; 56 57 let tl1 = tl.Dimension(16, 16); 58 let tl2 = tl1.Slice(0, 16, 0, 16); 59 let tl3 = tl2.BlockSize(4, 1); 60 61 //SPIRV: = OpTypeTensorViewNV %{{[^%]*}} %false %{{[^%]*}} %{{[^%]*$}} 62 //SPIRV: = OpCreateTensorViewNV % 63 TensorView<2, false, 0, 1> tvRowMajor; 64 TensorView<2, false, 1, 0> tvColumnMajor; 65 66 //SPIRV: = OpTensorViewSetDimensionNV % 67 let tvColumnMajor1 = tvColumnMajor.Dimension(16, 8); 68 69 //SPIRV: = OpTensorViewSetStrideNV % 70 let tvColumnMajor2 = tvColumnMajor1.Stride(8, 1); 71 72 //SPIRV: = OpTensorViewSetClipNV % 73 let tvColumnMajor3 = tvColumnMajor2.Clip(0, 8, 0, 64); 74 75#if defined(BLOCK_LOAD) 76 //SPIRV_BL: = OpCooperativeMatrixLoadTensorNV %{{.*}} TensorView|DecodeFunc % 77 let mat = CoopMatType.Load<uint32_t>(inputBuffer, 0, tl3, tvRowMajor, decodeFunc); 78 79#else // #if defined(BLOCK_LOAD) 80 //SPIRV: OpCooperativeMatrixLoadTensorNV % 81 //SPIRV-SAME: TensorView 82 let mat = CoopMatType.Load(inputBuffer, 0, tl3, tvRowMajor); 83 84#endif // #else // #if defined(BLOCK_LOAD) 85 86 //SPIRV: OpCooperativeMatrixStoreTensorNV {{.*}} TensorView % 87 mat.Store(outputBuffer, 0, tl3, tvColumnMajor3); 88}