D3DReflectionDumper.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // D3DReflectionDumper.cpp //
  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. // Use this to dump D3D Reflection data for testing. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include "dxc/Support/Global.h"
  12. #include "dxc/test/D3DReflectionDumper.h"
  13. #include "dxc/DxilContainer/DxilContainer.h"
  14. #include <sstream>
  15. // Remove this workaround once newer version of d3dcommon.h can be compiled against
  16. #define ADD_16_64_BIT_TYPES
  17. // Disable warning about value not being valid in enum
  18. #pragma warning( disable : 4063 )
  19. // Copied from llvm/ADT/StringExtras.h
  20. static inline char hexdigit(unsigned X, bool LowerCase = false) {
  21. const char HexChar = LowerCase ? 'a' : 'A';
  22. return X < 10 ? '0' + X : HexChar + X - 10;
  23. }
  24. // Copied from lib/IR/AsmWriter.cpp
  25. // PrintEscapedString - Print each character of the specified string, escaping
  26. // it if it is not printable or if it is an escape char.
  27. static std::string EscapedString(const char *text) {
  28. std::ostringstream ss;
  29. size_t size = strlen(text);
  30. for (unsigned i = 0, e = size; i != e; ++i) {
  31. unsigned char C = text[i];
  32. if (isprint(C) && C != '\\' && C != '"')
  33. ss << C;
  34. else
  35. ss << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
  36. }
  37. return ss.str();
  38. }
  39. namespace refl_dump {
  40. LPCSTR ToString(D3D_CBUFFER_TYPE CBType) {
  41. switch (CBType) {
  42. case D3D_CT_CBUFFER: return "D3D_CT_CBUFFER";
  43. case D3D_CT_TBUFFER: return "D3D_CT_TBUFFER";
  44. case D3D_CT_INTERFACE_POINTERS: return "D3D_CT_INTERFACE_POINTERS";
  45. case D3D_CT_RESOURCE_BIND_INFO: return "D3D_CT_RESOURCE_BIND_INFO";
  46. default: return nullptr;
  47. }
  48. }
  49. LPCSTR ToString(D3D_SHADER_INPUT_TYPE Type) {
  50. switch ((UINT32)Type) {
  51. case D3D_SIT_CBUFFER: return "D3D_SIT_CBUFFER";
  52. case D3D_SIT_TBUFFER: return "D3D_SIT_TBUFFER";
  53. case D3D_SIT_TEXTURE: return "D3D_SIT_TEXTURE";
  54. case D3D_SIT_SAMPLER: return "D3D_SIT_SAMPLER";
  55. case D3D_SIT_UAV_RWTYPED: return "D3D_SIT_UAV_RWTYPED";
  56. case D3D_SIT_STRUCTURED: return "D3D_SIT_STRUCTURED";
  57. case D3D_SIT_UAV_RWSTRUCTURED: return "D3D_SIT_UAV_RWSTRUCTURED";
  58. case D3D_SIT_BYTEADDRESS: return "D3D_SIT_BYTEADDRESS";
  59. case D3D_SIT_UAV_RWBYTEADDRESS: return "D3D_SIT_UAV_RWBYTEADDRESS";
  60. case D3D_SIT_UAV_APPEND_STRUCTURED: return "D3D_SIT_UAV_APPEND_STRUCTURED";
  61. case D3D_SIT_UAV_CONSUME_STRUCTURED: return "D3D_SIT_UAV_CONSUME_STRUCTURED";
  62. case D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER: return "D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER";
  63. case (D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 1): return "D3D_SIT_RTACCELERATIONSTRUCTURE";
  64. case (D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 2): return "D3D_SIT_UAV_FEEDBACKTEXTURE";
  65. default: return nullptr;
  66. }
  67. }
  68. LPCSTR ToString(D3D_RESOURCE_RETURN_TYPE ReturnType) {
  69. switch (ReturnType) {
  70. case D3D_RETURN_TYPE_UNORM: return "D3D_RETURN_TYPE_UNORM";
  71. case D3D_RETURN_TYPE_SNORM: return "D3D_RETURN_TYPE_SNORM";
  72. case D3D_RETURN_TYPE_SINT: return "D3D_RETURN_TYPE_SINT";
  73. case D3D_RETURN_TYPE_UINT: return "D3D_RETURN_TYPE_UINT";
  74. case D3D_RETURN_TYPE_FLOAT: return "D3D_RETURN_TYPE_FLOAT";
  75. case D3D_RETURN_TYPE_MIXED: return "D3D_RETURN_TYPE_MIXED";
  76. case D3D_RETURN_TYPE_DOUBLE: return "D3D_RETURN_TYPE_DOUBLE";
  77. case D3D_RETURN_TYPE_CONTINUED: return "D3D_RETURN_TYPE_CONTINUED";
  78. default: return nullptr;
  79. }
  80. }
  81. LPCSTR ToString(D3D_SRV_DIMENSION Dimension) {
  82. switch (Dimension) {
  83. case D3D_SRV_DIMENSION_UNKNOWN: return "D3D_SRV_DIMENSION_UNKNOWN";
  84. case D3D_SRV_DIMENSION_BUFFER: return "D3D_SRV_DIMENSION_BUFFER";
  85. case D3D_SRV_DIMENSION_TEXTURE1D: return "D3D_SRV_DIMENSION_TEXTURE1D";
  86. case D3D_SRV_DIMENSION_TEXTURE1DARRAY: return "D3D_SRV_DIMENSION_TEXTURE1DARRAY";
  87. case D3D_SRV_DIMENSION_TEXTURE2D: return "D3D_SRV_DIMENSION_TEXTURE2D";
  88. case D3D_SRV_DIMENSION_TEXTURE2DARRAY: return "D3D_SRV_DIMENSION_TEXTURE2DARRAY";
  89. case D3D_SRV_DIMENSION_TEXTURE2DMS: return "D3D_SRV_DIMENSION_TEXTURE2DMS";
  90. case D3D_SRV_DIMENSION_TEXTURE2DMSARRAY: return "D3D_SRV_DIMENSION_TEXTURE2DMSARRAY";
  91. case D3D_SRV_DIMENSION_TEXTURE3D: return "D3D_SRV_DIMENSION_TEXTURE3D";
  92. case D3D_SRV_DIMENSION_TEXTURECUBE: return "D3D_SRV_DIMENSION_TEXTURECUBE";
  93. case D3D_SRV_DIMENSION_TEXTURECUBEARRAY: return "D3D_SRV_DIMENSION_TEXTURECUBEARRAY";
  94. case D3D_SRV_DIMENSION_BUFFEREX: return "D3D_SRV_DIMENSION_BUFFEREX";
  95. default: return nullptr;
  96. }
  97. }
  98. LPCSTR ToString(D3D_PRIMITIVE_TOPOLOGY GSOutputTopology) {
  99. switch (GSOutputTopology) {
  100. case D3D_PRIMITIVE_TOPOLOGY_UNDEFINED: return "D3D_PRIMITIVE_TOPOLOGY_UNDEFINED";
  101. case D3D_PRIMITIVE_TOPOLOGY_POINTLIST: return "D3D_PRIMITIVE_TOPOLOGY_POINTLIST";
  102. case D3D_PRIMITIVE_TOPOLOGY_LINELIST: return "D3D_PRIMITIVE_TOPOLOGY_LINELIST";
  103. case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: return "D3D_PRIMITIVE_TOPOLOGY_LINESTRIP";
  104. case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: return "D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST";
  105. case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: return "D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP";
  106. case D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ: return "D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ";
  107. case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ: return "D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ";
  108. case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ: return "D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ";
  109. case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ: return "D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ";
  110. case D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST";
  111. case D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST";
  112. case D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST";
  113. case D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST";
  114. case D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST";
  115. case D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST";
  116. case D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST";
  117. case D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST";
  118. case D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST";
  119. case D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST";
  120. case D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST";
  121. case D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST";
  122. case D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST";
  123. case D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST";
  124. case D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST";
  125. case D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST";
  126. case D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST";
  127. case D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST";
  128. case D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST";
  129. case D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST";
  130. case D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST";
  131. case D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST";
  132. case D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST";
  133. case D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST";
  134. case D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST";
  135. case D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST";
  136. case D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST";
  137. case D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST";
  138. case D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST";
  139. case D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST";
  140. case D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST";
  141. case D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST: return "D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST";
  142. default: return nullptr;
  143. }
  144. }
  145. LPCSTR ToString(D3D_PRIMITIVE InputPrimitive) {
  146. switch (InputPrimitive) {
  147. case D3D_PRIMITIVE_UNDEFINED: return "D3D_PRIMITIVE_UNDEFINED";
  148. case D3D_PRIMITIVE_POINT: return "D3D_PRIMITIVE_POINT";
  149. case D3D_PRIMITIVE_LINE: return "D3D_PRIMITIVE_LINE";
  150. case D3D_PRIMITIVE_TRIANGLE: return "D3D_PRIMITIVE_TRIANGLE";
  151. case D3D_PRIMITIVE_LINE_ADJ: return "D3D_PRIMITIVE_LINE_ADJ";
  152. case D3D_PRIMITIVE_TRIANGLE_ADJ: return "D3D_PRIMITIVE_TRIANGLE_ADJ";
  153. case D3D_PRIMITIVE_1_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_1_CONTROL_POINT_PATCH";
  154. case D3D_PRIMITIVE_2_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_2_CONTROL_POINT_PATCH";
  155. case D3D_PRIMITIVE_3_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_3_CONTROL_POINT_PATCH";
  156. case D3D_PRIMITIVE_4_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_4_CONTROL_POINT_PATCH";
  157. case D3D_PRIMITIVE_5_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_5_CONTROL_POINT_PATCH";
  158. case D3D_PRIMITIVE_6_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_6_CONTROL_POINT_PATCH";
  159. case D3D_PRIMITIVE_7_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_7_CONTROL_POINT_PATCH";
  160. case D3D_PRIMITIVE_8_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_8_CONTROL_POINT_PATCH";
  161. case D3D_PRIMITIVE_9_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_9_CONTROL_POINT_PATCH";
  162. case D3D_PRIMITIVE_10_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_10_CONTROL_POINT_PATCH";
  163. case D3D_PRIMITIVE_11_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_11_CONTROL_POINT_PATCH";
  164. case D3D_PRIMITIVE_12_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_12_CONTROL_POINT_PATCH";
  165. case D3D_PRIMITIVE_13_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_13_CONTROL_POINT_PATCH";
  166. case D3D_PRIMITIVE_14_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_14_CONTROL_POINT_PATCH";
  167. case D3D_PRIMITIVE_15_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_15_CONTROL_POINT_PATCH";
  168. case D3D_PRIMITIVE_16_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_16_CONTROL_POINT_PATCH";
  169. case D3D_PRIMITIVE_17_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_17_CONTROL_POINT_PATCH";
  170. case D3D_PRIMITIVE_18_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_18_CONTROL_POINT_PATCH";
  171. case D3D_PRIMITIVE_19_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_19_CONTROL_POINT_PATCH";
  172. case D3D_PRIMITIVE_20_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_20_CONTROL_POINT_PATCH";
  173. case D3D_PRIMITIVE_21_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_21_CONTROL_POINT_PATCH";
  174. case D3D_PRIMITIVE_22_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_22_CONTROL_POINT_PATCH";
  175. case D3D_PRIMITIVE_23_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_23_CONTROL_POINT_PATCH";
  176. case D3D_PRIMITIVE_24_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_24_CONTROL_POINT_PATCH";
  177. case D3D_PRIMITIVE_25_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_25_CONTROL_POINT_PATCH";
  178. case D3D_PRIMITIVE_26_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_26_CONTROL_POINT_PATCH";
  179. case D3D_PRIMITIVE_27_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_27_CONTROL_POINT_PATCH";
  180. case D3D_PRIMITIVE_28_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_28_CONTROL_POINT_PATCH";
  181. case D3D_PRIMITIVE_29_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_29_CONTROL_POINT_PATCH";
  182. case D3D_PRIMITIVE_30_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_30_CONTROL_POINT_PATCH";
  183. case D3D_PRIMITIVE_31_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_31_CONTROL_POINT_PATCH";
  184. case D3D_PRIMITIVE_32_CONTROL_POINT_PATCH: return "D3D_PRIMITIVE_32_CONTROL_POINT_PATCH";
  185. default: return nullptr;
  186. }
  187. }
  188. LPCSTR ToString(D3D_TESSELLATOR_OUTPUT_PRIMITIVE HSOutputPrimitive) {
  189. switch (HSOutputPrimitive) {
  190. case D3D_TESSELLATOR_OUTPUT_UNDEFINED: return "D3D_TESSELLATOR_OUTPUT_UNDEFINED";
  191. case D3D_TESSELLATOR_OUTPUT_POINT: return "D3D_TESSELLATOR_OUTPUT_POINT";
  192. case D3D_TESSELLATOR_OUTPUT_LINE: return "D3D_TESSELLATOR_OUTPUT_LINE";
  193. case D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW: return "D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW";
  194. case D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW: return "D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW";
  195. default: return nullptr;
  196. }
  197. }
  198. LPCSTR ToString(D3D_TESSELLATOR_PARTITIONING HSPartitioning) {
  199. switch (HSPartitioning) {
  200. case D3D_TESSELLATOR_PARTITIONING_UNDEFINED: return "D3D_TESSELLATOR_PARTITIONING_UNDEFINED";
  201. case D3D_TESSELLATOR_PARTITIONING_INTEGER: return "D3D_TESSELLATOR_PARTITIONING_INTEGER";
  202. case D3D_TESSELLATOR_PARTITIONING_POW2: return "D3D_TESSELLATOR_PARTITIONING_POW2";
  203. case D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD: return "D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD";
  204. case D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN: return "D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN";
  205. default: return nullptr;
  206. }
  207. }
  208. LPCSTR ToString(D3D_TESSELLATOR_DOMAIN TessellatorDomain) {
  209. switch (TessellatorDomain) {
  210. case D3D_TESSELLATOR_DOMAIN_UNDEFINED: return "D3D_TESSELLATOR_DOMAIN_UNDEFINED";
  211. case D3D_TESSELLATOR_DOMAIN_ISOLINE: return "D3D_TESSELLATOR_DOMAIN_ISOLINE";
  212. case D3D_TESSELLATOR_DOMAIN_TRI: return "D3D_TESSELLATOR_DOMAIN_TRI";
  213. case D3D_TESSELLATOR_DOMAIN_QUAD: return "D3D_TESSELLATOR_DOMAIN_QUAD";
  214. default: return nullptr;
  215. }
  216. }
  217. LPCSTR ToString(D3D_SHADER_VARIABLE_CLASS Class) {
  218. switch (Class) {
  219. case D3D_SVC_SCALAR: return "D3D_SVC_SCALAR";
  220. case D3D_SVC_VECTOR: return "D3D_SVC_VECTOR";
  221. case D3D_SVC_MATRIX_ROWS: return "D3D_SVC_MATRIX_ROWS";
  222. case D3D_SVC_MATRIX_COLUMNS: return "D3D_SVC_MATRIX_COLUMNS";
  223. case D3D_SVC_OBJECT: return "D3D_SVC_OBJECT";
  224. case D3D_SVC_STRUCT: return "D3D_SVC_STRUCT";
  225. case D3D_SVC_INTERFACE_CLASS: return "D3D_SVC_INTERFACE_CLASS";
  226. case D3D_SVC_INTERFACE_POINTER: return "D3D_SVC_INTERFACE_POINTER";
  227. default: return nullptr;
  228. }
  229. }
  230. #ifdef ADD_16_64_BIT_TYPES
  231. #define D3D_SVT_INT16 ((D3D_SHADER_VARIABLE_TYPE)58)
  232. #define D3D_SVT_UINT16 ((D3D_SHADER_VARIABLE_TYPE)59)
  233. #define D3D_SVT_FLOAT16 ((D3D_SHADER_VARIABLE_TYPE)60)
  234. #define D3D_SVT_INT64 ((D3D_SHADER_VARIABLE_TYPE)61)
  235. #define D3D_SVT_UINT64 ((D3D_SHADER_VARIABLE_TYPE)62)
  236. #endif // ADD_16_64_BIT_TYPES
  237. LPCSTR ToString(D3D_SHADER_VARIABLE_TYPE Type) {
  238. switch (Type) {
  239. case D3D_SVT_VOID: return "D3D_SVT_VOID";
  240. case D3D_SVT_BOOL: return "D3D_SVT_BOOL";
  241. case D3D_SVT_INT: return "D3D_SVT_INT";
  242. case D3D_SVT_FLOAT: return "D3D_SVT_FLOAT";
  243. case D3D_SVT_STRING: return "D3D_SVT_STRING";
  244. case D3D_SVT_TEXTURE: return "D3D_SVT_TEXTURE";
  245. case D3D_SVT_TEXTURE1D: return "D3D_SVT_TEXTURE1D";
  246. case D3D_SVT_TEXTURE2D: return "D3D_SVT_TEXTURE2D";
  247. case D3D_SVT_TEXTURE3D: return "D3D_SVT_TEXTURE3D";
  248. case D3D_SVT_TEXTURECUBE: return "D3D_SVT_TEXTURECUBE";
  249. case D3D_SVT_SAMPLER: return "D3D_SVT_SAMPLER";
  250. case D3D_SVT_SAMPLER1D: return "D3D_SVT_SAMPLER1D";
  251. case D3D_SVT_SAMPLER2D: return "D3D_SVT_SAMPLER2D";
  252. case D3D_SVT_SAMPLER3D: return "D3D_SVT_SAMPLER3D";
  253. case D3D_SVT_SAMPLERCUBE: return "D3D_SVT_SAMPLERCUBE";
  254. case D3D_SVT_PIXELSHADER: return "D3D_SVT_PIXELSHADER";
  255. case D3D_SVT_VERTEXSHADER: return "D3D_SVT_VERTEXSHADER";
  256. case D3D_SVT_PIXELFRAGMENT: return "D3D_SVT_PIXELFRAGMENT";
  257. case D3D_SVT_VERTEXFRAGMENT: return "D3D_SVT_VERTEXFRAGMENT";
  258. case D3D_SVT_UINT: return "D3D_SVT_UINT";
  259. case D3D_SVT_UINT8: return "D3D_SVT_UINT8";
  260. case D3D_SVT_GEOMETRYSHADER: return "D3D_SVT_GEOMETRYSHADER";
  261. case D3D_SVT_RASTERIZER: return "D3D_SVT_RASTERIZER";
  262. case D3D_SVT_DEPTHSTENCIL: return "D3D_SVT_DEPTHSTENCIL";
  263. case D3D_SVT_BLEND: return "D3D_SVT_BLEND";
  264. case D3D_SVT_BUFFER: return "D3D_SVT_BUFFER";
  265. case D3D_SVT_CBUFFER: return "D3D_SVT_CBUFFER";
  266. case D3D_SVT_TBUFFER: return "D3D_SVT_TBUFFER";
  267. case D3D_SVT_TEXTURE1DARRAY: return "D3D_SVT_TEXTURE1DARRAY";
  268. case D3D_SVT_TEXTURE2DARRAY: return "D3D_SVT_TEXTURE2DARRAY";
  269. case D3D_SVT_RENDERTARGETVIEW: return "D3D_SVT_RENDERTARGETVIEW";
  270. case D3D_SVT_DEPTHSTENCILVIEW: return "D3D_SVT_DEPTHSTENCILVIEW";
  271. case D3D_SVT_TEXTURE2DMS: return "D3D_SVT_TEXTURE2DMS";
  272. case D3D_SVT_TEXTURE2DMSARRAY: return "D3D_SVT_TEXTURE2DMSARRAY";
  273. case D3D_SVT_TEXTURECUBEARRAY: return "D3D_SVT_TEXTURECUBEARRAY";
  274. case D3D_SVT_HULLSHADER: return "D3D_SVT_HULLSHADER";
  275. case D3D_SVT_DOMAINSHADER: return "D3D_SVT_DOMAINSHADER";
  276. case D3D_SVT_INTERFACE_POINTER: return "D3D_SVT_INTERFACE_POINTER";
  277. case D3D_SVT_COMPUTESHADER: return "D3D_SVT_COMPUTESHADER";
  278. case D3D_SVT_DOUBLE: return "D3D_SVT_DOUBLE";
  279. case D3D_SVT_RWTEXTURE1D: return "D3D_SVT_RWTEXTURE1D";
  280. case D3D_SVT_RWTEXTURE1DARRAY: return "D3D_SVT_RWTEXTURE1DARRAY";
  281. case D3D_SVT_RWTEXTURE2D: return "D3D_SVT_RWTEXTURE2D";
  282. case D3D_SVT_RWTEXTURE2DARRAY: return "D3D_SVT_RWTEXTURE2DARRAY";
  283. case D3D_SVT_RWTEXTURE3D: return "D3D_SVT_RWTEXTURE3D";
  284. case D3D_SVT_RWBUFFER: return "D3D_SVT_RWBUFFER";
  285. case D3D_SVT_BYTEADDRESS_BUFFER: return "D3D_SVT_BYTEADDRESS_BUFFER";
  286. case D3D_SVT_RWBYTEADDRESS_BUFFER: return "D3D_SVT_RWBYTEADDRESS_BUFFER";
  287. case D3D_SVT_STRUCTURED_BUFFER: return "D3D_SVT_STRUCTURED_BUFFER";
  288. case D3D_SVT_RWSTRUCTURED_BUFFER: return "D3D_SVT_RWSTRUCTURED_BUFFER";
  289. case D3D_SVT_APPEND_STRUCTURED_BUFFER: return "D3D_SVT_APPEND_STRUCTURED_BUFFER";
  290. case D3D_SVT_CONSUME_STRUCTURED_BUFFER: return "D3D_SVT_CONSUME_STRUCTURED_BUFFER";
  291. case D3D_SVT_MIN8FLOAT: return "D3D_SVT_MIN8FLOAT";
  292. case D3D_SVT_MIN10FLOAT: return "D3D_SVT_MIN10FLOAT";
  293. case D3D_SVT_MIN16FLOAT: return "D3D_SVT_MIN16FLOAT";
  294. case D3D_SVT_MIN12INT: return "D3D_SVT_MIN12INT";
  295. case D3D_SVT_MIN16INT: return "D3D_SVT_MIN16INT";
  296. case D3D_SVT_MIN16UINT: return "D3D_SVT_MIN16UINT";
  297. case D3D_SVT_INT16: return "D3D_SVT_INT16";
  298. case D3D_SVT_UINT16: return "D3D_SVT_UINT16";
  299. case D3D_SVT_FLOAT16: return "D3D_SVT_FLOAT16";
  300. case D3D_SVT_INT64: return "D3D_SVT_INT64";
  301. case D3D_SVT_UINT64: return "D3D_SVT_UINT64";
  302. default: return nullptr;
  303. }
  304. }
  305. LPCSTR ToString(D3D_SHADER_VARIABLE_FLAGS Flag) {
  306. switch (Flag) {
  307. case D3D_SVF_USERPACKED: return "D3D_SVF_USERPACKED";
  308. case D3D_SVF_USED: return "D3D_SVF_USED";
  309. case D3D_SVF_INTERFACE_POINTER: return "D3D_SVF_INTERFACE_POINTER";
  310. case D3D_SVF_INTERFACE_PARAMETER: return "D3D_SVF_INTERFACE_PARAMETER";
  311. }
  312. return nullptr;
  313. }
  314. LPCSTR ToString(D3D_SHADER_INPUT_FLAGS Flag) {
  315. switch (Flag) {
  316. case D3D_SIF_USERPACKED: return "D3D_SIF_USERPACKED";
  317. case D3D_SIF_COMPARISON_SAMPLER: return "D3D_SIF_COMPARISON_SAMPLER";
  318. case D3D_SIF_TEXTURE_COMPONENT_0: return "D3D_SIF_TEXTURE_COMPONENT_0";
  319. case D3D_SIF_TEXTURE_COMPONENT_1: return "D3D_SIF_TEXTURE_COMPONENT_1";
  320. case D3D_SIF_TEXTURE_COMPONENTS: return "D3D_SIF_TEXTURE_COMPONENTS";
  321. case D3D_SIF_UNUSED: return "D3D_SIF_UNUSED";
  322. }
  323. return nullptr;
  324. }
  325. LPCSTR ToString(D3D_SHADER_CBUFFER_FLAGS Flag) {
  326. switch (Flag) {
  327. case D3D_CBF_USERPACKED: return "D3D_CBF_USERPACKED";
  328. }
  329. return nullptr;
  330. }
  331. LPCSTR ToString(D3D_PARAMETER_FLAGS Flag) {
  332. switch (Flag) {
  333. case D3D_PF_IN: return "D3D_PF_IN";
  334. case D3D_PF_OUT: return "D3D_PF_OUT";
  335. }
  336. return nullptr;
  337. }
  338. void D3DReflectionDumper::DumpDefaultValue(LPCVOID pDefaultValue, UINT Size) {
  339. WriteLn("DefaultValue: ", pDefaultValue ? "<present>" : "<nullptr>"); // TODO: Dump DefaultValue
  340. }
  341. void D3DReflectionDumper::DumpShaderVersion(UINT Version) {
  342. const char *szType = "<unknown>";
  343. UINT Type = D3D12_SHVER_GET_TYPE(Version);
  344. switch (Type) {
  345. case (UINT)hlsl::DXIL::ShaderKind::Pixel: szType = "Pixel"; break;
  346. case (UINT)hlsl::DXIL::ShaderKind::Vertex: szType = "Vertex"; break;
  347. case (UINT)hlsl::DXIL::ShaderKind::Geometry: szType = "Geometry"; break;
  348. case (UINT)hlsl::DXIL::ShaderKind::Hull: szType = "Hull"; break;
  349. case (UINT)hlsl::DXIL::ShaderKind::Domain: szType = "Domain"; break;
  350. case (UINT)hlsl::DXIL::ShaderKind::Compute: szType = "Compute"; break;
  351. case (UINT)hlsl::DXIL::ShaderKind::Library: szType = "Library"; break;
  352. case (UINT)hlsl::DXIL::ShaderKind::RayGeneration: szType = "RayGeneration"; break;
  353. case (UINT)hlsl::DXIL::ShaderKind::Intersection: szType = "Intersection"; break;
  354. case (UINT)hlsl::DXIL::ShaderKind::AnyHit: szType = "AnyHit"; break;
  355. case (UINT)hlsl::DXIL::ShaderKind::ClosestHit: szType = "ClosestHit"; break;
  356. case (UINT)hlsl::DXIL::ShaderKind::Miss: szType = "Miss"; break;
  357. case (UINT)hlsl::DXIL::ShaderKind::Callable: szType = "Callable"; break;
  358. case (UINT)hlsl::DXIL::ShaderKind::Mesh: szType = "Mesh"; break;
  359. case (UINT)hlsl::DXIL::ShaderKind::Amplification: szType = "Amplification"; break;
  360. case (UINT)hlsl::DXIL::ShaderKind::Invalid: szType = "Invalid"; break;
  361. }
  362. UINT Major = D3D12_SHVER_GET_MAJOR(Version);
  363. UINT Minor = D3D12_SHVER_GET_MINOR(Version);
  364. WriteLn("Shader Version: ", szType, " ", Major, ".", Minor);
  365. }
  366. void D3DReflectionDumper::Dump(D3D12_SHADER_TYPE_DESC &tyDesc) {
  367. SetLastName(tyDesc.Name);
  368. WriteLn("D3D12_SHADER_TYPE_DESC: Name: ", m_LastName);
  369. Indent();
  370. DumpEnum("Class", tyDesc.Class);
  371. DumpEnum("Type", tyDesc.Type);
  372. WriteLn("Elements: ", tyDesc.Elements);
  373. WriteLn("Rows: ", tyDesc.Rows);
  374. WriteLn("Columns: ", tyDesc.Columns);
  375. WriteLn("Members: ", tyDesc.Members);
  376. WriteLn("Offset: ", tyDesc.Offset);
  377. Dedent();
  378. }
  379. void D3DReflectionDumper::Dump(D3D12_SHADER_VARIABLE_DESC &varDesc) {
  380. SetLastName(varDesc.Name);
  381. WriteLn("D3D12_SHADER_VARIABLE_DESC: Name: ", m_LastName);
  382. Indent();
  383. WriteLn("Size: ", varDesc.Size);
  384. WriteLn("StartOffset: ", varDesc.StartOffset);
  385. WriteLn("uFlags: ", FlagsValue<D3D_SHADER_VARIABLE_FLAGS>(varDesc.uFlags));
  386. DumpDefaultValue(varDesc.DefaultValue, varDesc.Size);
  387. Dedent();
  388. }
  389. void D3DReflectionDumper::Dump(D3D12_SHADER_BUFFER_DESC &Desc) {
  390. SetLastName(Desc.Name);
  391. WriteLn("D3D12_SHADER_BUFFER_DESC: Name: ", m_LastName);
  392. Indent();
  393. DumpEnum("Type", Desc.Type);
  394. WriteLn("Size: ", Desc.Size);
  395. WriteLn("uFlags: ", FlagsValue<D3D_SHADER_CBUFFER_FLAGS>(Desc.uFlags));
  396. WriteLn("Num Variables: ", Desc.Variables);
  397. Dedent();
  398. }
  399. void D3DReflectionDumper::Dump(D3D12_SHADER_INPUT_BIND_DESC &resDesc) {
  400. SetLastName(resDesc.Name);
  401. WriteLn("D3D12_SHADER_BUFFER_DESC: Name: ", m_LastName);
  402. Indent();
  403. DumpEnum("Type", resDesc.Type);
  404. WriteLn("uID: ", resDesc.uID);
  405. WriteLn("BindCount: ", resDesc.BindCount);
  406. WriteLn("BindPoint: ", resDesc.BindPoint);
  407. WriteLn("Space: ", resDesc.Space);
  408. DumpEnum("ReturnType", resDesc.ReturnType);
  409. DumpEnum("Dimension", resDesc.Dimension);
  410. WriteLn("NumSamples (or stride): ", resDesc.NumSamples);
  411. WriteLn("uFlags: ", FlagsValue<D3D_SHADER_INPUT_FLAGS>(resDesc.uFlags));
  412. Dedent();
  413. }
  414. void D3DReflectionDumper::Dump(D3D12_SHADER_DESC &Desc) {
  415. WriteLn("D3D12_SHADER_BUFFER_DESC:");
  416. Indent();
  417. DumpShaderVersion(Desc.Version);
  418. WriteLn("Creator: ", Desc.Creator ? Desc.Creator : "<nullptr>");
  419. WriteLn("Flags: ", std::hex, std::showbase, Desc.Flags); // TODO: fxc compiler flags
  420. WriteLn("ConstantBuffers: ", Desc.ConstantBuffers);
  421. WriteLn("BoundResources: ", Desc.BoundResources);
  422. WriteLn("InputParameters: ", Desc.InputParameters);
  423. WriteLn("OutputParameters: ", Desc.OutputParameters);
  424. hlsl::DXIL::ShaderKind ShaderKind = (hlsl::DXIL::ShaderKind)D3D12_SHVER_GET_TYPE(Desc.Version);
  425. if (ShaderKind == hlsl::DXIL::ShaderKind::Geometry) {
  426. WriteLn("cGSInstanceCount: ", Desc.cGSInstanceCount);
  427. WriteLn("GSMaxOutputVertexCount: ", Desc.GSMaxOutputVertexCount);
  428. DumpEnum("GSOutputTopology", Desc.GSOutputTopology);
  429. DumpEnum("InputPrimitive", Desc.InputPrimitive);
  430. }
  431. if (ShaderKind == hlsl::DXIL::ShaderKind::Hull) {
  432. WriteLn("PatchConstantParameters: ", Desc.PatchConstantParameters);
  433. WriteLn("cControlPoints: ", Desc.cControlPoints);
  434. DumpEnum("InputPrimitive", Desc.InputPrimitive);
  435. DumpEnum("HSOutputPrimitive", Desc.HSOutputPrimitive);
  436. DumpEnum("HSPartitioning", Desc.HSPartitioning);
  437. DumpEnum("TessellatorDomain", Desc.TessellatorDomain);
  438. }
  439. if (ShaderKind == hlsl::DXIL::ShaderKind::Domain) {
  440. WriteLn("PatchConstantParameters: ", Desc.PatchConstantParameters);
  441. WriteLn("cControlPoints: ", Desc.cControlPoints);
  442. DumpEnum("TessellatorDomain", Desc.TessellatorDomain);
  443. }
  444. // Instruction Counts
  445. WriteLn("InstructionCount: ", Desc.InstructionCount);
  446. WriteLn("TempArrayCount: ", Desc.TempArrayCount);
  447. WriteLn("DynamicFlowControlCount: ", Desc.DynamicFlowControlCount);
  448. WriteLn("ArrayInstructionCount: ", Desc.ArrayInstructionCount);
  449. WriteLn("TextureNormalInstructions: ", Desc.TextureNormalInstructions);
  450. WriteLn("TextureLoadInstructions: ", Desc.TextureLoadInstructions);
  451. WriteLn("TextureCompInstructions: ", Desc.TextureCompInstructions);
  452. WriteLn("TextureBiasInstructions: ", Desc.TextureBiasInstructions);
  453. WriteLn("TextureGradientInstructions: ", Desc.TextureGradientInstructions);
  454. WriteLn("FloatInstructionCount: ", Desc.FloatInstructionCount);
  455. WriteLn("IntInstructionCount: ", Desc.IntInstructionCount);
  456. WriteLn("UintInstructionCount: ", Desc.UintInstructionCount);
  457. WriteLn("CutInstructionCount: ", Desc.CutInstructionCount);
  458. WriteLn("EmitInstructionCount: ", Desc.EmitInstructionCount);
  459. WriteLn("cBarrierInstructions: ", Desc.cBarrierInstructions);
  460. WriteLn("cInterlockedInstructions: ", Desc.cInterlockedInstructions);
  461. WriteLn("cTextureStoreInstructions: ", Desc.cTextureStoreInstructions);
  462. Dedent();
  463. }
  464. void D3DReflectionDumper::Dump(D3D12_FUNCTION_DESC &Desc) {
  465. SetLastName(Desc.Name);
  466. WriteLn("D3D12_FUNCTION_DESC: Name: ", EscapedString(m_LastName));
  467. Indent();
  468. DumpShaderVersion(Desc.Version);
  469. WriteLn("Creator: ", Desc.Creator ? Desc.Creator : "<nullptr>");
  470. WriteLn("Flags: ", std::hex, std::showbase, Desc.Flags);
  471. WriteLn("ConstantBuffers: ", Desc.ConstantBuffers);
  472. WriteLn("BoundResources: ", Desc.BoundResources);
  473. WriteLn("FunctionParameterCount: ", Desc.FunctionParameterCount);
  474. WriteLn("HasReturn: ", Desc.HasReturn ? "TRUE" : "FALSE");
  475. Dedent();
  476. }
  477. void D3DReflectionDumper::Dump(D3D12_LIBRARY_DESC &Desc) {
  478. WriteLn("D3D12_LIBRARY_DESC:");
  479. Indent();
  480. WriteLn("Creator: ", Desc.Creator ? Desc.Creator : "<nullptr>");
  481. WriteLn("Flags: ", std::hex, std::showbase, Desc.Flags);
  482. WriteLn("FunctionCount: ", Desc.FunctionCount);
  483. Dedent();
  484. }
  485. void D3DReflectionDumper::Dump(ID3D12ShaderReflectionType *pType) {
  486. WriteLn("ID3D12ShaderReflectionType:");
  487. Indent();
  488. D3D12_SHADER_TYPE_DESC tyDesc;
  489. if (!pType || FAILED(pType->GetDesc(&tyDesc))) {
  490. Failure("GetDesc");
  491. Dedent();
  492. return;
  493. }
  494. Dump(tyDesc);
  495. if (tyDesc.Members) {
  496. WriteLn("{");
  497. Indent();
  498. for (UINT uMember = 0; uMember < tyDesc.Members; uMember++) {
  499. Dump(pType->GetMemberTypeByIndex(uMember));
  500. }
  501. Dedent();
  502. WriteLn("}");
  503. }
  504. Dedent();
  505. }
  506. void D3DReflectionDumper::Dump(ID3D12ShaderReflectionVariable *pVar) {
  507. WriteLn("ID3D12ShaderReflectionVariable:");
  508. Indent();
  509. D3D12_SHADER_VARIABLE_DESC varDesc;
  510. if (!pVar || FAILED(pVar->GetDesc(&varDesc))) {
  511. Failure("GetDesc");
  512. Dedent();
  513. return;
  514. }
  515. Dump(varDesc);
  516. Dump(pVar->GetType());
  517. ID3D12ShaderReflectionConstantBuffer* pCB = pVar->GetBuffer();
  518. D3D12_SHADER_BUFFER_DESC CBDesc;
  519. if (pCB && SUCCEEDED(pCB->GetDesc(&CBDesc))) {
  520. WriteLn("CBuffer: ", CBDesc.Name);
  521. }
  522. Dedent();
  523. }
  524. void D3DReflectionDumper::Dump(ID3D12ShaderReflectionConstantBuffer *pCBReflection) {
  525. WriteLn("ID3D12ShaderReflectionConstantBuffer:");
  526. Indent();
  527. D3D12_SHADER_BUFFER_DESC Desc;
  528. if (!pCBReflection || FAILED(pCBReflection->GetDesc(&Desc))) {
  529. Failure("GetDesc");
  530. Dedent();
  531. return;
  532. }
  533. Dump(Desc);
  534. if (Desc.Variables) {
  535. WriteLn("{");
  536. Indent();
  537. bool bCheckByNameFailed = false;
  538. for (UINT uVar = 0; uVar < Desc.Variables; uVar++) {
  539. if (m_bCheckByName)
  540. SetLastName();
  541. ID3D12ShaderReflectionVariable *pVar = pCBReflection->GetVariableByIndex(uVar);
  542. Dump(pVar);
  543. if (m_bCheckByName) {
  544. if (pCBReflection->GetVariableByName(m_LastName) != pVar) {
  545. bCheckByNameFailed = true;
  546. Failure("GetVariableByName ", m_LastName);
  547. }
  548. }
  549. }
  550. if (m_bCheckByName && !bCheckByNameFailed) {
  551. WriteLn("GetVariableByName checks succeeded.");
  552. }
  553. Dedent();
  554. WriteLn("}");
  555. }
  556. Dedent();
  557. }
  558. void D3DReflectionDumper::Dump(ID3D12ShaderReflection *pShaderReflection) {
  559. WriteLn("ID3D12ShaderReflection:");
  560. Indent();
  561. D3D12_SHADER_DESC Desc;
  562. if (!pShaderReflection || FAILED(pShaderReflection->GetDesc(&Desc))) {
  563. Failure("GetDesc");
  564. Dedent();
  565. return;
  566. }
  567. Dump(Desc);
  568. if (Desc.ConstantBuffers) {
  569. WriteLn("Constant Buffers:");
  570. Indent();
  571. bool bCheckByNameFailed = false;
  572. for (UINT uCB = 0; uCB < Desc.ConstantBuffers; uCB++) {
  573. ID3D12ShaderReflectionConstantBuffer *pCB = pShaderReflection->GetConstantBufferByIndex(uCB);
  574. Dump(pCB);
  575. if (m_bCheckByName && m_LastName) {
  576. if (pShaderReflection->GetConstantBufferByName(m_LastName) != pCB) {
  577. bCheckByNameFailed = true;
  578. Failure("GetConstantBufferByName ", m_LastName);
  579. }
  580. }
  581. }
  582. if (m_bCheckByName && !bCheckByNameFailed) {
  583. WriteLn("GetConstantBufferByName checks succeeded.");
  584. }
  585. Dedent();
  586. }
  587. if (Desc.BoundResources) {
  588. WriteLn("Bound Resources:");
  589. Indent();
  590. bool bCheckByNameFailed = false;
  591. for (UINT uRes = 0; uRes < Desc.BoundResources; uRes++) {
  592. D3D12_SHADER_INPUT_BIND_DESC bindDesc;
  593. if (FAILED(pShaderReflection->GetResourceBindingDesc(uRes, &bindDesc))) {
  594. }
  595. Dump(bindDesc);
  596. if (m_bCheckByName && bindDesc.Name) {
  597. D3D12_SHADER_INPUT_BIND_DESC bindDesc2;
  598. if (FAILED(pShaderReflection->GetResourceBindingDescByName(bindDesc.Name, &bindDesc2)) || bindDesc2.Name != bindDesc.Name) {
  599. bCheckByNameFailed = true;
  600. Failure("GetResourceBindingDescByName ", bindDesc.Name);
  601. }
  602. }
  603. }
  604. if (m_bCheckByName && !bCheckByNameFailed) {
  605. WriteLn("GetResourceBindingDescByName checks succeeded.");
  606. }
  607. Dedent();
  608. }
  609. // TODO
  610. Dedent();
  611. }
  612. void D3DReflectionDumper::Dump(ID3D12FunctionReflection *pFunctionReflection) {
  613. WriteLn("ID3D12FunctionReflection:");
  614. Indent();
  615. D3D12_FUNCTION_DESC Desc;
  616. if (!pFunctionReflection || FAILED(pFunctionReflection->GetDesc(&Desc))) {
  617. Failure("GetDesc");
  618. Dedent();
  619. return;
  620. }
  621. Dump(Desc);
  622. if (Desc.ConstantBuffers) {
  623. WriteLn("Constant Buffers:");
  624. Indent();
  625. bool bCheckByNameFailed = false;
  626. for (UINT uCB = 0; uCB < Desc.ConstantBuffers; uCB++) {
  627. ID3D12ShaderReflectionConstantBuffer *pCB = pFunctionReflection->GetConstantBufferByIndex(uCB);
  628. Dump(pCB);
  629. if (m_bCheckByName && m_LastName) {
  630. if (pFunctionReflection->GetConstantBufferByName(m_LastName) != pCB) {
  631. bCheckByNameFailed = true;
  632. Failure("GetConstantBufferByName ", m_LastName);
  633. }
  634. }
  635. }
  636. if (m_bCheckByName && !bCheckByNameFailed) {
  637. WriteLn("GetConstantBufferByName checks succeeded.");
  638. }
  639. Dedent();
  640. }
  641. if (Desc.BoundResources) {
  642. WriteLn("Bound Resources:");
  643. Indent();
  644. bool bCheckByNameFailed = false;
  645. for (UINT uRes = 0; uRes < Desc.BoundResources; uRes++) {
  646. D3D12_SHADER_INPUT_BIND_DESC bindDesc;
  647. if (FAILED(pFunctionReflection->GetResourceBindingDesc(uRes, &bindDesc))) {
  648. }
  649. Dump(bindDesc);
  650. if (m_bCheckByName && bindDesc.Name) {
  651. D3D12_SHADER_INPUT_BIND_DESC bindDesc2;
  652. if (FAILED(pFunctionReflection->GetResourceBindingDescByName(bindDesc.Name, &bindDesc2)) || bindDesc2.Name != bindDesc.Name) {
  653. bCheckByNameFailed = true;
  654. Failure("GetResourceBindingDescByName ", bindDesc.Name);
  655. }
  656. }
  657. }
  658. if (m_bCheckByName && !bCheckByNameFailed) {
  659. WriteLn("GetResourceBindingDescByName checks succeeded.");
  660. }
  661. Dedent();
  662. }
  663. // TODO
  664. Dedent();
  665. }
  666. void D3DReflectionDumper::Dump(ID3D12LibraryReflection *pLibraryReflection) {
  667. WriteLn("ID3D12LibraryReflection:");
  668. Indent();
  669. D3D12_LIBRARY_DESC Desc;
  670. if (!pLibraryReflection || FAILED(pLibraryReflection->GetDesc(&Desc))) {
  671. Failure("GetDesc");
  672. Dedent();
  673. return;
  674. }
  675. Dump(Desc);
  676. if (Desc.FunctionCount) {
  677. for (UINT uFunc = 0; uFunc < Desc.FunctionCount; uFunc++)
  678. Dump(pLibraryReflection->GetFunctionByIndex((INT)uFunc));
  679. }
  680. Dedent();
  681. }
  682. } // namespace refl_dump