diff options
Diffstat (limited to 'llvm/lib/ObjectYAML/DXContainerEmitter.cpp')
| -rw-r--r-- | llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index 64b13fc0ccde..09a5e41c7123 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -201,12 +201,63 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { memcpy(&PSV.BaseData, &P.Info->Info, sizeof(dxbc::PSV::v2::RuntimeInfo)); PSV.Resources = P.Info->Resources; - if (sys::IsBigEndianHost) - PSV.swapBytes(static_cast<Triple::EnvironmentType>( - Triple::Pixel + P.Info->Info.ShaderStage)); + for (auto El : P.Info->SigInputElements) + PSV.InputElements.push_back(mcdxbc::PSVSignatureElement{ + El.Name, El.Indices, El.StartRow, El.Cols, El.StartCol, + El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask, + El.Stream}); + + for (auto El : P.Info->SigOutputElements) + PSV.OutputElements.push_back(mcdxbc::PSVSignatureElement{ + El.Name, El.Indices, El.StartRow, El.Cols, El.StartCol, + El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask, + El.Stream}); + + for (auto El : P.Info->SigPatchOrPrimElements) + PSV.PatchOrPrimElements.push_back(mcdxbc::PSVSignatureElement{ + El.Name, El.Indices, El.StartRow, El.Cols, El.StartCol, + El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask, + El.Stream}); + + static_assert(PSV.OutputVectorMasks.size() == PSV.InputOutputMap.size()); + for (unsigned I = 0; I < PSV.OutputVectorMasks.size(); ++I) { + PSV.OutputVectorMasks[I].insert(PSV.OutputVectorMasks[I].begin(), + P.Info->OutputVectorMasks[I].begin(), + P.Info->OutputVectorMasks[I].end()); + PSV.InputOutputMap[I].insert(PSV.InputOutputMap[I].begin(), + P.Info->InputOutputMap[I].begin(), + P.Info->InputOutputMap[I].end()); + } + + PSV.PatchOrPrimMasks.insert(PSV.PatchOrPrimMasks.begin(), + P.Info->PatchOrPrimMasks.begin(), + P.Info->PatchOrPrimMasks.end()); + PSV.InputPatchMap.insert(PSV.InputPatchMap.begin(), + P.Info->InputPatchMap.begin(), + P.Info->InputPatchMap.end()); + PSV.PatchOutputMap.insert(PSV.PatchOutputMap.begin(), + P.Info->PatchOutputMap.begin(), + P.Info->PatchOutputMap.end()); + + PSV.finalize(static_cast<Triple::EnvironmentType>( + Triple::Pixel + P.Info->Info.ShaderStage)); PSV.write(OS, P.Info->Version); break; } + case dxbc::PartType::ISG1: + case dxbc::PartType::OSG1: + case dxbc::PartType::PSG1: { + mcdxbc::Signature Sig; + if (P.Signature.has_value()) { + for (const auto &Param : P.Signature->Parameters) { + Sig.addParam(Param.Stream, Param.Name, Param.Index, Param.SystemValue, + Param.CompType, Param.Register, Param.Mask, + Param.ExclusiveMask, Param.MinPrecision); + } + } + Sig.write(OS); + break; + } case dxbc::PartType::Unknown: break; // Skip any handling for unrecognized parts. } |
