Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DirectX] Move DXIL ResourceKind and ElementType to DXILABI.h. NFC #78225

Conversation

bogner
Copy link
Contributor

@bogner bogner commented Jan 16, 2024

No description provided.

Created using spr 1.3.5-bogner

[skip ci]
Created using spr 1.3.5-bogner
@llvmbot
Copy link
Collaborator

llvmbot commented Jan 16, 2024

@llvm/pr-subscribers-llvm-support
@llvm/pr-subscribers-hlsl

@llvm/pr-subscribers-backend-directx

Author: Justin Bogner (bogner)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/78225.diff

4 Files Affected:

  • (modified) llvm/include/llvm/Frontend/HLSL/HLSLResource.h (+4-48)
  • (modified) llvm/include/llvm/Support/DXILABI.h (+48)
  • (modified) llvm/lib/Target/DirectX/DXILResource.cpp (+46-46)
  • (modified) llvm/lib/Target/DirectX/DXILResource.h (+11-10)
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLResource.h b/llvm/include/llvm/Frontend/HLSL/HLSLResource.h
index 068b4c66711e467..dcf78ec856a9d64 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLResource.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLResource.h
@@ -14,6 +14,7 @@
 #define LLVM_FRONTEND_HLSL_HLSLRESOURCE_H
 
 #include "llvm/IR/Metadata.h"
+#include "llvm/Support/DXILABI.h"
 
 namespace llvm {
 class GlobalVariable;
@@ -29,54 +30,9 @@ enum class ResourceClass : uint8_t {
   NumClasses = Invalid,
 };
 
-// The value ordering of this enumeration is part of the DXIL ABI. Elements
-// can only be added to the end, and not removed.
-enum class ResourceKind : uint32_t {
-  Invalid = 0,
-  Texture1D,
-  Texture2D,
-  Texture2DMS,
-  Texture3D,
-  TextureCube,
-  Texture1DArray,
-  Texture2DArray,
-  Texture2DMSArray,
-  TextureCubeArray,
-  TypedBuffer,
-  RawBuffer,
-  StructuredBuffer,
-  CBuffer,
-  Sampler,
-  TBuffer,
-  RTAccelerationStructure,
-  FeedbackTexture2D,
-  FeedbackTexture2DArray,
-  NumEntries,
-};
-
-// The value ordering of this enumeration is part of the DXIL ABI. Elements
-// can only be added to the end, and not removed.
-enum class ElementType : uint32_t {
-  Invalid = 0,
-  I1,
-  I16,
-  U16,
-  I32,
-  U32,
-  I64,
-  U64,
-  F16,
-  F32,
-  F64,
-  SNormF16,
-  UNormF16,
-  SNormF32,
-  UNormF32,
-  SNormF64,
-  UNormF64,
-  PackedS8x32,
-  PackedU8x32,
-};
+// For now we use DXIL ABI enum values directly. This may change in the future.
+using dxil::ResourceKind;
+using dxil::ElementType;
 
 class FrontendResource {
   MDNode *Entry;
diff --git a/llvm/include/llvm/Support/DXILABI.h b/llvm/include/llvm/Support/DXILABI.h
index e2a8fbad16bb3f7..c1d81775b6711e3 100644
--- a/llvm/include/llvm/Support/DXILABI.h
+++ b/llvm/include/llvm/Support/DXILABI.h
@@ -39,6 +39,54 @@ enum class ParameterKind : uint8_t {
   DXIL_HANDLE,
 };
 
+/// The kind of resource for an SRV or UAV resource. Sometimes referred to as
+/// "Shape" in the DXIL docs.
+enum class ResourceKind : uint32_t {
+  Invalid = 0,
+  Texture1D,
+  Texture2D,
+  Texture2DMS,
+  Texture3D,
+  TextureCube,
+  Texture1DArray,
+  Texture2DArray,
+  Texture2DMSArray,
+  TextureCubeArray,
+  TypedBuffer,
+  RawBuffer,
+  StructuredBuffer,
+  CBuffer,
+  Sampler,
+  TBuffer,
+  RTAccelerationStructure,
+  FeedbackTexture2D,
+  FeedbackTexture2DArray,
+  NumEntries,
+};
+
+/// The element type of an SRV or UAV resource.
+enum class ElementType : uint32_t {
+  Invalid = 0,
+  I1,
+  I16,
+  U16,
+  I32,
+  U32,
+  I64,
+  U64,
+  F16,
+  F32,
+  F64,
+  SNormF16,
+  UNormF16,
+  SNormF32,
+  UNormF32,
+  SNormF64,
+  UNormF64,
+  PackedS8x32,
+  PackedU8x32,
+};
+
 } // namespace dxil
 } // namespace llvm
 
