Browse Source

Add DxilContainerReader and refactor PSV/RDAT into DxilContainer lib (#1642)

Tex Riddell 6 years ago
parent
commit
64bec9de53

+ 2 - 2
include/dxc/DxilContainer/DxilContainerAssembler.h

@@ -1,11 +1,11 @@
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //                                                                           //
-// DxilContainerWriter.h                                                     //
+// DxilContainerAssembler.h                                                  //
 // Copyright (C) Microsoft Corporation. All rights reserved.                 //
 // Copyright (C) Microsoft Corporation. All rights reserved.                 //
 // This file is distributed under the University of Illinois Open Source     //
 // This file is distributed under the University of Illinois Open Source     //
 // License. See LICENSE.TXT for details.                                     //
 // License. See LICENSE.TXT for details.                                     //
 //                                                                           //
 //                                                                           //
-// Helper class to write dxil container.                                     //
+// Helpers for writing to dxil container.                                    //
 //                                                                           //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 
 

+ 24 - 0
include/dxc/DxilContainer/DxilContainerReader.h

@@ -0,0 +1,24 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// DxilContainerReader.h                                                     //
+// Copyright (C) Microsoft Corporation. All rights reserved.                 //
+// This file is distributed under the University of Illinois Open Source     //
+// License. See LICENSE.TXT for details.                                     //
+//                                                                           //
+// Helpers for reading from dxil container.                                  //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+namespace hlsl {
+
+class DxilSubobjects;
+namespace RDAT {
+  class SubobjectTableReader;
+}
+
+void LoadSubobjectsFromRDAT(DxilSubobjects &subobjects,
+  RDAT::SubobjectTableReader *pSubobjectTableReader);
+
+} // namespace hlsl

+ 0 - 0
include/dxc/HLSL/DxilPipelineStateValidation.h → include/dxc/DxilContainer/DxilPipelineStateValidation.h


+ 0 - 0
include/dxc/HLSL/DxilRuntimeReflection.h → include/dxc/DxilContainer/DxilRuntimeReflection.h


+ 2 - 2
include/dxc/HLSL/DxilRuntimeReflection.inl → include/dxc/DxilContainer/DxilRuntimeReflection.inl

@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //                                                                           //
-// DxilLibraryReflection.cpp                                                 //
+// DxilRuntimeReflection.inl                                                 //
 // Copyright (C) Microsoft Corporation. All rights reserved.                 //
 // Copyright (C) Microsoft Corporation. All rights reserved.                 //
 // This file is distributed under the University of Illinois Open Source     //
 // This file is distributed under the University of Illinois Open Source     //
 // License. See LICENSE.TXT for details.                                     //
 // License. See LICENSE.TXT for details.                                     //
@@ -9,7 +9,7 @@
 //                                                                           //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 
 
-#include "dxc/HLSL/DxilRuntimeReflection.h"
+#include "dxc/DxilContainer/DxilRuntimeReflection.h"
 #include <unordered_map>
 #include <unordered_map>
 #include <vector>
 #include <vector>
 #include <memory>
 #include <memory>

+ 1 - 0
lib/DxilContainer/CMakeLists.txt

