python3kgae updated this revision to Diff 450182. python3kgae marked an inline comment as done. python3kgae added a comment.
Rename ResBinding and addResourceAnnotation to BufferResBinding and addBufferResourceAnnotation. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D130951/new/ https://reviews.llvm.org/D130951 Files: clang/lib/CodeGen/CGHLSLRuntime.cpp clang/lib/CodeGen/CGHLSLRuntime.h clang/test/CodeGenHLSL/builtins/RWBuffer-annotations.hlsl clang/test/CodeGenHLSL/cbuf.hlsl
Index: clang/test/CodeGenHLSL/cbuf.hlsl =================================================================== --- clang/test/CodeGenHLSL/cbuf.hlsl +++ clang/test/CodeGenHLSL/cbuf.hlsl @@ -1,7 +1,7 @@ // RUN: %clang_dxc -Tlib_6_7 -fcgl -Fo - %s | FileCheck %s // CHECK: @[[CB:.+]] = external addrspace(4) constant { float, i32, double } -cbuffer A : register(b0, space1) { +cbuffer A : register(b0, space2) { float a; double b; } @@ -19,3 +19,8 @@ // CHECK: load double, ptr addrspacecast (ptr addrspace(5) getelementptr inbounds ({ float, i32, double }, ptr addrspace(5) @[[TB]], i32 0, i32 2) to ptr), align 8 return a + b + c*d; } + +// CHECK: !hlsl.cbufs = !{![[CBMD:[0-9]+]]} +// CHECK: !hlsl.srvs = !{![[TBMD:[0-9]+]]} +// CHECK: ![[CBMD]] = !{ptr addrspace(4) @[[CB]], !"A.cb.ty", i32 0, i32 0, i32 2} +// CHECK: ![[TBMD]] = !{ptr addrspace(5) @[[TB]], !"A.tb.ty", i32 0, i32 2, i32 1} Index: clang/test/CodeGenHLSL/builtins/RWBuffer-annotations.hlsl =================================================================== --- clang/test/CodeGenHLSL/builtins/RWBuffer-annotations.hlsl +++ clang/test/CodeGenHLSL/builtins/RWBuffer-annotations.hlsl @@ -8,5 +8,5 @@ } // CHECK: !hlsl.uavs = !{![[Single:[0-9]+]], ![[Array:[0-9]+]]} -// CHECK-DAG: ![[Single]] = !{ptr @"?Buffer1@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 0} -// CHECK-DAG: ![[Array]] = !{ptr @"?BufferArray@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 1} +// CHECK-DAG: ![[Single]] = !{ptr @"?Buffer1@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 0, i32 -1, i32 0} +// CHECK-DAG: ![[Array]] = !{ptr @"?BufferArray@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 1, i32 -1, i32 0} Index: clang/lib/CodeGen/CGHLSLRuntime.h =================================================================== --- clang/lib/CodeGen/CGHLSLRuntime.h +++ clang/lib/CodeGen/CGHLSLRuntime.h @@ -31,6 +31,7 @@ namespace clang { class HLSLBufferDecl; +class HLSLResourceBindingAttr; class CallExpr; class Type; class VarDecl; @@ -42,13 +43,20 @@ class CGHLSLRuntime { public: + struct BufferResBinding { + // The ID like 2 in register(b2, space1). + llvm::Optional<unsigned> Reg; + // The Space like 1 is register(b2, space1). + // Default value is 0. + unsigned Space; + BufferResBinding(HLSLResourceBindingAttr *Attr); + }; struct Buffer { Buffer(HLSLBufferDecl *D); llvm::StringRef Name; // IsCBuffer - Whether the buffer is a cbuffer (and not a tbuffer). bool IsCBuffer; - llvm::Optional<unsigned> Reg; - unsigned Space; + BufferResBinding Binding; // Global variable and offset for each constant. std::vector<std::pair<llvm::GlobalVariable *, unsigned>> Constants; llvm::StructType *LayoutStruct = nullptr; @@ -69,6 +77,10 @@ void finishCodeGen(); private: + void addBufferResourceAnnotation(llvm::GlobalVariable *GV, + llvm::StringRef TyName, + hlsl::ResourceClass RC, + BufferResBinding &Binding); void addConstant(VarDecl *D, Buffer &CB); void addBufferDecls(DeclContext *DC, Buffer &CB); llvm::SmallVector<Buffer> Buffers; Index: clang/lib/CodeGen/CGHLSLRuntime.cpp =================================================================== --- clang/lib/CodeGen/CGHLSLRuntime.cpp +++ clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -110,10 +110,6 @@ return CBGV; } -void addResourceBinding(GlobalVariable *GV, CGHLSLRuntime::Buffer &CB) { - // FIXME: add resource binding to GV. -} - } // namespace void CGHLSLRuntime::addConstant(VarDecl *D, Buffer &CB) { @@ -191,19 +187,52 @@ Buf.IsCBuffer ? CBufferAddressSpace : TBufferAddressSpace; GlobalVariable *GV = replaceBuffer(Buf, AddressSapce); M.getGlobalList().push_back(GV); - addResourceBinding(GV, Buf); + hlsl::ResourceClass RC = + Buf.IsCBuffer ? hlsl::ResourceClass::CBuffer : hlsl::ResourceClass::SRV; + std::string TyName = + Buf.Name.str() + (Buf.IsCBuffer ? ".cb." : ".tb.") + "ty"; + addBufferResourceAnnotation(GV, TyName, RC, Buf.Binding); } } -CGHLSLRuntime::Buffer::Buffer(HLSLBufferDecl *D) { - Name = D->getName(); - IsCBuffer = D->isCBuffer(); - if (auto *Binding = D->getAttr<HLSLResourceBindingAttr>()) { - Reg = Binding->getID(); - Space = Binding->getSpace(); - } else { - Space = 0; +CGHLSLRuntime::Buffer::Buffer(HLSLBufferDecl *D) + : Name(D->getName()), IsCBuffer(D->isCBuffer()), + Binding(D->getAttr<HLSLResourceBindingAttr>()) {} + +void CGHLSLRuntime::addBufferResourceAnnotation(llvm::GlobalVariable *GV, + llvm::StringRef TyName, + hlsl::ResourceClass RC, + BufferResBinding &Binding) { + uint32_t Counter = ResourceCounters[static_cast<uint32_t>(RC)]++; + llvm::Module &M = CGM.getModule(); + + NamedMDNode *ResourceMD = nullptr; + switch (RC) { + case hlsl::ResourceClass::UAV: + ResourceMD = M.getOrInsertNamedMetadata("hlsl.uavs"); + break; + case hlsl::ResourceClass::SRV: + ResourceMD = M.getOrInsertNamedMetadata("hlsl.srvs"); + break; + case hlsl::ResourceClass::CBuffer: + ResourceMD = M.getOrInsertNamedMetadata("hlsl.cbufs"); + break; + default: + assert(false && "Unsupported buffer type!"); + return; } + + assert(ResourceMD != nullptr && + "ResourceMD must have been set by the switch above."); + + auto &Ctx = M.getContext(); + IRBuilder<> B(Ctx); + ResourceMD->addOperand( + MDNode::get(Ctx, {ValueAsMetadata::get(GV), MDString::get(Ctx, TyName), + ConstantAsMetadata::get(B.getInt32(Counter)), + ConstantAsMetadata::get(B.getInt32( + Binding.Reg ? Binding.Reg.getValue() : UINT_MAX)), + ConstantAsMetadata::get(B.getInt32(Binding.Space))})); } void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) { @@ -218,25 +247,18 @@ return; HLSLResourceAttr::ResourceClass RC = Attr->getResourceType(); - uint32_t Counter = ResourceCounters[static_cast<uint32_t>(RC)]++; + QualType QT(Ty, 0); + BufferResBinding Binding(RD->getAttr<HLSLResourceBindingAttr>()); + addBufferResourceAnnotation(GV, QT.getAsString(), + static_cast<hlsl::ResourceClass>(RC), Binding); +} - NamedMDNode *ResourceMD = nullptr; - switch (RC) { - case HLSLResourceAttr::ResourceClass::UAV: - ResourceMD = CGM.getModule().getOrInsertNamedMetadata("hlsl.uavs"); - break; - default: - assert(false && "Unsupported buffer type!"); - return; +CGHLSLRuntime::BufferResBinding::BufferResBinding( + HLSLResourceBindingAttr *Attr) { + if (Attr) { + Reg = Attr->getID(); + Space = Attr->getSpace(); + } else { + Space = 0; } - - assert(ResourceMD != nullptr && - "ResourceMD must have been set by the switch above."); - - auto &Ctx = CGM.getModule().getContext(); - IRBuilder<> B(Ctx); - QualType QT(Ty, 0); - ResourceMD->addOperand(MDNode::get( - Ctx, {ValueAsMetadata::get(GV), MDString::get(Ctx, QT.getAsString()), - ConstantAsMetadata::get(B.getInt32(Counter))})); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits