1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
//===- 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 "llvm/Support/DXILABI.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;
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(dxil::ElementType CompType);
static void printElementType(dxil::ResourceKind Kind,
dxil::ElementType CompType, unsigned Alignment,
raw_ostream &OS);
public:
struct ExtendedProperties {
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.
enum Tags : uint32_t {
TypedBufferElementType = 0,
StructuredBufferElementStride,
SamplerFeedbackKind,
Atomic64Use
};
MDNode *write(LLVMContext &Ctx) const;
};
};
class UAVResource : public ResourceBase {
dxil::ResourceKind Shape;
bool GloballyCoherent;
bool HasCounter;
bool IsROV;
ResourceBase::ExtendedProperties ExtProps;
void parseSourceType(StringRef S);
public:
UAVResource(uint32_t I, hlsl::FrontendResource R)
: ResourceBase(I, R), Shape(R.getResourceKind()), GloballyCoherent(false),
HasCounter(false), IsROV(R.getIsROV()), ExtProps{R.getElementType()} {}
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
|