Skip to content

[DirectX] adding support in obj2yaml and yaml2obj to root constants #127840

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 130 commits into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from 129 commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
526b34a
adding rootsignature to obj2yaml
Jan 13, 2025
e84a8e1
adding test
Jan 13, 2025
f25fd64
removing old test
Jan 13, 2025
16552f0
remove useless includes
Jan 13, 2025
a6eb4c0
addressing comments
Jan 14, 2025
7d080b3
updating test
Jan 14, 2025
504527b
removing useless header
Jan 15, 2025
2425672
fix formating
Jan 15, 2025
08c17bb
renaming test
Jan 15, 2025
395a536
addressing pr comments
Jan 16, 2025
f93dff9
adding str to ROOT_ELEMENT_FLAG
Jan 16, 2025
1c1edb8
formating
Jan 17, 2025
5bef775
refactoring to follow llvm standards
Jan 18, 2025
628545a
addressing comments
Jan 27, 2025
c5c2ab6
clean up
Jan 27, 2025
b9db72c
remove version
Jan 30, 2025
f4af043
fix pr
Jan 30, 2025
496b922
adding dxil-dis test
Jan 31, 2025
422578f
adding compatibility test
Jan 31, 2025
b1423eb
addressing test concerns
Feb 3, 2025
b6262b6
clean up
Feb 3, 2025
16d0e8e
addressing comments
Feb 4, 2025
0a9e468
adding fail test
Feb 4, 2025
8295031
adding comment
Feb 4, 2025
c8e1e38
adding few more tests
Feb 4, 2025
434b862
format
Feb 4, 2025
2bfc5ad
cleanup
Feb 5, 2025
479422d
adding metadata extraction
Jan 15, 2025
f61ee77
moving root signature to it's own pass
Jan 16, 2025
499d879
formating
Jan 16, 2025
c4af535
removing useless imports
Jan 16, 2025
819fa0d
fixing pr changes
Jan 16, 2025
d347a87
adding some asserts
Jan 16, 2025
d8824ed
format
Jan 16, 2025
25c0384
fixing assert
Jan 18, 2025
5eb0ad2
cleaning
Jan 27, 2025
559427d
clean up
Jan 29, 2025
8ca5b2a
addressing comments
Jan 30, 2025
d52cd2c
removing version
Jan 30, 2025
5930dcb
fix test
Jan 30, 2025
fc72988
addressing PR Comments
Jan 31, 2025
2d1ee0d
fix test
Feb 3, 2025
92a85fe
filtering root signatures not associated with entry function
Feb 4, 2025
979ee91
separating parsing and validation
Feb 4, 2025
d089674
improve error handling
Feb 6, 2025
980e7d9
clean up
Feb 6, 2025
04667f3
clean up
Feb 6, 2025
8ec40aa
formating
Feb 6, 2025
b0ac6be
addressing comments and fix tests
Feb 7, 2025
6a36503
formating
Feb 7, 2025
f7d2c12
addressing pr comments
Feb 10, 2025
d6c98ed
addressing PR comments
Feb 11, 2025
36746f5
addressing pr comments
Feb 11, 2025
b5208e8
removing copies from root signature use in dx container globals
Feb 11, 2025
1fd6568
adding more tests
Feb 12, 2025
cde4634
maybe fix test?
Feb 12, 2025
4410e7b
try fix format
Feb 12, 2025
cbdb114
removing test
Feb 12, 2025
667ee17
adding llvm unreachable and testing test
Feb 12, 2025
d0dae8b
stopping compilation if root signature error were emitted
Feb 12, 2025
b1b28f8
making sure Error tests fail
Feb 12, 2025
0efd8cc
adding root constants
Feb 12, 2025
11256d8
refactoring root signature analysis to return a map instead
Feb 12, 2025
3c5046e
addressing pr comments
Feb 12, 2025
5d4505c
clean up
Feb 12, 2025
3117530
addressing pr comments
Feb 13, 2025
0af845c
implementing find interface for RootSignatureAnalysisWrapper
Feb 13, 2025
bf49a3a
adding test for null function
Feb 13, 2025
78826a5
fix root signature test error
Feb 14, 2025
4e689e9
fix other functions are checked
Feb 14, 2025
b0d0180
adding missing continue
Feb 14, 2025
3c6894f
adding few more tests
Feb 14, 2025
08f6ddc
adding yaml2obj support
Feb 15, 2025
b232967
adding support for obj2yaml and initial tests
Feb 18, 2025
1026a8e
multiple parameters support and more testing
Feb 19, 2025
00175bf
clean up
Feb 19, 2025
9ed2adc
fixing formating
Feb 19, 2025
e8252ba
reapply rebase fix
Feb 19, 2025
4de5c29
clean up
Feb 20, 2025
fe13b61
addressing pr comments
Feb 22, 2025
767b7d0
first working version
Feb 22, 2025
8434dc2
formating
Feb 22, 2025
d391727
moving the offset logic to it's own class
Feb 24, 2025
68c7513
refactoring to remove use of map and string
Feb 24, 2025
23069ab
addressing comments
Feb 25, 2025
d14471b
using buffer_ostream
Feb 25, 2025
216341c
remove getsize
Feb 25, 2025
85f012c
clean up
Feb 25, 2025
1e2bcf5
clean up
Feb 25, 2025
0e277d9
clean up
Feb 25, 2025
5cd0044
clean up
Feb 25, 2025
7a7c34d
addressing pr comments
Feb 25, 2025
d3fafab
clean up
Feb 25, 2025
15d1a8c
Merge branch 'refactor/improve-offset-calculation' into users/joaosaf…
Feb 25, 2025
7485640
clean up
Feb 26, 2025
17abc82
moving initializer arround
Feb 26, 2025
4b177e2
addressing pr comments
Feb 26, 2025
ec1dd87
addressing changes
Feb 26, 2025
eb9d7d3
Merge branch 'main' into users/joaosaffran/127840
Feb 26, 2025
f2a4f04
fix test
Feb 26, 2025
7c4236c
refactoring to change representations in binary format
Mar 1, 2025
2894f96
addressing pr comments
Mar 2, 2025
7b5e9d8
addressing comments and clean up
Mar 20, 2025
f0e6a46
moving RootSignatureValidations to out of BinaryFormat
Mar 24, 2025
4fe30df
addressing most pr comments
Mar 24, 2025
cbc334a
adding root parameter view
Mar 26, 2025
31bcd73
clean up
Mar 26, 2025
30098e1
addressing pr comments
Mar 29, 2025
1bf6408
wip: implementing comments
Mar 31, 2025
d1b32f3
removing old code
Apr 4, 2025
3b9bf27
address errors
Apr 4, 2025
89632a4
removing validations from obj2yaml
Apr 7, 2025
67da709
ac
Apr 8, 2025
3991c5d
address comments
Apr 8, 2025
cfc6bfb
clean up
Apr 8, 2025
82a31fa
removing param_header_begin and param_header_end
Apr 9, 2025
e6865a7
Revert "clean up"
Apr 9, 2025
021976d
Reapply "clean up"
Apr 9, 2025
102ff4b
removing unnecessary parameters
Apr 10, 2025
39d4b08
addressing pr comments
Apr 10, 2025
7343d95
adding more tests
Apr 11, 2025
6986945
adding more tests and addressing comments
Apr 11, 2025
c0ac522
adding tests and changing parameter type
Apr 14, 2025
8511fa9
address comments
Apr 14, 2025
330369a
changing back enums to enum class
Apr 15, 2025
d747bcc
addressing PR comments and adding more tests
Apr 16, 2025
6cef567
adding tests and fixing code
Apr 16, 2025
246d5d3
addressing comments
Apr 16, 2025
bb6c0cf
clean up
Apr 16, 2025
7885eed
addressing nits
Apr 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 73 additions & 4 deletions llvm/include/llvm/BinaryFormat/DXContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#define LLVM_BINARYFORMAT_DXCONTAINER_H

