Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions llvm/include/llvm/MC/DXContainerRootSignature.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ struct RootSignatureDesc {
LLVM_ABI void write(raw_ostream &OS) const;

LLVM_ABI size_t getSize() const;
LLVM_ABI uint32_t computeRootParametersOffset() const;
LLVM_ABI uint32_t computeStaticSamplersOffset() const;
};
} // namespace mcdxbc
} // namespace llvm
Expand Down
4 changes: 2 additions & 2 deletions llvm/include/llvm/ObjectYAML/DXContainerYAML.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,9 @@ struct RootSignatureYamlDesc {

uint32_t Version;
uint32_t NumRootParameters;
uint32_t RootParametersOffset;
std::optional<uint32_t> RootParametersOffset;
uint32_t NumStaticSamplers;
uint32_t StaticSamplersOffset;
std::optional<uint32_t> StaticSamplersOffset;

RootParameterYamlDesc Parameters;
SmallVector<StaticSamplerYamlDesc> StaticSamplers;
Expand Down
76 changes: 42 additions & 34 deletions llvm/lib/MC/DXContainerRootSignature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,32 +20,43 @@ static uint32_t writePlaceholder(raw_svector_ostream &Stream) {
return Offset;
}

static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
uint32_t Offset) {
static uint32_t rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
uint32_t Offset) {
uint32_t Value =
support::endian::byte_swap<uint32_t, llvm::endianness::little>(
Stream.tell());
Stream.pwrite(reinterpret_cast<const char *>(&Value), sizeof(Value), Offset);
return Value;
}

size_t RootSignatureDesc::getSize() const {
size_t Size =
sizeof(dxbc::RTS0::v1::RootSignatureHeader) +
ParametersContainer.size() * sizeof(dxbc::RTS0::v1::RootParameterHeader) +
uint32_t StaticSamplersOffset = computeStaticSamplersOffset();
size_t StaticSamplersSize =
StaticSamplers.size() * sizeof(dxbc::RTS0::v1::StaticSampler);

return size_t(StaticSamplersOffset) + StaticSamplersSize;
}

uint32_t RootSignatureDesc::computeRootParametersOffset() const {
return sizeof(dxbc::RTS0::v1::RootSignatureHeader);
}

uint32_t RootSignatureDesc::computeStaticSamplersOffset() const {
uint32_t Offset = computeRootParametersOffset();

for (const RootParameterInfo &I : ParametersContainer) {
Offset += sizeof(dxbc::RTS0::v1::RootParameterHeader);
switch (I.Type) {
case dxbc::RootParameterType::Constants32Bit:
Size += sizeof(dxbc::RTS0::v1::RootConstants);
Offset += sizeof(dxbc::RTS0::v1::RootConstants);
break;
case dxbc::RootParameterType::CBV:
case dxbc::RootParameterType::SRV:
case dxbc::RootParameterType::UAV:
if (Version == 1)
Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
Offset += sizeof(dxbc::RTS0::v1::RootDescriptor);
else
Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
Offset += sizeof(dxbc::RTS0::v2::RootDescriptor);

break;
case dxbc::RootParameterType::DescriptorTable:
Expand All @@ -54,15 +65,16 @@ size_t RootSignatureDesc::getSize() const {

// 4 bytes for the number of ranges in table and
// 4 bytes for the ranges offset
Size += 2 * sizeof(uint32_t);
Offset += 2 * sizeof(uint32_t);
if (Version == 1)
Size += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size();
Offset += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size();
else
Size += sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size();
Offset += sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size();
break;
}
}
return Size;

return Offset;
}

void RootSignatureDesc::write(raw_ostream &OS) const {
Expand All @@ -76,11 +88,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, NumParameters, llvm::endianness::little);
support::endian::write(BOS, RootParameterOffset, llvm::endianness::little);
support::endian::write(BOS, NumSamplers, llvm::endianness::little);
uint32_t SSO = StaticSamplersOffset;
if (NumSamplers > 0)
SSO = writePlaceholder(BOS);
else
support::endian::write(BOS, SSO, llvm::endianness::little);
uint32_t SSO = writePlaceholder(BOS);
support::endian::write(BOS, Flags, llvm::endianness::little);

SmallVector<uint32_t> ParamsOffsets;
Expand Down Expand Up @@ -144,23 +152,23 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
}
}
}
if (NumSamplers > 0) {
rewriteOffsetToCurrentByte(BOS, SSO);
for (const auto &S : StaticSamplers) {
support::endian::write(BOS, S.Filter, llvm::endianness::little);
support::endian::write(BOS, S.AddressU, llvm::endianness::little);
support::endian::write(BOS, S.AddressV, llvm::endianness::little);
support::endian::write(BOS, S.AddressW, llvm::endianness::little);
support::endian::write(BOS, S.MipLODBias, llvm::endianness::little);
support::endian::write(BOS, S.MaxAnisotropy, llvm::endianness::little);
support::endian::write(BOS, S.ComparisonFunc, llvm::endianness::little);
support::endian::write(BOS, S.BorderColor, llvm::endianness::little);
support::endian::write(BOS, S.MinLOD, llvm::endianness::little);
support::endian::write(BOS, S.MaxLOD, llvm::endianness::little);
support::endian::write(BOS, S.ShaderRegister, llvm::endianness::little);
support::endian::write(BOS, S.RegisterSpace, llvm::endianness::little);
support::endian::write(BOS, S.ShaderVisibility, llvm::endianness::little);
}
[[maybe_unused]] uint32_t Offset = rewriteOffsetToCurrentByte(BOS, SSO);
assert(Offset == computeStaticSamplersOffset() &&
"Computed offset does not match written offset");
for (const auto &S : StaticSamplers) {
support::endian::write(BOS, S.Filter, llvm::endianness::little);
support::endian::write(BOS, S.AddressU, llvm::endianness::little);
support::endian::write(BOS, S.AddressV, llvm::endianness::little);
support::endian::write(BOS, S.AddressW, llvm::endianness::little);
support::endian::write(BOS, S.MipLODBias, llvm::endianness::little);
support::endian::write(BOS, S.MaxAnisotropy, llvm::endianness::little);
support::endian::write(BOS, S.ComparisonFunc, llvm::endianness::little);
support::endian::write(BOS, S.BorderColor, llvm::endianness::little);
support::endian::write(BOS, S.MinLOD, llvm::endianness::little);
support::endian::write(BOS, S.MaxLOD, llvm::endianness::little);
support::endian::write(BOS, S.ShaderRegister, llvm::endianness::little);
support::endian::write(BOS, S.RegisterSpace, llvm::endianness::little);
support::endian::write(BOS, S.ShaderVisibility, llvm::endianness::little);
}
assert(Storage.size() == getSize());
OS.write(Storage.data(), Storage.size());
Expand Down
34 changes: 28 additions & 6 deletions llvm/lib/ObjectYAML/DXContainerEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class DXContainerWriter {
Error validateSize(uint32_t Computed);

void writeHeader(raw_ostream &OS);
void writeParts(raw_ostream &OS);
Error writeParts(raw_ostream &OS);
};
} // namespace

