1//===- DXILResource.h - DXIL Resource helper objects ----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file This file contains helper objects for working with DXIL Resources.
10///
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_TARGET_DIRECTX_DXILRESOURCE_H
14#define LLVM_TARGET_DIRECTX_DXILRESOURCE_H
15
16#include "llvm/ADT/SmallVector.h"
17#include "llvm/ADT/StringRef.h"
18#include "llvm/Frontend/HLSL/HLSLResource.h"
19#include "llvm/IR/Metadata.h"
20#include "llvm/Support/Compiler.h"
21#include "llvm/Support/DXILABI.h"
22#include <cstdint>
23
24namespace llvm {
25class Module;
26class GlobalVariable;
27
28namespace dxil {
29class CBufferDataLayout;
30
31class ResourceBase {
32protected:
33 uint32_t ID;
34 GlobalVariable *GV;
35 StringRef Name;
36 uint32_t Space;
37 uint32_t LowerBound;
38 uint32_t RangeSize;
39 ResourceBase(uint32_t I, hlsl::FrontendResource R);
40
41 void write(LLVMContext &Ctx, MutableArrayRef<Metadata *> Entries) const;
42
43 void print(raw_ostream &O, StringRef IDPrefix, StringRef BindingPrefix) const;
44 static StringRef getKindName(dxil::ResourceKind Kind);
45 static void printKind(dxil::ResourceKind Kind, unsigned Alignment,
46 raw_ostream &OS, bool SRV = false,
47 bool HasCounter = false, uint32_t SampleCount = 0);
48
49 static StringRef getElementTypeName(dxil::ElementType CompType);
50 static void printElementType(dxil::ResourceKind Kind,
51 dxil::ElementType CompType, unsigned Alignment,
52 raw_ostream &OS);
53
54public:
55 struct ExtendedProperties {
56 std::optional<dxil::ElementType> ElementType;
57
58 // The value ordering of this enumeration is part of the DXIL ABI. Elements
59 // can only be added to the end, and not removed.
60 enum Tags : uint32_t {
61 TypedBufferElementType = 0,
62 StructuredBufferElementStride,
63 SamplerFeedbackKind,
64 Atomic64Use
65 };
66
67 MDNode *write(LLVMContext &Ctx) const;
68 };
69};
70
71class UAVResource : public ResourceBase {
72 dxil::ResourceKind Shape;
73 bool GloballyCoherent;
74 bool HasCounter;
75 bool IsROV;
76 ResourceBase::ExtendedProperties ExtProps;
77
78 void parseSourceType(StringRef S);
79
80public:
81 UAVResource(uint32_t I, hlsl::FrontendResource R)
82 : ResourceBase(I, R), Shape(R.getResourceKind()), GloballyCoherent(false),
83 HasCounter(false), IsROV(R.getIsROV()), ExtProps{.ElementType: R.getElementType()} {}
84
85 MDNode *write() const;
86 void print(raw_ostream &O) const;
87};
88
89class ConstantBuffer : public ResourceBase {
90 uint32_t CBufferSizeInBytes = 0; // Cbuffer used size in bytes.
91public:
92 ConstantBuffer(uint32_t I, hlsl::FrontendResource R);
93 void setSize(CBufferDataLayout &DL);
94 MDNode *write() const;
95 void print(raw_ostream &O) const;
96};
97
98template <typename T> class ResourceTable {
99 StringRef MDName;
100
101 llvm::SmallVector<T> Data;
102
103public:
104 ResourceTable(StringRef Name) : MDName(Name) {}
105 void collect(Module &M);
106 MDNode *write(Module &M) const;
107 void print(raw_ostream &O) const;
108};
109
110// FIXME: Fully computing the resource structures requires analyzing the IR
111// because some flags are set based on what operations are performed on the
112// resource. This partial patch handles some of the leg work, but not all of it.
113// See issue https://github.com/llvm/llvm-project/issues/57936.
114class Resources {
115 ResourceTable<UAVResource> UAVs = {"hlsl.uavs"};
116 ResourceTable<ConstantBuffer> CBuffers = {"hlsl.cbufs"};
117
118public:
119 void collect(Module &M);
120 void write(Module &M) const;
121 void print(raw_ostream &O) const;
122 LLVM_DUMP_METHOD void dump() const;
123};
124
125} // namespace dxil
126} // namespace llvm
127
128#endif // LLVM_TARGET_DIRECTX_DXILRESOURCE_H
129

source code of llvm/lib/Target/DirectX/DXILResource.h