#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/SwapByteOrder.h"
#include "llvm/TargetParser/Triple.h"

Expand Down Expand Up @@ -157,6 +158,40 @@ enum class RootElementFlag : uint32_t {
#include "DXContainerConstants.def"
};

#define ROOT_PARAMETER(Val, Enum) Enum = Val,
enum class RootParameterType : uint32_t {
#include "DXContainerConstants.def"
};

ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();

#define ROOT_PARAMETER(Val, Enum) \
case Val: \
return true;
inline bool isValidParameterType(uint32_t V) {
switch (V) {
#include "DXContainerConstants.def"
}
return false;
}

#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
enum class ShaderVisibility : uint32_t {
#include "DXContainerConstants.def"
};

ArrayRef<EnumEntry<ShaderVisibility>> getShaderVisibility();

#define SHADER_VISIBILITY(Val, Enum) \
case Val: \
return true;
inline bool isValidShaderVisibility(uint32_t V) {
switch (V) {
#include "DXContainerConstants.def"
}
return false;
}

PartType parsePartType(StringRef S);

struct VertexPSVInfo {
Expand Down Expand Up @@ -546,15 +581,49 @@ struct ProgramSignatureElement {
static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");

struct RootSignatureValidations {
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
struct RootConstants {
uint32_t ShaderRegister;
uint32_t RegisterSpace;
uint32_t Num32BitValues;

void swapBytes() {
sys::swapByteOrder(ShaderRegister);
sys::swapByteOrder(RegisterSpace);
sys::swapByteOrder(Num32BitValues);
}
};

static bool isValidRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
struct RootParameterHeader {
uint32_t ParameterType;
uint32_t ShaderVisibility;
uint32_t ParameterOffset;

static bool isValidVersion(uint32_t Version) {
return (Version == 1 || Version == 2);
void swapBytes() {
sys::swapByteOrder(ParameterType);
sys::swapByteOrder(ShaderVisibility);
sys::swapByteOrder(ParameterOffset);
}
};

struct RootSignatureHeader {
uint32_t Version;
uint32_t NumParameters;
uint32_t ParametersOffset;
uint32_t NumStaticSamplers;
uint32_t StaticSamplerOffset;
uint32_t Flags;

void swapBytes() {
sys::swapByteOrder(Version);
sys::swapByteOrder(NumParameters);
sys::swapByteOrder(ParametersOffset);
sys::swapByteOrder(NumStaticSamplers);
sys::swapByteOrder(StaticSamplerOffset);
sys::swapByteOrder(Flags);
}
};
} // namespace dxbc
} // namespace llvm

Expand Down
18 changes: 18 additions & 0 deletions llvm/include/llvm/BinaryFormat/DXContainerConstants.def
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,24 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
#undef ROOT_ELEMENT_FLAG
#endif // ROOT_ELEMENT_FLAG

#ifdef ROOT_PARAMETER

ROOT_PARAMETER(1, Constants32Bit)
#undef ROOT_PARAMETER
#endif // ROOT_PARAMETER

#ifdef SHADER_VISIBILITY

SHADER_VISIBILITY(0, All)
SHADER_VISIBILITY(1, Vertex)
SHADER_VISIBILITY(2, Hull)
SHADER_VISIBILITY(3, Domain)
SHADER_VISIBILITY(4, Geometry)
SHADER_VISIBILITY(5, Pixel)
SHADER_VISIBILITY(6, Amplification)
SHADER_VISIBILITY(7, Mesh)
#undef SHADER_VISIBILITY
#endif // SHADER_VISIBILITY

#ifdef DXIL_MODULE_FLAG

Expand Down
24 changes: 17 additions & 7 deletions llvm/include/llvm/MC/DXContainerRootSignature.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,33 @@
//
//===----------------------------------------------------------------------===//

#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
#include <limits>

namespace llvm {

class raw_ostream;

namespace mcdxbc {

struct RootParameter {
dxbc::RootParameterHeader Header;
union {
dxbc::RootConstants Constants;
};
};
struct RootSignatureDesc {
uint32_t Version = 2;
uint32_t NumParameters = 0;
uint32_t RootParametersOffset = 0;
uint32_t NumStaticSamplers = 0;
uint32_t StaticSamplersOffset = 0;
uint32_t Flags = 0;

uint32_t Version = 2U;
uint32_t Flags = 0U;
uint32_t RootParameterOffset = 0U;
uint32_t StaticSamplersOffset = 0u;
uint32_t NumStaticSamplers = 0u;
SmallVector<mcdxbc::RootParameter> Parameters;

void write(raw_ostream &OS) const;

size_t getSize() const;
};
} // namespace mcdxbc
} // namespace llvm
72 changes: 70 additions & 2 deletions llvm/include/llvm/Object/DXContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Object/Error.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/TargetParser/Triple.h"
#include <array>
#include <cstddef>
#include <variant>

namespace llvm {
Expand Down Expand Up @@ -116,6 +118,40 @@ template <typename T> struct ViewArray {
};

namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
StringRef ParamData;
RootParameterView(const dxbc::RootParameterHeader &H, StringRef P)
: Header(H), ParamData(P) {}

template <typename T> Expected<T> readParameter() {
T Struct;
if (sizeof(T) != ParamData.size())
return make_error<GenericBinaryError>(
"Reading structure out of file bounds", object_error::parse_failed);

memcpy(&Struct, ParamData.data(), sizeof(T));
// DXContainer is always little endian
if (sys::IsBigEndianHost)
Struct.swapBytes();
return Struct;
}
};

struct RootConstantView : RootParameterView {
static bool classof(const RootParameterView *V) {
return V->Header.ParameterType ==
(uint32_t)dxbc::RootParameterType::Constants32Bit;
}

llvm::Expected<dxbc::RootConstants> read() {
return readParameter<dxbc::RootConstants>();
}
};

static Error parseFailed(const Twine &Msg) {
return make_error<GenericBinaryError>(Msg.str(), object_error::parse_failed);
}

class RootSignature {
private:
Expand All @@ -125,17 +161,49 @@ class RootSignature {
uint32_t NumStaticSamplers;
uint32_t StaticSamplersOffset;
uint32_t Flags;
ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
StringRef PartData;

using param_header_iterator = ViewArray<dxbc::RootParameterHeader>::iterator;

public:
RootSignature() {}
RootSignature(StringRef PD) : PartData(PD) {}

Error parse(StringRef Data);
Error parse();
uint32_t getVersion() const { return Version; }
uint32_t getNumParameters() const { return NumParameters; }
uint32_t getRootParametersOffset() const { return RootParametersOffset; }
uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
uint32_t getNumRootParameters() const { return ParametersHeaders.size(); }
llvm::iterator_range<param_header_iterator> param_headers() const {
return llvm::make_range(ParametersHeaders.begin(), ParametersHeaders.end());
}
uint32_t getFlags() const { return Flags; }

llvm::Expected<RootParameterView>
getParameter(const dxbc::RootParameterHeader &Header) const {
size_t DataSize;

if (!dxbc::isValidParameterType(Header.ParameterType))
return parseFailed("invalid parameter type");

switch (static_cast<dxbc::RootParameterType>(Header.ParameterType)) {
case dxbc::RootParameterType::Constants32Bit:
DataSize = sizeof(dxbc::RootConstants);
break;
}
size_t EndOfSectionByte = getNumStaticSamplers() == 0
? PartData.size()
: getStaticSamplersOffset();

if (Header.ParameterOffset + DataSize > EndOfSectionByte)
return parseFailed("Reading structure out of file bounds");

StringRef Buff = PartData.substr(Header.ParameterOffset, DataSize);
RootParameterView View = RootParameterView(Header, Buff);
return View;
}
};

class PSVRuntimeInfo {
Expand Down
38 changes: 36 additions & 2 deletions llvm/include/llvm/ObjectYAML/DXContainerYAML.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,43 @@ struct ShaderHash {
};

#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;

struct RootConstantsYaml {
uint32_t ShaderRegister;
uint32_t RegisterSpace;
uint32_t Num32BitValues;
};

struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;

union {
RootConstantsYaml Constants;
};
};

struct RootSignatureYamlDesc {
RootSignatureYamlDesc() = default;
RootSignatureYamlDesc(const object::DirectX::RootSignature &Data);

uint32_t Version;
uint32_t NumParameters;
uint32_t NumRootParameters;
uint32_t RootParametersOffset;
uint32_t NumStaticSamplers;
uint32_t StaticSamplersOffset;

SmallVector<RootParameterYamlDesc> Parameters;

uint32_t getEncodedFlags();

iterator_range<RootParameterYamlDesc *> params() {
return make_range(Parameters.begin(), Parameters.end());
}

static llvm::Expected<DXContainerYAML::RootSignatureYamlDesc>
create(const object::DirectX::RootSignature &Data);

#include "llvm/BinaryFormat/DXContainerConstants.def"
};

Expand Down Expand Up @@ -192,6 +217,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::ResourceBindInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureElement)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::PSVInfo::MaskVector)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureParameter)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::RootParameterYamlDesc)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode)
Expand Down Expand Up @@ -264,6 +290,14 @@ template <> struct MappingTraits<DXContainerYAML::RootSignatureYamlDesc> {
DXContainerYAML::RootSignatureYamlDesc &RootSignature);
};

