Skip to content

Commit ac319a8

Browse files
bob80905bogner
andauthored
Attach resource attributes to handle within record, instead of record (#101433)
This PR attaches the resource attributes, `HLSLResourceAttr` and `HLSLResourceClassAttr`, to the handle contained within such resource classes like `RWBuffer`. CodeGen will now search for fields within HLSL resource decls, and emit previous data based on attributes on the handle member. An AST-dump test was added to verify that the resource attribute is attached to the handle within the resource record decl. Fixes #98556 --------- Co-authored-by: Justin Bogner <[email protected]>
1 parent d8b61dd commit ac319a8

File tree

4 files changed

+44
-28
lines changed

4 files changed

+44
-28
lines changed

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -280,18 +280,22 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) {
280280
const auto *RD = Ty->getAsCXXRecordDecl();
281281
if (!RD)
282282
return;
283-
const auto *HLSLResAttr = RD->getAttr<HLSLResourceAttr>();
284-
const auto *HLSLResClassAttr = RD->getAttr<HLSLResourceClassAttr>();
285-
if (!HLSLResAttr || !HLSLResClassAttr)
286-
return;
283+
// the resource related attributes are on the handle member
284+
// inside the record decl
285+
for (auto *FD : RD->fields()) {
286+
const auto *HLSLResAttr = FD->getAttr<HLSLResourceAttr>();
287+
const auto *HLSLResClassAttr = FD->getAttr<HLSLResourceClassAttr>();
288+
if (!HLSLResAttr || !HLSLResClassAttr)
289+
continue;
287290

288-
llvm::hlsl::ResourceClass RC = HLSLResClassAttr->getResourceClass();
289-
llvm::hlsl::ResourceKind RK = HLSLResAttr->getResourceKind();
290-
bool IsROV = HLSLResAttr->getIsROV();
291-
llvm::hlsl::ElementType ET = calculateElementType(CGM.getContext(), Ty);
291+
llvm::hlsl::ResourceClass RC = HLSLResClassAttr->getResourceClass();
292+
llvm::hlsl::ResourceKind RK = HLSLResAttr->getResourceKind();
293+
bool IsROV = HLSLResAttr->getIsROV();
294+
llvm::hlsl::ElementType ET = calculateElementType(CGM.getContext(), Ty);
292295

293-
BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>());
294-
addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding);
296+
BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>());
297+
addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding);
298+
}
295299
}
296300

297301
CGHLSLRuntime::BufferResBinding::BufferResBinding(

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ struct BuiltinTypeDeclBuilder {
8080
}
8181

8282
BuiltinTypeDeclBuilder &
83-
addMemberVariable(StringRef Name, QualType Type,
83+
addMemberVariable(StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,
8484
AccessSpecifier Access = AccessSpecifier::AS_private) {
8585
if (Record->isCompleteDefinition())
8686
return *this;
@@ -96,13 +96,16 @@ struct BuiltinTypeDeclBuilder {
9696
nullptr, false, InClassInitStyle::ICIS_NoInit);
9797
Field->setAccess(Access);
9898
Field->setImplicit(true);
99+
for (Attr *A : Attrs)
100+
Field->addAttr(A);
99101
Record->addDecl(Field);
100102
Fields[Name] = Field;
101103
return *this;
102104
}
103105

104106
BuiltinTypeDeclBuilder &
105-
addHandleMember(AccessSpecifier Access = AccessSpecifier::AS_private) {
107+
addHandleMember(ResourceClass RC, ResourceKind RK, bool IsROV,
108+
AccessSpecifier Access = AccessSpecifier::AS_private) {
106109
if (Record->isCompleteDefinition())
107110
return *this;
108111
QualType Ty = Record->getASTContext().VoidPtrTy;
@@ -112,17 +115,13 @@ struct BuiltinTypeDeclBuilder {
112115
Ty = Record->getASTContext().getPointerType(
113116
QualType(TTD->getTypeForDecl(), 0));
114117
}
115-
return addMemberVariable("h", Ty, Access);
116-
}
117-
118-
BuiltinTypeDeclBuilder &annotateHLSLResource(ResourceClass RC,
119-
ResourceKind RK, bool IsROV) {
120-
if (Record->isCompleteDefinition())
121-
return *this;
122-
Record->addAttr(
123-
HLSLResourceClassAttr::CreateImplicit(Record->getASTContext(), RC));
124-
Record->addAttr(
125-
HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RK, IsROV));
118+
// add handle member
119+
llvm::SmallVector<Attr *, 2> Attrs;
120+
Attr *ResourceClassAttr =
121+
HLSLResourceClassAttr::CreateImplicit(Record->getASTContext(), RC);
122+
Attr *ResourceAttr =
123+
HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RK, IsROV);
124+
addMemberVariable("h", Ty, {ResourceClassAttr, ResourceAttr}, Access);
126125
return *this;
127126
}
128127

@@ -489,9 +488,8 @@ static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S,
489488
ResourceClass RC, ResourceKind RK,
490489
bool IsROV) {
491490
return BuiltinTypeDeclBuilder(Decl)
492-
.addHandleMember()
493-
.addDefaultHandleConstructor(S, RC)
494-
.annotateHLSLResource(RC, RK, IsROV);
491+
.addHandleMember(RC, RK, IsROV)
492+
.addDefaultHandleConstructor(S, RC);
495493
}
496494

497495
void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ RWBuffer<float> Buffer;
3030
// CHECK-NEXT: CXXRecordDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit class RWBuffer definition
3131

3232
// CHECK: FinalAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit final
33+
// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'element_type *'
3334
// CHECK-NEXT: HLSLResourceClassAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV
3435
// CHECK-NEXT: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit TypedBuffer
35-
// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'element_type *'
3636

3737
// CHECK: CXXMethodDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> operator[] 'element_type &const (unsigned int) const'
3838
// CHECK-NEXT: ParmVarDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> Idx 'unsigned int'
@@ -59,6 +59,6 @@ RWBuffer<float> Buffer;
5959
// CHECK: TemplateArgument type 'float'
6060
// CHECK-NEXT: BuiltinType 0x{{[0-9A-Fa-f]+}} 'float'
6161
// CHECK-NEXT: FinalAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit final
62+
// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'float *'
6263
// CHECK-NEXT: HLSLResourceClassAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV
6364
// CHECK-NEXT: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit TypedBuffer
64-
// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'float *'
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -ast-dump -o - %s | FileCheck %s
2+
3+
// CHECK: -ClassTemplateDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit RWBuffer
4+
// CHECK: -CXXRecordDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit class RWBuffer definition
5+
// CHECK: -FieldDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'element_type *'
6+
// CHECK: -HLSLResourceClassAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit UAV
7+
// CHECK: -HLSLResourceAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit TypedBuffer
8+
RasterizerOrderedBuffer<vector<float, 4> > BufferArray3[4] : register(u4, space1);
9+
10+
// CHECK: -ClassTemplateSpecializationDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> class RWBuffer definition implicit_instantiation
11+
// CHECK: -FieldDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'float *'
12+
// CHECK: -HLSLResourceClassAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit UAV
13+
// CHECK: -HLSLResourceAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit TypedBuffer
14+
RWBuffer<float> Buffer1;

0 commit comments

Comments
 (0)