Skip to content

Commit cb7f4ff

Browse files
authored
[HLSL] Add Buffer def to frontend (#141086)
Fixes #138902 Defines the `Buffer<>` type in the clang frontend. Lowering from IR->Target Machine is already handled by other code
1 parent 440a8ad commit cb7f4ff

File tree

5 files changed

+147
-8
lines changed

5 files changed

+147
-8
lines changed

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,19 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
266266
*SemaPtr, HLSLNamespace, /*isTypedBuffer*/ true);
267267
ConceptDecl *StructuredBufferConcept = constructBufferConceptDecl(
268268
*SemaPtr, HLSLNamespace, /*isTypedBuffer*/ false);
269+
270+
Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Buffer")
271+
.addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
272+
.finalizeForwardDeclaration();
273+
274+
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
275+
setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
276+
/*RawBuffer=*/false)
277+
.addArraySubscriptOperators()
278+
.addLoadMethods()
279+
.completeDefinition();
280+
});
281+
269282
Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer")
270283
.addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
271284
.finalizeForwardDeclaration();

clang/test/AST/HLSL/TypedBuffers-AST.hlsl

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
22
// RUN: -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer -check-prefix=EMPTY %s
33
//
4+
// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
5+
// RUN: -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer -check-prefix=EMPTY %s
6+
//
47
// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
58
// RUN: -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer \
69
// RUN: -check-prefixes=CHECK,CHECK-UAV %s
10+
//
11+
// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
12+
// RUN: -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer \
13+
// RUN: -check-prefixes=CHECK,CHECK-SRV %s
714

8-
// TODO: Add AST tests for Buffer and RasterizerOrderedBuffer here
15+
// TODO: Add AST tests for RasterizerOrderedBuffer here
916

1017
// This test tests two different AST generations each typed buffer.
1118
// The "EMPTY" test mode verifies the AST generated by forward declaration
@@ -54,6 +61,7 @@ RESOURCE<float> Buffer;
5461
// CHECK: FinalAttr {{.*}} Implicit final
5562
// CHECK-NEXT: FieldDecl {{.*}} implicit __handle '__hlsl_resource_t
5663
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
64+
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
5765
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
5866

