Justin Bogner 58eec851cb
[DirectX] Move resource logic into PrettyPrinter and TranslateMetadata. NFC
Move the module level logic for resources into the pretty printer and translate
metadata passes rather than embedding them in the DXILResource helper. This
will make it easier to migrate towards the target extension type based approach
to resources.

Pull Request: https://github.com/llvm/llvm-project/pull/104446
2024-08-26 16:44:41 -07:00

134 lines
4.1 KiB
C++

//===- 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);
bool empty() const { return Data.empty(); }
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);
bool hasUAVs() const { return !UAVs.empty(); }
Metadata *writeUAVs(Module &M) const;
void printUAVs(raw_ostream &OS) const;
bool hasCBuffers() const { return !CBuffers.empty(); }
Metadata *writeCBuffers(Module &M) const;
void printCBuffers(raw_ostream &OS) const;
LLVM_DUMP_METHOD void dump() const;
};
} // namespace dxil
} // namespace llvm
#endif // LLVM_TARGET_DIRECTX_DXILRESOURCE_H