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

Reply via email to