llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-directx Author: Justin Bogner (bogner) <details> <summary>Changes</summary> --- 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 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; `````````` </details> https://github.com/llvm/llvm-project/pull/78225 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits