DxilContainerAssembler.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilContainerAssembler.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Helpers for writing to dxil container. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. #include <functional>
  13. #include "dxc/DxilContainer/DxilContainer.h"
  14. #include "llvm/ADT/StringRef.h"
  15. struct IStream;
  16. namespace llvm {
  17. class Module;
  18. }
  19. namespace hlsl {
  20. class AbstractMemoryStream;
  21. class DxilModule;
  22. class RootSignatureHandle;
  23. class ShaderModel;
  24. namespace DXIL {
  25. enum class SignatureKind;
  26. }
  27. class DxilPartWriter {
  28. public:
  29. virtual ~DxilPartWriter() {}
  30. virtual uint32_t size() const = 0;
  31. virtual void write(AbstractMemoryStream *pStream) = 0;
  32. };
  33. class DxilContainerWriter : public DxilPartWriter {
  34. public:
  35. typedef std::function<void(AbstractMemoryStream*)> WriteFn;
  36. virtual ~DxilContainerWriter() {}
  37. virtual void AddPart(uint32_t FourCC, uint32_t Size, WriteFn Write) = 0;
  38. };
  39. DxilPartWriter *NewProgramSignatureWriter(const DxilModule &M, DXIL::SignatureKind Kind);
  40. DxilPartWriter *NewRootSignatureWriter(const RootSignatureHandle &S);
  41. DxilPartWriter *NewFeatureInfoWriter(const DxilModule &M);
  42. DxilPartWriter *NewPSVWriter(const DxilModule &M, uint32_t PSVVersion = UINT_MAX);
  43. DxilPartWriter *NewRDATWriter(const DxilModule &M);
  44. DxilContainerWriter *NewDxilContainerWriter();
  45. // Set validator version to 0,0 (not validated) then re-emit as much reflection metadata as possible.
  46. void ReEmitLatestReflectionData(llvm::Module *pReflectionM);
  47. // Strip functions and serialize module.
  48. void StripAndCreateReflectionStream(llvm::Module *pReflectionM, uint32_t *pReflectionPartSizeInBytes, AbstractMemoryStream **ppReflectionStreamOut);
  49. void WriteProgramPart(const hlsl::ShaderModel *pModel,
  50. AbstractMemoryStream *pModuleBitcode,
  51. IStream *pStream);
  52. void SerializeDxilContainerForModule(hlsl::DxilModule *pModule,
  53. AbstractMemoryStream *pModuleBitcode,
  54. AbstractMemoryStream *pStream,
  55. llvm::StringRef DebugName,
  56. SerializeDxilFlags Flags,
  57. DxilShaderHash *pShaderHashOut = nullptr,
  58. AbstractMemoryStream *pReflectionStreamOut = nullptr,
  59. AbstractMemoryStream *pRootSigStreamOut = nullptr);
  60. void SerializeDxilContainerForRootSignature(hlsl::RootSignatureHandle *pRootSigHandle,
  61. AbstractMemoryStream *pStream);
  62. } // namespace hlsl