| //===- DXILResource.h - DXIL Resource helper objects ----------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file This file contains helper objects for working with DXIL Resources. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TARGET_DIRECTX_DXILRESOURCE_H | |
| #define LLVM_TARGET_DIRECTX_DXILRESOURCE_H | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/Frontend/HLSL/HLSLResource.h" | |
| #include "llvm/IR/Metadata.h" | |
| #include "llvm/Support/Compiler.h" | |
| #include <cstdint> | |
| namespace llvm { | |
| class Module; | |
| class GlobalVariable; | |
| namespace dxil { | |
| class CBufferDataLayout; | |
| class ResourceBase { | |
| protected: | |
| uint32_t ID; | |
| GlobalVariable *GV; | |
| StringRef Name; | |
| uint32_t Space; | |
| uint32_t LowerBound; | |
| uint32_t RangeSize; | |
| ResourceBase(uint32_t I, hlsl::FrontendResource R); | |
| 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); | |
| // 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 ComponentType : uint32_t { | |
| Invalid = 0, | |
| I1, | |
| I16, | |
| U16, | |
| I32, | |
| U32, | |
| I64, | |
| U64, | |
| F16, | |
| F32, | |
| F64, | |
| SNormF16, | |
| UNormF16, | |
| SNormF32, | |
| UNormF32, | |
| SNormF64, | |
| UNormF64, | |
| PackedS8x32, | |
| PackedU8x32, | |
| LastEntry | |
| }; | |
| static StringRef getComponentTypeName(ComponentType CompType); | |
| static void printComponentType(Kinds Kind, ComponentType CompType, | |
| unsigned Alignment, raw_ostream &OS); | |
| public: | |
| struct ExtendedProperties { | |
| std::optional<ComponentType> ElementType; | |
| // The value ordering of this enumeration is part of the DXIL ABI. Elements | |
| // can only be added to the end, and not removed. | |
| enum Tags : uint32_t { | |
| TypedBufferElementType = 0, | |
| StructuredBufferElementStride, | |
| SamplerFeedbackKind, | |
| Atomic64Use | |
| }; | |
| MDNode *write(LLVMContext &Ctx) const; | |
| }; | |
| }; | |
| class UAVResource : public ResourceBase { | |
| ResourceBase::Kinds Shape; | |
| bool GloballyCoherent; | |
| bool HasCounter; | |
| bool IsROV; | |
| ResourceBase::ExtendedProperties ExtProps; | |
| void parseSourceType(StringRef S); | |
| public: | |
| UAVResource(uint32_t I, hlsl::FrontendResource R); | |
| MDNode *write() const; | |
| void print(raw_ostream &O) const; | |
| }; | |
| class ConstantBuffer : public ResourceBase { | |
| uint32_t CBufferSizeInBytes = 0; // Cbuffer used size in bytes. | |
| public: | |
| ConstantBuffer(uint32_t I, hlsl::FrontendResource R); | |
| void setSize(CBufferDataLayout &DL); | |
| MDNode *write() const; | |
| void print(raw_ostream &O) const; | |
| }; | |
| template <typename T> class ResourceTable { | |
| StringRef MDName; | |
| llvm::SmallVector<T> Data; | |
| public: | |
| ResourceTable(StringRef Name) : MDName(Name) {} | |
| void collect(Module &M); | |
| MDNode *write(Module &M) const; | |
| void print(raw_ostream &O) const; | |
| }; | |
| // FIXME: Fully computing the resource structures requires analyzing the IR | |
| // because some flags are set based on what operations are performed on the | |
| // resource. This partial patch handles some of the leg work, but not all of it. | |
| // See issue https://github.com/llvm/llvm-project/issues/57936. | |
| class Resources { | |
| ResourceTable<UAVResource> UAVs = {"hlsl.uavs"}; | |
| ResourceTable<ConstantBuffer> CBuffers = {"hlsl.cbufs"}; | |
| public: | |
| void collect(Module &M); | |
| void write(Module &M) const; | |
| void print(raw_ostream &O) const; | |
| LLVM_DUMP_METHOD void dump() const; | |
| }; | |
| } // namespace dxil | |
| } // namespace llvm | |
| #endif // LLVM_TARGET_DIRECTX_DXILRESOURCE_H |