Expand Down Expand Up @@ -107,7 +107,7 @@ void DXContainerWriter::writeHeader(raw_ostream &OS) {
Offsets.size() * sizeof(uint32_t));
}

void DXContainerWriter::writeParts(raw_ostream &OS) {
Error DXContainerWriter::writeParts(raw_ostream &OS) {
uint32_t RollingOffset =
sizeof(dxbc::Header) + (ObjectFile.Header.PartCount * sizeof(uint32_t));
for (auto I : llvm::zip(ObjectFile.Parts, *ObjectFile.Header.PartOffsets)) {
Expand Down Expand Up @@ -269,9 +269,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
mcdxbc::RootSignatureDesc RS;
RS.Flags = P.RootSignature->getEncodedFlags();
RS.Version = P.RootSignature->Version;
RS.RootParameterOffset = P.RootSignature->RootParametersOffset;
RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;

for (DXContainerYAML::RootParameterLocationYaml &L :
P.RootSignature->Parameters.Locations) {
Expand Down Expand Up @@ -323,8 +321,10 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
Range.RegisterSpace = R.RegisterSpace;
Range.OffsetInDescriptorsFromTableStart =
R.OffsetInDescriptorsFromTableStart;

if (RS.Version > 1)
Range.Flags = R.getEncodedFlags();

Table.Ranges.push_back(Range);
}
RS.ParametersContainer.addParameter(Type, Visibility, Table);
Expand Down Expand Up @@ -352,6 +352,27 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.StaticSamplers.push_back(NewSampler);
}

// Handling of offsets
RS.RootParameterOffset = RS.computeRootParametersOffset();
if (P.RootSignature->RootParametersOffset &&
P.RootSignature->RootParametersOffset.value() !=
RS.RootParameterOffset) {
return createStringError(
errc::invalid_argument,
"Specified RootParametersOffset does not match required value: %d.",
RS.RootParameterOffset);
}

RS.StaticSamplersOffset = RS.computeStaticSamplersOffset();
if (P.RootSignature->StaticSamplersOffset &&
P.RootSignature->StaticSamplersOffset.value() !=
RS.StaticSamplersOffset) {
return createStringError(
errc::invalid_argument,
"Specified StaticSamplersOffset does not match computed value: %d.",
RS.StaticSamplersOffset);
}

RS.write(OS);
break;
}
Expand All @@ -361,14 +382,15 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
OS.write_zeros(PartSize - BytesWritten);
RollingOffset += PartSize;
}