template <> struct MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc> {
static void mapping(IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P);
};

template <> struct MappingTraits<llvm::DXContainerYAML::RootConstantsYaml> {
static void mapping(IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C);
};

} // namespace yaml

} // namespace llvm
Expand Down
20 changes: 20 additions & 0 deletions llvm/lib/BinaryFormat/DXContainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,26 @@ ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() {
return ArrayRef(SigComponentTypes);
}

#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibility::Enum},

static const EnumEntry<ShaderVisibility> ShaderVisibilityValues[] = {
#include "llvm/BinaryFormat/DXContainerConstants.def"
};

ArrayRef<EnumEntry<ShaderVisibility>> dxbc::getShaderVisibility() {
return ArrayRef(ShaderVisibilityValues);
}

#define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum},

static const EnumEntry<RootParameterType> RootParameterTypes[] = {
#include "llvm/BinaryFormat/DXContainerConstants.def"
};

ArrayRef<EnumEntry<RootParameterType>> dxbc::getRootParameterTypes() {
return ArrayRef(RootParameterTypes);
}

#define SEMANTIC_KIND(Val, Enum) {#Enum, PSV::SemanticKind::Enum},

static const EnumEntry<PSV::SemanticKind> SemanticKindNames[] = {
Expand Down
Loading
Loading