yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Jay KwakSupport Vulkan memory model (#7057)d58243d90

master
3.1 KiB88 linesraw
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}