Skip to content

Commit b66c864

Browse files
committed
review: move offset computation to RootSignatureDesc in common place
1 parent b913992 commit b66c864

File tree

3 files changed

+47
-52
lines changed

3 files changed

+47
-52
lines changed

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ struct RootSignatureDesc {
110110
LLVM_ABI void write(raw_ostream &OS) const;
111111

112112
LLVM_ABI size_t getSize() const;
113+
LLVM_ABI uint32_t computeRootParametersOffset() const;
114+
LLVM_ABI uint32_t computeStaticSamplersOffset() const;
113115
};
114116
} // namespace mcdxbc
115117
} // namespace llvm

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,33 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
2929
}
3030

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

36+
return size_t(StaticSamplersOffset) + StaticSamplersSize;
37+
}
38+
39+
uint32_t RootSignatureDesc::computeRootParametersOffset() const {
40+
return sizeof(dxbc::RTS0::v1::RootSignatureHeader);
41+
}
42+
43+
uint32_t RootSignatureDesc::computeStaticSamplersOffset() const {
44+
uint32_t Offset = computeRootParametersOffset();
45+
3746
for (const RootParameterInfo &I : ParametersContainer) {
47+
Offset += sizeof(dxbc::RTS0::v1::RootParameterHeader);
3848
switch (I.Type) {
3949
case dxbc::RootParameterType::Constants32Bit:
40-
Size += sizeof(dxbc::RTS0::v1::RootConstants);
50+
Offset += sizeof(dxbc::RTS0::v1::RootConstants);
4151
break;
4252
case dxbc::RootParameterType::CBV:
4353
case dxbc::RootParameterType::SRV:
4454
case dxbc::RootParameterType::UAV:
4555
if (Version == 1)
46-
Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
56+
Offset += sizeof(dxbc::RTS0::v1::RootDescriptor);
4757
else
48-
Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
58+
Offset += sizeof(dxbc::RTS0::v2::RootDescriptor);
4959

5060
break;
5161
case dxbc::RootParameterType::DescriptorTable:
@@ -54,15 +64,16 @@ size_t RootSignatureDesc::getSize() const {
5464

5565
// 4 bytes for the number of ranges in table and
5666
// 4 bytes for the ranges offset
57-
Size += 2 * sizeof(uint32_t);
67+
Offset += 2 * sizeof(uint32_t);
5868
if (Version == 1)
59-
Size += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size();
69+
Offset += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size();
6070
else
61-
Size += sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size();
71+
Offset += sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size();
6272
break;
6373
}
6474
}
65-
return Size;
75+
76+
return Offset;
6677
}
6778

6879
void RootSignatureDesc::write(raw_ostream &OS) const {

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -269,27 +269,11 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
269269
mcdxbc::RootSignatureDesc RS;
270270
RS.Flags = P.RootSignature->getEncodedFlags();
271271
RS.Version = P.RootSignature->Version;
272-
273-
// Handling of RootParameters
274-
const uint32_t RootHeaderSize =
275-
sizeof(dxbc::RTS0::v1::RootSignatureHeader);
276-
if (P.RootSignature->RootParametersOffset &&
277-
P.RootSignature->RootParametersOffset.value() != RootHeaderSize) {
278-
return createStringError(
279-
errc::invalid_argument,
280-
"Specified RootParametersOffset does not match required value: %d.",
281-
RootHeaderSize);
282-
}
283-
284-
uint32_t Offset = RootHeaderSize;
285-
RS.RootParameterOffset = Offset;
272+
RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
286273

287274
for (DXContainerYAML::RootParameterLocationYaml &L :
288275
P.RootSignature->Parameters.Locations) {
289276

290-
// Offset RootParameterHeader
291-
Offset += sizeof(dxbc::RTS0::v1::RootParameterHeader);
292-
293277
assert(dxbc::isValidParameterType(L.Header.Type) &&
294278
"invalid DXContainer YAML");
295279
assert(dxbc::isValidShaderVisibility(L.Header.Visibility) &&
@@ -308,8 +292,6 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
308292
Constants.RegisterSpace = ConstantYaml.RegisterSpace;
309293
Constants.ShaderRegister = ConstantYaml.ShaderRegister;
310294
RS.ParametersContainer.addParameter(Type, Visibility, Constants);
311-
312-
Offset += sizeof(dxbc::RTS0::v1::RootConstants);
313295
break;
314296
}
315297
case dxbc::RootParameterType::CBV:
@@ -321,11 +303,8 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
321303
dxbc::RTS0::v2::RootDescriptor Descriptor;
322304
Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace;
323305
Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister;
324-
if (RS.Version > 1) {
306+
if (RS.Version > 1)
325307
Descriptor.Flags = DescriptorYaml.getEncodedFlags();
326-
Offset += sizeof(dxbc::RTS0::v2::RootDescriptor);
327-
} else
328-
Offset += sizeof(dxbc::RTS0::v1::RootDescriptor);
329308

330309
RS.ParametersContainer.addParameter(Type, Visibility, Descriptor);
331310
break;
@@ -334,8 +313,6 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
334313
const DXContainerYAML::DescriptorTableYaml &TableYaml =
335314
P.RootSignature->Parameters.getOrInsertTable(L);
336315
mcdxbc::DescriptorTable Table;
337-
Offset +=
338-
2 * sizeof(uint32_t); // DescriptorTable NumRanges and Offset
339316
for (const auto &R : TableYaml.Ranges) {
340317

341318
dxbc::RTS0::v2::DescriptorRange Range;
@@ -346,11 +323,8 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
346323
Range.OffsetInDescriptorsFromTableStart =
347324
R.OffsetInDescriptorsFromTableStart;
348325

349-
if (RS.Version > 1) {
350-
Offset += sizeof(dxbc::RTS0::v2::DescriptorRange);
326+
if (RS.Version > 1)
351327
Range.Flags = R.getEncodedFlags();
352-
} else
353-
Offset += sizeof(dxbc::RTS0::v1::DescriptorRange);
354328

355329
Table.Ranges.push_back(Range);
356330
}
@@ -360,19 +334,6 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
360334
}
361335
}
362336

363-
// Handling of StaticSamplers
364-
RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
365-
366-
if (P.RootSignature->StaticSamplersOffset &&
367-
P.RootSignature->StaticSamplersOffset.value() != Offset) {
368-
return createStringError(
369-
errc::invalid_argument,
370-
"Specified StaticSamplersOffset does not match computed value: %d.",
371-
Offset);
372-
}
373-
374-
RS.StaticSamplersOffset = Offset;
375-
376337
for (const auto &Param : P.RootSignature->samplers()) {
377338
dxbc::RTS0::v1::StaticSampler NewSampler;
378339
NewSampler.Filter = Param.Filter;
@@ -392,6 +353,27 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
392353
RS.StaticSamplers.push_back(NewSampler);
393354
}
394355

356+
// Handling of offsets
357+
RS.RootParameterOffset = RS.computeRootParametersOffset();
358+
if (P.RootSignature->RootParametersOffset &&
359+
P.RootSignature->RootParametersOffset.value() !=
360+
RS.RootParameterOffset) {
361+
return createStringError(
362+
errc::invalid_argument,
363+
"Specified RootParametersOffset does not match required value: %d.",
364+
RS.RootParameterOffset);
365+
}
366+
367+
RS.StaticSamplersOffset = RS.computeStaticSamplersOffset();
368+
if (P.RootSignature->StaticSamplersOffset &&
369+
P.RootSignature->StaticSamplersOffset.value() !=
370+
RS.StaticSamplersOffset) {
371+
return createStringError(
372+
errc::invalid_argument,
373+
"Specified StaticSamplersOffset does not match computed value: %d.",
374+
RS.StaticSamplersOffset);
375+
}
376+
395377
RS.write(OS);
396378
break;
397379
}

0 commit comments

Comments
 (0)