[clang] Attach resource attributes to handle within record, instead of record (PR #101433)
Damyan Pepper via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 1 15:03:09 PDT 2024
================
@@ -280,18 +280,22 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) {
const auto *RD = Ty->getAsCXXRecordDecl();
if (!RD)
return;
- const auto *HLSLResAttr = RD->getAttr<HLSLResourceAttr>();
- const auto *HLSLResClassAttr = RD->getAttr<HLSLResourceClassAttr>();
- if (!HLSLResAttr || !HLSLResClassAttr)
- return;
+ // the resource related attributes are on the handle member
+ // inside the record decl
+ for (auto *FD : RD->fields()) {
+ const auto *HLSLResAttr = FD->getAttr<HLSLResourceAttr>();
+ const auto *HLSLResClassAttr = FD->getAttr<HLSLResourceClassAttr>();
+ if (!HLSLResAttr || !HLSLResClassAttr)
+ continue;
- llvm::hlsl::ResourceClass RC = HLSLResClassAttr->getResourceClass();
- llvm::hlsl::ResourceKind RK = HLSLResAttr->getResourceKind();
- bool IsROV = HLSLResAttr->getIsROV();
- llvm::hlsl::ElementType ET = calculateElementType(CGM.getContext(), Ty);
+ llvm::hlsl::ResourceClass RC = HLSLResClassAttr->getResourceClass();
+ llvm::hlsl::ResourceKind RK = HLSLResAttr->getResourceKind();
+ bool IsROV = HLSLResAttr->getIsROV();
+ llvm::hlsl::ElementType ET = calculateElementType(CGM.getContext(), Ty);
- BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>());
- addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding);
+ BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>());
+ addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding);
----------------
damyanp wrote:
What if there are >1 fields in the struct that have the resource / resource class attributes on it? Is it ok to add multiple bindings in that case?
https://github.com/llvm/llvm-project/pull/101433
More information about the cfe-commits
mailing list