yum-mirror/slang

Making it easier to work with shaders

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

James Helferty (NVIDIA)render-test: Change D3D12 default to sm_6_5 (#8320)f02b08490

master
7.8 KiB132 linesraw
1// byte-address-buffer-aligned.slang
2//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -d3d12 -profile cs_6_0 -shaderobj -output-using-type
3//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -vk -shaderobj -output-using-type
4//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -cuda -shaderobj -output-using-type
5
6//TEST:SIMPLE(filecheck=CHECK1):-target glsl -entry computeMain -stage compute
7//TEST:SIMPLE(filecheck=CHECK2):-target hlsl -entry computeMain -stage compute
8//TEST:SIMPLE(filecheck=CHECK3):-target spirv -entry computeMain -stage compute
9//TEST:SIMPLE(filecheck=CHECK3):-target spirv -emit-spirv-directly -entry computeMain -stage compute
10//TEST:SIMPLE(filecheck=CHECK_CUDA):-target cuda -entry computeMain -stage compute
11
12// Confirm compilation of `(RW)ByteAddressBuffer` with aligned load / stores to wider data types.
13
14//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=buffer0
15[vk::binding(2, 3)] RWByteAddressBuffer buffer0;
16
17[shader("compute")]
18[numthreads(1,1,1)]
19void computeMain(uint3 threadId : SV_DispatchThreadID)
20{
21    // CHECK-NOT: warning
22
23    // CHECK1: vec4 {{.*}} = buffer0_{{.*}}.{{.*}} = buffer0_{{.*}}.{{.*}};
24    // CHECK1: vec4 {{.*}} = buffer0_{{.*}}.{{.*}} = vec4(buffer0_{{.*}}.{{.*}}, buffer0_{{.*}}.{{.*}}, buffer0_{{.*}}.{{.*}}, buffer0_{{.*}}.{{.*}});
25    // CHECK1: vec4 {{.*}} = buffer0_{{.*}}.{{.*}};
26    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}];
27    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}];
28    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}];
29    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}];
30    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}};
31    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}};
32    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}};
33    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = buffer0_{{.*}}.{{.*}};
34    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}};
35    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}};
36    // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}};
37
38    // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(32U);
39    // CHECK2: buffer0_0.Store(32U,{{.*}});
40    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(8U);
41    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(12U);
42    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(16U);
43    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(20U);
44    // CHECK2: buffer0_0.Store(32U,float4({{.*}}, {{.*}}, {{.*}}, {{.*}}));
45    // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(32U);
46    // CHECK2: buffer0_0.Store(8U,{{.*}}[int(0)]);
47    // CHECK2: buffer0_0.Store(12U,{{.*}}[int(1)]);
48    // CHECK2: buffer0_0.Store(16U,{{.*}}[int(2)]);
49    // CHECK2: buffer0_0.Store(20U,{{.*}}[int(3)]);
50    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(8U);
51    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(12U);
52    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(16U);
53    // CHECK2: float {{.*}} = (buffer0_0).Load<float >(20U);
54    // CHECK2: buffer0_0.Store(8U,{{.*}});
55    // CHECK2: buffer0_0.Store(12U,{{.*}});
56    // CHECK2: buffer0_0.Store(16U,{{.*}});
57    // CHECK2: buffer0_0.Store(20U,{{.*}});
58
59    // CHECK3-DAG: %[[v4f:[a-zA-Z0-9_]+]] = OpTypeVector %float 4
60    // CHECK3-DAG: %[[SBv4f:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[v4f]]
61    // CHECK3-DAG: %[[RTv4f:[a-zA-Z0-9_]+]] = OpTypeRuntimeArray %[[v4f]]
62    // CHECK3-DAG: %[[RWBv4f:[a-zA-Z0-9_]+]] = OpTypeStruct %[[RTv4f]]
63    // CHECK3-DAG: %[[SBRW:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[RWBv4f]]
64    // CHECK3-DAG: %[[RTf:[a-zA-Z0-9_]+]] = OpTypeRuntimeArray %float
65    // CHECK3-DAG: %[[RWBf:[a-zA-Z0-9_]+]] = OpTypeStruct %[[RTf]]
66    // CHECK3-DAG: %[[SBRW0:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[RWBf]]
67    // CHECK3-DAG: %[[SBf:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %float
68    // CHECK3-DAG: %[[BUF0:[a-zA-Z0-9_]+]] =  OpVariable %[[SBRW]] StorageBuffer
69    // CHECK3-DAG: %[[BUF00:[a-zA-Z0-9_]+]] =  OpVariable %[[SBRW0]] StorageBuffer
70    // CHECK3-DAG: %[[V0:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]] %{{.*}}
71    // CHECK3-DAG: %[[V1:[a-zA-Z0-9_]+]] = OpLoad %[[v4f]]  %[[V0]]
72    // CHECK3-DAG: %[[V2:[a-zA-Z0-9_]+]] = OpAccessChain  %[[SBv4f]] %[[BUF0]] %{{.*}}
73    // CHECK3-DAG: OpStore %[[V2]] %[[V1]]
74    // CHECK3-DAG: %[[V3:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
75    // CHECK3-DAG: %[[V4:[a-zA-Z0-9_]+]] = OpLoad %float %[[V3]]
76    // CHECK3-DAG: %[[V5:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
77    // CHECK3-DAG: %[[V6:[a-zA-Z0-9_]+]] = OpLoad %float %[[V5]]
78    // CHECK3-DAG: %[[V7:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
79    // CHECK3-DAG: %[[V8:[a-zA-Z0-9_]+]] = OpLoad %float %[[V7]]
80    // CHECK3-DAG: %[[V9:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
81    // CHECK3-DAG: %[[V10:[a-zA-Z0-9_]+]] = OpLoad %float %[[V9]]
82    // CHECK3-DAG: %[[V11:[a-zA-Z0-9_]+]] = OpCompositeConstruct %[[v4f]] %[[V4]] %[[V6]] %[[V8]] %[[V10]]
83    // CHECK3-DAG: %[[V12:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]]
84    // CHECK3-DAG: OpStore %[[V12]] %[[V11]]
85    // CHECK3-DAG: %[[V13:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]]
86    // CHECK3-DAG: %[[V14:[a-zA-Z0-9_]+]] = OpLoad %[[v4f]] %[[V13]]
87    // CHECK3-DAG: %[[V15:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 0
88    // CHECK3-DAG: %[[V16:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
89    // CHECK3-DAG: OpStore %[[V16]] %[[V15]]
90    // CHECK3-DAG: %[[V17:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 1
91    // CHECK3-DAG: %[[V18:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
92    // CHECK3-DAG: OpStore %[[V18]] %[[V17]]
93    // CHECK3-DAG: %[[V19:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 2
94    // CHECK3-DAG: %[[V20:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
95    // CHECK3-DAG: OpStore %[[V20]] %[[V19]]
96    // CHECK3-DAG: %[[V21:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 3
97    // CHECK3-DAG: %[[V22:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
98    // CHECK3-DAG: OpStore %[[V22]] %[[V21]]
99    // CHECK3-DAG: %[[V23:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
100    // CHECK3-DAG: %[[V24:[a-zA-Z0-9_]+]] = OpLoad %float %[[V23]]
101    // CHECK3-DAG: %[[V25:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
102    // CHECK3-DAG: %[[V26:[a-zA-Z0-9_]+]] = OpLoad %float %[[V25]]
103    // CHECK3-DAG: %[[V27:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
104    // CHECK3-DAG: %[[V28:[a-zA-Z0-9_]+]] = OpLoad %float %[[V27]]
105    // CHECK3-DAG: %[[V29:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
106    // CHECK3-DAG: %[[V30:[a-zA-Z0-9_]+]] = OpLoad %float %[[V29]]
107    // CHECK3-DAG: %[[V31:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
108    // CHECK3-DAG: OpStore %[[V31]] %[[V24]]
109    // CHECK3-DAG: %[[V32:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
110    // CHECK3-DAG: OpStore %[[V32]] %[[V26]]
111    // CHECK3-DAG: %[[V33:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
112    // CHECK3-DAG: OpStore %[[V33]] %[[V28]]
113    // CHECK3-DAG: %[[V34:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]]
114    // CHECK3-DAG: OpStore %[[V34]] %[[V30]]
115    buffer0.StoreAligned(32, buffer0.LoadAligned<float4>(32));
116    buffer0.StoreAligned(32, buffer0.LoadAligned<float4>(8));
117    buffer0.StoreAligned(8, buffer0.LoadAligned<float4>(32));
118    buffer0.StoreAligned(8, buffer0.LoadAligned<float4>(8));
119}
120
121// CHECK_CUDA: ).Load<float4{{.*}}>(32U);
122// CHECK_CUDA: .Store(32U,{{.*}});
123// CHECK_CUDA: ).Load<float{{.*}}>(8U);
124// CHECK_CUDA: ).Load<float{{.*}}>(12U);
125// CHECK_CUDA: ).Load<float{{.*}}>(16U);
126// CHECK_CUDA: ).Load<float{{.*}}>(20U);
127// CHECK_CUDA: .Store(32U,make_float4{{.*}});
128// CHECK_CUDA: ).Load<float4{{.*}}>(32U);
129// CHECK_CUDA: .Store(8U,{{.*}});
130// CHECK_CUDA: .Store(12U,{{.*}});
131// CHECK_CUDA: .Store(16U,{{.*}});
132// CHECK_CUDA: .Store(20U,{{.*}});