DxilSubobject.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilSubobject.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. // Defines Subobject types for DxilModule. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. #include <vector>
  13. #include <memory>
  14. #include <unordered_map>
  15. #include <map>
  16. #include "DxilConstants.h"
  17. #include "llvm/ADT/MapVector.h"
  18. #include "llvm/ADT/StringRef.h"
  19. namespace hlsl {
  20. class DxilSubobjects;
  21. namespace RDAT {
  22. class SubobjectTableReader;
  23. }
  24. class DxilSubobject {
  25. public:
  26. using Kind = DXIL::SubobjectKind;
  27. DxilSubobject() = delete;
  28. DxilSubobject(const DxilSubobject &other) = delete;
  29. DxilSubobject(DxilSubobject &&other);
  30. ~DxilSubobject();
  31. DxilSubobject &operator=(const DxilSubobject &other) = delete;
  32. Kind GetKind() const { return m_Kind; }
  33. llvm::StringRef GetName() const { return m_Name; }
  34. // Note: strings and root signature data is owned by DxilModule
  35. // When creating subobjects, use canonical strings from module
  36. bool GetStateObjectConfig(uint32_t &Flags) const;
  37. bool GetRootSignature(bool local, const void * &Data, uint32_t &Size,
  38. const char **pText = nullptr) const;
  39. bool GetSubobjectToExportsAssociation(llvm::StringRef &Subobject,
  40. const char * const * &Exports,
  41. uint32_t &NumExports) const;
  42. bool GetRaytracingShaderConfig(uint32_t &MaxPayloadSizeInBytes,
  43. uint32_t &MaxAttributeSizeInBytes) const;
  44. bool GetRaytracingPipelineConfig(uint32_t &MaxTraceRecursionDepth) const;
  45. bool GetRaytracingPipelineConfig1(uint32_t &MaxTraceRecursionDepth, uint32_t &Flags) const;
  46. bool GetHitGroup(DXIL::HitGroupType &hitGroupType,
  47. llvm::StringRef &AnyHit,
  48. llvm::StringRef &ClosestHit,
  49. llvm::StringRef &Intersection) const;
  50. private:
  51. DxilSubobject(DxilSubobjects &owner, Kind kind, llvm::StringRef name);
  52. DxilSubobject(DxilSubobjects &owner, const DxilSubobject &other, llvm::StringRef name);
  53. void CopyUnionedContents(const DxilSubobject &other);
  54. void InternStrings();
  55. DxilSubobjects &m_Owner;
  56. Kind m_Kind;
  57. llvm::StringRef m_Name;
  58. std::vector<const char*> m_Exports;
  59. struct StateObjectConfig_t {
  60. uint32_t Flags; // DXIL::StateObjectFlags
  61. };
  62. struct RootSignature_t {
  63. uint32_t Size;
  64. const void *Data;
  65. const char *Text; // can be null
  66. };
  67. struct SubobjectToExportsAssociation_t {
  68. const char *Subobject;
  69. // see m_Exports for export list
  70. };
  71. struct RaytracingShaderConfig_t {
  72. uint32_t MaxPayloadSizeInBytes;
  73. uint32_t MaxAttributeSizeInBytes;
  74. };
  75. struct RaytracingPipelineConfig_t {
  76. uint32_t MaxTraceRecursionDepth;
  77. };
  78. struct RaytracingPipelineConfig1_t {
  79. uint32_t MaxTraceRecursionDepth;
  80. uint32_t Flags; // DXIL::RaytracingPipelineFlags
  81. };
  82. struct HitGroup_t {
  83. DXIL::HitGroupType Type;
  84. const char *AnyHit;
  85. const char *ClosestHit;
  86. const char *Intersection;
  87. };
  88. union {
  89. StateObjectConfig_t StateObjectConfig;
  90. RootSignature_t RootSignature;
  91. SubobjectToExportsAssociation_t SubobjectToExportsAssociation;
  92. RaytracingShaderConfig_t RaytracingShaderConfig;
  93. RaytracingPipelineConfig_t RaytracingPipelineConfig;
  94. HitGroup_t HitGroup;
  95. RaytracingPipelineConfig1_t RaytracingPipelineConfig1;
  96. };
  97. friend class DxilSubobjects;
  98. };
  99. class DxilSubobjects {
  100. public:
  101. typedef std::pair<std::unique_ptr<char[]>, size_t> StoredBytes;
  102. typedef llvm::MapVector< llvm::StringRef, StoredBytes > BytesStorage;
  103. typedef llvm::MapVector< llvm::StringRef, std::unique_ptr<DxilSubobject> > SubobjectStorage;
  104. using Kind = DXIL::SubobjectKind;
  105. DxilSubobjects();
  106. DxilSubobjects(const DxilSubobjects &other) = delete;
  107. DxilSubobjects(DxilSubobjects &&other);
  108. ~DxilSubobjects();
  109. DxilSubobjects &operator=(const DxilSubobjects &other) = delete;
  110. // Add/find string in owned subobject strings, returning canonical ptr
  111. llvm::StringRef InternString(llvm::StringRef value);
  112. // Add/find raw bytes, returning canonical ptr
  113. const void *InternRawBytes(const void *ptr, size_t size);
  114. DxilSubobject *FindSubobject(llvm::StringRef name);
  115. void RemoveSubobject(llvm::StringRef name);
  116. DxilSubobject &CloneSubobject(const DxilSubobject &Subobject, llvm::StringRef Name);
  117. const SubobjectStorage &GetSubobjects() const { return m_Subobjects; }
  118. // Create DxilSubobjects
  119. DxilSubobject &CreateStateObjectConfig(llvm::StringRef Name,
  120. uint32_t Flags);
  121. // Local/Global RootSignature
  122. DxilSubobject &CreateRootSignature(llvm::StringRef Name,
  123. bool local,
  124. const void *Data,
  125. uint32_t Size,
  126. llvm::StringRef *pText = nullptr);
  127. DxilSubobject &CreateSubobjectToExportsAssociation(
  128. llvm::StringRef Name,
  129. llvm::StringRef Subobject, llvm::StringRef *Exports, uint32_t NumExports);
  130. DxilSubobject &CreateRaytracingShaderConfig(
  131. llvm::StringRef Name,
  132. uint32_t MaxPayloadSizeInBytes,
  133. uint32_t MaxAttributeSizeInBytes);
  134. DxilSubobject &CreateRaytracingPipelineConfig(
  135. llvm::StringRef Name,
  136. uint32_t MaxTraceRecursionDepth);
  137. DxilSubobject &CreateRaytracingPipelineConfig1(
  138. llvm::StringRef Name,
  139. uint32_t MaxTraceRecursionDepth,
  140. uint32_t Flags);
  141. DxilSubobject &CreateHitGroup(llvm::StringRef Name,
  142. DXIL::HitGroupType hitGroupType,
  143. llvm::StringRef AnyHit,
  144. llvm::StringRef ClosestHit,
  145. llvm::StringRef Intersection);
  146. private:
  147. DxilSubobject &CreateSubobject(Kind kind, llvm::StringRef Name);
  148. BytesStorage m_BytesStorage;
  149. SubobjectStorage m_Subobjects;
  150. };
  151. bool LoadSubobjectsFromRDAT(DxilSubobjects &subobjects, RDAT::SubobjectTableReader *pSubobjectTableReader);
  152. } // namespace hlsl