26class DXContainerWriter {
36 Error computePartOffsets();
37 Error validatePartOffsets();
48 else if (*
ObjectFile.Header.FileSize < Computed)
50 "File size specified is too small.");
54Error DXContainerWriter::validatePartOffsets() {
57 errc::invalid_argument,
58 "Mismatch between number of parts and part offsets.");
62 if (RollingOffset > std::get<1>(
I))
64 "Offset mismatch, not enough space for data.");
68 if (
Error Err = validateSize(RollingOffset))
74Error DXContainerWriter::computePartOffsets() {
76 return validatePartOffsets();
79 ObjectFile.Header.PartOffsets = std::vector<uint32_t>();
81 ObjectFile.Header.PartOffsets->push_back(RollingOffset);
84 if (
Error Err = validateSize(RollingOffset))
92 memcpy(Header.Magic,
"DXBC", 4);
93 memcpy(Header.FileHash.Digest,
ObjectFile.Header.Hash.data(), 16);
94 Header.Version.Major =
ObjectFile.Header.Version.Major;
95 Header.Version.Minor =
ObjectFile.Header.Version.Minor;
100 OS.
write(
reinterpret_cast<char *
>(&Header),
sizeof(Header));
104 for (
auto &O : Offsets)
114 if (RollingOffset < std::get<1>(
I)) {
115 uint32_t PadBytes = std::get<1>(
I) - RollingOffset;
131 case dxbc::PartType::DXIL: {
136 P.Program->MinorVersion);
138 Header.ShaderKind =
P.Program->ShaderKind;
139 memcpy(Header.Bitcode.Magic,
"DXIL", 4);
140 Header.Bitcode.MajorVersion =
P.Program->DXILMajorVersion;
141 Header.Bitcode.MinorVersion =
P.Program->DXILMinorVersion;
142 Header.Bitcode.Unused = 0;
145 if (
P.Program->DXILOffset)
146 Header.Bitcode.Offset = *
P.Program->DXILOffset;
150 if (
P.Program->DXILSize)
151 Header.Bitcode.Size = *
P.Program->DXILSize;
153 Header.Bitcode.Size =
P.Program->DXIL ?
P.Program->DXIL->size() : 0;
156 Header.Size = *
P.Program->Size;
160 uint32_t BitcodeOffset = Header.Bitcode.Offset;
163 OS.
write(
reinterpret_cast<const char *
>(&Header),
165 if (
P.Program->DXIL) {
170 OS.
write(
reinterpret_cast<char *
>(
P.Program->DXIL->data()),
171 P.Program->DXIL->size());
175 case dxbc::PartType::SFI0: {
178 if (!
P.Flags.has_value())
186 case dxbc::PartType::HASH: {
187 if (!
P.Hash.has_value())
190 if (
P.Hash->IncludesSource)
191 Hash.
Flags |=
static_cast<uint32_t>(dxbc::HashFlags::IncludesSource);
192 memcpy(&Hash.
Digest[0], &
P.Hash->Digest[0], 16);
198 case dxbc::PartType::PSV0: {
199 if (!
P.Info.has_value())
206 for (
auto El :
P.Info->SigInputElements)
208 El.
Name, El.Indices, El.StartRow, El.Cols, El.StartCol,
209 El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask,
212 for (
auto El :
P.Info->SigOutputElements)
214 El.
Name, El.Indices, El.StartRow, El.Cols, El.StartCol,
215 El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask,
218 for (
auto El :
P.Info->SigPatchOrPrimElements)
220 El.
Name, El.Indices, El.StartRow, El.Cols, El.StartCol,
221 El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask,
227 P.Info->OutputVectorMasks[
I].begin(),
228 P.Info->OutputVectorMasks[
I].end());
230 P.Info->InputOutputMap[
I].begin(),
231 P.Info->InputOutputMap[
I].end());
235 P.Info->PatchOrPrimMasks.begin(),
236 P.Info->PatchOrPrimMasks.end());
238 P.Info->InputPatchMap.begin(),
239 P.Info->InputPatchMap.end());
241 P.Info->PatchOutputMap.begin(),
242 P.Info->PatchOutputMap.end());
249 case dxbc::PartType::ISG1:
250 case dxbc::PartType::OSG1:
251 case dxbc::PartType::PSG1: {
253 if (
P.Signature.has_value()) {
254 for (
const auto &Param :
P.Signature->Parameters) {
263 case dxbc::PartType::Unknown:
265 case dxbc::PartType::RTS0:
266 if (!
P.RootSignature.has_value())
270 RS.
Flags =
P.RootSignature->getEncodedFlags();
271 RS.
Version =
P.RootSignature->Version;
275 P.RootSignature->Parameters.Locations) {
278 "invalid DXContainer YAML");
280 "invalid DXContainer YAML");
286 case dxbc::RootParameterType::Constants32Bit: {
288 P.RootSignature->Parameters.getOrInsertConstants(L);
297 case dxbc::RootParameterType::CBV:
298 case dxbc::RootParameterType::SRV:
299 case dxbc::RootParameterType::UAV: {
301 P.RootSignature->Parameters.getOrInsertDescriptor(L);
311 case dxbc::RootParameterType::DescriptorTable: {
313 P.RootSignature->Parameters.getOrInsertTable(L);
315 for (
const auto &R : TableYaml.
Ranges) {
318 Range.RangeType =
R.RangeType;
319 Range.NumDescriptors =
R.NumDescriptors;
320 Range.BaseShaderRegister =
R.BaseShaderRegister;
321 Range.RegisterSpace =
R.RegisterSpace;
322 Range.OffsetInDescriptorsFromTableStart =
323 R.OffsetInDescriptorsFromTableStart;
326 Range.Flags =
R.getEncodedFlags();
336 for (
const auto &Param :
P.RootSignature->samplers()) {
357 if (
P.RootSignature->RootParametersOffset &&
358 P.RootSignature->RootParametersOffset.value() !=
361 errc::invalid_argument,
362 "Specified RootParametersOffset does not match required value: %d.",
367 if (
P.RootSignature->StaticSamplersOffset &&
368 P.RootSignature->StaticSamplersOffset.value() !=
371 errc::invalid_argument,
372 "Specified StaticSamplersOffset does not match computed value: %d.",
380 RollingOffset += BytesWritten;
381 if (BytesWritten < PartSize)
383 RollingOffset += PartSize;
390 if (
Error Err = computePartOffsets())
393 return writeParts(
OS);
401 DXContainerWriter Writer(Doc);
402 if (
Error Err = Writer.write(Out)) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
Base class for error info classes.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
iterator insert(iterator I, T &&Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
An efficient, type-erasing, non-owning reference to a callable.
void addParam(uint32_t Stream, StringRef Name, uint32_t Index, dxbc::D3DSystemValue SystemValue, dxbc::SigComponentType CompType, uint32_t Register, uint8_t Mask, uint8_t ExclusiveMask, dxbc::SigMinPrecision MinPrecision)
void write(raw_ostream &OS)
This class is the base class for all object file types.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write_zeros(unsigned NumZeros)
write_zeros - Insert 'NumZeros' nulls.
uint64_t tell() const
tell - Return the current offset with the file.
raw_ostream & write(unsigned char C)
bool isValidShaderVisibility(uint32_t V)
LLVM_ABI PartType parsePartType(StringRef S)
bool isValidParameterType(uint32_t V)
constexpr bool IsBigEndianHost
void swapByteOrder(T &Value)
LLVM_ABI bool yaml2dxcontainer(DXContainerYAML::Object &Doc, raw_ostream &Out, ErrorHandler EH)
This is an optimization pass for GlobalISel generic memory operations.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue)
SmallVector< DescriptorRangeYaml > Ranges
LLVM_ABI uint32_t getEncodedFlags() const
uint32_t ShaderVisibility
SmallVector< dxbc::RTS0::v2::DescriptorRange > Ranges
dxbc::PSV::v3::RuntimeInfo BaseData
llvm::StringRef EntryName
SmallVector< uint32_t > PatchOrPrimMasks
SmallVector< uint32_t > PatchOutputMap
SmallVector< dxbc::PSV::v2::ResourceBindInfo > Resources
void finalize(Triple::EnvironmentType Stage)
SmallVector< PSVSignatureElement > InputElements
SmallVector< uint32_t > InputPatchMap
SmallVector< PSVSignatureElement > OutputElements
SmallVector< PSVSignatureElement > PatchOrPrimElements
void write(raw_ostream &OS, uint32_t Version=std::numeric_limits< uint32_t >::max()) const
std::array< SmallVector< uint32_t >, 4 > OutputVectorMasks
std::array< SmallVector< uint32_t >, 4 > InputOutputMap
void addParameter(dxbc::RootParameterType Type, dxbc::ShaderVisibility Visibility, RootConstants Constant)
uint32_t RootParameterOffset
LLVM_ABI uint32_t computeRootParametersOffset() const
LLVM_ABI void write(raw_ostream &OS) const
uint32_t NumStaticSamplers
LLVM_ABI uint32_t computeStaticSamplersOffset() const
SmallVector< dxbc::RTS0::v1::StaticSampler > StaticSamplers
mcdxbc::RootParametersContainer ParametersContainer
uint32_t StaticSamplersOffset
Common declarations for yaml2obj.