d3dx12_core.h 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535
  1. //*********************************************************
  2. //
  3. // Copyright (c) Microsoft Corporation.
  4. // Licensed under the MIT License (MIT).
  5. //
  6. //*********************************************************
  7. #pragma once
  8. #ifndef __cplusplus
  9. #error D3DX12 requires C++
  10. #endif
  11. #include <string.h>
  12. #include "d3d12.h"
  13. #include "d3dx12_default.h"
  14. //------------------------------------------------------------------------------------------------
  15. #ifndef D3DX12_ASSERT
  16. #ifdef assert
  17. #define D3DX12_ASSERT(x) assert(x)
  18. #else
  19. #define D3DX12_ASSERT(x)
  20. #endif
  21. #endif
  22. //------------------------------------------------------------------------------------------------
  23. template <typename t_CommandListType>
  24. inline ID3D12CommandList * const * CommandListCast(t_CommandListType * const * pp) noexcept
  25. {
  26. // This cast is useful for passing strongly typed command list pointers into
  27. // ExecuteCommandLists.
  28. // This cast is valid as long as the const-ness is respected. D3D12 APIs do
  29. // respect the const-ness of their arguments.
  30. return reinterpret_cast<ID3D12CommandList * const *>(pp);
  31. }
  32. //------------------------------------------------------------------------------------------------
  33. inline bool operator==( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r ) noexcept
  34. {
  35. return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width &&
  36. l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth;
  37. }
  38. //------------------------------------------------------------------------------------------------
  39. inline bool operator!=( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r ) noexcept
  40. { return !( l == r ); }
  41. //------------------------------------------------------------------------------------------------
  42. struct CD3DX12_RECT : public D3D12_RECT
  43. {
  44. CD3DX12_RECT() = default;
  45. explicit CD3DX12_RECT( const D3D12_RECT& o ) noexcept :
  46. D3D12_RECT( o )
  47. {}
  48. explicit CD3DX12_RECT(
  49. LONG Left,
  50. LONG Top,
  51. LONG Right,
  52. LONG Bottom ) noexcept
  53. {
  54. left = Left;
  55. top = Top;
  56. right = Right;
  57. bottom = Bottom;
  58. }
  59. };
  60. //------------------------------------------------------------------------------------------------
  61. struct CD3DX12_VIEWPORT : public D3D12_VIEWPORT
  62. {
  63. CD3DX12_VIEWPORT() = default;
  64. explicit CD3DX12_VIEWPORT( const D3D12_VIEWPORT& o ) noexcept :
  65. D3D12_VIEWPORT( o )
  66. {}
  67. explicit CD3DX12_VIEWPORT(
  68. FLOAT topLeftX,
  69. FLOAT topLeftY,
  70. FLOAT width,
  71. FLOAT height,
  72. FLOAT minDepth = D3D12_MIN_DEPTH,
  73. FLOAT maxDepth = D3D12_MAX_DEPTH ) noexcept
  74. {
  75. TopLeftX = topLeftX;
  76. TopLeftY = topLeftY;
  77. Width = width;
  78. Height = height;
  79. MinDepth = minDepth;
  80. MaxDepth = maxDepth;
  81. }
  82. explicit CD3DX12_VIEWPORT(
  83. _In_ ID3D12Resource* pResource,
  84. UINT mipSlice = 0,
  85. FLOAT topLeftX = 0.0f,
  86. FLOAT topLeftY = 0.0f,
  87. FLOAT minDepth = D3D12_MIN_DEPTH,
  88. FLOAT maxDepth = D3D12_MAX_DEPTH ) noexcept
  89. {
  90. #if defined(_MSC_VER) || !defined(_WIN32)
  91. const auto Desc = pResource->GetDesc();
  92. #else
  93. D3D12_RESOURCE_DESC tmpDesc;
  94. const auto& Desc = *pResource->GetDesc(&tmpDesc);
  95. #endif
  96. const UINT64 SubresourceWidth = Desc.Width >> mipSlice;
  97. const UINT64 SubresourceHeight = Desc.Height >> mipSlice;
  98. switch (Desc.Dimension)
  99. {
  100. case D3D12_RESOURCE_DIMENSION_BUFFER:
  101. TopLeftX = topLeftX;
  102. TopLeftY = 0.0f;
  103. Width = float(Desc.Width) - topLeftX;
  104. Height = 1.0f;
  105. break;
  106. case D3D12_RESOURCE_DIMENSION_TEXTURE1D:
  107. TopLeftX = topLeftX;
  108. TopLeftY = 0.0f;
  109. Width = (SubresourceWidth ? float(SubresourceWidth) : 1.0f) - topLeftX;
  110. Height = 1.0f;
  111. break;
  112. case D3D12_RESOURCE_DIMENSION_TEXTURE2D:
  113. case D3D12_RESOURCE_DIMENSION_TEXTURE3D:
  114. TopLeftX = topLeftX;
  115. TopLeftY = topLeftY;
  116. Width = (SubresourceWidth ? float(SubresourceWidth) : 1.0f) - topLeftX;
  117. Height = (SubresourceHeight ? float(SubresourceHeight) : 1.0f) - topLeftY;
  118. break;
  119. default: break;
  120. }
  121. MinDepth = minDepth;
  122. MaxDepth = maxDepth;
  123. }
  124. };
  125. //------------------------------------------------------------------------------------------------
  126. struct CD3DX12_BOX : public D3D12_BOX
  127. {
  128. CD3DX12_BOX() = default;
  129. explicit CD3DX12_BOX( const D3D12_BOX& o ) noexcept :
  130. D3D12_BOX( o )
  131. {}
  132. explicit CD3DX12_BOX(
  133. LONG Left,
  134. LONG Right ) noexcept
  135. {
  136. left = static_cast<UINT>(Left);
  137. top = 0;
  138. front = 0;
  139. right = static_cast<UINT>(Right);
  140. bottom = 1;
  141. back = 1;
  142. }
  143. explicit CD3DX12_BOX(
  144. LONG Left,
  145. LONG Top,
  146. LONG Right,
  147. LONG Bottom ) noexcept
  148. {
  149. left = static_cast<UINT>(Left);
  150. top = static_cast<UINT>(Top);
  151. front = 0;
  152. right = static_cast<UINT>(Right);
  153. bottom = static_cast<UINT>(Bottom);
  154. back = 1;
  155. }
  156. explicit CD3DX12_BOX(
  157. LONG Left,
  158. LONG Top,
  159. LONG Front,
  160. LONG Right,
  161. LONG Bottom,
  162. LONG Back ) noexcept
  163. {
  164. left = static_cast<UINT>(Left);
  165. top = static_cast<UINT>(Top);
  166. front = static_cast<UINT>(Front);
  167. right = static_cast<UINT>(Right);
  168. bottom = static_cast<UINT>(Bottom);
  169. back = static_cast<UINT>(Back);
  170. }
  171. };
  172. inline bool operator==( const D3D12_BOX& l, const D3D12_BOX& r ) noexcept
  173. {
  174. return l.left == r.left && l.top == r.top && l.front == r.front &&
  175. l.right == r.right && l.bottom == r.bottom && l.back == r.back;
  176. }
  177. inline bool operator!=( const D3D12_BOX& l, const D3D12_BOX& r ) noexcept
  178. { return !( l == r ); }
  179. //------------------------------------------------------------------------------------------------
  180. struct CD3DX12_DEPTH_STENCIL_DESC : public D3D12_DEPTH_STENCIL_DESC
  181. {
  182. CD3DX12_DEPTH_STENCIL_DESC() = default;
  183. explicit CD3DX12_DEPTH_STENCIL_DESC( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept :
  184. D3D12_DEPTH_STENCIL_DESC( o )
  185. {}
  186. explicit CD3DX12_DEPTH_STENCIL_DESC( CD3DX12_DEFAULT ) noexcept
  187. {
  188. DepthEnable = TRUE;
  189. DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
  190. DepthFunc = D3D12_COMPARISON_FUNC_LESS;
  191. StencilEnable = FALSE;
  192. StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
  193. StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
  194. const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp =
  195. { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS };
  196. FrontFace = defaultStencilOp;
  197. BackFace = defaultStencilOp;
  198. }
  199. explicit CD3DX12_DEPTH_STENCIL_DESC(
  200. BOOL depthEnable,
  201. D3D12_DEPTH_WRITE_MASK depthWriteMask,
  202. D3D12_COMPARISON_FUNC depthFunc,
  203. BOOL stencilEnable,
  204. UINT8 stencilReadMask,
  205. UINT8 stencilWriteMask,
  206. D3D12_STENCIL_OP frontStencilFailOp,
  207. D3D12_STENCIL_OP frontStencilDepthFailOp,
  208. D3D12_STENCIL_OP frontStencilPassOp,
  209. D3D12_COMPARISON_FUNC frontStencilFunc,
  210. D3D12_STENCIL_OP backStencilFailOp,
  211. D3D12_STENCIL_OP backStencilDepthFailOp,
  212. D3D12_STENCIL_OP backStencilPassOp,
  213. D3D12_COMPARISON_FUNC backStencilFunc ) noexcept
  214. {
  215. DepthEnable = depthEnable;
  216. DepthWriteMask = depthWriteMask;
  217. DepthFunc = depthFunc;
  218. StencilEnable = stencilEnable;
  219. StencilReadMask = stencilReadMask;
  220. StencilWriteMask = stencilWriteMask;
  221. FrontFace.StencilFailOp = frontStencilFailOp;
  222. FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
  223. FrontFace.StencilPassOp = frontStencilPassOp;
  224. FrontFace.StencilFunc = frontStencilFunc;
  225. BackFace.StencilFailOp = backStencilFailOp;
  226. BackFace.StencilDepthFailOp = backStencilDepthFailOp;
  227. BackFace.StencilPassOp = backStencilPassOp;
  228. BackFace.StencilFunc = backStencilFunc;
  229. }
  230. };
  231. //------------------------------------------------------------------------------------------------
  232. struct CD3DX12_DEPTH_STENCIL_DESC1 : public D3D12_DEPTH_STENCIL_DESC1
  233. {
  234. CD3DX12_DEPTH_STENCIL_DESC1() = default;
  235. explicit CD3DX12_DEPTH_STENCIL_DESC1( const D3D12_DEPTH_STENCIL_DESC1& o ) noexcept :
  236. D3D12_DEPTH_STENCIL_DESC1( o )
  237. {}
  238. explicit CD3DX12_DEPTH_STENCIL_DESC1( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept
  239. {
  240. DepthEnable = o.DepthEnable;
  241. DepthWriteMask = o.DepthWriteMask;
  242. DepthFunc = o.DepthFunc;
  243. StencilEnable = o.StencilEnable;
  244. StencilReadMask = o.StencilReadMask;
  245. StencilWriteMask = o.StencilWriteMask;
  246. FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
  247. FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
  248. FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
  249. FrontFace.StencilFunc = o.FrontFace.StencilFunc;
  250. BackFace.StencilFailOp = o.BackFace.StencilFailOp;
  251. BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
  252. BackFace.StencilPassOp = o.BackFace.StencilPassOp;
  253. BackFace.StencilFunc = o.BackFace.StencilFunc;
  254. DepthBoundsTestEnable = FALSE;
  255. }
  256. explicit CD3DX12_DEPTH_STENCIL_DESC1( CD3DX12_DEFAULT ) noexcept
  257. {
  258. DepthEnable = TRUE;
  259. DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
  260. DepthFunc = D3D12_COMPARISON_FUNC_LESS;
  261. StencilEnable = FALSE;
  262. StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
  263. StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
  264. const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp =
  265. { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS };
  266. FrontFace = defaultStencilOp;
  267. BackFace = defaultStencilOp;
  268. DepthBoundsTestEnable = FALSE;
  269. }
  270. explicit CD3DX12_DEPTH_STENCIL_DESC1(
  271. BOOL depthEnable,
  272. D3D12_DEPTH_WRITE_MASK depthWriteMask,
  273. D3D12_COMPARISON_FUNC depthFunc,
  274. BOOL stencilEnable,
  275. UINT8 stencilReadMask,
  276. UINT8 stencilWriteMask,
  277. D3D12_STENCIL_OP frontStencilFailOp,
  278. D3D12_STENCIL_OP frontStencilDepthFailOp,
  279. D3D12_STENCIL_OP frontStencilPassOp,
  280. D3D12_COMPARISON_FUNC frontStencilFunc,
  281. D3D12_STENCIL_OP backStencilFailOp,
  282. D3D12_STENCIL_OP backStencilDepthFailOp,
  283. D3D12_STENCIL_OP backStencilPassOp,
  284. D3D12_COMPARISON_FUNC backStencilFunc,
  285. BOOL depthBoundsTestEnable ) noexcept
  286. {
  287. DepthEnable = depthEnable;
  288. DepthWriteMask = depthWriteMask;
  289. DepthFunc = depthFunc;
  290. StencilEnable = stencilEnable;
  291. StencilReadMask = stencilReadMask;
  292. StencilWriteMask = stencilWriteMask;
  293. FrontFace.StencilFailOp = frontStencilFailOp;
  294. FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
  295. FrontFace.StencilPassOp = frontStencilPassOp;
  296. FrontFace.StencilFunc = frontStencilFunc;
  297. BackFace.StencilFailOp = backStencilFailOp;
  298. BackFace.StencilDepthFailOp = backStencilDepthFailOp;
  299. BackFace.StencilPassOp = backStencilPassOp;
  300. BackFace.StencilFunc = backStencilFunc;
  301. DepthBoundsTestEnable = depthBoundsTestEnable;
  302. }
  303. operator D3D12_DEPTH_STENCIL_DESC() const noexcept
  304. {
  305. D3D12_DEPTH_STENCIL_DESC D;
  306. D.DepthEnable = DepthEnable;
  307. D.DepthWriteMask = DepthWriteMask;
  308. D.DepthFunc = DepthFunc;
  309. D.StencilEnable = StencilEnable;
  310. D.StencilReadMask = StencilReadMask;
  311. D.StencilWriteMask = StencilWriteMask;
  312. D.FrontFace.StencilFailOp = FrontFace.StencilFailOp;
  313. D.FrontFace.StencilDepthFailOp = FrontFace.StencilDepthFailOp;
  314. D.FrontFace.StencilPassOp = FrontFace.StencilPassOp;
  315. D.FrontFace.StencilFunc = FrontFace.StencilFunc;
  316. D.BackFace.StencilFailOp = BackFace.StencilFailOp;
  317. D.BackFace.StencilDepthFailOp = BackFace.StencilDepthFailOp;
  318. D.BackFace.StencilPassOp = BackFace.StencilPassOp;
  319. D.BackFace.StencilFunc = BackFace.StencilFunc;
  320. return D;
  321. }
  322. };
  323. //------------------------------------------------------------------------------------------------
  324. #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
  325. struct CD3DX12_DEPTH_STENCIL_DESC2 : public D3D12_DEPTH_STENCIL_DESC2
  326. {
  327. CD3DX12_DEPTH_STENCIL_DESC2() = default;
  328. explicit CD3DX12_DEPTH_STENCIL_DESC2( const D3D12_DEPTH_STENCIL_DESC2& o ) noexcept :
  329. D3D12_DEPTH_STENCIL_DESC2( o )
  330. {}
  331. explicit CD3DX12_DEPTH_STENCIL_DESC2( const D3D12_DEPTH_STENCIL_DESC1& o ) noexcept
  332. {
  333. DepthEnable = o.DepthEnable;
  334. DepthWriteMask = o.DepthWriteMask;
  335. DepthFunc = o.DepthFunc;
  336. StencilEnable = o.StencilEnable;
  337. FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
  338. FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
  339. FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
  340. FrontFace.StencilFunc = o.FrontFace.StencilFunc;
  341. FrontFace.StencilReadMask = o.StencilReadMask;
  342. FrontFace.StencilWriteMask = o.StencilWriteMask;
  343. BackFace.StencilFailOp = o.BackFace.StencilFailOp;
  344. BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
  345. BackFace.StencilPassOp = o.BackFace.StencilPassOp;
  346. BackFace.StencilFunc = o.BackFace.StencilFunc;
  347. BackFace.StencilReadMask = o.StencilReadMask;
  348. BackFace.StencilWriteMask = o.StencilWriteMask;
  349. DepthBoundsTestEnable = o.DepthBoundsTestEnable;
  350. }
  351. explicit CD3DX12_DEPTH_STENCIL_DESC2( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept
  352. {
  353. DepthEnable = o.DepthEnable;
  354. DepthWriteMask = o.DepthWriteMask;
  355. DepthFunc = o.DepthFunc;
  356. StencilEnable = o.StencilEnable;
  357. FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
  358. FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
  359. FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
  360. FrontFace.StencilFunc = o.FrontFace.StencilFunc;
  361. FrontFace.StencilReadMask = o.StencilReadMask;
  362. FrontFace.StencilWriteMask = o.StencilWriteMask;
  363. BackFace.StencilFailOp = o.BackFace.StencilFailOp;
  364. BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
  365. BackFace.StencilPassOp = o.BackFace.StencilPassOp;
  366. BackFace.StencilFunc = o.BackFace.StencilFunc;
  367. BackFace.StencilReadMask = o.StencilReadMask;
  368. BackFace.StencilWriteMask = o.StencilWriteMask;
  369. DepthBoundsTestEnable = FALSE;
  370. }
  371. explicit CD3DX12_DEPTH_STENCIL_DESC2( CD3DX12_DEFAULT ) noexcept
  372. {
  373. DepthEnable = TRUE;
  374. DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
  375. DepthFunc = D3D12_COMPARISON_FUNC_LESS;
  376. StencilEnable = FALSE;
  377. const D3D12_DEPTH_STENCILOP_DESC1 defaultStencilOp =
  378. { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS, D3D12_DEFAULT_STENCIL_READ_MASK, D3D12_DEFAULT_STENCIL_WRITE_MASK };
  379. FrontFace = defaultStencilOp;
  380. BackFace = defaultStencilOp;
  381. DepthBoundsTestEnable = FALSE;
  382. }
  383. explicit CD3DX12_DEPTH_STENCIL_DESC2(
  384. BOOL depthEnable,
  385. D3D12_DEPTH_WRITE_MASK depthWriteMask,
  386. D3D12_COMPARISON_FUNC depthFunc,
  387. BOOL stencilEnable,
  388. D3D12_STENCIL_OP frontStencilFailOp,
  389. D3D12_STENCIL_OP frontStencilDepthFailOp,
  390. D3D12_STENCIL_OP frontStencilPassOp,
  391. D3D12_COMPARISON_FUNC frontStencilFunc,
  392. UINT8 frontStencilReadMask,
  393. UINT8 frontStencilWriteMask,
  394. D3D12_STENCIL_OP backStencilFailOp,
  395. D3D12_STENCIL_OP backStencilDepthFailOp,
  396. D3D12_STENCIL_OP backStencilPassOp,
  397. D3D12_COMPARISON_FUNC backStencilFunc,
  398. UINT8 backStencilReadMask,
  399. UINT8 backStencilWriteMask,
  400. BOOL depthBoundsTestEnable ) noexcept
  401. {
  402. DepthEnable = depthEnable;
  403. DepthWriteMask = depthWriteMask;
  404. DepthFunc = depthFunc;
  405. StencilEnable = stencilEnable;
  406. FrontFace.StencilFailOp = frontStencilFailOp;
  407. FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
  408. FrontFace.StencilPassOp = frontStencilPassOp;
  409. FrontFace.StencilFunc = frontStencilFunc;
  410. FrontFace.StencilReadMask = frontStencilReadMask;
  411. FrontFace.StencilWriteMask = frontStencilWriteMask;
  412. BackFace.StencilFailOp = backStencilFailOp;
  413. BackFace.StencilDepthFailOp = backStencilDepthFailOp;
  414. BackFace.StencilPassOp = backStencilPassOp;
  415. BackFace.StencilFunc = backStencilFunc;
  416. BackFace.StencilReadMask = backStencilReadMask;
  417. BackFace.StencilWriteMask = backStencilWriteMask;
  418. DepthBoundsTestEnable = depthBoundsTestEnable;
  419. }
  420. operator D3D12_DEPTH_STENCIL_DESC() const noexcept
  421. {
  422. D3D12_DEPTH_STENCIL_DESC D;
  423. D.DepthEnable = DepthEnable;
  424. D.DepthWriteMask = DepthWriteMask;
  425. D.DepthFunc = DepthFunc;
  426. D.StencilEnable = StencilEnable;
  427. D.StencilReadMask = FrontFace.StencilReadMask;
  428. D.StencilWriteMask = FrontFace.StencilWriteMask;
  429. D.FrontFace.StencilFailOp = FrontFace.StencilFailOp;
  430. D.FrontFace.StencilDepthFailOp = FrontFace.StencilDepthFailOp;
  431. D.FrontFace.StencilPassOp = FrontFace.StencilPassOp;
  432. D.FrontFace.StencilFunc = FrontFace.StencilFunc;
  433. D.BackFace.StencilFailOp = BackFace.StencilFailOp;
  434. D.BackFace.StencilDepthFailOp = BackFace.StencilDepthFailOp;
  435. D.BackFace.StencilPassOp = BackFace.StencilPassOp;
  436. D.BackFace.StencilFunc = BackFace.StencilFunc;
  437. return D;
  438. }
  439. };
  440. #endif // D3D12_SDK_VERSION >= 606
  441. //------------------------------------------------------------------------------------------------
  442. struct CD3DX12_BLEND_DESC : public D3D12_BLEND_DESC
  443. {
  444. CD3DX12_BLEND_DESC() = default;
  445. explicit CD3DX12_BLEND_DESC( const D3D12_BLEND_DESC& o ) noexcept :
  446. D3D12_BLEND_DESC( o )
  447. {}
  448. explicit CD3DX12_BLEND_DESC( CD3DX12_DEFAULT ) noexcept
  449. {
  450. AlphaToCoverageEnable = FALSE;
  451. IndependentBlendEnable = FALSE;
  452. const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
  453. {
  454. FALSE,FALSE,
  455. D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
  456. D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
  457. D3D12_LOGIC_OP_NOOP,
  458. D3D12_COLOR_WRITE_ENABLE_ALL,
  459. };
  460. for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
  461. RenderTarget[ i ] = defaultRenderTargetBlendDesc;
  462. }
  463. };
  464. //------------------------------------------------------------------------------------------------
  465. struct CD3DX12_RASTERIZER_DESC : public D3D12_RASTERIZER_DESC
  466. {
  467. CD3DX12_RASTERIZER_DESC() = default;
  468. explicit CD3DX12_RASTERIZER_DESC( const D3D12_RASTERIZER_DESC& o ) noexcept :
  469. D3D12_RASTERIZER_DESC( o )
  470. {}
  471. explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT ) noexcept
  472. {
  473. FillMode = D3D12_FILL_MODE_SOLID;
  474. CullMode = D3D12_CULL_MODE_BACK;
  475. FrontCounterClockwise = FALSE;
  476. DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
  477. DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
  478. SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
  479. DepthClipEnable = TRUE;
  480. MultisampleEnable = FALSE;
  481. AntialiasedLineEnable = FALSE;
  482. ForcedSampleCount = 0;
  483. ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
  484. }
  485. explicit CD3DX12_RASTERIZER_DESC(
  486. D3D12_FILL_MODE fillMode,
  487. D3D12_CULL_MODE cullMode,
  488. BOOL frontCounterClockwise,
  489. INT depthBias,
  490. FLOAT depthBiasClamp,
  491. FLOAT slopeScaledDepthBias,
  492. BOOL depthClipEnable,
  493. BOOL multisampleEnable,
  494. BOOL antialiasedLineEnable,
  495. UINT forcedSampleCount,
  496. D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
  497. {
  498. FillMode = fillMode;
  499. CullMode = cullMode;
  500. FrontCounterClockwise = frontCounterClockwise;
  501. DepthBias = depthBias;
  502. DepthBiasClamp = depthBiasClamp;
  503. SlopeScaledDepthBias = slopeScaledDepthBias;
  504. DepthClipEnable = depthClipEnable;
  505. MultisampleEnable = multisampleEnable;
  506. AntialiasedLineEnable = antialiasedLineEnable;
  507. ForcedSampleCount = forcedSampleCount;
  508. ConservativeRaster = conservativeRaster;
  509. }
  510. };
  511. //------------------------------------------------------------------------------------------------
  512. #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
  513. struct CD3DX12_RASTERIZER_DESC1 : public D3D12_RASTERIZER_DESC1
  514. {
  515. CD3DX12_RASTERIZER_DESC1() = default;
  516. explicit CD3DX12_RASTERIZER_DESC1(const D3D12_RASTERIZER_DESC1& o) noexcept :
  517. D3D12_RASTERIZER_DESC1(o)
  518. {
  519. }
  520. explicit CD3DX12_RASTERIZER_DESC1(const D3D12_RASTERIZER_DESC& o) noexcept
  521. {
  522. FillMode = o.FillMode;
  523. CullMode = o.CullMode;
  524. FrontCounterClockwise = o.FrontCounterClockwise;
  525. DepthBias = static_cast<FLOAT>(o.DepthBias);
  526. DepthBiasClamp = o.DepthBiasClamp;
  527. SlopeScaledDepthBias = o.SlopeScaledDepthBias;
  528. DepthClipEnable = o.DepthClipEnable;
  529. MultisampleEnable = o.MultisampleEnable;
  530. AntialiasedLineEnable = o.AntialiasedLineEnable;
  531. ForcedSampleCount = o.ForcedSampleCount;
  532. ConservativeRaster = o.ConservativeRaster;
  533. }
  534. explicit CD3DX12_RASTERIZER_DESC1(CD3DX12_DEFAULT) noexcept
  535. {
  536. FillMode = D3D12_FILL_MODE_SOLID;
  537. CullMode = D3D12_CULL_MODE_BACK;
  538. FrontCounterClockwise = FALSE;
  539. DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
  540. DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
  541. SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
  542. DepthClipEnable = TRUE;
  543. MultisampleEnable = FALSE;
  544. AntialiasedLineEnable = FALSE;
  545. ForcedSampleCount = 0;
  546. ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
  547. }
  548. explicit CD3DX12_RASTERIZER_DESC1(
  549. D3D12_FILL_MODE fillMode,
  550. D3D12_CULL_MODE cullMode,
  551. BOOL frontCounterClockwise,
  552. FLOAT depthBias,
  553. FLOAT depthBiasClamp,
  554. FLOAT slopeScaledDepthBias,
  555. BOOL depthClipEnable,
  556. BOOL multisampleEnable,
  557. BOOL antialiasedLineEnable,
  558. UINT forcedSampleCount,
  559. D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
  560. {
  561. FillMode = fillMode;
  562. CullMode = cullMode;
  563. FrontCounterClockwise = frontCounterClockwise;
  564. DepthBias = depthBias;
  565. DepthBiasClamp = depthBiasClamp;
  566. SlopeScaledDepthBias = slopeScaledDepthBias;
  567. DepthClipEnable = depthClipEnable;
  568. MultisampleEnable = multisampleEnable;
  569. AntialiasedLineEnable = antialiasedLineEnable;
  570. ForcedSampleCount = forcedSampleCount;
  571. ConservativeRaster = conservativeRaster;
  572. }
  573. operator D3D12_RASTERIZER_DESC() const noexcept
  574. {
  575. D3D12_RASTERIZER_DESC o;
  576. o.FillMode = FillMode;
  577. o.CullMode = CullMode;
  578. o.FrontCounterClockwise = FrontCounterClockwise;
  579. o.DepthBias = static_cast<INT>(DepthBias);
  580. o.DepthBiasClamp = DepthBiasClamp;
  581. o.SlopeScaledDepthBias = SlopeScaledDepthBias;
  582. o.DepthClipEnable = DepthClipEnable;
  583. o.MultisampleEnable = MultisampleEnable;
  584. o.AntialiasedLineEnable = AntialiasedLineEnable;
  585. o.ForcedSampleCount = ForcedSampleCount;
  586. o.ConservativeRaster = ConservativeRaster;
  587. return o;
  588. }
  589. };
  590. #endif // D3D12_SDK_VERSION >= 608
  591. //------------------------------------------------------------------------------------------------
  592. #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
  593. struct CD3DX12_RASTERIZER_DESC2 : public D3D12_RASTERIZER_DESC2
  594. {
  595. CD3DX12_RASTERIZER_DESC2() = default;
  596. explicit CD3DX12_RASTERIZER_DESC2(const D3D12_RASTERIZER_DESC2& o) noexcept :
  597. D3D12_RASTERIZER_DESC2(o)
  598. {
  599. }
  600. explicit CD3DX12_RASTERIZER_DESC2(const D3D12_RASTERIZER_DESC1& o) noexcept
  601. {
  602. FillMode = o.FillMode;
  603. CullMode = o.CullMode;
  604. FrontCounterClockwise = o.FrontCounterClockwise;
  605. DepthBias = o.DepthBias;
  606. DepthBiasClamp = o.DepthBiasClamp;
  607. SlopeScaledDepthBias = o.SlopeScaledDepthBias;
  608. DepthClipEnable = o.DepthClipEnable;
  609. LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_ALIASED;
  610. if (o.MultisampleEnable)
  611. {
  612. LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_QUADRILATERAL_WIDE;
  613. }
  614. else if (o.AntialiasedLineEnable)
  615. {
  616. LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_ALPHA_ANTIALIASED;
  617. }
  618. ForcedSampleCount = o.ForcedSampleCount;
  619. ConservativeRaster = o.ConservativeRaster;
  620. }
  621. explicit CD3DX12_RASTERIZER_DESC2(const D3D12_RASTERIZER_DESC& o) noexcept
  622. : CD3DX12_RASTERIZER_DESC2(CD3DX12_RASTERIZER_DESC1(o))
  623. {
  624. }
  625. explicit CD3DX12_RASTERIZER_DESC2(CD3DX12_DEFAULT) noexcept
  626. {
  627. FillMode = D3D12_FILL_MODE_SOLID;
  628. CullMode = D3D12_CULL_MODE_BACK;
  629. FrontCounterClockwise = FALSE;
  630. DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
  631. DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
  632. SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
  633. DepthClipEnable = TRUE;
  634. LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_ALIASED;
  635. ForcedSampleCount = 0;
  636. ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
  637. }
  638. explicit CD3DX12_RASTERIZER_DESC2(
  639. D3D12_FILL_MODE fillMode,
  640. D3D12_CULL_MODE cullMode,
  641. BOOL frontCounterClockwise,
  642. FLOAT depthBias,
  643. FLOAT depthBiasClamp,
  644. FLOAT slopeScaledDepthBias,
  645. BOOL depthClipEnable,
  646. D3D12_LINE_RASTERIZATION_MODE lineRasterizationMode,
  647. UINT forcedSampleCount,
  648. D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
  649. {
  650. FillMode = fillMode;
  651. CullMode = cullMode;
  652. FrontCounterClockwise = frontCounterClockwise;
  653. DepthBias = depthBias;
  654. DepthBiasClamp = depthBiasClamp;
  655. SlopeScaledDepthBias = slopeScaledDepthBias;
  656. DepthClipEnable = depthClipEnable;
  657. LineRasterizationMode = lineRasterizationMode;
  658. ForcedSampleCount = forcedSampleCount;
  659. ConservativeRaster = conservativeRaster;
  660. }
  661. operator D3D12_RASTERIZER_DESC1() const noexcept
  662. {
  663. D3D12_RASTERIZER_DESC1 o;
  664. o.FillMode = FillMode;
  665. o.CullMode = CullMode;
  666. o.FrontCounterClockwise = FrontCounterClockwise;
  667. o.DepthBias = DepthBias;
  668. o.DepthBiasClamp = DepthBiasClamp;
  669. o.SlopeScaledDepthBias = SlopeScaledDepthBias;
  670. o.DepthClipEnable = DepthClipEnable;
  671. o.MultisampleEnable = FALSE;
  672. o.AntialiasedLineEnable = FALSE;
  673. if (LineRasterizationMode == D3D12_LINE_RASTERIZATION_MODE_ALPHA_ANTIALIASED)
  674. {
  675. o.AntialiasedLineEnable = TRUE;
  676. }
  677. else if (LineRasterizationMode != D3D12_LINE_RASTERIZATION_MODE_ALIASED)
  678. {
  679. o.MultisampleEnable = TRUE;
  680. }
  681. o.ForcedSampleCount = ForcedSampleCount;
  682. o.ConservativeRaster = ConservativeRaster;
  683. return o;
  684. }
  685. operator D3D12_RASTERIZER_DESC() const noexcept
  686. {
  687. return (D3D12_RASTERIZER_DESC)CD3DX12_RASTERIZER_DESC1((D3D12_RASTERIZER_DESC1)*this);
  688. }
  689. };
  690. #endif // D3D12_SDK_VERSION >= 610
  691. //------------------------------------------------------------------------------------------------
  692. struct CD3DX12_RESOURCE_ALLOCATION_INFO : public D3D12_RESOURCE_ALLOCATION_INFO
  693. {
  694. CD3DX12_RESOURCE_ALLOCATION_INFO() = default;
  695. explicit CD3DX12_RESOURCE_ALLOCATION_INFO( const D3D12_RESOURCE_ALLOCATION_INFO& o ) noexcept :
  696. D3D12_RESOURCE_ALLOCATION_INFO( o )
  697. {}
  698. CD3DX12_RESOURCE_ALLOCATION_INFO(
  699. UINT64 size,
  700. UINT64 alignment ) noexcept
  701. {
  702. SizeInBytes = size;
  703. Alignment = alignment;
  704. }
  705. };
  706. //------------------------------------------------------------------------------------------------
  707. struct CD3DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES
  708. {
  709. CD3DX12_HEAP_PROPERTIES() = default;
  710. explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES &o) noexcept :
  711. D3D12_HEAP_PROPERTIES(o)
  712. {}
  713. CD3DX12_HEAP_PROPERTIES(
  714. D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
  715. D3D12_MEMORY_POOL memoryPoolPreference,
  716. UINT creationNodeMask = 1,
  717. UINT nodeMask = 1 ) noexcept
  718. {
  719. Type = D3D12_HEAP_TYPE_CUSTOM;
  720. CPUPageProperty = cpuPageProperty;
  721. MemoryPoolPreference = memoryPoolPreference;
  722. CreationNodeMask = creationNodeMask;
  723. VisibleNodeMask = nodeMask;
  724. }
  725. explicit CD3DX12_HEAP_PROPERTIES(
  726. D3D12_HEAP_TYPE type,
  727. UINT creationNodeMask = 1,
  728. UINT nodeMask = 1 ) noexcept
  729. {
  730. Type = type;
  731. CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
  732. MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
  733. CreationNodeMask = creationNodeMask;
  734. VisibleNodeMask = nodeMask;
  735. }
  736. bool IsCPUAccessible() const noexcept
  737. {
  738. return Type == D3D12_HEAP_TYPE_UPLOAD || Type == D3D12_HEAP_TYPE_READBACK
  739. #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
  740. || Type == D3D12_HEAP_TYPE_GPU_UPLOAD
  741. #endif
  742. || (Type == D3D12_HEAP_TYPE_CUSTOM &&
  743. (CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE || CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_BACK));
  744. }
  745. };
  746. inline bool operator==( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r ) noexcept
  747. {
  748. return l.Type == r.Type && l.CPUPageProperty == r.CPUPageProperty &&
  749. l.MemoryPoolPreference == r.MemoryPoolPreference &&
  750. l.CreationNodeMask == r.CreationNodeMask &&
  751. l.VisibleNodeMask == r.VisibleNodeMask;
  752. }
  753. inline bool operator!=( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r ) noexcept
  754. { return !( l == r ); }
  755. //------------------------------------------------------------------------------------------------
  756. struct CD3DX12_HEAP_DESC : public D3D12_HEAP_DESC
  757. {
  758. CD3DX12_HEAP_DESC() = default;
  759. explicit CD3DX12_HEAP_DESC(const D3D12_HEAP_DESC &o) noexcept :
  760. D3D12_HEAP_DESC(o)
  761. {}
  762. CD3DX12_HEAP_DESC(
  763. UINT64 size,
  764. D3D12_HEAP_PROPERTIES properties,
  765. UINT64 alignment = 0,
  766. D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
  767. {
  768. SizeInBytes = size;
  769. Properties = properties;
  770. Alignment = alignment;
  771. Flags = flags;
  772. }
  773. CD3DX12_HEAP_DESC(
  774. UINT64 size,
  775. D3D12_HEAP_TYPE type,
  776. UINT64 alignment = 0,
  777. D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
  778. {
  779. SizeInBytes = size;
  780. Properties = CD3DX12_HEAP_PROPERTIES( type );
  781. Alignment = alignment;
  782. Flags = flags;
  783. }
  784. CD3DX12_HEAP_DESC(
  785. UINT64 size,
  786. D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
  787. D3D12_MEMORY_POOL memoryPoolPreference,
  788. UINT64 alignment = 0,
  789. D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
  790. {
  791. SizeInBytes = size;
  792. Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
  793. Alignment = alignment;
  794. Flags = flags;
  795. }
  796. CD3DX12_HEAP_DESC(
  797. const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
  798. D3D12_HEAP_PROPERTIES properties,
  799. D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
  800. {
  801. SizeInBytes = resAllocInfo.SizeInBytes;
  802. Properties = properties;
  803. Alignment = resAllocInfo.Alignment;
  804. Flags = flags;
  805. }
  806. CD3DX12_HEAP_DESC(
  807. const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
  808. D3D12_HEAP_TYPE type,
  809. D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
  810. {
  811. SizeInBytes = resAllocInfo.SizeInBytes;
  812. Properties = CD3DX12_HEAP_PROPERTIES( type );
  813. Alignment = resAllocInfo.Alignment;
  814. Flags = flags;
  815. }
  816. CD3DX12_HEAP_DESC(
  817. const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
  818. D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
  819. D3D12_MEMORY_POOL memoryPoolPreference,
  820. D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
  821. {
  822. SizeInBytes = resAllocInfo.SizeInBytes;
  823. Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
  824. Alignment = resAllocInfo.Alignment;
  825. Flags = flags;
  826. }
  827. bool IsCPUAccessible() const noexcept
  828. { return static_cast< const CD3DX12_HEAP_PROPERTIES* >( &Properties )->IsCPUAccessible(); }
  829. };
  830. inline bool operator==( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r ) noexcept
  831. {
  832. return l.SizeInBytes == r.SizeInBytes &&
  833. l.Properties == r.Properties &&
  834. l.Alignment == r.Alignment &&
  835. l.Flags == r.Flags;
  836. }
  837. inline bool operator!=( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r ) noexcept
  838. { return !( l == r ); }
  839. //------------------------------------------------------------------------------------------------
  840. struct CD3DX12_CLEAR_VALUE : public D3D12_CLEAR_VALUE
  841. {
  842. CD3DX12_CLEAR_VALUE() = default;
  843. explicit CD3DX12_CLEAR_VALUE(const D3D12_CLEAR_VALUE &o) noexcept :
  844. D3D12_CLEAR_VALUE(o)
  845. {}
  846. CD3DX12_CLEAR_VALUE(
  847. DXGI_FORMAT format,
  848. const FLOAT color[4] ) noexcept
  849. {
  850. Format = format;
  851. memcpy( Color, color, sizeof( Color ) );
  852. }
  853. CD3DX12_CLEAR_VALUE(
  854. DXGI_FORMAT format,
  855. FLOAT depth,
  856. UINT8 stencil ) noexcept
  857. {
  858. Format = format;
  859. memset( &Color, 0, sizeof( Color ) );
  860. /* Use memcpy to preserve NAN values */
  861. memcpy( &DepthStencil.Depth, &depth, sizeof( depth ) );
  862. DepthStencil.Stencil = stencil;
  863. }
  864. };
  865. //------------------------------------------------------------------------------------------------
  866. inline bool operator==( const D3D12_CLEAR_VALUE &a, const D3D12_CLEAR_VALUE &b) noexcept
  867. {
  868. if (a.Format != b.Format) return false;
  869. if (a.Format == DXGI_FORMAT_D24_UNORM_S8_UINT
  870. || a.Format == DXGI_FORMAT_D16_UNORM
  871. || a.Format == DXGI_FORMAT_D32_FLOAT
  872. || a.Format == DXGI_FORMAT_D32_FLOAT_S8X24_UINT)
  873. {
  874. return (a.DepthStencil.Depth == b.DepthStencil.Depth) &&
  875. (a.DepthStencil.Stencil == b.DepthStencil.Stencil);
  876. } else {
  877. return (a.Color[0] == b.Color[0]) &&
  878. (a.Color[1] == b.Color[1]) &&
  879. (a.Color[2] == b.Color[2]) &&
  880. (a.Color[3] == b.Color[3]);
  881. }
  882. }
  883. //------------------------------------------------------------------------------------------------
  884. struct CD3DX12_RANGE : public D3D12_RANGE
  885. {
  886. CD3DX12_RANGE() = default;
  887. explicit CD3DX12_RANGE(const D3D12_RANGE &o) noexcept :
  888. D3D12_RANGE(o)
  889. {}
  890. CD3DX12_RANGE(
  891. SIZE_T begin,
  892. SIZE_T end ) noexcept
  893. {
  894. Begin = begin;
  895. End = end;
  896. }
  897. };
  898. //------------------------------------------------------------------------------------------------
  899. struct CD3DX12_RANGE_UINT64 : public D3D12_RANGE_UINT64
  900. {
  901. CD3DX12_RANGE_UINT64() = default;
  902. explicit CD3DX12_RANGE_UINT64(const D3D12_RANGE_UINT64 &o) noexcept :
  903. D3D12_RANGE_UINT64(o)
  904. {}
  905. CD3DX12_RANGE_UINT64(
  906. UINT64 begin,
  907. UINT64 end ) noexcept
  908. {
  909. Begin = begin;
  910. End = end;
  911. }
  912. };
  913. //------------------------------------------------------------------------------------------------
  914. struct CD3DX12_SUBRESOURCE_RANGE_UINT64 : public D3D12_SUBRESOURCE_RANGE_UINT64
  915. {
  916. CD3DX12_SUBRESOURCE_RANGE_UINT64() = default;
  917. explicit CD3DX12_SUBRESOURCE_RANGE_UINT64(const D3D12_SUBRESOURCE_RANGE_UINT64 &o) noexcept :
  918. D3D12_SUBRESOURCE_RANGE_UINT64(o)
  919. {}
  920. CD3DX12_SUBRESOURCE_RANGE_UINT64(
  921. UINT subresource,
  922. const D3D12_RANGE_UINT64& range ) noexcept
  923. {
  924. Subresource = subresource;
  925. Range = range;
  926. }
  927. CD3DX12_SUBRESOURCE_RANGE_UINT64(
  928. UINT subresource,
  929. UINT64 begin,
  930. UINT64 end ) noexcept
  931. {
  932. Subresource = subresource;
  933. Range.Begin = begin;
  934. Range.End = end;
  935. }
  936. };
  937. //------------------------------------------------------------------------------------------------
  938. struct CD3DX12_SHADER_BYTECODE : public D3D12_SHADER_BYTECODE
  939. {
  940. CD3DX12_SHADER_BYTECODE() = default;
  941. explicit CD3DX12_SHADER_BYTECODE(const D3D12_SHADER_BYTECODE &o) noexcept :
  942. D3D12_SHADER_BYTECODE(o)
  943. {}
  944. CD3DX12_SHADER_BYTECODE(
  945. _In_ ID3DBlob* pShaderBlob ) noexcept
  946. {
  947. pShaderBytecode = pShaderBlob->GetBufferPointer();
  948. BytecodeLength = pShaderBlob->GetBufferSize();
  949. }
  950. CD3DX12_SHADER_BYTECODE(
  951. const void* _pShaderBytecode,
  952. SIZE_T bytecodeLength ) noexcept
  953. {
  954. pShaderBytecode = _pShaderBytecode;
  955. BytecodeLength = bytecodeLength;
  956. }
  957. };
  958. //------------------------------------------------------------------------------------------------
  959. struct CD3DX12_TILED_RESOURCE_COORDINATE : public D3D12_TILED_RESOURCE_COORDINATE
  960. {
  961. CD3DX12_TILED_RESOURCE_COORDINATE() = default;
  962. explicit CD3DX12_TILED_RESOURCE_COORDINATE(const D3D12_TILED_RESOURCE_COORDINATE &o) noexcept :
  963. D3D12_TILED_RESOURCE_COORDINATE(o)
  964. {}
  965. CD3DX12_TILED_RESOURCE_COORDINATE(
  966. UINT x,
  967. UINT y,
  968. UINT z,
  969. UINT subresource ) noexcept
  970. {
  971. X = x;
  972. Y = y;
  973. Z = z;
  974. Subresource = subresource;
  975. }
  976. };
  977. //------------------------------------------------------------------------------------------------
  978. struct CD3DX12_TILE_REGION_SIZE : public D3D12_TILE_REGION_SIZE
  979. {
  980. CD3DX12_TILE_REGION_SIZE() = default;
  981. explicit CD3DX12_TILE_REGION_SIZE(const D3D12_TILE_REGION_SIZE &o) noexcept :
  982. D3D12_TILE_REGION_SIZE(o)
  983. {}
  984. CD3DX12_TILE_REGION_SIZE(
  985. UINT numTiles,
  986. BOOL useBox,
  987. UINT width,
  988. UINT16 height,
  989. UINT16 depth ) noexcept
  990. {
  991. NumTiles = numTiles;
  992. UseBox = useBox;
  993. Width = width;
  994. Height = height;
  995. Depth = depth;
  996. }
  997. };
  998. //------------------------------------------------------------------------------------------------
  999. struct CD3DX12_SUBRESOURCE_TILING : public D3D12_SUBRESOURCE_TILING
  1000. {
  1001. CD3DX12_SUBRESOURCE_TILING() = default;
  1002. explicit CD3DX12_SUBRESOURCE_TILING(const D3D12_SUBRESOURCE_TILING &o) noexcept :
  1003. D3D12_SUBRESOURCE_TILING(o)
  1004. {}
  1005. CD3DX12_SUBRESOURCE_TILING(
  1006. UINT widthInTiles,
  1007. UINT16 heightInTiles,
  1008. UINT16 depthInTiles,
  1009. UINT startTileIndexInOverallResource ) noexcept
  1010. {
  1011. WidthInTiles = widthInTiles;
  1012. HeightInTiles = heightInTiles;
  1013. DepthInTiles = depthInTiles;
  1014. StartTileIndexInOverallResource = startTileIndexInOverallResource;
  1015. }
  1016. };
  1017. //------------------------------------------------------------------------------------------------
  1018. struct CD3DX12_TILE_SHAPE : public D3D12_TILE_SHAPE
  1019. {
  1020. CD3DX12_TILE_SHAPE() = default;
  1021. explicit CD3DX12_TILE_SHAPE(const D3D12_TILE_SHAPE &o) noexcept :
  1022. D3D12_TILE_SHAPE(o)
  1023. {}
  1024. CD3DX12_TILE_SHAPE(
  1025. UINT widthInTexels,
  1026. UINT heightInTexels,
  1027. UINT depthInTexels ) noexcept
  1028. {
  1029. WidthInTexels = widthInTexels;
  1030. HeightInTexels = heightInTexels;
  1031. DepthInTexels = depthInTexels;
  1032. }
  1033. };
  1034. //------------------------------------------------------------------------------------------------
  1035. struct CD3DX12_PACKED_MIP_INFO : public D3D12_PACKED_MIP_INFO
  1036. {
  1037. CD3DX12_PACKED_MIP_INFO() = default;
  1038. explicit CD3DX12_PACKED_MIP_INFO(const D3D12_PACKED_MIP_INFO &o) noexcept :
  1039. D3D12_PACKED_MIP_INFO(o)
  1040. {}
  1041. CD3DX12_PACKED_MIP_INFO(
  1042. UINT8 numStandardMips,
  1043. UINT8 numPackedMips,
  1044. UINT numTilesForPackedMips,
  1045. UINT startTileIndexInOverallResource ) noexcept
  1046. {
  1047. NumStandardMips = numStandardMips;
  1048. NumPackedMips = numPackedMips;
  1049. NumTilesForPackedMips = numTilesForPackedMips;
  1050. StartTileIndexInOverallResource = startTileIndexInOverallResource;
  1051. }
  1052. };
  1053. //------------------------------------------------------------------------------------------------
  1054. struct CD3DX12_SUBRESOURCE_FOOTPRINT : public D3D12_SUBRESOURCE_FOOTPRINT
  1055. {
  1056. CD3DX12_SUBRESOURCE_FOOTPRINT() = default;
  1057. explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_SUBRESOURCE_FOOTPRINT &o) noexcept :
  1058. D3D12_SUBRESOURCE_FOOTPRINT(o)
  1059. {}
  1060. CD3DX12_SUBRESOURCE_FOOTPRINT(
  1061. DXGI_FORMAT format,
  1062. UINT width,
  1063. UINT height,
  1064. UINT depth,
  1065. UINT rowPitch ) noexcept
  1066. {
  1067. Format = format;
  1068. Width = width;
  1069. Height = height;
  1070. Depth = depth;
  1071. RowPitch = rowPitch;
  1072. }
  1073. explicit CD3DX12_SUBRESOURCE_FOOTPRINT(
  1074. const D3D12_RESOURCE_DESC& resDesc,
  1075. UINT rowPitch ) noexcept
  1076. {
  1077. Format = resDesc.Format;
  1078. Width = UINT( resDesc.Width );
  1079. Height = resDesc.Height;
  1080. Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1u);
  1081. RowPitch = rowPitch;
  1082. }
  1083. };
  1084. //------------------------------------------------------------------------------------------------
  1085. struct CD3DX12_TEXTURE_COPY_LOCATION : public D3D12_TEXTURE_COPY_LOCATION
  1086. {
  1087. CD3DX12_TEXTURE_COPY_LOCATION() = default;
  1088. explicit CD3DX12_TEXTURE_COPY_LOCATION(const D3D12_TEXTURE_COPY_LOCATION &o) noexcept :
  1089. D3D12_TEXTURE_COPY_LOCATION(o)
  1090. {}
  1091. CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes) noexcept
  1092. {
  1093. pResource = pRes;
  1094. Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
  1095. PlacedFootprint = {};
  1096. }
  1097. CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes, D3D12_PLACED_SUBRESOURCE_FOOTPRINT const& Footprint) noexcept
  1098. {
  1099. pResource = pRes;
  1100. Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
  1101. PlacedFootprint = Footprint;
  1102. }
  1103. CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes, UINT Sub) noexcept
  1104. {
  1105. pResource = pRes;
  1106. Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
  1107. PlacedFootprint = {};
  1108. SubresourceIndex = Sub;
  1109. }
  1110. };
  1111. //------------------------------------------------------------------------------------------------
  1112. constexpr UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize ) noexcept
  1113. {
  1114. return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize;
  1115. }
  1116. //------------------------------------------------------------------------------------------------
  1117. inline UINT8 D3D12GetFormatPlaneCount(
  1118. _In_ ID3D12Device* pDevice,
  1119. DXGI_FORMAT Format
  1120. ) noexcept
  1121. {
  1122. D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = { Format, 0 };
  1123. if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo))))
  1124. {
  1125. return 0;
  1126. }
  1127. return formatInfo.PlaneCount;
  1128. }
  1129. //------------------------------------------------------------------------------------------------
  1130. struct CD3DX12_RESOURCE_DESC : public D3D12_RESOURCE_DESC
  1131. {
  1132. CD3DX12_RESOURCE_DESC() = default;
  1133. explicit CD3DX12_RESOURCE_DESC( const D3D12_RESOURCE_DESC& o ) noexcept :
  1134. D3D12_RESOURCE_DESC( o )
  1135. {}
  1136. CD3DX12_RESOURCE_DESC(
  1137. D3D12_RESOURCE_DIMENSION dimension,
  1138. UINT64 alignment,
  1139. UINT64 width,
  1140. UINT height,
  1141. UINT16 depthOrArraySize,
  1142. UINT16 mipLevels,
  1143. DXGI_FORMAT format,
  1144. UINT sampleCount,
  1145. UINT sampleQuality,
  1146. D3D12_TEXTURE_LAYOUT layout,
  1147. D3D12_RESOURCE_FLAGS flags ) noexcept
  1148. {
  1149. Dimension = dimension;
  1150. Alignment = alignment;
  1151. Width = width;
  1152. Height = height;
  1153. DepthOrArraySize = depthOrArraySize;
  1154. MipLevels = mipLevels;
  1155. Format = format;
  1156. SampleDesc.Count = sampleCount;
  1157. SampleDesc.Quality = sampleQuality;
  1158. Layout = layout;
  1159. Flags = flags;
  1160. }
  1161. static inline CD3DX12_RESOURCE_DESC Buffer(
  1162. const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
  1163. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE ) noexcept
  1164. {
  1165. return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes,
  1166. 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags );
  1167. }
  1168. static inline CD3DX12_RESOURCE_DESC Buffer(
  1169. UINT64 width,
  1170. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1171. UINT64 alignment = 0 ) noexcept
  1172. {
  1173. return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1,
  1174. DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags );
  1175. }
  1176. static inline CD3DX12_RESOURCE_DESC Tex1D(
  1177. DXGI_FORMAT format,
  1178. UINT64 width,
  1179. UINT16 arraySize = 1,
  1180. UINT16 mipLevels = 0,
  1181. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1182. D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
  1183. UINT64 alignment = 0 ) noexcept
  1184. {
  1185. return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize,
  1186. mipLevels, format, 1, 0, layout, flags );
  1187. }
  1188. static inline CD3DX12_RESOURCE_DESC Tex2D(
  1189. DXGI_FORMAT format,
  1190. UINT64 width,
  1191. UINT height,
  1192. UINT16 arraySize = 1,
  1193. UINT16 mipLevels = 0,
  1194. UINT sampleCount = 1,
  1195. UINT sampleQuality = 0,
  1196. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1197. D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
  1198. UINT64 alignment = 0 ) noexcept
  1199. {
  1200. return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize,
  1201. mipLevels, format, sampleCount, sampleQuality, layout, flags );
  1202. }
  1203. static inline CD3DX12_RESOURCE_DESC Tex3D(
  1204. DXGI_FORMAT format,
  1205. UINT64 width,
  1206. UINT height,
  1207. UINT16 depth,
  1208. UINT16 mipLevels = 0,
  1209. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1210. D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
  1211. UINT64 alignment = 0 ) noexcept
  1212. {
  1213. return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
  1214. mipLevels, format, 1, 0, layout, flags );
  1215. }
  1216. inline UINT16 Depth() const noexcept
  1217. { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
  1218. inline UINT16 ArraySize() const noexcept
  1219. { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
  1220. inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const noexcept
  1221. { return D3D12GetFormatPlaneCount(pDevice, Format); }
  1222. inline UINT Subresources(_In_ ID3D12Device* pDevice) const noexcept
  1223. { return static_cast<UINT>(MipLevels) * ArraySize() * PlaneCount(pDevice); }
  1224. inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept
  1225. { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); }
  1226. };
  1227. inline bool operator==( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept
  1228. {
  1229. return l.Dimension == r.Dimension &&
  1230. l.Alignment == r.Alignment &&
  1231. l.Width == r.Width &&
  1232. l.Height == r.Height &&
  1233. l.DepthOrArraySize == r.DepthOrArraySize &&
  1234. l.MipLevels == r.MipLevels &&
  1235. l.Format == r.Format &&
  1236. l.SampleDesc.Count == r.SampleDesc.Count &&
  1237. l.SampleDesc.Quality == r.SampleDesc.Quality &&
  1238. l.Layout == r.Layout &&
  1239. l.Flags == r.Flags;
  1240. }
  1241. inline bool operator!=( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept
  1242. { return !( l == r ); }
  1243. //------------------------------------------------------------------------------------------------
  1244. struct CD3DX12_RESOURCE_DESC1 : public D3D12_RESOURCE_DESC1
  1245. {
  1246. CD3DX12_RESOURCE_DESC1() = default;
  1247. explicit CD3DX12_RESOURCE_DESC1( const D3D12_RESOURCE_DESC1& o ) noexcept :
  1248. D3D12_RESOURCE_DESC1( o )
  1249. {}
  1250. explicit CD3DX12_RESOURCE_DESC1( const D3D12_RESOURCE_DESC& o ) noexcept
  1251. {
  1252. Dimension = o.Dimension;
  1253. Alignment = o.Alignment;
  1254. Width = o.Width;
  1255. Height = o.Height;
  1256. DepthOrArraySize = o.DepthOrArraySize;
  1257. MipLevels = o.MipLevels;
  1258. Format = o.Format;
  1259. SampleDesc = o.SampleDesc;
  1260. Layout = o.Layout;
  1261. Flags = o.Flags;
  1262. SamplerFeedbackMipRegion = {};
  1263. }
  1264. CD3DX12_RESOURCE_DESC1(
  1265. D3D12_RESOURCE_DIMENSION dimension,
  1266. UINT64 alignment,
  1267. UINT64 width,
  1268. UINT height,
  1269. UINT16 depthOrArraySize,
  1270. UINT16 mipLevels,
  1271. DXGI_FORMAT format,
  1272. UINT sampleCount,
  1273. UINT sampleQuality,
  1274. D3D12_TEXTURE_LAYOUT layout,
  1275. D3D12_RESOURCE_FLAGS flags,
  1276. UINT samplerFeedbackMipRegionWidth = 0,
  1277. UINT samplerFeedbackMipRegionHeight = 0,
  1278. UINT samplerFeedbackMipRegionDepth = 0) noexcept
  1279. {
  1280. Dimension = dimension;
  1281. Alignment = alignment;
  1282. Width = width;
  1283. Height = height;
  1284. DepthOrArraySize = depthOrArraySize;
  1285. MipLevels = mipLevels;
  1286. Format = format;
  1287. SampleDesc.Count = sampleCount;
  1288. SampleDesc.Quality = sampleQuality;
  1289. Layout = layout;
  1290. Flags = flags;
  1291. SamplerFeedbackMipRegion.Width = samplerFeedbackMipRegionWidth;
  1292. SamplerFeedbackMipRegion.Height = samplerFeedbackMipRegionHeight;
  1293. SamplerFeedbackMipRegion.Depth = samplerFeedbackMipRegionDepth;
  1294. }
  1295. static inline CD3DX12_RESOURCE_DESC1 Buffer(
  1296. const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
  1297. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE ) noexcept
  1298. {
  1299. return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes,
  1300. 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags, 0, 0, 0 );
  1301. }
  1302. static inline CD3DX12_RESOURCE_DESC1 Buffer(
  1303. UINT64 width,
  1304. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1305. UINT64 alignment = 0 ) noexcept
  1306. {
  1307. return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1,
  1308. DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags, 0, 0, 0 );
  1309. }
  1310. static inline CD3DX12_RESOURCE_DESC1 Tex1D(
  1311. DXGI_FORMAT format,
  1312. UINT64 width,
  1313. UINT16 arraySize = 1,
  1314. UINT16 mipLevels = 0,
  1315. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1316. D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
  1317. UINT64 alignment = 0 ) noexcept
  1318. {
  1319. return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize,
  1320. mipLevels, format, 1, 0, layout, flags, 0, 0, 0 );
  1321. }
  1322. static inline CD3DX12_RESOURCE_DESC1 Tex2D(
  1323. DXGI_FORMAT format,
  1324. UINT64 width,
  1325. UINT height,
  1326. UINT16 arraySize = 1,
  1327. UINT16 mipLevels = 0,
  1328. UINT sampleCount = 1,
  1329. UINT sampleQuality = 0,
  1330. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1331. D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
  1332. UINT64 alignment = 0,
  1333. UINT samplerFeedbackMipRegionWidth = 0,
  1334. UINT samplerFeedbackMipRegionHeight = 0,
  1335. UINT samplerFeedbackMipRegionDepth = 0) noexcept
  1336. {
  1337. return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize,
  1338. mipLevels, format, sampleCount, sampleQuality, layout, flags, samplerFeedbackMipRegionWidth,
  1339. samplerFeedbackMipRegionHeight, samplerFeedbackMipRegionDepth );
  1340. }
  1341. static inline CD3DX12_RESOURCE_DESC1 Tex3D(
  1342. DXGI_FORMAT format,
  1343. UINT64 width,
  1344. UINT height,
  1345. UINT16 depth,
  1346. UINT16 mipLevels = 0,
  1347. D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
  1348. D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
  1349. UINT64 alignment = 0 ) noexcept
  1350. {
  1351. return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
  1352. mipLevels, format, 1, 0, layout, flags, 0, 0, 0 );
  1353. }
  1354. inline UINT16 Depth() const noexcept
  1355. { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
  1356. inline UINT16 ArraySize() const noexcept
  1357. { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
  1358. inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const noexcept
  1359. { return D3D12GetFormatPlaneCount(pDevice, Format); }
  1360. inline UINT Subresources(_In_ ID3D12Device* pDevice) const noexcept
  1361. { return static_cast<UINT>(MipLevels) * ArraySize() * PlaneCount(pDevice); }
  1362. inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept
  1363. { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); }
  1364. };
  1365. inline bool operator==( const D3D12_RESOURCE_DESC1& l, const D3D12_RESOURCE_DESC1& r ) noexcept
  1366. {
  1367. return l.Dimension == r.Dimension &&
  1368. l.Alignment == r.Alignment &&
  1369. l.Width == r.Width &&
  1370. l.Height == r.Height &&
  1371. l.DepthOrArraySize == r.DepthOrArraySize &&
  1372. l.MipLevels == r.MipLevels &&
  1373. l.Format == r.Format &&
  1374. l.SampleDesc.Count == r.SampleDesc.Count &&
  1375. l.SampleDesc.Quality == r.SampleDesc.Quality &&
  1376. l.Layout == r.Layout &&
  1377. l.Flags == r.Flags &&
  1378. l.SamplerFeedbackMipRegion.Width == r.SamplerFeedbackMipRegion.Width &&
  1379. l.SamplerFeedbackMipRegion.Height == r.SamplerFeedbackMipRegion.Height &&
  1380. l.SamplerFeedbackMipRegion.Depth == r.SamplerFeedbackMipRegion.Depth;
  1381. }
  1382. inline bool operator!=( const D3D12_RESOURCE_DESC1& l, const D3D12_RESOURCE_DESC1& r ) noexcept
  1383. { return !( l == r ); }
  1384. //------------------------------------------------------------------------------------------------
  1385. // Fills in the mipmap and alignment values of pDesc when either members are zero
  1386. // Used to replace an implicit field to an explicit (0 mip map = max mip map level)
  1387. // If expansion has occured, returns LclDesc, else returns the original pDesc
  1388. inline const CD3DX12_RESOURCE_DESC1* D3DX12ConditionallyExpandAPIDesc(
  1389. CD3DX12_RESOURCE_DESC1& LclDesc,
  1390. const CD3DX12_RESOURCE_DESC1* pDesc)
  1391. {
  1392. // Expand mip levels:
  1393. if (pDesc->MipLevels == 0 || pDesc->Alignment == 0)
  1394. {
  1395. LclDesc = *pDesc;
  1396. if (pDesc->MipLevels == 0)
  1397. {
  1398. auto MaxMipLevels = [](UINT64 uiMaxDimension) -> UINT16
  1399. {
  1400. UINT16 uiRet = 0;
  1401. while (uiMaxDimension > 0)
  1402. {
  1403. uiRet++;
  1404. uiMaxDimension >>= 1;
  1405. }
  1406. return uiRet;
  1407. };
  1408. auto Max = [](UINT64 const & a, UINT64 const & b)
  1409. {
  1410. return (a < b) ? b : a;
  1411. };
  1412. LclDesc.MipLevels = MaxMipLevels(
  1413. Max(LclDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? LclDesc.DepthOrArraySize : 1,
  1414. Max(LclDesc.Width, LclDesc.Height)));
  1415. }
  1416. if (pDesc->Alignment == 0)
  1417. {
  1418. if (pDesc->Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE
  1419. || pDesc->Layout == D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE
  1420. )
  1421. {
  1422. LclDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
  1423. }
  1424. else
  1425. {
  1426. LclDesc.Alignment =
  1427. (pDesc->SampleDesc.Count > 1 ? D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT : D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT);
  1428. }
  1429. }
  1430. return &LclDesc;
  1431. }
  1432. else
  1433. {
  1434. return pDesc;
  1435. }
  1436. }
  1437. //------------------------------------------------------------------------------------------------
  1438. struct CD3DX12_VIEW_INSTANCING_DESC : public D3D12_VIEW_INSTANCING_DESC
  1439. {
  1440. CD3DX12_VIEW_INSTANCING_DESC() = default;
  1441. explicit CD3DX12_VIEW_INSTANCING_DESC( const D3D12_VIEW_INSTANCING_DESC& o ) noexcept :
  1442. D3D12_VIEW_INSTANCING_DESC( o )
  1443. {}
  1444. explicit CD3DX12_VIEW_INSTANCING_DESC( CD3DX12_DEFAULT ) noexcept
  1445. {
  1446. ViewInstanceCount = 0;
  1447. pViewInstanceLocations = nullptr;
  1448. Flags = D3D12_VIEW_INSTANCING_FLAG_NONE;
  1449. }
  1450. explicit CD3DX12_VIEW_INSTANCING_DESC(
  1451. UINT InViewInstanceCount,
  1452. const D3D12_VIEW_INSTANCE_LOCATION* InViewInstanceLocations,
  1453. D3D12_VIEW_INSTANCING_FLAGS InFlags) noexcept
  1454. {
  1455. ViewInstanceCount = InViewInstanceCount;
  1456. pViewInstanceLocations = InViewInstanceLocations;
  1457. Flags = InFlags;
  1458. }
  1459. };
  1460. //------------------------------------------------------------------------------------------------
  1461. struct CD3DX12_RT_FORMAT_ARRAY : public D3D12_RT_FORMAT_ARRAY
  1462. {
  1463. CD3DX12_RT_FORMAT_ARRAY() = default;
  1464. explicit CD3DX12_RT_FORMAT_ARRAY(const D3D12_RT_FORMAT_ARRAY& o) noexcept
  1465. : D3D12_RT_FORMAT_ARRAY(o)
  1466. {}
  1467. explicit CD3DX12_RT_FORMAT_ARRAY(_In_reads_(NumFormats) const DXGI_FORMAT* pFormats, UINT NumFormats) noexcept
  1468. {
  1469. NumRenderTargets = NumFormats;
  1470. memcpy(RTFormats, pFormats, sizeof(RTFormats));
  1471. // assumes ARRAY_SIZE(pFormats) == ARRAY_SIZE(RTFormats)
  1472. }
  1473. };