diff --git a/llvm/lib/Target/DirectX/DXILResource.cpp b/llvm/lib/Target/DirectX/DXILResource.cpp
index 621852f2453ff51..8e5b9867e6661bf 100644
--- a/llvm/lib/Target/DirectX/DXILResource.cpp
+++ b/llvm/lib/Target/DirectX/DXILResource.cpp
@@ -21,7 +21,6 @@
 
 using namespace llvm;
 using namespace llvm::dxil;
-using namespace llvm::hlsl;
 
 template <typename T> void ResourceTable<T>::collect(Module &M) {
   NamedMDNode *Entry = M.getNamedMetadata(MDName);
@@ -30,7 +29,7 @@ template <typename T> void ResourceTable<T>::collect(Module &M) {
 
   uint32_t Counter = 0;
   for (auto *Res : Entry->operands()) {
-    Data.push_back(T(Counter++, FrontendResource(cast<MDNode>(Res))));
+    Data.push_back(T(Counter++, hlsl::FrontendResource(cast<MDNode>(Res))));
   }
 }
 
@@ -42,7 +41,7 @@ template <> void ResourceTable<ConstantBuffer>::collect(Module &M) {
   uint32_t Counter = 0;
   for (auto *Res : Entry->operands()) {
     Data.push_back(
-        ConstantBuffer(Counter++, FrontendResource(cast<MDNode>(Res))));
+        ConstantBuffer(Counter++, hlsl::FrontendResource(cast<MDNode>(Res))));
   }
   // FIXME: share CBufferDataLayout with CBuffer load lowering.
   //   See https://github.com/llvm/llvm-project/issues/58381
@@ -56,7 +55,7 @@ void Resources::collect(Module &M) {
   CBuffers.collect(M);
 }
 
-ResourceBase::ResourceBase(uint32_t I, FrontendResource R)
+ResourceBase::ResourceBase(uint32_t I, hlsl::FrontendResource R)
     : ID(I), GV(R.getGlobalVariable()), Name(""), Space(R.getSpace()),
       LowerBound(R.getResourceIndex()), RangeSize(1) {
   if (auto *ArrTy = dyn_cast<ArrayType>(GV->getValueType()))
@@ -107,83 +106,84 @@ StringRef ResourceBase::getElementTypeName(ElementType ElTy) {
   llvm_unreachable("All ElementType enums are handled in switch");
 }
 
-void ResourceBase::printElementType(Kinds Kind, ElementType ElTy,
+void ResourceBase::printElementType(ResourceKind Kind, ElementType ElTy,
                                     unsigned Alignment, raw_ostream &OS) {
   switch (Kind) {
   default:
     // TODO: add vector size.
     OS << right_justify(getElementTypeName(ElTy), Alignment);
     break;
-  case Kinds::RawBuffer:
+  case ResourceKind::RawBuffer:
     OS << right_justify("byte", Alignment);
     break;
-  case Kinds::StructuredBuffer:
+  case ResourceKind::StructuredBuffer:
     OS << right_justify("struct", Alignment);
     break;
-  case Kinds::CBuffer:
-  case Kinds::Sampler:
+  case ResourceKind::CBuffer:
+  case ResourceKind::Sampler:
     OS << right_justify("NA", Alignment);
     break;
-  case Kinds::Invalid:
-  case Kinds::NumEntries:
+  case ResourceKind::Invalid:
+  case ResourceKind::NumEntries:
     break;
   }
 }
 
-StringRef ResourceBase::getKindName(Kinds Kind) {
+StringRef ResourceBase::getKindName(ResourceKind Kind) {
   switch (Kind) {
-  case Kinds::NumEntries:
-  case Kinds::Invalid:
+  case ResourceKind::NumEntries:
+  case ResourceKind::Invalid:
     return "invalid";
-  case Kinds::Texture1D:
+  case ResourceKind::Texture1D:
     return "1d";
-  case Kinds::Texture2D:
+  case ResourceKind::Texture2D:
     return "2d";
-  case Kinds::Texture2DMS:
+  case ResourceKind::Texture2DMS:
     return "2dMS";
-  case Kinds::Texture3D:
+  case ResourceKind::Texture3D:
     return "3d";
-  case Kinds::TextureCube:
+  case ResourceKind::TextureCube:
     return "cube";
-  case Kinds::Texture1DArray:
+  case ResourceKind::Texture1DArray:
     return "1darray";
-  case Kinds::Texture2DArray:
+  case ResourceKind::Texture2DArray:
     return "2darray";
-  case Kinds::Texture2DMSArray:
+  case ResourceKind::Texture2DMSArray:
     return "2darrayMS";
-  case Kinds::TextureCubeArray:
+  case ResourceKind::TextureCubeArray:
     return "cubearray";
-  case Kinds::TypedBuffer:
+  case ResourceKind::TypedBuffer:
     return "buf";
-  case Kinds::RawBuffer:
+  case ResourceKind::RawBuffer:
     return "rawbuf";
-  case Kinds::StructuredBuffer:
+  case ResourceKind::StructuredBuffer:
     return "structbuf";
-  case Kinds::CBuffer:
+  case ResourceKind::CBuffer:
     return "cbuffer";
-  case Kinds::Sampler:
+  case ResourceKind::Sampler:
     return "sampler";
-  case Kinds::TBuffer:
+  case ResourceKind::TBuffer:
     return "tbuffer";
-  case Kinds::RTAccelerationStructure:
+  case ResourceKind::RTAccelerationStructure:
     return "ras";
-  case Kinds::FeedbackTexture2D:
+  case ResourceKind::FeedbackTexture2D:
     return "fbtex2d";
-  case Kinds::FeedbackTexture2DArray:
+  case ResourceKind::FeedbackTexture2DArray:
     return "fbtex2darray";
   }
-  llvm_unreachable("All Kinds enums are handled in switch");
+  llvm_unreachable("All ResourceKind enums are handled in switch");
 }
 
-void ResourceBase::printKind(Kinds Kind, unsigned Alignment, raw_ostream &OS,
-                             bool SRV, bool HasCounter, uint32_t SampleCount) {
+void ResourceBase::printKind(ResourceKind Kind, unsigned Alignment,
+                             raw_ostream &OS, bool SRV, bool HasCounter,
+                             uint32_t SampleCount) {
   switch (Kind) {
   default:
     OS << right_justify(getKindName(Kind), Alignment);
     break;
 
-  case Kinds::RawBuffer:
-  case Kinds::StructuredBuffer:
+  case ResourceKind::RawBuffer:
+  case ResourceKind::StructuredBuffer:
     if (SRV)
       OS << right_justify("r/o", Alignment);
     else {
@@ -193,22 +193,22 @@ void ResourceBase::printKind(Kinds Kind, unsigned Alignment, raw_ostream &OS,
         OS << right_justify("r/w+cnt", Alignment);
     }
     break;
-  case Kinds::TypedBuffer:
+  case ResourceKind::TypedBuffer:
     OS << right_justify("buf", Alignment);
     break;
-  case Kinds::Texture2DMS:
-  case Kinds::Texture2DMSArray: {
+  case ResourceKind::Texture2DMS:
+  case ResourceKind::Texture2DMSArray: {
     std::string DimName = getKindName(Kind).str();
     if (SampleCount)
       DimName += std::to_string(SampleCount);
     OS << right_justify(DimName, Alignment);
   } break;
-  case Kinds::CBuffer:
-  case Kinds::Sampler:
+  case ResourceKind::CBuffer:
+  case ResourceKind::Sampler:
     OS << right_justify("NA", Alignment);
     break;
-  case Kinds::Invalid:
-  case Kinds::NumEntries:
+  case ResourceKind::Invalid:
+  case ResourceKind::NumEntries:
     break;
   }
 }
@@ -258,9 +258,9 @@ void ConstantBuffer::print(raw_ostream &OS) const {
 
   OS << right_justify("cbuffer", 10);
 
-  printElementType(Kinds::CBuffer, ElementType::Invalid, 8, OS);
+  printElementType(ResourceKind::CBuffer, ElementType::Invalid, 8, OS);
 
-  printKind(Kinds::CBuffer, 12, OS, /*SRV*/ false, /*HasCounter*/ false);
+  printKind(ResourceKind::CBuffer, 12, OS, /*SRV*/ false, /*HasCounter*/ false);
   // Print the binding part.
   ResourceBase::print(OS, "CB", "cb");
 }
diff --git a/llvm/lib/Target/DirectX/DXILResource.h b/llvm/lib/Target/DirectX/DXILResource.h
index 5f8b0badd145c1e..06902fe2b87b0ca 100644
--- a/llvm/lib/Target/DirectX/DXILResource.h
+++ b/llvm/lib/Target/DirectX/DXILResource.h
@@ -18,6 +18,7 @@
 #include "llvm/Frontend/HLSL/HLSLResource.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/DXILABI.h"
 #include <cstdint>
 
 namespace llvm {
@@ -40,19 +41,19 @@ class ResourceBase {
   void write(LLVMContext &Ctx, MutableArrayRef<Metadata *> Entries) const;
 
   void print(raw_ostream &O, StringRef IDPrefix, StringRef BindingPrefix) const;
-  using Kinds = hlsl::ResourceKind;
-  static StringRef getKindName(Kinds Kind);
-  static void printKind(Kinds Kind, unsigned Alignment, raw_ostream &OS,
-                        bool SRV = false, bool HasCounter = false,
-                        uint32_t SampleCount = 0);
+  static StringRef getKindName(dxil::ResourceKind Kind);
+  static void printKind(dxil::ResourceKind Kind, unsigned Alignment,
+                        raw_ostream &OS, bool SRV = false,
+                        bool HasCounter = false, uint32_t SampleCount = 0);
 
-  static StringRef getElementTypeName(hlsl::ElementType CompType);
-  static void printElementType(Kinds Kind, hlsl::ElementType CompType,
-                               unsigned Alignment, raw_ostream &OS);
+  static StringRef getElementTypeName(dxil::ElementType CompType);
+  static void printElementType(dxil::ResourceKind Kind,
+                               dxil::ElementType CompType, unsigned Alignment,
+                               raw_ostream &OS);
 
 public:
   struct ExtendedProperties {
-    std::optional<hlsl::ElementType> ElementType;
+    std::optional<dxil::ElementType> ElementType;
 
     // The value ordering of this enumeration is part of the DXIL ABI. Elements
     // can only be added to the end, and not removed.
@@ -68,7 +69,7 @@ class ResourceBase {
 };
 
 class UAVResource : public ResourceBase {
-  ResourceBase::Kinds Shape;
+  dxil::ResourceKind Shape;
   bool GloballyCoherent;
   bool HasCounter;
   bool IsROV;

Copy link

github-actions bot commented Jan 16, 2024

✅ With the latest revision this PR passed the C/C++ code formatter.

Copy link
Collaborator

@llvm-beanz llvm-beanz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like you angered the clang-format god, but otherwise LGTM.

bogner and others added 4 commits January 29, 2024 08:53
Created using spr 1.3.5-bogner

[skip ci]
Created using spr 1.3.5-bogner
Created using spr 1.3.5-bogner

[skip ci]
Created using spr 1.3.5-bogner
@bogner bogner changed the base branch from users/bogner/sprmain.directx-move-dxil-resourcekind-and-elementtype-to-dxilabih-nfc to main January 29, 2024 17:50
@bogner bogner merged commit ad71318 into main Jan 29, 2024
6 of 7 checks passed
@bogner bogner deleted the users/bogner/sprdirectx-move-dxil-resourcekind-and-elementtype-to-dxilabih-nfc branch January 29, 2024 17:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants