home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Common / d3dx12.h < prev    next >
Encoding:
C/C++ Source or Header  |  2016-03-02  |  56.5 KB  |  1,509 lines

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