Viewing file: DXILResource.h (7.18 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- DXILResource.h - Tools to translate DXIL resources -------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===//
#ifndef LLVM_TRANSFORMS_UTILS_DXILRESOURCE_H #define LLVM_TRANSFORMS_UTILS_DXILRESOURCE_H
#include "llvm/IR/Metadata.h" #include "llvm/IR/Value.h" #include "llvm/Support/DXILABI.h"
namespace llvm { namespace dxil {
struct ResourceBinding { uint32_t Space; uint32_t LowerBound; uint32_t Size;
bool operator==(const ResourceBinding &RHS) const { return std::tie(Space, LowerBound, Size) == std::tie(RHS.Space, RHS.LowerBound, RHS.Size); } bool operator!=(const ResourceBinding &RHS) const { return !(*this == RHS); } };
class ResourceInfo { struct UAVInfo { bool GloballyCoherent; bool HasCounter; bool IsROV;
bool operator==(const UAVInfo &RHS) const { return std::tie(GloballyCoherent, HasCounter, IsROV) == std::tie(RHS.GloballyCoherent, RHS.HasCounter, RHS.IsROV); } bool operator!=(const UAVInfo &RHS) const { return !(*this == RHS); } };
struct StructInfo { uint32_t Stride; Align Alignment;
bool operator==(const StructInfo &RHS) const { return std::tie(Stride, Alignment) == std::tie(RHS.Stride, RHS.Alignment); } bool operator!=(const StructInfo &RHS) const { return !(*this == RHS); } };
struct TypedInfo { dxil::ElementType ElementTy; uint32_t ElementCount;
bool operator==(const TypedInfo &RHS) const { return std::tie(ElementTy, ElementCount) == std::tie(RHS.ElementTy, RHS.ElementCount); } bool operator!=(const TypedInfo &RHS) const { return !(*this == RHS); } };
struct MSInfo { uint32_t Count;
bool operator==(const MSInfo &RHS) const { return Count == RHS.Count; } bool operator!=(const MSInfo &RHS) const { return !(*this == RHS); } };
struct FeedbackInfo { dxil::SamplerFeedbackType Type;
bool operator==(const FeedbackInfo &RHS) const { return Type == RHS.Type; } bool operator!=(const FeedbackInfo &RHS) const { return !(*this == RHS); } };
// Universal properties. Value *Symbol; StringRef Name;
ResourceBinding Binding; uint32_t UniqueID;
dxil::ResourceClass RC; dxil::ResourceKind Kind;
// Resource class dependent properties. // CBuffer, Sampler, and RawBuffer end here. union { UAVInfo UAVFlags; // UAV uint32_t CBufferSize; // CBuffer dxil::SamplerType SamplerTy; // Sampler };
// Resource kind dependent properties. union { StructInfo Struct; // StructuredBuffer TypedInfo Typed; // All SRV/UAV except Raw/StructuredBuffer FeedbackInfo Feedback; // FeedbackTexture };
MSInfo MultiSample;
// Conditions to check before accessing union members. bool isUAV() const; bool isCBuffer() const; bool isSampler() const; bool isStruct() const; bool isTyped() const; bool isFeedback() const; bool isMultiSample() const;
ResourceInfo(dxil::ResourceClass RC, dxil::ResourceKind Kind, Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID) : Symbol(Symbol), Name(Name), Binding(Binding), UniqueID(UniqueID), RC(RC), Kind(Kind) {}
public: static ResourceInfo SRV(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::ElementType ElementTy, uint32_t ElementCount, dxil::ResourceKind Kind); static ResourceInfo RawBuffer(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID); static ResourceInfo StructuredBuffer(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, uint32_t Stride, Align Alignment); static ResourceInfo Texture2DMS(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::ElementType ElementTy, uint32_t ElementCount, uint32_t SampleCount); static ResourceInfo Texture2DMSArray(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::ElementType ElementTy, uint32_t ElementCount, uint32_t SampleCount);
static ResourceInfo UAV(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::ElementType ElementTy, uint32_t ElementCount, bool GloballyCoherent, bool IsROV, dxil::ResourceKind Kind); static ResourceInfo RWRawBuffer(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, bool GloballyCoherent, bool IsROV); static ResourceInfo RWStructuredBuffer(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, uint32_t Stride, Align Alignment, bool GloballyCoherent, bool IsROV, bool HasCounter); static ResourceInfo RWTexture2DMS(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::ElementType ElementTy, uint32_t ElementCount, uint32_t SampleCount, bool GloballyCoherent); static ResourceInfo RWTexture2DMSArray(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::ElementType ElementTy, uint32_t ElementCount, uint32_t SampleCount, bool GloballyCoherent); static ResourceInfo FeedbackTexture2D(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::SamplerFeedbackType FeedbackTy); static ResourceInfo FeedbackTexture2DArray(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::SamplerFeedbackType FeedbackTy);
static ResourceInfo CBuffer(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, uint32_t Size);
static ResourceInfo Sampler(Value *Symbol, StringRef Name, ResourceBinding Binding, uint32_t UniqueID, dxil::SamplerType SamplerTy);
bool operator==(const ResourceInfo &RHS) const;
MDTuple *getAsMetadata(LLVMContext &Ctx) const;
ResourceBinding getBinding() const { return Binding; } std::pair<uint32_t, uint32_t> getAnnotateProps() const; };
} // namespace dxil } // namespace llvm
#endif // LLVM_TRANSFORMS_UTILS_DXILRESOURCE_H
|