xref: /llvm-project/clang/test/SemaHLSL/num_threads.hlsl (revision ef2b1700f4648816e6a6ce27cfee1c501421ee50)
1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -ast-dump -o - %s | FileCheck %s
2// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-mesh -x hlsl -ast-dump -o - %s | FileCheck %s
3// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-amplification -x hlsl -ast-dump -o - %s | FileCheck %s
4// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -o - %s | FileCheck %s
5// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-pixel -x hlsl -ast-dump -o - %s -verify
6// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-vertex -x hlsl -ast-dump -o - %s -verify
7// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-hull -x hlsl -ast-dump -o - %s -verify
8// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-domain -x hlsl -ast-dump -o - %s -verify
9// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -ast-dump -o - %s -DFAIL -verify
10// RUN: %clang_cc1 -triple dxil-pc-shadermodel5.0-compute -x hlsl -ast-dump -o - %s -DFAIL -verify
11// RUN: %clang_cc1 -triple dxil-pc-shadermodel4.0-compute -x hlsl -ast-dump -o - %s -DFAIL -verify
12
13#if __SHADER_TARGET_STAGE == __SHADER_STAGE_COMPUTE || __SHADER_TARGET_STAGE == __SHADER_STAGE_MESH || __SHADER_TARGET_STAGE == __SHADER_STAGE_AMPLIFICATION || __SHADER_TARGET_STAGE == __SHADER_STAGE_LIBRARY
14#ifdef FAIL
15
16// expected-warning@+1 {{'numthreads' attribute only applies to global functions}}
17[numthreads(1,1,1)]
18struct Fido {
19  // expected-warning@+1 {{'numthreads' attribute only applies to global functions}}
20  [numthreads(1,1,1)]
21  void wag() {}
22
23  // expected-warning@+1 {{'numthreads' attribute only applies to global functions}}
24  [numthreads(1,1,1)]
25  static void oops() {}
26};
27
28// expected-warning@+1 {{'numthreads' attribute only applies to global functions}}
29[numthreads(1,1,1)]
30static void oops() {}
31
32namespace spec {
33// expected-warning@+1 {{'numthreads' attribute only applies to global functions}}
34[numthreads(1,1,1)]
35static void oops() {}
36}
37
38// expected-error@+1 {{'numthreads' attribute parameters do not match the previous declaration}}
39[numthreads(1,1,1)]
40// expected-note@+1 {{conflicting attribute is here}}
41[numthreads(2,2,1)]
42int doubledUp() {
43  return 1;
44}
45
46// expected-note@+1 {{conflicting attribute is here}}
47[numthreads(1,1,1)]
48int forwardDecl();
49
50// expected-error@+1 {{'numthreads' attribute parameters do not match the previous declaration}}
51[numthreads(2,2,1)]
52int forwardDecl() {
53  return 1;
54}
55
56#if __SHADER_TARGET_MAJOR == 6
57// expected-error@+1 {{'numthreads' attribute requires exactly 3 arguments}}
58[numthreads]
59// expected-error@+1 {{'numthreads' attribute requires exactly 3 arguments}}
60[numthreads()]
61// expected-error@+1 {{'numthreads' attribute requires exactly 3 arguments}}
62[numthreads(1,2,3,4)]
63// expected-error@+1 {{'numthreads' attribute requires an integer constant}}
64[numthreads("1",2,3)]
65// expected-error@+1 {{argument 'X' to numthreads attribute cannot exceed 1024}}
66[numthreads(-1,2,3)]
67// expected-error@+1 {{argument 'Y' to numthreads attribute cannot exceed 1024}}
68[numthreads(1,-2,3)]
69// expected-error@+1 {{argument 'Z' to numthreads attribute cannot exceed 1024}}
70[numthreads(1,2,-3)]
71// expected-error@+1 {{total number of threads cannot exceed 1024}}
72[numthreads(1024,1024,1024)]
73#elif __SHADER_TARGET_MAJOR == 5
74// expected-error@+1 {{argument 'Z' to numthreads attribute cannot exceed 64}}
75[numthreads(1,2,68)]
76#else
77// expected-error@+1 {{argument 'Z' to numthreads attribute cannot exceed 1}}
78[numthreads(1,2,2)]
79// expected-error@+1 {{total number of threads cannot exceed 768}}
80[numthreads(1024,1,1)]
81#endif // __SHADER_TARGET_MAJOR
82#endif // FAIL
83// CHECK: HLSLNumThreadsAttr 0x{{[0-9a-fA-F]+}} <line:{{[0-9]+}}:2, col:18> 1 2 1
84[numthreads(1,2,1)]
85int entry() {
86 return 1;
87}
88
89// Because these two attributes match, they should both appear in the AST
90[numthreads(2,2,1)]
91// CHECK: HLSLNumThreadsAttr 0x{{[0-9a-fA-F]+}} <line:90:2, col:18> 2 2 1
92int secondFn();
93
94[numthreads(2,2,1)]
95// CHECK: HLSLNumThreadsAttr 0x{{[0-9a-fA-F]+}} <line:94:2, col:18> 2 2 1
96int secondFn() {
97  return 1;
98}
99
100[numthreads(4,2,1)]
101// CHECK: HLSLNumThreadsAttr 0x{{[0-9a-fA-F]+}} <line:100:2, col:18> 4 2 1
102int onlyOnForwardDecl();
103
104// CHECK: HLSLNumThreadsAttr 0x{{[0-9a-fA-F]+}} <line:100:2, col:18> Inherited 4 2 1
105int onlyOnForwardDecl() {
106  return 1;
107}
108
109#else // Vertex and Pixel only beyond here
110// expected-error-re@+1 {{attribute 'numthreads' is unsupported in '{{[A-Za-z]+}}' shaders, requires one of the following: compute, amplification, mesh}}
111[numthreads(1,1,1)]
112int main() {
113 return 1;
114}
115
116#endif
117