5967
// Default constructor
@@ -129,7 +137,8 @@ RESOURCE<float> Buffer;
129137
// CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
130138
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
131139
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
132-
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
140+
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
141+
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
133142
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
134143
// CHECK-SAME: ' lvalue .__handle {{.*}}
135144
// CHECK-NEXT: CXXThisExpr {{.*}} 'const [[RESOURCE]]<element_type>' lvalue implicit this
@@ -145,7 +154,8 @@ RESOURCE<float> Buffer;
145154
// CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
146155
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
147156
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
148-
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
157+
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
158+
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
149159
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
150160
// CHECK-SAME: ' lvalue .__handle {{.*}}
151161
// CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit this
@@ -163,7 +173,8 @@ RESOURCE<float> Buffer;
163173
// CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
164174
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
165175
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
166-
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
176+
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
177+
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
167178
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
168179
// CHECK-SAME: ' lvalue .__handle {{.*}}
169180
// CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit this
@@ -177,4 +188,5 @@ RESOURCE<float> Buffer;
177188
// CHECK-NEXT: FinalAttr {{.*}} Implicit final
178189
// CHECK-NEXT: FieldDecl {{.*}} implicit referenced __handle '__hlsl_resource_t
179190
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
191+
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
180192
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(float)]]
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s
2+
3+
typedef vector<float, 3> float3;
4+
typedef vector<double, 2> double2;
5+
typedef vector<double, 3> double3;
6+
7+
8+
// expected-error@+1 {{class template 'Buffer' requires template arguments}}
9+
Buffer BufferErr1;
10+
11+
// expected-error@+1 {{too few template arguments for class template 'Buffer'}}
12+
Buffer<> BufferErr2;
13+
14+
// test implicit Buffer concept
15+
Buffer<int> r1;
16+
Buffer<float> r2;
17+
Buffer<float3> Buff;
18+
Buffer<double2> r4;
19+
20+
// expected-error@+4 {{constraints not satisfied for class template 'Buffer'}}
21+
// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_typed_resource_element_compatible<element_type> class Buffer}}
22+
// expected-note@*:* {{because 'hlsl::Buffer<int>' does not satisfy '__is_typed_resource_element_compatible'}}
23+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(hlsl::Buffer<int>)' evaluated to false}}
24+
Buffer<Buffer<int> > r5;
25+
26+
struct s {
27+
int x;
28+
};
29+
30+
struct Empty {};
31+
32+
template<typename T> struct TemplatedBuffer {
33+
T a;
34+
};
35+
36+
template<typename T> struct TemplatedVector {
37+
vector<T, 4> v;
38+
};
39+
40+
// structs not allowed
41+
// expected-error@+4 {{constraints not satisfied for class template 'Buffer'}}
42+
// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_typed_resource_element_compatible<element_type> class Buffer}}
43+
// expected-note@*:* {{because 's' does not satisfy '__is_typed_resource_element_compatible'}}
44+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(s)' evaluated to false}}
45+
Buffer<s> r6;
46+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
47+
// expected-note@*:* {{because 'Empty' does not satisfy '__is_typed_resource_element_compatible'}}
48+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(Empty)' evaluated to false}}
49+
Buffer<Empty> r7;
50+
51+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
52+
// expected-note@*:* {{because 'TemplatedBuffer<int>' does not satisfy '__is_typed_resource_element_compatible'}}
53+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedBuffer<int>)' evaluated to false}}
54+
Buffer<TemplatedBuffer<int> > r8;
55+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
56+
// expected-note@*:* {{because 'TemplatedVector<int>' does not satisfy '__is_typed_resource_element_compatible'}}
57+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedVector<int>)' evaluated to false}}
58+
Buffer<TemplatedVector<int> > r9;
59+
60+
// arrays not allowed
61+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
62+
// expected-note@*:* {{because 'half[4]' does not satisfy '__is_typed_resource_element_compatible'}}
63+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(half[4])' evaluated to false}}
64+
Buffer<half[4]> r10;
65+
66+
typedef vector<int, 8> int8;
67+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
68+
// expected-note@*:* {{because 'vector<int, 8>' (vector of 8 'int' values) does not satisfy '__is_typed_resource_element_compatible'}}
69+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector<int, 8>)' evaluated to false}}
70+
Buffer<int8> r11;
71+
72+
typedef int MyInt;
73+
Buffer<MyInt> r12;
74+
75+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
76+
// expected-note@*:* {{because 'bool' does not satisfy '__is_typed_resource_element_compatible'}}
77+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(bool)' evaluated to false}}
78+
Buffer<bool> r13;
79+
80+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
81+
// expected-note@*:* {{because 'vector<bool, 2>' (vector of 2 'bool' values) does not satisfy '__is_typed_resource_element_compatible'}}
82+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector<bool, 2>)' evaluated to false}}
83+
Buffer<vector<bool, 2>> r14;
84+
85+
enum numbers { one, two, three };
86+
87+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
88+
// expected-note@*:* {{because 'numbers' does not satisfy '__is_typed_resource_element_compatible'}}
89+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(numbers)' evaluated to false}}
90+
Buffer<numbers> r15;
91+
92+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
93+
// expected-note@*:* {{because 'vector<double, 3>' (vector of 3 'double' values) does not satisfy '__is_typed_resource_element_compatible'}}
94+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector<double, 3>)' evaluated to false}}
95+
Buffer<double3> r16;
96+
97+
98+
struct threeDoubles {
99+
double a;
100+
double b;
101+
double c;
102+
};
103+
104+
// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
105+
// expected-note@*:* {{because 'threeDoubles' does not satisfy '__is_typed_resource_element_compatible'}}
106+
// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(threeDoubles)' evaluated to false}}
107+
Buffer<threeDoubles> BufferErr3;
108+
109+
110+
[numthreads(1,1,1)]
111+
void main() {
112+
(void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::Buffer<vector<float, 3>>'}}
113+
// expected-note@* {{implicitly declared private here}}
114+
}

clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ RWBuffer<> BufferErr2;
1414
// test implicit RWBuffer concept
1515
RWBuffer<int> r1;
1616
RWBuffer<float> r2;
17-
RWBuffer<float3> Buffer;
17+
RWBuffer<float3> Buff;
1818
RWBuffer<double2> r4;
1919

2020
// expected-error@+4 {{constraints not satisfied for class template 'RWBuffer'}}
@@ -109,6 +109,6 @@ RWBuffer<threeDoubles> BufferErr3;
109109

110110
[numthreads(1,1,1)]
111111
void main() {
112-
(void)Buffer.__handle; // expected-error {{'__handle' is a private member of 'hlsl::RWBuffer<vector<float, 3>>'}}
112+
(void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::RWBuffer<vector<float, 3>>'}}
113113
// expected-note@* {{implicitly declared private here}}
114114
}

clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
typedef vector<float, 3> float3;
44

5-
StructuredBuffer<float3> Buffer;
5+
StructuredBuffer<float3> Buff;
66

77
// expected-error@+2 {{class template 'StructuredBuffer' requires template arguments}}
88
// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_structured_resource_element_compatible<element_type> class StructuredBuffer {}}}
@@ -26,6 +26,6 @@ StructuredBuffer<Empty> BufferErr4;
2626

2727
[numthreads(1,1,1)]
2828
void main() {
29-
(void)Buffer.__handle; // expected-error {{'__handle' is a private member of 'hlsl::StructuredBuffer<vector<float, 3>>'}}
29+
(void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::StructuredBuffer<vector<float, 3>>'}}
3030
// expected-note@* {{implicitly declared private here}}
3131
}

0 commit comments

Comments
 (0)