summaryrefslogtreecommitdiff
path: root/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ObjectYAML/DXContainerEmitter.cpp')
-rw-r--r--llvm/lib/ObjectYAML/DXContainerEmitter.cpp57
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.
}