@@ -3,6 +3,7 @@
 add_llvm_library(LLVMDxilContainer
 add_llvm_library(LLVMDxilContainer
   DxilContainer.cpp
   DxilContainer.cpp
   DxilContainerAssembler.cpp
   DxilContainerAssembler.cpp
+  DxilContainerReader.cpp
 
 
   ADDITIONAL_HEADER_DIRS
   ADDITIONAL_HEADER_DIRS
   ${LLVM_MAIN_INCLUDE_DIR}/llvm/IR
   ${LLVM_MAIN_INCLUDE_DIR}/llvm/IR

+ 2 - 2
lib/DxilContainer/DxilContainerAssembler.cpp

@@ -29,8 +29,8 @@
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/FileIOHelper.h"
 #include "dxc/Support/FileIOHelper.h"
 #include "dxc/Support/dxcapi.impl.h"
 #include "dxc/Support/dxcapi.impl.h"
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
-#include "dxc/HLSL/DxilRuntimeReflection.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
+#include "dxc/DxilContainer/DxilRuntimeReflection.h"
 #include <algorithm>
 #include <algorithm>
 #include <functional>
 #include <functional>
 
 

+ 77 - 0
lib/DxilContainer/DxilContainerReader.cpp

@@ -0,0 +1,77 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// DxilContainerReader.cpp                                                   //
+// Copyright (C) Microsoft Corporation. All rights reserved.                 //
+// This file is distributed under the University of Illinois Open Source     //
+// License. See LICENSE.TXT for details.                                     //
+//                                                                           //
+// Provides support for manipulating DXIL container structures.              //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "dxc/Support/Global.h"
+#include "dxc/Support/Unicode.h"
+#include "dxc/Support/WinIncludes.h"
+#include "dxc/DXIL/DxilSubobject.h"
+#include "dxc/DxilContainer/DxilContainerReader.h"
+#include "dxc/DxilContainer/DxilRuntimeReflection.h"
+
+namespace hlsl {
+
+void LoadSubobjectsFromRDAT(DxilSubobjects &subobjects, RDAT::SubobjectTableReader *pSubobjectTableReader) {
+  if (!pSubobjectTableReader)
+    return;
+  for (unsigned i = 0; i < pSubobjectTableReader->GetCount(); ++i) {
+    auto reader = pSubobjectTableReader->GetItem(i);
+    DXIL::SubobjectKind kind = reader.GetKind();
+    bool bLocalRS = false;
+    switch (kind) {
+    case DXIL::SubobjectKind::StateObjectConfig:
+      subobjects.CreateStateObjectConfig(reader.GetName(),
+        reader.GetStateObjectConfig_Flags());
+      break;
+    case DXIL::SubobjectKind::LocalRootSignature:
+      bLocalRS = true;
+    case DXIL::SubobjectKind::GlobalRootSignature: {
+      const void *pOutBytes;
+      uint32_t OutSizeInBytes;
+      reader.GetRootSignature(&pOutBytes, &OutSizeInBytes);
+      subobjects.CreateRootSignature(reader.GetName(), bLocalRS, pOutBytes, OutSizeInBytes);
+      break;
+    }
+    case DXIL::SubobjectKind::SubobjectToExportsAssociation: {
+      uint32_t NumExports = reader.GetSubobjectToExportsAssociation_NumExports();
+      std::vector<const char*> Exports;
+      Exports.resize(NumExports);
+      for (unsigned i = 0; i < NumExports; ++i) {
+        Exports[i] = reader.GetSubobjectToExportsAssociation_Export(i);
+      }
+      subobjects.CreateSubobjectToExportsAssociation(reader.GetName(),
+        reader.GetSubobjectToExportsAssociation_Subobject(),
+        Exports.data(), NumExports);
+      break;
+    }
+    case DXIL::SubobjectKind::RaytracingShaderConfig:
+      subobjects.CreateRaytracingShaderConfig(reader.GetName(),
+        reader.GetRaytracingShaderConfig_MaxPayloadSizeInBytes(),
+        reader.GetRaytracingShaderConfig_MaxAttributeSizeInBytes());
+      break;
+    case DXIL::SubobjectKind::RaytracingPipelineConfig:
+      subobjects.CreateRaytracingPipelineConfig(reader.GetName(),
+        reader.GetRaytracingPipelineConfig_MaxTraceRecursionDepth());
+      break;
+    case DXIL::SubobjectKind::HitGroup:
+      subobjects.CreateHitGroup(reader.GetName(),
+        reader.GetHitGroup_Intersection(),
+        reader.GetHitGroup_AnyHit(),
+        reader.GetHitGroup_ClosestHit());
+      break;
+    }
+  }
+}
+
+
+} // namespace hlsl
+
+// DxilRuntimeReflection implementation
+#include "dxc/DxilContainer/DxilRuntimeReflection.inl"

+ 1 - 1
lib/DxilRootSignature/DxilRootSignature.cpp

@@ -11,7 +11,7 @@
 
 
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinFunctions.h"
 #include "dxc/Support/WinFunctions.h"

+ 1 - 1
lib/DxilRootSignature/DxilRootSignatureConvert.cpp

@@ -11,7 +11,7 @@
 
 
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinFunctions.h"
 #include "dxc/Support/WinFunctions.h"

+ 1 - 1
lib/DxilRootSignature/DxilRootSignatureSerializer.cpp

@@ -11,7 +11,7 @@
 
 
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinFunctions.h"
 #include "dxc/Support/WinFunctions.h"

+ 1 - 1
lib/DxilRootSignature/DxilRootSignatureValidator.cpp

@@ -11,7 +11,7 @@
 
 
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
 #include "dxc/DxilRootSignature/DxilRootSignature.h"
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/Global.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinIncludes.h"
 #include "dxc/Support/WinFunctions.h"
 #include "dxc/Support/WinFunctions.h"

+ 0 - 2
lib/HLSL/DxilContainerReflection.cpp

@@ -2351,5 +2351,3 @@ DEFINE_CROSS_PLATFORM_UUIDOF(IDxcContainerReflection)
 
 
 #endif // LLVM_ON_WIN32
 #endif // LLVM_ON_WIN32
 
 
-// DxilRuntimeReflection implementation
-#include "dxc/HLSL/DxilRuntimeReflection.inl"

+ 1 - 1
lib/HLSL/DxilSignatureValidation.cpp

@@ -17,6 +17,6 @@
 using namespace hlsl;
 using namespace hlsl;
 using namespace llvm;
 using namespace llvm;
 
 
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
 #include <functional>
 #include <functional>
 #include "dxc/HLSL/ViewIDPipelineValidation.inl"
 #include "dxc/HLSL/ViewIDPipelineValidation.inl"

+ 17 - 64
tools/clang/tools/dxcompiler/dxcdisassembler.cpp

@@ -25,10 +25,11 @@
 #include "llvm/IR/AssemblyAnnotationWriter.h"
 #include "llvm/IR/AssemblyAnnotationWriter.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/Format.h"
-#include "dxc/HLSL/DxilPipelineStateValidation.h"
-#include "dxc/HLSL/DxilRuntimeReflection.h"
-#include "dxc/HLSL/ComputeViewIdState.h"
+#include "dxc/DxilContainer/DxilPipelineStateValidation.h"
 #include "dxc/DxilContainer/DxilContainer.h"
 #include "dxc/DxilContainer/DxilContainer.h"
+#include "dxc/DxilContainer/DxilRuntimeReflection.h"
+#include "dxc/DxilContainer/DxilContainerReader.h"
+#include "dxc/HLSL/ComputeViewIdState.h"
 #include "dxc/DXIL/DxilUtil.h"
 #include "dxc/DXIL/DxilUtil.h"
 #include "dxcutil.h"
 #include "dxcutil.h"
 
 
@@ -1433,63 +1434,10 @@ void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer,
 
 
 namespace dxcutil {
 namespace dxcutil {
 
 
-// TODO: Move DeserializeSubobjectsFromRuntimeData to more appropriate place
-void DeserializeSubobjectsFromRuntimeData(DxilSubobjects &subobjects, RDAT::DxilRuntimeData &runtimeData) {
-  RDAT::SubobjectTableReader *pSubobjectTableReader = runtimeData.GetSubobjectTableReader();
-  if (!pSubobjectTableReader)
-    return;
-  for (unsigned i = 0; i < pSubobjectTableReader->GetCount(); ++i) {
-    auto reader = pSubobjectTableReader->GetItem(i);
-    DXIL::SubobjectKind kind = reader.GetKind();
-    bool bLocalRS = false;
-    switch (kind) {
-    case DXIL::SubobjectKind::StateObjectConfig:
-      subobjects.CreateStateObjectConfig(reader.GetName(),
-        reader.GetStateObjectConfig_Flags());
-      break;
-    case DXIL::SubobjectKind::LocalRootSignature:
-      bLocalRS = true;
-    case DXIL::SubobjectKind::GlobalRootSignature: {
-      const void *pOutBytes;
-      uint32_t OutSizeInBytes;
-      reader.GetRootSignature(&pOutBytes, &OutSizeInBytes);
-      subobjects.CreateRootSignature(reader.GetName(), bLocalRS, pOutBytes, OutSizeInBytes);
-      break;
-    }
-    case DXIL::SubobjectKind::SubobjectToExportsAssociation: {
-      uint32_t NumExports = reader.GetSubobjectToExportsAssociation_NumExports();
-      std::vector<const char*> Exports;
-      Exports.resize(NumExports);
-      for (unsigned i = 0; i < NumExports; ++i) {
-        Exports[i] = reader.GetSubobjectToExportsAssociation_Export(i);
-      }
-      subobjects.CreateSubobjectToExportsAssociation(reader.GetName(),
-        reader.GetSubobjectToExportsAssociation_Subobject(),
-        Exports.data(), NumExports);
-      break;
-    }
-    case DXIL::SubobjectKind::RaytracingShaderConfig:
-      subobjects.CreateRaytracingShaderConfig(reader.GetName(),
-        reader.GetRaytracingShaderConfig_MaxPayloadSizeInBytes(),
-        reader.GetRaytracingShaderConfig_MaxAttributeSizeInBytes());
-      break;
-    case DXIL::SubobjectKind::RaytracingPipelineConfig:
-      subobjects.CreateRaytracingPipelineConfig(reader.GetName(),
-        reader.GetRaytracingPipelineConfig_MaxTraceRecursionDepth());
-      break;
-    case DXIL::SubobjectKind::HitGroup:
-      subobjects.CreateHitGroup(reader.GetName(),
-        reader.GetHitGroup_Intersection(),
-        reader.GetHitGroup_AnyHit(),
-        reader.GetHitGroup_ClosestHit());
-      break;
-    }
-  }
-}
-
 HRESULT Disassemble(IDxcBlob *pProgram, raw_string_ostream &Stream) {
 HRESULT Disassemble(IDxcBlob *pProgram, raw_string_ostream &Stream) {
   const char *pIL = (const char *)pProgram->GetBufferPointer();
   const char *pIL = (const char *)pProgram->GetBufferPointer();
   uint32_t pILLength = pProgram->GetBufferSize();
   uint32_t pILLength = pProgram->GetBufferSize();
+  const DxilPartHeader *pRDATPart = nullptr;
   if (const DxilContainerHeader *pContainer =
   if (const DxilContainerHeader *pContainer =
           IsDxilContainerLike(pIL, pILLength)) {
           IsDxilContainerLike(pIL, pILLength)) {
     if (!IsValidDxilContainer(pContainer, pILLength)) {
     if (!IsValidDxilContainer(pContainer, pILLength)) {
@@ -1572,13 +1520,7 @@ HRESULT Disassemble(IDxcBlob *pProgram, raw_string_ostream &Stream) {
     it = std::find_if(begin(pContainer), end(pContainer),
     it = std::find_if(begin(pContainer), end(pContainer),
       DxilPartIsType(DFCC_RuntimeData));
       DxilPartIsType(DFCC_RuntimeData));
     if (it != end(pContainer)) {
     if (it != end(pContainer)) {
-      RDAT::DxilRuntimeData runtimeData(GetDxilPartData(*it), (*it)->PartSize);
-      Stream << ";" << " [RDAT] Begin\n";
-      // TODO: Print the rest of the RDAT info
-      DxilSubobjects subobjects;
-      DeserializeSubobjectsFromRuntimeData(subobjects, runtimeData);
-      PrintSubobjects(subobjects, Stream, /*comment*/ ";");
-      Stream << ";" << " [RDAT] End\n";
+      pRDATPart = *it;
     }
     }
 
 
     GetDxilProgramBitcode(pProgramHeader, &pIL, &pILLength);
     GetDxilProgramBitcode(pProgramHeader, &pIL, &pILLength);
@@ -1600,6 +1542,7 @@ HRESULT Disassemble(IDxcBlob *pProgram, raw_string_ostream &Stream) {
 
 
   if (pModule->getNamedMetadata("dx.version")) {
   if (pModule->getNamedMetadata("dx.version")) {
     DxilModule &dxilModule = pModule->GetOrCreateDxilModule();
     DxilModule &dxilModule = pModule->GetOrCreateDxilModule();
+
     if (!dxilModule.GetShaderModel()->IsLib()) {
     if (!dxilModule.GetShaderModel()->IsLib()) {
       PrintDxilSignature("Input", dxilModule.GetInputSignature(), Stream,
       PrintDxilSignature("Input", dxilModule.GetInputSignature(), Stream,
                          /*comment*/ ";");
                          /*comment*/ ";");
@@ -1612,6 +1555,16 @@ HRESULT Disassemble(IDxcBlob *pProgram, raw_string_ostream &Stream) {
     PrintBufferDefinitions(dxilModule, Stream, /*comment*/ ";");
     PrintBufferDefinitions(dxilModule, Stream, /*comment*/ ";");
     PrintResourceBindings(dxilModule, Stream, /*comment*/ ";");
     PrintResourceBindings(dxilModule, Stream, /*comment*/ ";");
     PrintViewIdState(dxilModule, Stream, /*comment*/ ";");
     PrintViewIdState(dxilModule, Stream, /*comment*/ ";");
+
+    if (pRDATPart) {
+      RDAT::DxilRuntimeData runtimeData(GetDxilPartData(pRDATPart), pRDATPart->PartSize);
+      // TODO: Print the rest of the RDAT info
+      if (RDAT::SubobjectTableReader *pSubobjectTableReader =
+        runtimeData.GetSubobjectTableReader()) {
+        dxilModule.ResetSubobjects(new DxilSubobjects());
+        LoadSubobjectsFromRDAT(*dxilModule.GetSubobjects(), pSubobjectTableReader);
+      }
+    }
     if (dxilModule.GetSubobjects()) {
     if (dxilModule.GetSubobjects()) {
       PrintSubobjects(*dxilModule.GetSubobjects(), Stream, /*comment*/ ";");
       PrintSubobjects(*dxilModule.GetSubobjects(), Stream, /*comment*/ ";");
     }
     }

+ 1 - 1
tools/clang/unittests/HLSL/DxilContainerTest.cpp

@@ -43,7 +43,7 @@
 #include "dxc/Support/dxcapi.use.h"
 #include "dxc/Support/dxcapi.use.h"
 #include "dxc/Support/HLSLOptions.h"
 #include "dxc/Support/HLSLOptions.h"
 #include "dxc/DxilContainer/DxilContainer.h"
 #include "dxc/DxilContainer/DxilContainer.h"
-#include "dxc/HLSL/DxilRuntimeReflection.h"
+#include "dxc/DxilContainer/DxilRuntimeReflection.h"
 #include "dxc/DXIL/DxilShaderFlags.h"
 #include "dxc/DXIL/DxilShaderFlags.h"
 #include "dxc/DXIL/DxilUtil.h"
 #include "dxc/DXIL/DxilUtil.h"