return Error::success();
}

Error DXContainerWriter::write(raw_ostream &OS) {
if (Error Err = computePartOffsets())
return Err;
writeHeader(OS);
writeParts(OS);
return Error::success();
return writeParts(OS);
}

namespace llvm {
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/ObjectYAML/DXContainerYAML.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -376,9 +376,9 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) {
IO.mapRequired("Version", S.Version);
IO.mapRequired("NumRootParameters", S.NumRootParameters);
IO.mapRequired("RootParametersOffset", S.RootParametersOffset);
IO.mapOptional("RootParametersOffset", S.RootParametersOffset, std::nullopt);
IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers);
IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
IO.mapOptional("StaticSamplersOffset", S.StaticSamplersOffset, std::nullopt);
IO.mapRequired("Parameters", S.Parameters.Locations, S);
IO.mapOptional("Samplers", S.StaticSamplers);
#define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
;DXC-NEXT: NumRootParameters: 1
;DXC-NEXT: RootParametersOffset: 24
;DXC-NEXT: NumStaticSamplers: 0
;DXC-NEXT: StaticSamplersOffset: 0
;DXC-NEXT: StaticSamplersOffset: 380
;DXC-NEXT: Parameters:
;DXC-NEXT: - ParameterType: 0
;DXC-NEXT: ShaderVisibility: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: NumRootParameters: 1
; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: StaticSamplersOffset: 84
; DXC-NEXT: Parameters:
; DXC-NEXT: - ParameterType: 0
; DXC-NEXT: ShaderVisibility: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: NumRootParameters: 1
; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: StaticSamplersOffset: 92
; DXC-NEXT: Parameters:
; DXC-NEXT: - ParameterType: 0
; DXC-NEXT: ShaderVisibility: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: NumRootParameters: 0
; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: StaticSamplersOffset: 24
; DXC-NEXT: Parameters: []
; DXC-NEXT: AllowInputAssemblerInputLayout: true
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: NumRootParameters: 1
; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: StaticSamplersOffset: 48
; DXC-NEXT: Parameters:
; DXC-NEXT: - ParameterType: 1
; DXC-NEXT: ShaderVisibility: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: NumRootParameters: 1
; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: StaticSamplersOffset: 48
; DXC-NEXT: Parameters:
; DXC-NEXT: - ParameterType: 2
; DXC-NEXT: ShaderVisibility: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: NumRootParameters: 1
; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: StaticSamplersOffset: 44
; DXC-NEXT: Parameters:
; DXC-NEXT: - ParameterType: 2
; DXC-NEXT: ShaderVisibility: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Parts:
NumRootParameters: 1
RootParametersOffset: 24
NumStaticSamplers: 0
StaticSamplersOffset: 60
StaticSamplersOffset: 44
Parameters:
- ParameterType: 2 # SRV
ShaderVisibility: 3 # Domain
Expand All @@ -34,7 +34,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 1
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: StaticSamplersOffset: 44
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: 2
# CHECK-NEXT: ShaderVisibility: 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Parts:
NumRootParameters: 1
RootParametersOffset: 24
NumStaticSamplers: 0
StaticSamplersOffset: 60
StaticSamplersOffset: 48
Parameters:
- ParameterType: 2 # SRV
ShaderVisibility: 3 # Domain
Expand All @@ -35,7 +35,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 1
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: StaticSamplersOffset: 48
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: 2
# CHECK-NEXT: ShaderVisibility: 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Parts:
NumRootParameters: 1
RootParametersOffset: 24
NumStaticSamplers: 0
StaticSamplersOffset: 60
StaticSamplersOffset: 64
Parameters:
- ParameterType: 0 # SRV
ShaderVisibility: 3 # Domain
Expand All @@ -40,7 +40,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 1
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: StaticSamplersOffset: 64
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: 0
# CHECK-NEXT: ShaderVisibility: 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Parts:
NumRootParameters: 1
RootParametersOffset: 24
NumStaticSamplers: 0
StaticSamplersOffset: 60
StaticSamplersOffset: 68
Parameters:
- ParameterType: 0 # SRV
ShaderVisibility: 3 # Domain
Expand All @@ -41,7 +41,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 1
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: StaticSamplersOffset: 68
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: 0
# CHECK-NEXT: ShaderVisibility: 3
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Parts:
NumRootParameters: 0
RootParametersOffset: 24
NumStaticSamplers: 0
StaticSamplersOffset: 60
StaticSamplersOffset: 24
Parameters: []
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
Expand All @@ -29,7 +29,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 0
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: StaticSamplersOffset: 24
# CHECK-NEXT: Parameters: []
# CHECK-NEXT: AllowInputAssemblerInputLayout: true
# CHECK-NEXT: DenyGeometryShaderRootAccess: true
Loading