/*** Autogenerated by WIDL 6.0-rc1 from include/d3d12.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __d3d12_h__
#define __d3d12_h__

/* Forward declarations */

#ifndef __ID3D12Object_FWD_DEFINED__
#define __ID3D12Object_FWD_DEFINED__
typedef interface ID3D12Object ID3D12Object;
#ifdef __cplusplus
interface ID3D12Object;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DeviceChild_FWD_DEFINED__
#define __ID3D12DeviceChild_FWD_DEFINED__
typedef interface ID3D12DeviceChild ID3D12DeviceChild;
#ifdef __cplusplus
interface ID3D12DeviceChild;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Pageable_FWD_DEFINED__
#define __ID3D12Pageable_FWD_DEFINED__
typedef interface ID3D12Pageable ID3D12Pageable;
#ifdef __cplusplus
interface ID3D12Pageable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Heap_FWD_DEFINED__
#define __ID3D12Heap_FWD_DEFINED__
typedef interface ID3D12Heap ID3D12Heap;
#ifdef __cplusplus
interface ID3D12Heap;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Resource_FWD_DEFINED__
#define __ID3D12Resource_FWD_DEFINED__
typedef interface ID3D12Resource ID3D12Resource;
#ifdef __cplusplus
interface ID3D12Resource;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12CommandList_FWD_DEFINED__
#define __ID3D12CommandList_FWD_DEFINED__
typedef interface ID3D12CommandList ID3D12CommandList;
#ifdef __cplusplus
interface ID3D12CommandList;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DescriptorHeap_FWD_DEFINED__
#define __ID3D12DescriptorHeap_FWD_DEFINED__
typedef interface ID3D12DescriptorHeap ID3D12DescriptorHeap;
#ifdef __cplusplus
interface ID3D12DescriptorHeap;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12QueryHeap_FWD_DEFINED__
#define __ID3D12QueryHeap_FWD_DEFINED__
typedef interface ID3D12QueryHeap ID3D12QueryHeap;
#ifdef __cplusplus
interface ID3D12QueryHeap;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12CommandSignature_FWD_DEFINED__
#define __ID3D12CommandSignature_FWD_DEFINED__
typedef interface ID3D12CommandSignature ID3D12CommandSignature;
#ifdef __cplusplus
interface ID3D12CommandSignature;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList_FWD_DEFINED__
#define __ID3D12GraphicsCommandList_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList ID3D12GraphicsCommandList;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList1_FWD_DEFINED__
#define __ID3D12GraphicsCommandList1_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList1 ID3D12GraphicsCommandList1;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList2_FWD_DEFINED__
#define __ID3D12GraphicsCommandList2_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList2 ID3D12GraphicsCommandList2;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList2;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12CommandQueue_FWD_DEFINED__
#define __ID3D12CommandQueue_FWD_DEFINED__
typedef interface ID3D12CommandQueue ID3D12CommandQueue;
#ifdef __cplusplus
interface ID3D12CommandQueue;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12RootSignature_FWD_DEFINED__
#define __ID3D12RootSignature_FWD_DEFINED__
typedef interface ID3D12RootSignature ID3D12RootSignature;
#ifdef __cplusplus
interface ID3D12RootSignature;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12PipelineState_FWD_DEFINED__
#define __ID3D12PipelineState_FWD_DEFINED__
typedef interface ID3D12PipelineState ID3D12PipelineState;
#ifdef __cplusplus
interface ID3D12PipelineState;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Fence_FWD_DEFINED__
#define __ID3D12Fence_FWD_DEFINED__
typedef interface ID3D12Fence ID3D12Fence;
#ifdef __cplusplus
interface ID3D12Fence;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12CommandAllocator_FWD_DEFINED__
#define __ID3D12CommandAllocator_FWD_DEFINED__
typedef interface ID3D12CommandAllocator ID3D12CommandAllocator;
#ifdef __cplusplus
interface ID3D12CommandAllocator;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device_FWD_DEFINED__
#define __ID3D12Device_FWD_DEFINED__
typedef interface ID3D12Device ID3D12Device;
#ifdef __cplusplus
interface ID3D12Device;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device1_FWD_DEFINED__
#define __ID3D12Device1_FWD_DEFINED__
typedef interface ID3D12Device1 ID3D12Device1;
#ifdef __cplusplus
interface ID3D12Device1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12RootSignatureDeserializer_FWD_DEFINED__
#define __ID3D12RootSignatureDeserializer_FWD_DEFINED__
typedef interface ID3D12RootSignatureDeserializer ID3D12RootSignatureDeserializer;
#ifdef __cplusplus
interface ID3D12RootSignatureDeserializer;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12VersionedRootSignatureDeserializer_FWD_DEFINED__
#define __ID3D12VersionedRootSignatureDeserializer_FWD_DEFINED__
typedef interface ID3D12VersionedRootSignatureDeserializer ID3D12VersionedRootSignatureDeserializer;
#ifdef __cplusplus
interface ID3D12VersionedRootSignatureDeserializer;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <dxgi.h>
#include <d3dcommon.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _D3D12_CONSTANTS
#define _D3D12_CONSTANTS
#define D3D12_CS_TGSM_REGISTER_COUNT (8192)

#define D3D12_MAX_ROOT_COST (64)

#define D3D12_VIEWPORT_BOUNDS_MAX (32767)

#define D3D12_VIEWPORT_BOUNDS_MIN (-32768)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COUNT (15)

#define D3D12_APPEND_ALIGNED_ELEMENT (0xffffffff)

#define D3D12_DEFAULT_BLEND_FACTOR_ALPHA (1.0f)
#define D3D12_DEFAULT_BLEND_FACTOR_BLUE (1.0f)
#define D3D12_DEFAULT_BLEND_FACTOR_GREEN (1.0f)
#define D3D12_DEFAULT_BLEND_FACTOR_RED (1.0f)
#define D3D12_DEFAULT_DEPTH_BIAS (0)

#define D3D12_DEFAULT_DEPTH_BIAS_CLAMP (0.0f)
#define D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS (0.0f)
#define D3D12_DEFAULT_STENCIL_READ_MASK (0xff)

#define D3D12_DEFAULT_STENCIL_WRITE_MASK (0xff)

#define D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND (0xffffffff)

#define D3D12_FLOAT32_MAX (3.402823466e+38f)
#define D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT (32)

#define D3D12_UAV_SLOT_COUNT (64)

#define D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT (4096)

#define D3D12_REQ_IMMEDIATE_CONSTANT_BUFFER_ELEMENT_COUNT (4096)

#define D3D12_REQ_MIP_LEVELS (15)

#define D3D12_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION (2048)

#define D3D12_REQ_TEXTURE1D_U_DIMENSION (16384)

#define D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION (2048)

#define D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION (16384)

#define D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION (2048)

#define D3D12_REQ_TEXTURECUBE_DIMENSION (16384)

#define D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES (0xffffffff)

#define D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8)

#define D3D12_SO_BUFFER_MAX_STRIDE_IN_BYTES (2048)

#define D3D12_SO_BUFFER_SLOT_COUNT (4)

#define D3D12_SO_DDI_REGISTER_INDEX_DENOTING_GAP (0xffffffff)

#define D3D12_SO_NO_RASTERIZED_STREAM (0xffffffff)

#define D3D12_SO_OUTPUT_COMPONENT_COUNT (128)

#define D3D12_SO_STREAM_COUNT (4)

#define D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256)

#define D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4194304)

#define D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (65536)

#define D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT (16)

#define D3D12_SMALL_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (65536)

#define D3D12_SMALL_RESOURCE_PLACEMENT_ALIGNMENT (4096)

#define D3D12_STANDARD_MAXIMUM_ELEMENT_ALIGNMENT_BYTE_MULTIPLE (4)

#define D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256)

#define D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512)

#define D3D12_UAV_COUNTER_PLACEMENT_ALIGNMENT (4096)

#define D3D12_VS_INPUT_REGISTER_COUNT (32)

#define D3D12_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE (16)

#endif
#define D3D12_SHADER_COMPONENT_MAPPING_MASK (0x7)

#define D3D12_SHADER_COMPONENT_MAPPING_SHIFT (3)

#define D3D12_SHADER_COMPONENT_MAPPING_ALWAYS_SET_BIT_AVOIDING_ZEROMEM_MISTAKES (1 << (D3D12_SHADER_COMPONENT_MAPPING_SHIFT * 4))

typedef enum D3D12_SHADER_MIN_PRECISION_SUPPORT {
    D3D12_SHADER_MIN_PRECISION_SUPPORT_NONE = 0x0,
    D3D12_SHADER_MIN_PRECISION_SUPPORT_10_BIT = 0x1,
    D3D12_SHADER_MIN_PRECISION_SUPPORT_16_BIT = 0x2
} D3D12_SHADER_MIN_PRECISION_SUPPORT;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_SHADER_MIN_PRECISION_SUPPORT);
typedef enum D3D12_TILED_RESOURCES_TIER {
    D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED = 0,
    D3D12_TILED_RESOURCES_TIER_1 = 1,
    D3D12_TILED_RESOURCES_TIER_2 = 2,
    D3D12_TILED_RESOURCES_TIER_3 = 3
} D3D12_TILED_RESOURCES_TIER;
typedef enum D3D12_RESOURCE_BINDING_TIER {
    D3D12_RESOURCE_BINDING_TIER_1 = 1,
    D3D12_RESOURCE_BINDING_TIER_2 = 2,
    D3D12_RESOURCE_BINDING_TIER_3 = 3
} D3D12_RESOURCE_BINDING_TIER;
typedef enum D3D12_CONSERVATIVE_RASTERIZATION_TIER {
    D3D12_CONSERVATIVE_RASTERIZATION_TIER_NOT_SUPPORTED = 0,
    D3D12_CONSERVATIVE_RASTERIZATION_TIER_1 = 1,
    D3D12_CONSERVATIVE_RASTERIZATION_TIER_2 = 2,
    D3D12_CONSERVATIVE_RASTERIZATION_TIER_3 = 3
} D3D12_CONSERVATIVE_RASTERIZATION_TIER;
typedef enum D3D12_CROSS_NODE_SHARING_TIER {
    D3D12_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED = 0,
    D3D12_CROSS_NODE_SHARING_TIER_1_EMULATED = 1,
    D3D12_CROSS_NODE_SHARING_TIER_1 = 2,
    D3D12_CROSS_NODE_SHARING_TIER_2 = 3
} D3D12_CROSS_NODE_SHARING_TIER;
typedef enum D3D12_RESOURCE_HEAP_TIER {
    D3D12_RESOURCE_HEAP_TIER_1 = 1,
    D3D12_RESOURCE_HEAP_TIER_2 = 2
} D3D12_RESOURCE_HEAP_TIER;
typedef enum D3D12_FORMAT_SUPPORT1 {
    D3D12_FORMAT_SUPPORT1_NONE = 0x0,
    D3D12_FORMAT_SUPPORT1_BUFFER = 0x1,
    D3D12_FORMAT_SUPPORT1_IA_VERTEX_BUFFER = 0x2,
    D3D12_FORMAT_SUPPORT1_IA_INDEX_BUFFER = 0x4,
    D3D12_FORMAT_SUPPORT1_SO_BUFFER = 0x8,
    D3D12_FORMAT_SUPPORT1_TEXTURE1D = 0x10,
    D3D12_FORMAT_SUPPORT1_TEXTURE2D = 0x20,
    D3D12_FORMAT_SUPPORT1_TEXTURE3D = 0x40,
    D3D12_FORMAT_SUPPORT1_TEXTURECUBE = 0x80,
    D3D12_FORMAT_SUPPORT1_SHADER_LOAD = 0x100,
    D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE = 0x200,
    D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_COMPARISON = 0x400,
    D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_MONO_TEXT = 0x800,
    D3D12_FORMAT_SUPPORT1_MIP = 0x1000,
    D3D12_FORMAT_SUPPORT1_RENDER_TARGET = 0x4000,
    D3D12_FORMAT_SUPPORT1_BLENDABLE = 0x8000,
    D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL = 0x10000,
    D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RESOLVE = 0x40000,
    D3D12_FORMAT_SUPPORT1_DISPLAY = 0x80000,
    D3D12_FORMAT_SUPPORT1_CAST_WITHIN_BIT_LAYOUT = 0x100000,
    D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RENDERTARGET = 0x200000,
    D3D12_FORMAT_SUPPORT1_MULTISAMPLE_LOAD = 0x400000,
    D3D12_FORMAT_SUPPORT1_SHADER_GATHER = 0x800000,
    D3D12_FORMAT_SUPPORT1_BACK_BUFFER_CAST = 0x1000000,
    D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW = 0x2000000,
    D3D12_FORMAT_SUPPORT1_SHADER_GATHER_COMPARISON = 0x4000000,
    D3D12_FORMAT_SUPPORT1_DECODER_OUTPUT = 0x8000000,
    D3D12_FORMAT_SUPPORT1_VIDEO_PROCESSOR_OUTPUT = 0x10000000,
    D3D12_FORMAT_SUPPORT1_VIDEO_PROCESSOR_INPUT = 0x20000000,
    D3D12_FORMAT_SUPPORT1_VIDEO_ENCODER = 0x40000000
} D3D12_FORMAT_SUPPORT1;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_FORMAT_SUPPORT1);
typedef enum D3D12_FORMAT_SUPPORT2 {
    D3D12_FORMAT_SUPPORT2_NONE = 0x0,
    D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_ADD = 0x1,
    D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_BITWISE_OPS = 0x2,
    D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_COMPARE_STORE_OR_COMPARE_EXCHANGE = 0x4,
    D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_EXCHANGE = 0x8,
    D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX = 0x10,
    D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX = 0x20,
    D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD = 0x40,
    D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE = 0x80,
    D3D12_FORMAT_SUPPORT2_OUTPUT_MERGER_LOGIC_OP = 0x100,
    D3D12_FORMAT_SUPPORT2_TILED = 0x200,
    D3D12_FORMAT_SUPPORT2_MULTIPLANE_OVERLAY = 0x4000
} D3D12_FORMAT_SUPPORT2;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_FORMAT_SUPPORT2);
typedef enum D3D12_WRITEBUFFERIMMEDIATE_MODE {
    D3D12_WRITEBUFFERIMMEDIATE_MODE_DEFAULT = 0x0,
    D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_IN = 0x1,
    D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_OUT = 0x2
} D3D12_WRITEBUFFERIMMEDIATE_MODE;
typedef enum D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER {
    D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_NOT_SUPPORTED = 0x0,
    D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_1 = 0x1,
    D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_2 = 0x2
} D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER;
typedef enum D3D12_SHADER_CACHE_SUPPORT_FLAGS {
    D3D12_SHADER_CACHE_SUPPORT_NONE = 0x0,
    D3D12_SHADER_CACHE_SUPPORT_SINGLE_PSO = 0x1,
    D3D12_SHADER_CACHE_SUPPORT_LIBRARY = 0x2,
    D3D12_SHADER_CACHE_SUPPORT_AUTOMATIC_INPROC_CACHE = 0x4,
    D3D12_SHADER_CACHE_SUPPORT_AUTOMATIC_DISK_CACHE = 0x8
} D3D12_SHADER_CACHE_SUPPORT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_SHADER_CACHE_SUPPORT_FLAGS);
typedef enum D3D12_COMMAND_LIST_SUPPORT_FLAGS {
    D3D12_COMMAND_LIST_SUPPORT_FLAG_NONE = 0x0,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_DIRECT = 0x1,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_BUNDLE = 0x2,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_COMPUTE = 0x4,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_COPY = 0x8,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_VIDEO_DECODE = 0x10,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_VIDEO_PROCESS = 0x20,
    D3D12_COMMAND_LIST_SUPPORT_FLAG_VIDEO_ENCODE = 0x40
} D3D12_COMMAND_LIST_SUPPORT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_COMMAND_LIST_SUPPORT_FLAGS);
typedef enum D3D12_VIEW_INSTANCING_TIER {
    D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED = 0x0,
    D3D12_VIEW_INSTANCING_TIER_1 = 0x1,
    D3D12_VIEW_INSTANCING_TIER_2 = 0x2,
    D3D12_VIEW_INSTANCING_TIER_3 = 0x3
} D3D12_VIEW_INSTANCING_TIER;
typedef enum D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER {
    D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_0 = 0x0,
    D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_1 = 0x1
} D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER;
typedef enum D3D12_HEAP_SERIALIZATION_TIER {
    D3D12_HEAP_SERIALIZATION_TIER_0 = 0x0,
    D3D12_HEAP_SERIALIZATION_TIER_10 = 0xa
} D3D12_HEAP_SERIALIZATION_TIER;
typedef enum D3D12_RENDER_PASS_TIER {
    D3D12_RENDER_PASS_TIER_0 = 0x0,
    D3D12_RENDER_PASS_TIER_1 = 0x1,
    D3D12_RENDER_PASS_TIER_2 = 0x2
} D3D12_RENDER_PASS_TIER;
typedef enum D3D12_RAYTRACING_TIER {
    D3D12_RAYTRACING_TIER_NOT_SUPPORTED = 0x0,
    D3D12_RAYTRACING_TIER_1_0 = 0xa
} D3D12_RAYTRACING_TIER;
#ifndef __ID3D12Fence_FWD_DEFINED__
#define __ID3D12Fence_FWD_DEFINED__
typedef interface ID3D12Fence ID3D12Fence;
#ifdef __cplusplus
interface ID3D12Fence;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12RootSignature_FWD_DEFINED__
#define __ID3D12RootSignature_FWD_DEFINED__
typedef interface ID3D12RootSignature ID3D12RootSignature;
#ifdef __cplusplus
interface ID3D12RootSignature;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Heap_FWD_DEFINED__
#define __ID3D12Heap_FWD_DEFINED__
typedef interface ID3D12Heap ID3D12Heap;
#ifdef __cplusplus
interface ID3D12Heap;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DescriptorHeap_FWD_DEFINED__
#define __ID3D12DescriptorHeap_FWD_DEFINED__
typedef interface ID3D12DescriptorHeap ID3D12DescriptorHeap;
#ifdef __cplusplus
interface ID3D12DescriptorHeap;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Resource_FWD_DEFINED__
#define __ID3D12Resource_FWD_DEFINED__
typedef interface ID3D12Resource ID3D12Resource;
#ifdef __cplusplus
interface ID3D12Resource;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12CommandAllocator_FWD_DEFINED__
#define __ID3D12CommandAllocator_FWD_DEFINED__
typedef interface ID3D12CommandAllocator ID3D12CommandAllocator;
#ifdef __cplusplus
interface ID3D12CommandAllocator;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList_FWD_DEFINED__
#define __ID3D12GraphicsCommandList_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList ID3D12GraphicsCommandList;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12CommandQueue_FWD_DEFINED__
#define __ID3D12CommandQueue_FWD_DEFINED__
typedef interface ID3D12CommandQueue ID3D12CommandQueue;
#ifdef __cplusplus
interface ID3D12CommandQueue;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12PipelineState_FWD_DEFINED__
#define __ID3D12PipelineState_FWD_DEFINED__
typedef interface ID3D12PipelineState ID3D12PipelineState;
#ifdef __cplusplus
interface ID3D12PipelineState;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device_FWD_DEFINED__
#define __ID3D12Device_FWD_DEFINED__
typedef interface ID3D12Device ID3D12Device;
#ifdef __cplusplus
interface ID3D12Device;
#endif /* __cplusplus */
#endif

typedef RECT D3D12_RECT;
typedef struct D3D12_BOX {
    UINT left;
    UINT top;
    UINT front;
    UINT right;
    UINT bottom;
    UINT back;
} D3D12_BOX;
typedef struct D3D12_VIEWPORT {
    FLOAT TopLeftX;
    FLOAT TopLeftY;
    FLOAT Width;
    FLOAT Height;
    FLOAT MinDepth;
    FLOAT MaxDepth;
} D3D12_VIEWPORT;
typedef struct D3D12_RANGE {
    SIZE_T Begin;
    SIZE_T End;
} D3D12_RANGE;
typedef struct D3D12_RANGE_UINT64 {
    UINT64 Begin;
    UINT64 End;
} D3D12_RANGE_UINT64;
typedef struct D3D12_SUBRESOURCE_RANGE_UINT64 {
    UINT Subresource;
    D3D12_RANGE_UINT64 Range;
} D3D12_SUBRESOURCE_RANGE_UINT64;
typedef struct D3D12_RESOURCE_ALLOCATION_INFO {
    UINT64 SizeInBytes;
    UINT64 Alignment;
} D3D12_RESOURCE_ALLOCATION_INFO;
typedef struct D3D12_DRAW_ARGUMENTS {
    UINT VertexCountPerInstance;
    UINT InstanceCount;
    UINT StartVertexLocation;
    UINT StartInstanceLocation;
} D3D12_DRAW_ARGUMENTS;
typedef struct D3D12_DRAW_INDEXED_ARGUMENTS {
    UINT IndexCountPerInstance;
    UINT InstanceCount;
    UINT StartIndexLocation;
    INT BaseVertexLocation;
    UINT StartInstanceLocation;
} D3D12_DRAW_INDEXED_ARGUMENTS;
typedef struct D3D12_DISPATCH_ARGUMENTS {
    UINT ThreadGroupCountX;
    UINT ThreadGroupCountY;
    UINT ThreadGroupCountZ;
} D3D12_DISPATCH_ARGUMENTS;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS {
    WINBOOL DoublePrecisionFloatShaderOps;
    WINBOOL OutputMergerLogicOp;
    D3D12_SHADER_MIN_PRECISION_SUPPORT MinPrecisionSupport;
    D3D12_TILED_RESOURCES_TIER TiledResourcesTier;
    D3D12_RESOURCE_BINDING_TIER ResourceBindingTier;
    WINBOOL PSSpecifiedStencilRefSupported;
    WINBOOL TypedUAVLoadAdditionalFormats;
    WINBOOL ROVsSupported;
    D3D12_CONSERVATIVE_RASTERIZATION_TIER ConservativeRasterizationTier;
    UINT MaxGPUVirtualAddressBitsPerResource;
    WINBOOL StandardSwizzle64KBSupported;
    D3D12_CROSS_NODE_SHARING_TIER CrossNodeSharingTier;
    WINBOOL CrossAdapterRowMajorTextureSupported;
    WINBOOL VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation;
    D3D12_RESOURCE_HEAP_TIER ResourceHeapTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS;
typedef struct D3D12_FEATURE_DATA_FORMAT_SUPPORT {
    DXGI_FORMAT Format;
    D3D12_FORMAT_SUPPORT1 Support1;
    D3D12_FORMAT_SUPPORT2 Support2;
} D3D12_FEATURE_DATA_FORMAT_SUPPORT;
typedef enum D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS {
    D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE = 0x0,
    D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_TILED_RESOURCE = 0x1
} D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS);
typedef struct D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS {
    DXGI_FORMAT Format;
    UINT SampleCount;
    D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags;
    UINT NumQualityLevels;
} D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS;
typedef enum D3D12_HEAP_TYPE {
    D3D12_HEAP_TYPE_DEFAULT = 1,
    D3D12_HEAP_TYPE_UPLOAD = 2,
    D3D12_HEAP_TYPE_READBACK = 3,
    D3D12_HEAP_TYPE_CUSTOM = 4
} D3D12_HEAP_TYPE;
typedef enum D3D12_CPU_PAGE_PROPERTY {
    D3D12_CPU_PAGE_PROPERTY_UNKNOWN = 0,
    D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE = 1,
    D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE = 2,
    D3D12_CPU_PAGE_PROPERTY_WRITE_BACK = 3
} D3D12_CPU_PAGE_PROPERTY;
typedef enum D3D12_MEMORY_POOL {
    D3D12_MEMORY_POOL_UNKNOWN = 0,
    D3D12_MEMORY_POOL_L0 = 1,
    D3D12_MEMORY_POOL_L1 = 2
} D3D12_MEMORY_POOL;
typedef struct D3D12_HEAP_PROPERTIES {
    D3D12_HEAP_TYPE Type;
    D3D12_CPU_PAGE_PROPERTY CPUPageProperty;
    D3D12_MEMORY_POOL MemoryPoolPreference;
    UINT CreationNodeMask;
    UINT VisibleNodeMask;
} D3D12_HEAP_PROPERTIES;
typedef enum D3D12_HEAP_FLAGS {
    D3D12_HEAP_FLAG_NONE = 0x0,
    D3D12_HEAP_FLAG_SHARED = 0x1,
    D3D12_HEAP_FLAG_DENY_BUFFERS = 0x4,
    D3D12_HEAP_FLAG_ALLOW_DISPLAY = 0x8,
    D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER = 0x20,
    D3D12_HEAP_FLAG_DENY_RT_DS_TEXTURES = 0x40,
    D3D12_HEAP_FLAG_DENY_NON_RT_DS_TEXTURES = 0x80,
    D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES = 0x0,
    D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS = 0xc0,
    D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES = 0x44,
    D3D12_HEAP_FLAG_ALLOW_ONLY_RT_DS_TEXTURES = 0x84
} D3D12_HEAP_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_HEAP_FLAGS);
typedef struct D3D12_HEAP_DESC {
    UINT64 SizeInBytes;
    D3D12_HEAP_PROPERTIES Properties;
    UINT64 Alignment;
    D3D12_HEAP_FLAGS Flags;
} D3D12_HEAP_DESC;
typedef struct D3D12_TILED_RESOURCE_COORDINATE {
    UINT X;
    UINT Y;
    UINT Z;
    UINT Subresource;
} D3D12_TILED_RESOURCE_COORDINATE;
typedef struct D3D12_TILE_REGION_SIZE {
    UINT NumTiles;
    WINBOOL UseBox;
    UINT Width;
    UINT16 Height;
    UINT16 Depth;
} D3D12_TILE_REGION_SIZE;
typedef struct D3D12_SUBRESOURCE_TILING {
    UINT WidthInTiles;
    UINT16 HeightInTiles;
    UINT16 DepthInTiles;
    UINT StartTileIndexInOverallResource;
} D3D12_SUBRESOURCE_TILING;
typedef struct D3D12_TILE_SHAPE {
    UINT WidthInTexels;
    UINT HeightInTexels;
    UINT DepthInTexels;
} D3D12_TILE_SHAPE;
typedef struct D3D12_SHADER_BYTECODE {
    const void *pShaderBytecode;
    SIZE_T BytecodeLength;
} D3D12_SHADER_BYTECODE;
typedef struct D3D12_DEPTH_STENCIL_VALUE {
    FLOAT Depth;
    UINT8 Stencil;
} D3D12_DEPTH_STENCIL_VALUE;
typedef struct D3D12_CLEAR_VALUE {
    DXGI_FORMAT Format;
    __C89_NAMELESS union {
        FLOAT Color[4];
        D3D12_DEPTH_STENCIL_VALUE DepthStencil;
    } __C89_NAMELESSUNIONNAME;
} D3D12_CLEAR_VALUE;
typedef struct D3D12_PACKED_MIP_INFO {
    UINT8 NumStandardMips;
    UINT8 NumPackedMips;
    UINT NumTilesForPackedMips;
    UINT StartTileIndexInOverallResource;
} D3D12_PACKED_MIP_INFO;
typedef enum D3D12_RESOURCE_STATES {
    D3D12_RESOURCE_STATE_COMMON = 0,
    D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER = 0x1,
    D3D12_RESOURCE_STATE_INDEX_BUFFER = 0x2,
    D3D12_RESOURCE_STATE_RENDER_TARGET = 0x4,
    D3D12_RESOURCE_STATE_UNORDERED_ACCESS = 0x8,
    D3D12_RESOURCE_STATE_DEPTH_WRITE = 0x10,
    D3D12_RESOURCE_STATE_DEPTH_READ = 0x20,
    D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE = 0x40,
    D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE = 0x80,
    D3D12_RESOURCE_STATE_STREAM_OUT = 0x100,
    D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT = 0x200,
    D3D12_RESOURCE_STATE_COPY_DEST = 0x400,
    D3D12_RESOURCE_STATE_COPY_SOURCE = 0x800,
    D3D12_RESOURCE_STATE_RESOLVE_DEST = 0x1000,
    D3D12_RESOURCE_STATE_RESOLVE_SOURCE = 0x2000,
    D3D12_RESOURCE_STATE_GENERIC_READ = ((((0x1 | 0x2) | 0x40) | 0x80) | 0x200) | 0x800,
    D3D12_RESOURCE_STATE_PRESENT = 0x0,
    D3D12_RESOURCE_STATE_PREDICATION = 0x200,
    D3D12_RESOURCE_STATE_VIDEO_DECODE_READ = 0x10000,
    D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE = 0x20000,
    D3D12_RESOURCE_STATE_VIDEO_PROCESS_READ = 0x40000,
    D3D12_RESOURCE_STATE_VIDEO_PROCESS_WRITE = 0x80000,
    D3D12_RESOURCE_STATE_VIDEO_ENCODE_READ = 0x200000,
    D3D12_RESOURCE_STATE_VIDEO_ENCODE_WRITE = 0x800000
} D3D12_RESOURCE_STATES;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RESOURCE_STATES);
typedef enum D3D12_RESOURCE_BARRIER_TYPE {
    D3D12_RESOURCE_BARRIER_TYPE_TRANSITION = 0,
    D3D12_RESOURCE_BARRIER_TYPE_ALIASING = 1,
    D3D12_RESOURCE_BARRIER_TYPE_UAV = 2
} D3D12_RESOURCE_BARRIER_TYPE;
typedef enum D3D12_RESOURCE_BARRIER_FLAGS {
    D3D12_RESOURCE_BARRIER_FLAG_NONE = 0x0,
    D3D12_RESOURCE_BARRIER_FLAG_BEGIN_ONLY = 0x1,
    D3D12_RESOURCE_BARRIER_FLAG_END_ONLY = 0x2
} D3D12_RESOURCE_BARRIER_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RESOURCE_BARRIER_FLAGS);
typedef struct D3D12_RESOURCE_TRANSITION_BARRIER {
    ID3D12Resource *pResource;
    UINT Subresource;
    D3D12_RESOURCE_STATES StateBefore;
    D3D12_RESOURCE_STATES StateAfter;
} D3D12_RESOURCE_TRANSITION_BARRIER;
typedef struct D3D12_RESOURCE_ALIASING_BARRIER_ALIASING {
    ID3D12Resource *pResourceBefore;
    ID3D12Resource *pResourceAfter;
} D3D12_RESOURCE_ALIASING_BARRIER;
typedef struct D3D12_RESOURCE_UAV_BARRIER {
    ID3D12Resource *pResource;
} D3D12_RESOURCE_UAV_BARRIER;
typedef struct D3D12_RESOURCE_BARRIER {
    D3D12_RESOURCE_BARRIER_TYPE Type;
    D3D12_RESOURCE_BARRIER_FLAGS Flags;
    __C89_NAMELESS union {
        D3D12_RESOURCE_TRANSITION_BARRIER Transition;
        D3D12_RESOURCE_ALIASING_BARRIER Aliasing;
        D3D12_RESOURCE_UAV_BARRIER UAV;
    } __C89_NAMELESSUNIONNAME;
} D3D12_RESOURCE_BARRIER;
typedef enum D3D12_RESOURCE_DIMENSION {
    D3D12_RESOURCE_DIMENSION_UNKNOWN = 0,
    D3D12_RESOURCE_DIMENSION_BUFFER = 1,
    D3D12_RESOURCE_DIMENSION_TEXTURE1D = 2,
    D3D12_RESOURCE_DIMENSION_TEXTURE2D = 3,
    D3D12_RESOURCE_DIMENSION_TEXTURE3D = 4
} D3D12_RESOURCE_DIMENSION;
typedef enum D3D12_TEXTURE_LAYOUT {
    D3D12_TEXTURE_LAYOUT_UNKNOWN = 0,
    D3D12_TEXTURE_LAYOUT_ROW_MAJOR = 1,
    D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE = 2,
    D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE = 3
} D3D12_TEXTURE_LAYOUT;
typedef enum D3D12_RESOURCE_FLAGS {
    D3D12_RESOURCE_FLAG_NONE = 0x0,
    D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET = 0x1,
    D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL = 0x2,
    D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS = 0x4,
    D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE = 0x8,
    D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER = 0x10,
    D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS = 0x20
} D3D12_RESOURCE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RESOURCE_FLAGS);
typedef struct D3D12_RESOURCE_DESC {
    D3D12_RESOURCE_DIMENSION Dimension;
    UINT64 Alignment;
    UINT64 Width;
    UINT Height;
    UINT16 DepthOrArraySize;
    UINT16 MipLevels;
    DXGI_FORMAT Format;
    DXGI_SAMPLE_DESC SampleDesc;
    D3D12_TEXTURE_LAYOUT Layout;
    D3D12_RESOURCE_FLAGS Flags;
} D3D12_RESOURCE_DESC;
typedef enum D3D12_RESOLVE_MODE {
    D3D12_RESOLVE_MODE_DECOMPRESS = 0,
    D3D12_RESOLVE_MODE_MIN = 1,
    D3D12_RESOLVE_MODE_MAX = 2,
    D3D12_RESOLVE_MODE_AVERAGE = 3
} D3D12_RESOLVE_MODE;
typedef struct D3D12_SAMPLE_POSITION {
    INT8 X;
    INT8 Y;
} D3D12_SAMPLE_POSITION;
typedef enum D3D12_TEXTURE_COPY_TYPE {
    D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX = 0,
    D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT = 1
} D3D12_TEXTURE_COPY_TYPE;
typedef struct D3D12_SUBRESOURCE_FOOTPRINT {
    DXGI_FORMAT Format;
    UINT Width;
    UINT Height;
    UINT Depth;
    UINT RowPitch;
} D3D12_SUBRESOURCE_FOOTPRINT;
typedef struct D3D12_PLACED_SUBRESOURCE_FOOTPRINT {
    UINT64 Offset;
    D3D12_SUBRESOURCE_FOOTPRINT Footprint;
} D3D12_PLACED_SUBRESOURCE_FOOTPRINT;
typedef struct D3D12_TEXTURE_COPY_LOCATION {
    ID3D12Resource *pResource;
    D3D12_TEXTURE_COPY_TYPE Type;
    __C89_NAMELESS union {
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT PlacedFootprint;
        UINT SubresourceIndex;
    } __C89_NAMELESSUNIONNAME;
} D3D12_TEXTURE_COPY_LOCATION;
typedef enum D3D12_DESCRIPTOR_RANGE_TYPE {
    D3D12_DESCRIPTOR_RANGE_TYPE_SRV = 0,
    D3D12_DESCRIPTOR_RANGE_TYPE_UAV = 1,
    D3D12_DESCRIPTOR_RANGE_TYPE_CBV = 2,
    D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER = 3
} D3D12_DESCRIPTOR_RANGE_TYPE;
typedef struct D3D12_DESCRIPTOR_RANGE {
    D3D12_DESCRIPTOR_RANGE_TYPE RangeType;
    UINT NumDescriptors;
    UINT BaseShaderRegister;
    UINT RegisterSpace;
    UINT OffsetInDescriptorsFromTableStart;
} D3D12_DESCRIPTOR_RANGE;
typedef enum D3D12_DESCRIPTOR_RANGE_FLAGS {
    D3D12_DESCRIPTOR_RANGE_FLAG_NONE = 0x0,
    D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE = 0x1,
    D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE = 0x2,
    D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
    D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC = 0x8
} D3D12_DESCRIPTOR_RANGE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_DESCRIPTOR_RANGE_FLAGS);
typedef struct D3D12_DESCRIPTOR_RANGE1 {
    D3D12_DESCRIPTOR_RANGE_TYPE RangeType;
    UINT NumDescriptors;
    UINT BaseShaderRegister;
    UINT RegisterSpace;
    D3D12_DESCRIPTOR_RANGE_FLAGS Flags;
    UINT OffsetInDescriptorsFromTableStart;
} D3D12_DESCRIPTOR_RANGE1;
typedef struct D3D12_ROOT_DESCRIPTOR_TABLE {
    UINT NumDescriptorRanges;
    const D3D12_DESCRIPTOR_RANGE *pDescriptorRanges;
} D3D12_ROOT_DESCRIPTOR_TABLE;
typedef struct D3D12_ROOT_DESCRIPTOR_TABLE1 {
    UINT NumDescriptorRanges;
    const D3D12_DESCRIPTOR_RANGE1 *pDescriptorRanges;
} D3D12_ROOT_DESCRIPTOR_TABLE1;
typedef struct D3D12_ROOT_CONSTANTS {
    UINT ShaderRegister;
    UINT RegisterSpace;
    UINT Num32BitValues;
} D3D12_ROOT_CONSTANTS;
typedef struct D3D12_ROOT_DESCRIPTOR {
    UINT ShaderRegister;
    UINT RegisterSpace;
} D3D12_ROOT_DESCRIPTOR;
typedef enum D3D12_ROOT_DESCRIPTOR_FLAGS {
    D3D12_ROOT_DESCRIPTOR_FLAG_NONE = 0x0,
    D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE = 0x2,
    D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
    D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC = 0x8
} D3D12_ROOT_DESCRIPTOR_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_ROOT_DESCRIPTOR_FLAGS);
typedef struct D3D12_ROOT_DESCRIPTOR1 {
    UINT ShaderRegister;
    UINT RegisterSpace;
    D3D12_ROOT_DESCRIPTOR_FLAGS Flags;
} D3D12_ROOT_DESCRIPTOR1;
typedef enum D3D12_ROOT_PARAMETER_TYPE {
    D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE = 0,
    D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS = 1,
    D3D12_ROOT_PARAMETER_TYPE_CBV = 2,
    D3D12_ROOT_PARAMETER_TYPE_SRV = 3,
    D3D12_ROOT_PARAMETER_TYPE_UAV = 4
} D3D12_ROOT_PARAMETER_TYPE;
typedef enum D3D12_SHADER_VISIBILITY {
    D3D12_SHADER_VISIBILITY_ALL = 0,
    D3D12_SHADER_VISIBILITY_VERTEX = 1,
    D3D12_SHADER_VISIBILITY_HULL = 2,
    D3D12_SHADER_VISIBILITY_DOMAIN = 3,
    D3D12_SHADER_VISIBILITY_GEOMETRY = 4,
    D3D12_SHADER_VISIBILITY_PIXEL = 5
} D3D12_SHADER_VISIBILITY;
typedef struct D3D12_ROOT_PARAMETER {
    D3D12_ROOT_PARAMETER_TYPE ParameterType;
    __C89_NAMELESS union {
        D3D12_ROOT_DESCRIPTOR_TABLE DescriptorTable;
        D3D12_ROOT_CONSTANTS Constants;
        D3D12_ROOT_DESCRIPTOR Descriptor;
    } __C89_NAMELESSUNIONNAME;
    D3D12_SHADER_VISIBILITY ShaderVisibility;
} D3D12_ROOT_PARAMETER;
typedef struct D3D12_ROOT_PARAMETER1 {
    D3D12_ROOT_PARAMETER_TYPE ParameterType;
    __C89_NAMELESS union {
        D3D12_ROOT_DESCRIPTOR_TABLE1 DescriptorTable;
        D3D12_ROOT_CONSTANTS Constants;
        D3D12_ROOT_DESCRIPTOR1 Descriptor;
    } __C89_NAMELESSUNIONNAME;
    D3D12_SHADER_VISIBILITY ShaderVisibility;
} D3D12_ROOT_PARAMETER1;
typedef enum D3D12_STATIC_BORDER_COLOR {
    D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK = 0,
    D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK = 1,
    D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE = 2
} D3D12_STATIC_BORDER_COLOR;
typedef enum D3D12_FILTER {
    D3D12_FILTER_MIN_MAG_MIP_POINT = 0x0,
    D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR = 0x1,
    D3D12_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x4,
    D3D12_FILTER_MIN_POINT_MAG_MIP_LINEAR = 0x5,
    D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT = 0x10,
    D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x11,
    D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT = 0x14,
    D3D12_FILTER_MIN_MAG_MIP_LINEAR = 0x15,
    D3D12_FILTER_ANISOTROPIC = 0x55,
    D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT = 0x80,
    D3D12_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR = 0x81,
    D3D12_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x84,
    D3D12_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR = 0x85,
    D3D12_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT = 0x90,
    D3D12_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x91,
    D3D12_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT = 0x94,
    D3D12_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR = 0x95,
    D3D12_FILTER_COMPARISON_ANISOTROPIC = 0xd5,
    D3D12_FILTER_MINIMUM_MIN_MAG_MIP_POINT = 0x100,
    D3D12_FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR = 0x101,
    D3D12_FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x104,
    D3D12_FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR = 0x105,
    D3D12_FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT = 0x110,
    D3D12_FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x111,
    D3D12_FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT = 0x114,
    D3D12_FILTER_MINIMUM_MIN_MAG_MIP_LINEAR = 0x115,
    D3D12_FILTER_MINIMUM_ANISOTROPIC = 0x155,
    D3D12_FILTER_MAXIMUM_MIN_MAG_MIP_POINT = 0x180,
    D3D12_FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR = 0x181,
    D3D12_FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x184,
    D3D12_FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR = 0x185,
    D3D12_FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT = 0x190,
    D3D12_FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x191,
    D3D12_FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT = 0x194,
    D3D12_FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR = 0x195,
    D3D12_FILTER_MAXIMUM_ANISOTROPIC = 0x1d5
} D3D12_FILTER;
typedef enum D3D12_FILTER_TYPE {
    D3D12_FILTER_TYPE_POINT = 0,
    D3D12_FILTER_TYPE_LINEAR = 1
} D3D12_FILTER_TYPE;
#define D3D12_MIP_FILTER_SHIFT (0)

#define D3D12_MAG_FILTER_SHIFT (2)

#define D3D12_MIN_FILTER_SHIFT (4)

#define D3D12_FILTER_TYPE_MASK (0x3)

#define D3D12_ANISOTROPIC_FILTERING_BIT (0x40)

typedef enum D3D12_FILTER_REDUCTION_TYPE {
    D3D12_FILTER_REDUCTION_TYPE_STANDARD = 0,
    D3D12_FILTER_REDUCTION_TYPE_COMPARISON = 1,
    D3D12_FILTER_REDUCTION_TYPE_MINIMUM = 2,
    D3D12_FILTER_REDUCTION_TYPE_MAXIMUM = 3
} D3D12_FILTER_REDUCTION_TYPE;
#define D3D12_FILTER_REDUCTION_TYPE_MASK (0x3)

#define D3D12_FILTER_REDUCTION_TYPE_SHIFT (7)

#define D3D12_DECODE_MAG_FILTER(filter) \
    ((D3D12_FILTER_TYPE)(((filter) >> D3D12_MAG_FILTER_SHIFT) & D3D12_FILTER_TYPE_MASK))
#define D3D12_DECODE_MIN_FILTER(filter) \
    ((D3D12_FILTER_TYPE)(((filter) >> D3D12_MIN_FILTER_SHIFT) & D3D12_FILTER_TYPE_MASK))
#define D3D12_DECODE_MIP_FILTER(filter) \
    ((D3D12_FILTER_TYPE)(((filter) >> D3D12_MIP_FILTER_SHIFT) & D3D12_FILTER_TYPE_MASK))
#define D3D12_DECODE_IS_ANISOTROPIC_FILTER(filter)  \
    (((filter) & D3D12_ANISOTROPIC_FILTERING_BIT) \
    && (D3D12_DECODE_MIN_FILTER(filter) == D3D12_FILTER_TYPE_LINEAR) \
    && (D3D12_DECODE_MAG_FILTER(filter) == D3D12_FILTER_TYPE_LINEAR) \
    && (D3D12_DECODE_MIP_FILTER(filter) == D3D12_FILTER_TYPE_LINEAR))
#define D3D12_DECODE_FILTER_REDUCTION(filter) \
    ((D3D12_FILTER_REDUCTION_TYPE)(((filter) >> D3D12_FILTER_REDUCTION_TYPE_SHIFT) \
    & D3D12_FILTER_REDUCTION_TYPE_MASK))
#define D3D12_DECODE_IS_COMPARISON_FILTER(filter) \
    (D3D12_DECODE_FILTER_REDUCTION(filter) == D3D12_FILTER_REDUCTION_TYPE_COMPARISON)
typedef enum D3D12_TEXTURE_ADDRESS_MODE {
    D3D12_TEXTURE_ADDRESS_MODE_WRAP = 1,
    D3D12_TEXTURE_ADDRESS_MODE_MIRROR = 2,
    D3D12_TEXTURE_ADDRESS_MODE_CLAMP = 3,
    D3D12_TEXTURE_ADDRESS_MODE_BORDER = 4,
    D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE = 5
} D3D12_TEXTURE_ADDRESS_MODE;
typedef enum D3D12_COMPARISON_FUNC {
    D3D12_COMPARISON_FUNC_NEVER = 1,
    D3D12_COMPARISON_FUNC_LESS = 2,
    D3D12_COMPARISON_FUNC_EQUAL = 3,
    D3D12_COMPARISON_FUNC_LESS_EQUAL = 4,
    D3D12_COMPARISON_FUNC_GREATER = 5,
    D3D12_COMPARISON_FUNC_NOT_EQUAL = 6,
    D3D12_COMPARISON_FUNC_GREATER_EQUAL = 7,
    D3D12_COMPARISON_FUNC_ALWAYS = 8
} D3D12_COMPARISON_FUNC;
typedef struct D3D12_STATIC_SAMPLER_DESC {
    D3D12_FILTER Filter;
    D3D12_TEXTURE_ADDRESS_MODE AddressU;
    D3D12_TEXTURE_ADDRESS_MODE AddressV;
    D3D12_TEXTURE_ADDRESS_MODE AddressW;
    FLOAT MipLODBias;
    UINT MaxAnisotropy;
    D3D12_COMPARISON_FUNC ComparisonFunc;
    D3D12_STATIC_BORDER_COLOR BorderColor;
    FLOAT MinLOD;
    FLOAT MaxLOD;
    UINT ShaderRegister;
    UINT RegisterSpace;
    D3D12_SHADER_VISIBILITY ShaderVisibility;
} D3D12_STATIC_SAMPLER_DESC;
typedef enum D3D12_ROOT_SIGNATURE_FLAGS {
    D3D12_ROOT_SIGNATURE_FLAG_NONE = 0x0,
    D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT = 0x1,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_VERTEX_SHADER_ROOT_ACCESS = 0x2,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS = 0x4,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS = 0x8,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS = 0x10,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS = 0x20,
    D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT = 0x40
} D3D12_ROOT_SIGNATURE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_ROOT_SIGNATURE_FLAGS);
typedef struct D3D12_ROOT_SIGNATURE_DESC {
    UINT NumParameters;
    const D3D12_ROOT_PARAMETER *pParameters;
    UINT NumStaticSamplers;
    const D3D12_STATIC_SAMPLER_DESC *pStaticSamplers;
    D3D12_ROOT_SIGNATURE_FLAGS Flags;
} D3D12_ROOT_SIGNATURE_DESC;
typedef struct D3D12_ROOT_SIGNATURE_DESC1 {
    UINT NumParameters;
    const D3D12_ROOT_PARAMETER1 *pParameters;
    UINT NumStaticSamplers;
    const D3D12_STATIC_SAMPLER_DESC *pStaticSamplers;
    D3D12_ROOT_SIGNATURE_FLAGS Flags;
} D3D12_ROOT_SIGNATURE_DESC1;
typedef enum D3D_ROOT_SIGNATURE_VERSION {
    D3D_ROOT_SIGNATURE_VERSION_1 = 0x1,
    D3D_ROOT_SIGNATURE_VERSION_1_0 = 0x1,
    D3D_ROOT_SIGNATURE_VERSION_1_1 = 0x2
} D3D_ROOT_SIGNATURE_VERSION;
typedef struct D3D12_VERSIONED_ROOT_SIGNATURE_DESC {
    D3D_ROOT_SIGNATURE_VERSION Version;
    __C89_NAMELESS union {
        D3D12_ROOT_SIGNATURE_DESC Desc_1_0;
        D3D12_ROOT_SIGNATURE_DESC1 Desc_1_1;
    } __C89_NAMELESSUNIONNAME;
} D3D12_VERSIONED_ROOT_SIGNATURE_DESC;
typedef enum D3D12_DESCRIPTOR_HEAP_TYPE {
    D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV = 0,
    D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER = 1,
    D3D12_DESCRIPTOR_HEAP_TYPE_RTV = 2,
    D3D12_DESCRIPTOR_HEAP_TYPE_DSV = 3,
    D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES = 4
} D3D12_DESCRIPTOR_HEAP_TYPE;
typedef enum D3D12_DESCRIPTOR_HEAP_FLAGS {
    D3D12_DESCRIPTOR_HEAP_FLAG_NONE = 0x0,
    D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE = 0x1
} D3D12_DESCRIPTOR_HEAP_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_DESCRIPTOR_HEAP_FLAGS);
typedef struct D3D12_DESCRIPTOR_HEAP_DESC {
    D3D12_DESCRIPTOR_HEAP_TYPE Type;
    UINT NumDescriptors;
    D3D12_DESCRIPTOR_HEAP_FLAGS Flags;
    UINT NodeMask;
} D3D12_DESCRIPTOR_HEAP_DESC;
typedef UINT64 D3D12_GPU_VIRTUAL_ADDRESS;
typedef struct D3D12_CONSTANT_BUFFER_VIEW_DESC {
    D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
    UINT SizeInBytes;
} D3D12_CONSTANT_BUFFER_VIEW_DESC;
typedef enum D3D12_SRV_DIMENSION {
    D3D12_SRV_DIMENSION_UNKNOWN = 0,
    D3D12_SRV_DIMENSION_BUFFER = 1,
    D3D12_SRV_DIMENSION_TEXTURE1D = 2,
    D3D12_SRV_DIMENSION_TEXTURE1DARRAY = 3,
    D3D12_SRV_DIMENSION_TEXTURE2D = 4,
    D3D12_SRV_DIMENSION_TEXTURE2DARRAY = 5,
    D3D12_SRV_DIMENSION_TEXTURE2DMS = 6,
    D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY = 7,
    D3D12_SRV_DIMENSION_TEXTURE3D = 8,
    D3D12_SRV_DIMENSION_TEXTURECUBE = 9,
    D3D12_SRV_DIMENSION_TEXTURECUBEARRAY = 10
} D3D12_SRV_DIMENSION;
typedef enum D3D12_BUFFER_SRV_FLAGS {
    D3D12_BUFFER_SRV_FLAG_NONE = 0x0,
    D3D12_BUFFER_SRV_FLAG_RAW = 0x1
} D3D12_BUFFER_SRV_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_BUFFER_SRV_FLAGS);
typedef enum D3D12_SHADER_COMPONENT_MAPPING {
    D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0 = 0,
    D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1 = 1,
    D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2 = 2,
    D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3 = 3,
    D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0 = 4,
    D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1 = 5
} D3D12_SHADER_COMPONENT_MAPPING;
#define D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(x, y, z, w) \
        (((x) & D3D12_SHADER_COMPONENT_MAPPING_MASK) \
        | (((y) & D3D12_SHADER_COMPONENT_MAPPING_MASK) << D3D12_SHADER_COMPONENT_MAPPING_SHIFT) \
        | (((z) & D3D12_SHADER_COMPONENT_MAPPING_MASK) << (D3D12_SHADER_COMPONENT_MAPPING_SHIFT * 2)) \
        | (((w) & D3D12_SHADER_COMPONENT_MAPPING_MASK) << (D3D12_SHADER_COMPONENT_MAPPING_SHIFT * 3)) \
        | D3D12_SHADER_COMPONENT_MAPPING_ALWAYS_SET_BIT_AVOIDING_ZEROMEM_MISTAKES)
#define D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(0, 1, 2, 3)
#define D3D12_DECODE_SHADER_4_COMPONENT_MAPPING(i, mapping) \
        ((D3D12_SHADER_COMPONENT_MAPPING)(mapping >> (i * D3D12_SHADER_COMPONENT_MAPPING_SHIFT) \
        & D3D12_SHADER_COMPONENT_MAPPING_MASK))
typedef struct D3D12_BUFFER_SRV {
    UINT64 FirstElement;
    UINT NumElements;
    UINT StructureByteStride;
    D3D12_BUFFER_SRV_FLAGS Flags;
} D3D12_BUFFER_SRV;
typedef struct D3D12_TEX1D_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    FLOAT ResourceMinLODClamp;
} D3D12_TEX1D_SRV;
typedef struct D3D12_TEX1D_ARRAY_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT FirstArraySlice;
    UINT ArraySize;
    FLOAT ResourceMinLODClamp;
} D3D12_TEX1D_ARRAY_SRV;
typedef struct D3D12_TEX2D_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT PlaneSlice;
    FLOAT ResourceMinLODClamp;
} D3D12_TEX2D_SRV;
typedef struct D3D12_TEX2D_ARRAY_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT FirstArraySlice;
    UINT ArraySize;
    UINT PlaneSlice;
    FLOAT ResourceMinLODClamp;
} D3D12_TEX2D_ARRAY_SRV;
typedef struct D3D12_TEX2DMS_SRV {
    UINT UnusedField_NothingToDefine;
} D3D12_TEX2DMS_SRV;
typedef struct D3D12_TEX2DMS_ARRAY_SRV {
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX2DMS_ARRAY_SRV;
typedef struct D3D12_TEX3D_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    FLOAT ResourceMinLODClamp;
} D3D12_TEX3D_SRV;
typedef struct D3D12_TEXCUBE_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    FLOAT ResourceMinLODClamp;
} D3D12_TEXCUBE_SRV;
typedef struct D3D12_TEXCUBE_ARRAY_SRV {
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT First2DArrayFace;
    UINT NumCubes;
    FLOAT ResourceMinLODClamp;
} D3D12_TEXCUBE_ARRAY_SRV;
typedef struct D3D12_SHADER_RESOURCE_VIEW_DESC {
    DXGI_FORMAT Format;
    D3D12_SRV_DIMENSION ViewDimension;
    UINT Shader4ComponentMapping;
    __C89_NAMELESS union {
        D3D12_BUFFER_SRV Buffer;
        D3D12_TEX1D_SRV Texture1D;
        D3D12_TEX1D_ARRAY_SRV Texture1DArray;
        D3D12_TEX2D_SRV Texture2D;
        D3D12_TEX2D_ARRAY_SRV Texture2DArray;
        D3D12_TEX2DMS_SRV Texture2DMS;
        D3D12_TEX2DMS_ARRAY_SRV Texture2DMSArray;
        D3D12_TEX3D_SRV Texture3D;
        D3D12_TEXCUBE_SRV TextureCube;
        D3D12_TEXCUBE_ARRAY_SRV TextureCubeArray;
    } __C89_NAMELESSUNIONNAME;
} D3D12_SHADER_RESOURCE_VIEW_DESC;
typedef enum D3D12_UAV_DIMENSION {
    D3D12_UAV_DIMENSION_UNKNOWN = 0,
    D3D12_UAV_DIMENSION_BUFFER = 1,
    D3D12_UAV_DIMENSION_TEXTURE1D = 2,
    D3D12_UAV_DIMENSION_TEXTURE1DARRAY = 3,
    D3D12_UAV_DIMENSION_TEXTURE2D = 4,
    D3D12_UAV_DIMENSION_TEXTURE2DARRAY = 5,
    D3D12_UAV_DIMENSION_TEXTURE3D = 8
} D3D12_UAV_DIMENSION;
typedef enum D3D12_BUFFER_UAV_FLAGS {
    D3D12_BUFFER_UAV_FLAG_NONE = 0x0,
    D3D12_BUFFER_UAV_FLAG_RAW = 0x1
} D3D12_BUFFER_UAV_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_BUFFER_UAV_FLAGS);
typedef struct D3D12_BUFFER_UAV {
    UINT64 FirstElement;
    UINT NumElements;
    UINT StructureByteStride;
    UINT64 CounterOffsetInBytes;
    D3D12_BUFFER_UAV_FLAGS Flags;
} D3D12_BUFFER_UAV;
typedef struct D3D12_TEX1D_UAV {
    UINT MipSlice;
} D3D12_TEX1D_UAV;
typedef struct D3D12_TEX1D_ARRAY_UAV {
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX1D_ARRAY_UAV;
typedef struct D3D12_TEX2D_UAV {
    UINT MipSlice;
    UINT PlaneSlice;
} D3D12_TEX2D_UAV;
typedef struct D3D12_TEX2D_ARRAY_UAV {
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
    UINT PlaneSlice;
} D3D12_TEX2D_ARRAY_UAV;
typedef struct D3D12_TEX3D_UAV {
    UINT MipSlice;
    UINT FirstWSlice;
    UINT WSize;
} D3D12_TEX3D_UAV;
typedef struct D3D12_UNORDERED_ACCESS_VIEW_DESC {
    DXGI_FORMAT Format;
    D3D12_UAV_DIMENSION ViewDimension;
    __C89_NAMELESS union {
        D3D12_BUFFER_UAV Buffer;
        D3D12_TEX1D_UAV Texture1D;
        D3D12_TEX1D_ARRAY_UAV Texture1DArray;
        D3D12_TEX2D_UAV Texture2D;
        D3D12_TEX2D_ARRAY_UAV Texture2DArray;
        D3D12_TEX3D_UAV Texture3D;
    } __C89_NAMELESSUNIONNAME;
} D3D12_UNORDERED_ACCESS_VIEW_DESC;
typedef enum D3D12_RTV_DIMENSION {
    D3D12_RTV_DIMENSION_UNKNOWN = 0,
    D3D12_RTV_DIMENSION_BUFFER = 1,
    D3D12_RTV_DIMENSION_TEXTURE1D = 2,
    D3D12_RTV_DIMENSION_TEXTURE1DARRAY = 3,
    D3D12_RTV_DIMENSION_TEXTURE2D = 4,
    D3D12_RTV_DIMENSION_TEXTURE2DARRAY = 5,
    D3D12_RTV_DIMENSION_TEXTURE2DMS = 6,
    D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY = 7,
    D3D12_RTV_DIMENSION_TEXTURE3D = 8
} D3D12_RTV_DIMENSION;
typedef struct D3D12_BUFFER_RTV {
    UINT64 FirstElement;
    UINT NumElements;
} D3D12_BUFFER_RTV;
typedef struct D3D12_TEX1D_RTV {
    UINT MipSlice;
} D3D12_TEX1D_RTV;
typedef struct D3D12_TEX1D_ARRAY_RTV {
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX1D_ARRAY_RTV;
typedef struct D3D12_TEX2D_RTV {
    UINT MipSlice;
    UINT PlaneSlice;
} D3D12_TEX2D_RTV;
typedef struct D3D12_TEX2D_ARRAY_RTV {
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
    UINT PlaneSlice;
} D3D12_TEX2D_ARRAY_RTV;
typedef struct D3D12_TEX2DMS_RTV {
    UINT UnusedField_NothingToDefine;
} D3D12_TEX2DMS_RTV;
typedef struct D3D12_TEX2DMS_ARRAY_RTV {
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX2DMS_ARRAY_RTV;
typedef struct D3D12_TEX3D_RTV {
    UINT MipSlice;
    UINT FirstWSlice;
    UINT WSize;
} D3D12_TEX3D_RTV;
typedef struct D3D12_RENDER_TARGET_VIEW_DESC {
    DXGI_FORMAT Format;
    D3D12_RTV_DIMENSION ViewDimension;
    __C89_NAMELESS union {
        D3D12_BUFFER_RTV Buffer;
        D3D12_TEX1D_RTV Texture1D;
        D3D12_TEX1D_ARRAY_RTV Texture1DArray;
        D3D12_TEX2D_RTV Texture2D;
        D3D12_TEX2D_ARRAY_RTV Texture2DArray;
        D3D12_TEX2DMS_RTV Texture2DMS;
        D3D12_TEX2DMS_ARRAY_RTV Texture2DMSArray;
        D3D12_TEX3D_RTV Texture3D;
    } __C89_NAMELESSUNIONNAME;
} D3D12_RENDER_TARGET_VIEW_DESC;
typedef enum D3D12_DSV_DIMENSION {
    D3D12_DSV_DIMENSION_UNKNOWN = 0,
    D3D12_DSV_DIMENSION_TEXTURE1D = 1,
    D3D12_DSV_DIMENSION_TEXTURE1DARRAY = 2,
    D3D12_DSV_DIMENSION_TEXTURE2D = 3,
    D3D12_DSV_DIMENSION_TEXTURE2DARRAY = 4,
    D3D12_DSV_DIMENSION_TEXTURE2DMS = 5,
    D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY = 6
} D3D12_DSV_DIMENSION;
typedef enum D3D12_DSV_FLAGS {
    D3D12_DSV_FLAG_NONE = 0x0,
    D3D12_DSV_FLAG_READ_ONLY_DEPTH = 0x1,
    D3D12_DSV_FLAG_READ_ONLY_STENCIL = 0x2
} D3D12_DSV_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_DSV_FLAGS);
typedef struct D3D12_TEX1D_DSV {
    UINT MipSlice;
} D3D12_TEX1D_DSV;
typedef struct D3D12_TEX1D_ARRAY_DSV {
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX1D_ARRAY_DSV;
typedef struct D3D12_TEX2D_DSV {
    UINT MipSlice;
} D3D12_TEX2D_DSV;
typedef struct D3D12_TEX2D_ARRAY_DSV {
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX2D_ARRAY_DSV;
typedef struct D3D12_TEX2DMS_DSV {
    UINT UnusedField_NothingToDefine;
} D3D12_TEX2DMS_DSV;
typedef struct D3D12_TEX2DMS_ARRAY_DSV {
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D12_TEX2DMS_ARRAY_DSV;
typedef struct D3D12_DEPTH_STENCIL_VIEW_DESC {
    DXGI_FORMAT Format;
    D3D12_DSV_DIMENSION ViewDimension;
    D3D12_DSV_FLAGS Flags;
    __C89_NAMELESS union {
        D3D12_TEX1D_DSV Texture1D;
        D3D12_TEX1D_ARRAY_DSV Texture1DArray;
        D3D12_TEX2D_DSV Texture2D;
        D3D12_TEX2D_ARRAY_DSV Texture2DArray;
        D3D12_TEX2DMS_DSV Texture2DMS;
        D3D12_TEX2DMS_ARRAY_DSV Texture2DMSArray;
    } __C89_NAMELESSUNIONNAME;
} D3D12_DEPTH_STENCIL_VIEW_DESC;
typedef struct D3D12_SAMPLER_DESC {
    D3D12_FILTER Filter;
    D3D12_TEXTURE_ADDRESS_MODE AddressU;
    D3D12_TEXTURE_ADDRESS_MODE AddressV;
    D3D12_TEXTURE_ADDRESS_MODE AddressW;
    FLOAT MipLODBias;
    UINT MaxAnisotropy;
    D3D12_COMPARISON_FUNC ComparisonFunc;
    FLOAT BorderColor[4];
    FLOAT MinLOD;
    FLOAT MaxLOD;
} D3D12_SAMPLER_DESC;
typedef struct D3D12_CPU_DESCRIPTOR_HANDLE {
    SIZE_T ptr;
} D3D12_CPU_DESCRIPTOR_HANDLE;
typedef struct D3D12_GPU_DESCRIPTOR_HANDLE {
    UINT64 ptr;
} D3D12_GPU_DESCRIPTOR_HANDLE;
typedef enum D3D12_STENCIL_OP {
    D3D12_STENCIL_OP_KEEP = 1,
    D3D12_STENCIL_OP_ZERO = 2,
    D3D12_STENCIL_OP_REPLACE = 3,
    D3D12_STENCIL_OP_INCR_SAT = 4,
    D3D12_STENCIL_OP_DECR_SAT = 5,
    D3D12_STENCIL_OP_INVERT = 6,
    D3D12_STENCIL_OP_INCR = 7,
    D3D12_STENCIL_OP_DECR = 8
} D3D12_STENCIL_OP;
typedef struct D3D12_DEPTH_STENCILOP_DESC {
    D3D12_STENCIL_OP StencilFailOp;
    D3D12_STENCIL_OP StencilDepthFailOp;
    D3D12_STENCIL_OP StencilPassOp;
    D3D12_COMPARISON_FUNC StencilFunc;
} D3D12_DEPTH_STENCILOP_DESC;
typedef enum D3D12_DEPTH_WRITE_MASK {
    D3D12_DEPTH_WRITE_MASK_ZERO = 0,
    D3D12_DEPTH_WRITE_MASK_ALL = 1
} D3D12_DEPTH_WRITE_MASK;
typedef struct D3D12_DEPTH_STENCIL_DESC {
    WINBOOL DepthEnable;
    D3D12_DEPTH_WRITE_MASK DepthWriteMask;
    D3D12_COMPARISON_FUNC DepthFunc;
    WINBOOL StencilEnable;
    UINT8 StencilReadMask;
    UINT8 StencilWriteMask;
    D3D12_DEPTH_STENCILOP_DESC FrontFace;
    D3D12_DEPTH_STENCILOP_DESC BackFace;
} D3D12_DEPTH_STENCIL_DESC;
typedef enum D3D12_BLEND {
    D3D12_BLEND_ZERO = 1,
    D3D12_BLEND_ONE = 2,
    D3D12_BLEND_SRC_COLOR = 3,
    D3D12_BLEND_INV_SRC_COLOR = 4,
    D3D12_BLEND_SRC_ALPHA = 5,
    D3D12_BLEND_INV_SRC_ALPHA = 6,
    D3D12_BLEND_DEST_ALPHA = 7,
    D3D12_BLEND_INV_DEST_ALPHA = 8,
    D3D12_BLEND_DEST_COLOR = 9,
    D3D12_BLEND_INV_DEST_COLOR = 10,
    D3D12_BLEND_SRC_ALPHA_SAT = 11,
    D3D12_BLEND_BLEND_FACTOR = 14,
    D3D12_BLEND_INV_BLEND_FACTOR = 15,
    D3D12_BLEND_SRC1_COLOR = 16,
    D3D12_BLEND_INV_SRC1_COLOR = 17,
    D3D12_BLEND_SRC1_ALPHA = 18,
    D3D12_BLEND_INV_SRC1_ALPHA = 19
} D3D12_BLEND;
typedef enum D3D12_BLEND_OP {
    D3D12_BLEND_OP_ADD = 1,
    D3D12_BLEND_OP_SUBTRACT = 2,
    D3D12_BLEND_OP_REV_SUBTRACT = 3,
    D3D12_BLEND_OP_MIN = 4,
    D3D12_BLEND_OP_MAX = 5
} D3D12_BLEND_OP;
typedef enum D3D12_LOGIC_OP {
    D3D12_LOGIC_OP_CLEAR = 0,
    D3D12_LOGIC_OP_SET = 1,
    D3D12_LOGIC_OP_COPY = 2,
    D3D12_LOGIC_OP_COPY_INVERTED = 3,
    D3D12_LOGIC_OP_NOOP = 4
} D3D12_LOGIC_OP;
typedef enum D3D12_COLOR_WRITE_ENABLE {
    D3D12_COLOR_WRITE_ENABLE_RED = 0x1,
    D3D12_COLOR_WRITE_ENABLE_GREEN = 0x2,
    D3D12_COLOR_WRITE_ENABLE_BLUE = 0x4,
    D3D12_COLOR_WRITE_ENABLE_ALPHA = 0x8,
    D3D12_COLOR_WRITE_ENABLE_ALL = ((D3D12_COLOR_WRITE_ENABLE_RED | D3D12_COLOR_WRITE_ENABLE_GREEN) | D3D12_COLOR_WRITE_ENABLE_BLUE) | D3D12_COLOR_WRITE_ENABLE_ALPHA
} D3D12_COLOR_WRITE_ENABLE;
typedef struct D3D12_RENDER_TARGET_BLEND_DESC {
    WINBOOL BlendEnable;
    WINBOOL LogicOpEnable;
    D3D12_BLEND SrcBlend;
    D3D12_BLEND DestBlend;
    D3D12_BLEND_OP BlendOp;
    D3D12_BLEND SrcBlendAlpha;
    D3D12_BLEND DestBlendAlpha;
    D3D12_BLEND_OP BlendOpAlpha;
    D3D12_LOGIC_OP LogicOp;
    UINT8 RenderTargetWriteMask;
} D3D12_RENDER_TARGET_BLEND_DESC;
typedef struct D3D12_BLEND_DESC {
    WINBOOL AlphaToCoverageEnable;
    WINBOOL IndependentBlendEnable;
    D3D12_RENDER_TARGET_BLEND_DESC RenderTarget[8];
} D3D12_BLEND_DESC;
typedef enum D3D12_FILL_MODE {
    D3D12_FILL_MODE_WIREFRAME = 2,
    D3D12_FILL_MODE_SOLID = 3
} D3D12_FILL_MODE;
typedef enum D3D12_CULL_MODE {
    D3D12_CULL_MODE_NONE = 1,
    D3D12_CULL_MODE_FRONT = 2,
    D3D12_CULL_MODE_BACK = 3
} D3D12_CULL_MODE;
typedef enum D3D12_CONSERVATIVE_RASTERIZATION_MODE {
    D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF = 0,
    D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON = 1
} D3D12_CONSERVATIVE_RASTERIZATION_MODE;
typedef struct D3D12_RASTERIZER_DESC {
    D3D12_FILL_MODE FillMode;
    D3D12_CULL_MODE CullMode;
    WINBOOL FrontCounterClockwise;
    INT DepthBias;
    FLOAT DepthBiasClamp;
    FLOAT SlopeScaledDepthBias;
    WINBOOL DepthClipEnable;
    WINBOOL MultisampleEnable;
    WINBOOL AntialiasedLineEnable;
    UINT ForcedSampleCount;
    D3D12_CONSERVATIVE_RASTERIZATION_MODE ConservativeRaster;
} D3D12_RASTERIZER_DESC;
typedef struct D3D12_SO_DECLARATION_ENTRY {
    UINT Stream;
    const char *SemanticName;
    UINT SemanticIndex;
    BYTE StartComponent;
    BYTE ComponentCount;
    BYTE OutputSlot;
} D3D12_SO_DECLARATION_ENTRY;
typedef struct D3D12_STREAM_OUTPUT_DESC {
    const D3D12_SO_DECLARATION_ENTRY *pSODeclaration;
    UINT NumEntries;
    const UINT *pBufferStrides;
    UINT NumStrides;
    UINT RasterizedStream;
} D3D12_STREAM_OUTPUT_DESC;
typedef enum D3D12_INPUT_CLASSIFICATION {
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA = 0,
    D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA = 1
} D3D12_INPUT_CLASSIFICATION;
typedef struct D3D12_INPUT_ELEMENT_DESC {
    const char *SemanticName;
    UINT SemanticIndex;
    DXGI_FORMAT Format;
    UINT InputSlot;
    UINT AlignedByteOffset;
    D3D12_INPUT_CLASSIFICATION InputSlotClass;
    UINT InstanceDataStepRate;
} D3D12_INPUT_ELEMENT_DESC;
typedef struct D3D12_INPUT_LAYOUT_DESC {
    const D3D12_INPUT_ELEMENT_DESC *pInputElementDescs;
    UINT NumElements;
} D3D12_INPUT_LAYOUT_DESC;
typedef enum D3D12_INDEX_BUFFER_STRIP_CUT_VALUE {
    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED = 0,
    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF = 1,
    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF = 2
} D3D12_INDEX_BUFFER_STRIP_CUT_VALUE;
typedef D3D_PRIMITIVE_TOPOLOGY D3D12_PRIMITIVE_TOPOLOGY;
typedef enum D3D12_PRIMITIVE_TOPOLOGY_TYPE {
    D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED = 0,
    D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT = 1,
    D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE = 2,
    D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE = 3,
    D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH = 4
} D3D12_PRIMITIVE_TOPOLOGY_TYPE;
typedef struct D3D12_CACHED_PIPELINE_STATE {
    const void *pCachedBlob;
    SIZE_T CachedBlobSizeInBytes;
} D3D12_CACHED_PIPELINE_STATE;
typedef enum D3D12_PIPELINE_STATE_FLAGS {
    D3D12_PIPELINE_STATE_FLAG_NONE = 0x0,
    D3D12_PIPELINE_STATE_FLAG_DEBUG = 0x1
} D3D12_PIPELINE_STATE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_PIPELINE_STATE_FLAGS);
typedef struct D3D12_GRAPHICS_PIPELINE_STATE_DESC {
    ID3D12RootSignature *pRootSignature;
    D3D12_SHADER_BYTECODE VS;
    D3D12_SHADER_BYTECODE PS;
    D3D12_SHADER_BYTECODE DS;
    D3D12_SHADER_BYTECODE HS;
    D3D12_SHADER_BYTECODE GS;
    D3D12_STREAM_OUTPUT_DESC StreamOutput;
    D3D12_BLEND_DESC BlendState;
    UINT SampleMask;
    D3D12_RASTERIZER_DESC RasterizerState;
    D3D12_DEPTH_STENCIL_DESC DepthStencilState;
    D3D12_INPUT_LAYOUT_DESC InputLayout;
    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue;
    D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
    UINT NumRenderTargets;
    DXGI_FORMAT RTVFormats[8];
    DXGI_FORMAT DSVFormat;
    DXGI_SAMPLE_DESC SampleDesc;
    UINT NodeMask;
    D3D12_CACHED_PIPELINE_STATE CachedPSO;
    D3D12_PIPELINE_STATE_FLAGS Flags;
} D3D12_GRAPHICS_PIPELINE_STATE_DESC;
typedef struct D3D12_COMPUTE_PIPELINE_STATE_DESC {
    ID3D12RootSignature *pRootSignature;
    D3D12_SHADER_BYTECODE CS;
    UINT NodeMask;
    D3D12_CACHED_PIPELINE_STATE CachedPSO;
    D3D12_PIPELINE_STATE_FLAGS Flags;
} D3D12_COMPUTE_PIPELINE_STATE_DESC;
typedef enum D3D12_COMMAND_LIST_TYPE {
    D3D12_COMMAND_LIST_TYPE_DIRECT = 0,
    D3D12_COMMAND_LIST_TYPE_BUNDLE = 1,
    D3D12_COMMAND_LIST_TYPE_COMPUTE = 2,
    D3D12_COMMAND_LIST_TYPE_COPY = 3
} D3D12_COMMAND_LIST_TYPE;
typedef enum D3D12_COMMAND_QUEUE_PRIORITY {
    D3D12_COMMAND_QUEUE_PRIORITY_NORMAL = 0,
    D3D12_COMMAND_QUEUE_PRIORITY_HIGH = 100,
    D3D12_COMMAND_QUEUE_PRIORITY_GLOBAL_REALTIME = 10000
} D3D12_COMMAND_QUEUE_PRIORITY;
typedef enum D3D12_COMMAND_QUEUE_FLAGS {
    D3D12_COMMAND_QUEUE_FLAG_NONE = 0x0,
    D3D12_COMMAND_QUEUE_FLAG_DISABLE_GPU_TIMEOUT = 0x1
} D3D12_COMMAND_QUEUE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_COMMAND_QUEUE_FLAGS);
typedef struct D3D12_COMMAND_QUEUE_DESC {
    D3D12_COMMAND_LIST_TYPE Type;
    INT Priority;
    D3D12_COMMAND_QUEUE_FLAGS Flags;
    UINT NodeMask;
} D3D12_COMMAND_QUEUE_DESC;
typedef struct D3D12_FEATURE_DATA_ARCHITECTURE {
    UINT NodeIndex;
    WINBOOL TileBasedRenderer;
    WINBOOL UMA;
    WINBOOL CacheCoherentUMA;
} D3D12_FEATURE_DATA_ARCHITECTURE;
typedef struct D3D12_FEATURE_DATA_FORMAT_INFO {
    DXGI_FORMAT Format;
    UINT8 PlaneCount;
} D3D12_FEATURE_DATA_FORMAT_INFO;
typedef struct D3D12_FEATURE_DATA_FEATURE_LEVELS {
    UINT NumFeatureLevels;
    const D3D_FEATURE_LEVEL *pFeatureLevelsRequested;
    D3D_FEATURE_LEVEL MaxSupportedFeatureLevel;
} D3D12_FEATURE_DATA_FEATURE_LEVELS;
typedef struct D3D12_FEATURE_DATA_ROOT_SIGNATURE {
    D3D_ROOT_SIGNATURE_VERSION HighestVersion;
} D3D12_FEATURE_DATA_ROOT_SIGNATURE;
typedef struct D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT {
    UINT MaxGPUVirtualAddressBitsPerResource;
    UINT MaxGPUVirtualAddressBitsPerProcess;
} D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT;
typedef enum D3D_SHADER_MODEL {
    D3D_SHADER_MODEL_5_1 = 0x51,
    D3D_SHADER_MODEL_6_0 = 0x60
} D3D_SHADER_MODEL;
typedef struct D3D12_FEATURE_DATA_SHADER_MODEL {
    D3D_SHADER_MODEL HighestShaderModel;
} D3D12_FEATURE_DATA_SHADER_MODEL;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS1 {
    WINBOOL WaveOps;
    UINT WaveLaneCountMin;
    UINT WaveLaneCountMax;
    UINT TotalLaneCount;
    WINBOOL ExpandedComputeResourceStates;
    WINBOOL Int64ShaderOps;
} D3D12_FEATURE_DATA_D3D12_OPTIONS1;
typedef struct D3D12_FEATURE_DATA_ARCHITECTURE1 {
    UINT NodeIndex;
    WINBOOL TileBasedRenderer;
    WINBOOL UMA;
    WINBOOL CacheCoherentUMA;
    WINBOOL IsolatedMMU;
} D3D12_FEATURE_DATA_ARCHITECTURE1;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS2 {
    WINBOOL DepthBoundsTestSupported;
    D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER ProgrammableSamplePositionsTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS2;
typedef struct D3D12_FEATURE_DATA_SHADER_CACHE {
    D3D12_SHADER_CACHE_SUPPORT_FLAGS SupportFlags;
} D3D12_FEATURE_DATA_SHADER_CACHE;
typedef struct D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY {
    D3D12_COMMAND_LIST_TYPE CommandListType;
    UINT Priority;
    WINBOOL PriorityForTypeIsSupported;
} D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS3 {
    WINBOOL CopyQueueTimestampQueriesSupported;
    WINBOOL CastingFullyTypedFormatSupported;
    D3D12_COMMAND_LIST_SUPPORT_FLAGS WriteBufferImmediateSupportFlags;
    D3D12_VIEW_INSTANCING_TIER ViewInstancingTier;
    WINBOOL BarycentricsSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS3;
typedef struct D3D12_FEATURE_DATA_EXISTING_HEAPS {
    WINBOOL Supported;
} D3D12_FEATURE_DATA_EXISTING_HEAPS;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS4 {
    WINBOOL MSAA64KBAlignedTextureSupported;
    D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER SharedResourceCompatibilityTier;
    WINBOOL Native16BitShaderOpsSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS4;
typedef struct D3D12_FEATURE_DATA_SERIALIZATION {
    UINT NodeIndex;
    D3D12_HEAP_SERIALIZATION_TIER HeapSerializationTier;
} D3D12_FEATURE_DATA_SERIALIZATION;
typedef struct D3D12_FEATURE_DATA_CROSS_NODE {
    D3D12_CROSS_NODE_SHARING_TIER SharingTier;
    WINBOOL AtomicShaderInstructions;
} D3D12_FEATURE_DATA_CROSS_NODE;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS5 {
    WINBOOL SRVOnlyTiledResourceTier3;
    D3D12_RENDER_PASS_TIER RenderPassesTier;
    D3D12_RAYTRACING_TIER RaytracingTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS5;
typedef enum D3D12_FEATURE {
    D3D12_FEATURE_D3D12_OPTIONS = 0,
    D3D12_FEATURE_ARCHITECTURE = 1,
    D3D12_FEATURE_FEATURE_LEVELS = 2,
    D3D12_FEATURE_FORMAT_SUPPORT = 3,
    D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS = 4,
    D3D12_FEATURE_FORMAT_INFO = 5,
    D3D12_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT = 6,
    D3D12_FEATURE_SHADER_MODEL = 7,
    D3D12_FEATURE_D3D12_OPTIONS1 = 8,
    D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_SUPPORT = 10,
    D3D12_FEATURE_ROOT_SIGNATURE = 12,
    D3D12_FEATURE_ARCHITECTURE1 = 16,
    D3D12_FEATURE_D3D12_OPTIONS2 = 18,
    D3D12_FEATURE_SHADER_CACHE = 19,
    D3D12_FEATURE_COMMAND_QUEUE_PRIORITY = 20,
    D3D12_FEATURE_D3D12_OPTIONS3 = 21,
    D3D12_FEATURE_EXISTING_HEAPS = 22,
    D3D12_FEATURE_D3D12_OPTIONS4 = 23,
    D3D12_FEATURE_SERIALIZATION = 24,
    D3D12_FEATURE_CROSS_NODE = 25,
    D3D12_FEATURE_D3D12_OPTIONS5 = 27,
    D3D12_FEATURE_D3D12_OPTIONS6 = 30,
    D3D12_FEATURE_QUERY_META_COMMAND = 31,
    D3D12_FEATURE_D3D12_OPTIONS7 = 32,
    D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPE_COUNT = 33,
    D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPES = 34
} D3D12_FEATURE;
typedef struct D3D12_MEMCPY_DEST {
    void *pData;
    SIZE_T RowPitch;
    SIZE_T SlicePitch;
} D3D12_MEMCPY_DEST;
typedef struct D3D12_SUBRESOURCE_DATA {
    const void *pData;
    LONG_PTR RowPitch;
    LONG_PTR SlicePitch;
} D3D12_SUBRESOURCE_DATA;
typedef enum D3D12_MULTIPLE_FENCE_WAIT_FLAGS {
    D3D12_MULTIPLE_FENCE_WAIT_FLAG_NONE = 0x0,
    D3D12_MULTIPLE_FENCE_WAIT_FLAG_ANY = 0x1,
    D3D12_MULTIPLE_FENCE_WAIT_FLAG_ALL = 0x0
} D3D12_MULTIPLE_FENCE_WAIT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_MULTIPLE_FENCE_WAIT_FLAGS);
typedef enum D3D12_RESIDENCY_PRIORITY {
    D3D12_RESIDENCY_PRIORITY_MINIMUM = 0x28000000,
    D3D12_RESIDENCY_PRIORITY_LOW = 0x50000000,
    D3D12_RESIDENCY_PRIORITY_NORMAL = 0x78000000,
    D3D12_RESIDENCY_PRIORITY_HIGH = 0xa0010000,
    D3D12_RESIDENCY_PRIORITY_MAXIMUM = 0xc8000000
} D3D12_RESIDENCY_PRIORITY;
typedef struct D3D12_WRITEBUFFERIMMEDIATE_PARAMETER {
    D3D12_GPU_VIRTUAL_ADDRESS Dest;
    UINT32 Value;
} D3D12_WRITEBUFFERIMMEDIATE_PARAMETER;
/*****************************************************************************
 * ID3D12Object interface
 */
#ifndef __ID3D12Object_INTERFACE_DEFINED__
#define __ID3D12Object_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Object, 0xc4fec28f, 0x7966, 0x4e95, 0x9f,0x94, 0xf4,0x31,0xcb,0x56,0xc3,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c4fec28f-7966-4e95-9f94-f431cb56c3b8")
ID3D12Object : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPrivateData(
        REFGUID guid,
        UINT *data_size,
        void *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrivateData(
        REFGUID guid,
        UINT data_size,
        const void *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(
        REFGUID guid,
        const IUnknown *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        const WCHAR *name) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Object, 0xc4fec28f, 0x7966, 0x4e95, 0x9f,0x94, 0xf4,0x31,0xcb,0x56,0xc3,0xb8)
#endif
#else
typedef struct ID3D12ObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Object *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Object *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Object *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Object *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Object *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Object *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Object *This,
        const WCHAR *name);

    END_INTERFACE
} ID3D12ObjectVtbl;

interface ID3D12Object {
    CONST_VTBL ID3D12ObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Object_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Object_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Object_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Object_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Object_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Object_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Object_SetName(This,name) (This)->lpVtbl->SetName(This,name)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Object_QueryInterface(ID3D12Object* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Object_AddRef(ID3D12Object* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Object_Release(ID3D12Object* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Object_GetPrivateData(ID3D12Object* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Object_SetPrivateData(ID3D12Object* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Object_SetPrivateDataInterface(ID3D12Object* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Object_SetName(ID3D12Object* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
#endif
#endif

#endif


#endif  /* __ID3D12Object_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12DeviceChild interface
 */
#ifndef __ID3D12DeviceChild_INTERFACE_DEFINED__
#define __ID3D12DeviceChild_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DeviceChild, 0x905db94b, 0xa00c, 0x4140, 0x9d,0xf5, 0x2b,0x64,0xca,0x9e,0xa3,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("905db94b-a00c-4140-9df5-2b64ca9ea357")
ID3D12DeviceChild : public ID3D12Object
{
    virtual HRESULT STDMETHODCALLTYPE GetDevice(
        REFIID riid,
        void **device) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DeviceChild, 0x905db94b, 0xa00c, 0x4140, 0x9d,0xf5, 0x2b,0x64,0xca,0x9e,0xa3,0x57)
#endif
#else
typedef struct ID3D12DeviceChildVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12DeviceChild *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12DeviceChild *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12DeviceChild *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12DeviceChild *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12DeviceChild *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12DeviceChild *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12DeviceChild *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12DeviceChild *This,
        REFIID riid,
        void **device);

    END_INTERFACE
} ID3D12DeviceChildVtbl;

interface ID3D12DeviceChild {
    CONST_VTBL ID3D12DeviceChildVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DeviceChild_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DeviceChild_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DeviceChild_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12DeviceChild_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12DeviceChild_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12DeviceChild_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12DeviceChild_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12DeviceChild_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12DeviceChild_QueryInterface(ID3D12DeviceChild* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12DeviceChild_AddRef(ID3D12DeviceChild* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12DeviceChild_Release(ID3D12DeviceChild* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12DeviceChild_GetPrivateData(ID3D12DeviceChild* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12DeviceChild_SetPrivateData(ID3D12DeviceChild* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12DeviceChild_SetPrivateDataInterface(ID3D12DeviceChild* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12DeviceChild_SetName(ID3D12DeviceChild* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12DeviceChild_GetDevice(ID3D12DeviceChild* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
#endif
#endif

#endif


#endif  /* __ID3D12DeviceChild_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Pageable interface
 */
#ifndef __ID3D12Pageable_INTERFACE_DEFINED__
#define __ID3D12Pageable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Pageable, 0x63ee58fb, 0x1268, 0x4835, 0x86,0xda, 0xf0,0x08,0xce,0x62,0xf0,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("63ee58fb-1268-4835-86da-f008ce62f0d6")
ID3D12Pageable : public ID3D12DeviceChild
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Pageable, 0x63ee58fb, 0x1268, 0x4835, 0x86,0xda, 0xf0,0x08,0xce,0x62,0xf0,0xd6)
#endif
#else
typedef struct ID3D12PageableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Pageable *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Pageable *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Pageable *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Pageable *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Pageable *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Pageable *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Pageable *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12Pageable *This,
        REFIID riid,
        void **device);

    END_INTERFACE
} ID3D12PageableVtbl;

interface ID3D12Pageable {
    CONST_VTBL ID3D12PageableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Pageable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Pageable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Pageable_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Pageable_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Pageable_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Pageable_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Pageable_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Pageable_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Pageable_QueryInterface(ID3D12Pageable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Pageable_AddRef(ID3D12Pageable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Pageable_Release(ID3D12Pageable* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Pageable_GetPrivateData(ID3D12Pageable* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Pageable_SetPrivateData(ID3D12Pageable* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Pageable_SetPrivateDataInterface(ID3D12Pageable* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Pageable_SetName(ID3D12Pageable* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12Pageable_GetDevice(ID3D12Pageable* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
#endif
#endif

#endif


#endif  /* __ID3D12Pageable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Heap interface
 */
#ifndef __ID3D12Heap_INTERFACE_DEFINED__
#define __ID3D12Heap_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Heap, 0x6b3b2502, 0x6e51, 0x45b3, 0x90,0xee, 0x98,0x84,0x26,0x5e,0x8d,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6b3b2502-6e51-45b3-90ee-9884265e8df3")
ID3D12Heap : public ID3D12Pageable
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_HEAP_DESC* STDMETHODCALLTYPE GetDesc(
        D3D12_HEAP_DESC *__ret) = 0;
    D3D12_HEAP_DESC STDMETHODCALLTYPE GetDesc(
        )
    {
        D3D12_HEAP_DESC __ret;
        return *GetDesc(&__ret);
    }
#else
    virtual D3D12_HEAP_DESC STDMETHODCALLTYPE GetDesc(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Heap, 0x6b3b2502, 0x6e51, 0x45b3, 0x90,0xee, 0x98,0x84,0x26,0x5e,0x8d,0xf3)
#endif
#else
typedef struct ID3D12HeapVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Heap *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Heap *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Heap *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Heap *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Heap *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Heap *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Heap *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12Heap *This,
        REFIID riid,
        void **device);

    /*** ID3D12Heap methods ***/
    D3D12_HEAP_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12Heap *This,
        D3D12_HEAP_DESC *__ret);

    END_INTERFACE
} ID3D12HeapVtbl;

interface ID3D12Heap {
    CONST_VTBL ID3D12HeapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Heap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Heap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Heap_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Heap_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Heap_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Heap_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Heap_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Heap_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Heap methods ***/
#define ID3D12Heap_GetDesc(This) ID3D12Heap_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Heap_QueryInterface(ID3D12Heap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Heap_AddRef(ID3D12Heap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Heap_Release(ID3D12Heap* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Heap_GetPrivateData(ID3D12Heap* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Heap_SetPrivateData(ID3D12Heap* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Heap_SetPrivateDataInterface(ID3D12Heap* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Heap_SetName(ID3D12Heap* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12Heap_GetDevice(ID3D12Heap* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Heap methods ***/
static FORCEINLINE D3D12_HEAP_DESC ID3D12Heap_GetDesc(ID3D12Heap* This) {
    D3D12_HEAP_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12Heap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Resource interface
 */
#ifndef __ID3D12Resource_INTERFACE_DEFINED__
#define __ID3D12Resource_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Resource, 0x696442be, 0xa72e, 0x4059, 0xbc,0x79, 0x5b,0x5c,0x98,0x04,0x0f,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("696442be-a72e-4059-bc79-5b5c98040fad")
ID3D12Resource : public ID3D12Pageable
{
    virtual HRESULT STDMETHODCALLTYPE Map(
        UINT sub_resource,
        const D3D12_RANGE *read_range,
        void **data) = 0;

    virtual void STDMETHODCALLTYPE Unmap(
        UINT sub_resource,
        const D3D12_RANGE *written_range) = 0;

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_RESOURCE_DESC* STDMETHODCALLTYPE GetDesc(
        D3D12_RESOURCE_DESC *__ret) = 0;
    D3D12_RESOURCE_DESC STDMETHODCALLTYPE GetDesc(
        )
    {
        D3D12_RESOURCE_DESC __ret;
        return *GetDesc(&__ret);
    }
#else
    virtual D3D12_RESOURCE_DESC STDMETHODCALLTYPE GetDesc(
        ) = 0;
#endif

    virtual D3D12_GPU_VIRTUAL_ADDRESS STDMETHODCALLTYPE GetGPUVirtualAddress(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteToSubresource(
        UINT dst_sub_resource,
        const D3D12_BOX *dst_box,
        const void *src_data,
        UINT src_row_pitch,
        UINT src_slice_pitch) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadFromSubresource(
        void *dst_data,
        UINT dst_row_pitch,
        UINT dst_slice_pitch,
        UINT src_sub_resource,
        const D3D12_BOX *src_box) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHeapProperties(
        D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS *flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Resource, 0x696442be, 0xa72e, 0x4059, 0xbc,0x79, 0x5b,0x5c,0x98,0x04,0x0f,0xad)
#endif
#else
typedef struct ID3D12ResourceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Resource *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Resource *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Resource *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Resource *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Resource *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Resource *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Resource *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12Resource *This,
        REFIID riid,
        void **device);

    /*** ID3D12Resource methods ***/
    HRESULT (STDMETHODCALLTYPE *Map)(
        ID3D12Resource *This,
        UINT sub_resource,
        const D3D12_RANGE *read_range,
        void **data);

    void (STDMETHODCALLTYPE *Unmap)(
        ID3D12Resource *This,
        UINT sub_resource,
        const D3D12_RANGE *written_range);

    D3D12_RESOURCE_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12Resource *This,
        D3D12_RESOURCE_DESC *__ret);

    D3D12_GPU_VIRTUAL_ADDRESS (STDMETHODCALLTYPE *GetGPUVirtualAddress)(
        ID3D12Resource *This);

    HRESULT (STDMETHODCALLTYPE *WriteToSubresource)(
        ID3D12Resource *This,
        UINT dst_sub_resource,
        const D3D12_BOX *dst_box,
        const void *src_data,
        UINT src_row_pitch,
        UINT src_slice_pitch);

    HRESULT (STDMETHODCALLTYPE *ReadFromSubresource)(
        ID3D12Resource *This,
        void *dst_data,
        UINT dst_row_pitch,
        UINT dst_slice_pitch,
        UINT src_sub_resource,
        const D3D12_BOX *src_box);

    HRESULT (STDMETHODCALLTYPE *GetHeapProperties)(
        ID3D12Resource *This,
        D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS *flags);

    END_INTERFACE
} ID3D12ResourceVtbl;

interface ID3D12Resource {
    CONST_VTBL ID3D12ResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Resource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Resource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Resource_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Resource_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Resource_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Resource_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Resource_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Resource_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Resource methods ***/
#define ID3D12Resource_Map(This,sub_resource,read_range,data) (This)->lpVtbl->Map(This,sub_resource,read_range,data)
#define ID3D12Resource_Unmap(This,sub_resource,written_range) (This)->lpVtbl->Unmap(This,sub_resource,written_range)
#define ID3D12Resource_GetDesc(This) ID3D12Resource_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Resource_GetGPUVirtualAddress(This) (This)->lpVtbl->GetGPUVirtualAddress(This)
#define ID3D12Resource_WriteToSubresource(This,dst_sub_resource,dst_box,src_data,src_row_pitch,src_slice_pitch) (This)->lpVtbl->WriteToSubresource(This,dst_sub_resource,dst_box,src_data,src_row_pitch,src_slice_pitch)
#define ID3D12Resource_ReadFromSubresource(This,dst_data,dst_row_pitch,dst_slice_pitch,src_sub_resource,src_box) (This)->lpVtbl->ReadFromSubresource(This,dst_data,dst_row_pitch,dst_slice_pitch,src_sub_resource,src_box)
#define ID3D12Resource_GetHeapProperties(This,heap_properties,flags) (This)->lpVtbl->GetHeapProperties(This,heap_properties,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Resource_QueryInterface(ID3D12Resource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Resource_AddRef(ID3D12Resource* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Resource_Release(ID3D12Resource* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Resource_GetPrivateData(ID3D12Resource* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Resource_SetPrivateData(ID3D12Resource* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Resource_SetPrivateDataInterface(ID3D12Resource* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Resource_SetName(ID3D12Resource* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12Resource_GetDevice(ID3D12Resource* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Resource methods ***/
static FORCEINLINE HRESULT ID3D12Resource_Map(ID3D12Resource* This,UINT sub_resource,const D3D12_RANGE *read_range,void **data) {
    return This->lpVtbl->Map(This,sub_resource,read_range,data);
}
static FORCEINLINE void ID3D12Resource_Unmap(ID3D12Resource* This,UINT sub_resource,const D3D12_RANGE *written_range) {
    This->lpVtbl->Unmap(This,sub_resource,written_range);
}
static FORCEINLINE D3D12_RESOURCE_DESC ID3D12Resource_GetDesc(ID3D12Resource* This) {
    D3D12_RESOURCE_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
static FORCEINLINE D3D12_GPU_VIRTUAL_ADDRESS ID3D12Resource_GetGPUVirtualAddress(ID3D12Resource* This) {
    return This->lpVtbl->GetGPUVirtualAddress(This);
}
static FORCEINLINE HRESULT ID3D12Resource_WriteToSubresource(ID3D12Resource* This,UINT dst_sub_resource,const D3D12_BOX *dst_box,const void *src_data,UINT src_row_pitch,UINT src_slice_pitch) {
    return This->lpVtbl->WriteToSubresource(This,dst_sub_resource,dst_box,src_data,src_row_pitch,src_slice_pitch);
}
static FORCEINLINE HRESULT ID3D12Resource_ReadFromSubresource(ID3D12Resource* This,void *dst_data,UINT dst_row_pitch,UINT dst_slice_pitch,UINT src_sub_resource,const D3D12_BOX *src_box) {
    return This->lpVtbl->ReadFromSubresource(This,dst_data,dst_row_pitch,dst_slice_pitch,src_sub_resource,src_box);
}
static FORCEINLINE HRESULT ID3D12Resource_GetHeapProperties(ID3D12Resource* This,D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS *flags) {
    return This->lpVtbl->GetHeapProperties(This,heap_properties,flags);
}
#endif
#endif

#endif


#endif  /* __ID3D12Resource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12CommandList interface
 */
#ifndef __ID3D12CommandList_INTERFACE_DEFINED__
#define __ID3D12CommandList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12CommandList, 0x7116d91c, 0xe7e4, 0x47ce, 0xb8,0xc6, 0xec,0x81,0x68,0xf4,0x37,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7116d91c-e7e4-47ce-b8c6-ec8168f437e5")
ID3D12CommandList : public ID3D12DeviceChild
{
    virtual D3D12_COMMAND_LIST_TYPE STDMETHODCALLTYPE GetType(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12CommandList, 0x7116d91c, 0xe7e4, 0x47ce, 0xb8,0xc6, 0xec,0x81,0x68,0xf4,0x37,0xe5)
#endif
#else
typedef struct ID3D12CommandListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12CommandList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12CommandList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12CommandList *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12CommandList *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12CommandList *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12CommandList *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12CommandList *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12CommandList *This,
        REFIID riid,
        void **device);

    /*** ID3D12CommandList methods ***/
    D3D12_COMMAND_LIST_TYPE (STDMETHODCALLTYPE *GetType)(
        ID3D12CommandList *This);

    END_INTERFACE
} ID3D12CommandListVtbl;

interface ID3D12CommandList {
    CONST_VTBL ID3D12CommandListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12CommandList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12CommandList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12CommandList_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12CommandList_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12CommandList_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12CommandList_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12CommandList_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12CommandList_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12CommandList_GetType(This) (This)->lpVtbl->GetType(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12CommandList_QueryInterface(ID3D12CommandList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12CommandList_AddRef(ID3D12CommandList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12CommandList_Release(ID3D12CommandList* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12CommandList_GetPrivateData(ID3D12CommandList* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandList_SetPrivateData(ID3D12CommandList* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandList_SetPrivateDataInterface(ID3D12CommandList* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12CommandList_SetName(ID3D12CommandList* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12CommandList_GetDevice(ID3D12CommandList* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static FORCEINLINE D3D12_COMMAND_LIST_TYPE ID3D12CommandList_GetType(ID3D12CommandList* This) {
    return This->lpVtbl->GetType(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12CommandList_INTERFACE_DEFINED__ */

typedef enum D3D12_TILE_COPY_FLAGS {
    D3D12_TILE_COPY_FLAG_NONE = 0x0,
    D3D12_TILE_COPY_FLAG_NO_HAZARD = 0x1,
    D3D12_TILE_COPY_FLAG_LINEAR_BUFFER_TO_SWIZZLED_TILED_RESOURCE = 0x2,
    D3D12_TILE_COPY_FLAG_SWIZZLED_TILED_RESOURCE_TO_LINEAR_BUFFER = 0x4
} D3D12_TILE_COPY_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_TILE_COPY_FLAGS);
typedef struct D3D12_INDEX_BUFFER_VIEW {
    D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
    UINT SizeInBytes;
    DXGI_FORMAT Format;
} D3D12_INDEX_BUFFER_VIEW;
typedef struct D3D12_VERTEX_BUFFER_VIEW {
    D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
    UINT SizeInBytes;
    UINT StrideInBytes;
} D3D12_VERTEX_BUFFER_VIEW;
typedef struct D3D12_STREAM_OUTPUT_BUFFER_VIEW {
    D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
    UINT64 SizeInBytes;
    D3D12_GPU_VIRTUAL_ADDRESS BufferFilledSizeLocation;
} D3D12_STREAM_OUTPUT_BUFFER_VIEW;
typedef enum D3D12_CLEAR_FLAGS {
    D3D12_CLEAR_FLAG_DEPTH = 0x1,
    D3D12_CLEAR_FLAG_STENCIL = 0x2
} D3D12_CLEAR_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_CLEAR_FLAGS);
typedef struct D3D12_DISCARD_REGION {
    UINT NumRects;
    const D3D12_RECT *pRects;
    UINT FirstSubresource;
    UINT NumSubresources;
} D3D12_DISCARD_REGION;
typedef enum D3D12_QUERY_TYPE {
    D3D12_QUERY_TYPE_OCCLUSION = 0,
    D3D12_QUERY_TYPE_BINARY_OCCLUSION = 1,
    D3D12_QUERY_TYPE_TIMESTAMP = 2,
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS = 3,
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 = 4,
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 = 5,
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 = 6,
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 = 7
} D3D12_QUERY_TYPE;
typedef struct D3D12_QUERY_DATA_PIPELINE_STATISTICS {
    UINT64 IAVertices;
    UINT64 IAPrimitives;
    UINT64 VSInvocations;
    UINT64 GSInvocations;
    UINT64 GSPrimitives;
    UINT64 CInvocations;
    UINT64 CPrimitives;
    UINT64 PSInvocations;
    UINT64 HSInvocations;
    UINT64 DSInvocations;
    UINT64 CSInvocations;
} D3D12_QUERY_DATA_PIPELINE_STATISTICS;
typedef struct D3D12_QUERY_DATA_SO_STATISTICS {
    UINT64 NumPrimitivesWritten;
    UINT64 PrimitivesStorageNeeded;
} D3D12_QUERY_DATA_SO_STATISTICS;
typedef enum D3D12_PREDICATION_OP {
    D3D12_PREDICATION_OP_EQUAL_ZERO = 0,
    D3D12_PREDICATION_OP_NOT_EQUAL_ZERO = 1
} D3D12_PREDICATION_OP;
/*****************************************************************************
 * ID3D12DescriptorHeap interface
 */
#ifndef __ID3D12DescriptorHeap_INTERFACE_DEFINED__
#define __ID3D12DescriptorHeap_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DescriptorHeap, 0x8efb471d, 0x616c, 0x4f49, 0x90,0xf7, 0x12,0x7b,0xb7,0x63,0xfa,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8efb471d-616c-4f49-90f7-127bb763fa51")
ID3D12DescriptorHeap : public ID3D12Pageable
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_DESCRIPTOR_HEAP_DESC* STDMETHODCALLTYPE GetDesc(
        D3D12_DESCRIPTOR_HEAP_DESC *__ret) = 0;
    D3D12_DESCRIPTOR_HEAP_DESC STDMETHODCALLTYPE GetDesc(
        )
    {
        D3D12_DESCRIPTOR_HEAP_DESC __ret;
        return *GetDesc(&__ret);
    }
#else
    virtual D3D12_DESCRIPTOR_HEAP_DESC STDMETHODCALLTYPE GetDesc(
        ) = 0;
#endif

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_CPU_DESCRIPTOR_HANDLE* STDMETHODCALLTYPE GetCPUDescriptorHandleForHeapStart(
        D3D12_CPU_DESCRIPTOR_HANDLE *__ret) = 0;
    D3D12_CPU_DESCRIPTOR_HANDLE STDMETHODCALLTYPE GetCPUDescriptorHandleForHeapStart(
        )
    {
        D3D12_CPU_DESCRIPTOR_HANDLE __ret;
        return *GetCPUDescriptorHandleForHeapStart(&__ret);
    }
#else
    virtual D3D12_CPU_DESCRIPTOR_HANDLE STDMETHODCALLTYPE GetCPUDescriptorHandleForHeapStart(
        ) = 0;
#endif

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_GPU_DESCRIPTOR_HANDLE* STDMETHODCALLTYPE GetGPUDescriptorHandleForHeapStart(
        D3D12_GPU_DESCRIPTOR_HANDLE *__ret) = 0;
    D3D12_GPU_DESCRIPTOR_HANDLE STDMETHODCALLTYPE GetGPUDescriptorHandleForHeapStart(
        )
    {
        D3D12_GPU_DESCRIPTOR_HANDLE __ret;
        return *GetGPUDescriptorHandleForHeapStart(&__ret);
    }
#else
    virtual D3D12_GPU_DESCRIPTOR_HANDLE STDMETHODCALLTYPE GetGPUDescriptorHandleForHeapStart(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DescriptorHeap, 0x8efb471d, 0x616c, 0x4f49, 0x90,0xf7, 0x12,0x7b,0xb7,0x63,0xfa,0x51)
#endif
#else
typedef struct ID3D12DescriptorHeapVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12DescriptorHeap *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12DescriptorHeap *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12DescriptorHeap *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12DescriptorHeap *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12DescriptorHeap *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12DescriptorHeap *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12DescriptorHeap *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12DescriptorHeap *This,
        REFIID riid,
        void **device);

    /*** ID3D12DescriptorHeap methods ***/
    D3D12_DESCRIPTOR_HEAP_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12DescriptorHeap *This,
        D3D12_DESCRIPTOR_HEAP_DESC *__ret);

    D3D12_CPU_DESCRIPTOR_HANDLE * (STDMETHODCALLTYPE *GetCPUDescriptorHandleForHeapStart)(
        ID3D12DescriptorHeap *This,
        D3D12_CPU_DESCRIPTOR_HANDLE *__ret);

    D3D12_GPU_DESCRIPTOR_HANDLE * (STDMETHODCALLTYPE *GetGPUDescriptorHandleForHeapStart)(
        ID3D12DescriptorHeap *This,
        D3D12_GPU_DESCRIPTOR_HANDLE *__ret);

    END_INTERFACE
} ID3D12DescriptorHeapVtbl;

interface ID3D12DescriptorHeap {
    CONST_VTBL ID3D12DescriptorHeapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DescriptorHeap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DescriptorHeap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DescriptorHeap_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12DescriptorHeap_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12DescriptorHeap_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12DescriptorHeap_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12DescriptorHeap_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12DescriptorHeap_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12DescriptorHeap methods ***/
#define ID3D12DescriptorHeap_GetDesc(This) ID3D12DescriptorHeap_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(This) ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(This) ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12DescriptorHeap_QueryInterface(ID3D12DescriptorHeap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12DescriptorHeap_AddRef(ID3D12DescriptorHeap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12DescriptorHeap_Release(ID3D12DescriptorHeap* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12DescriptorHeap_GetPrivateData(ID3D12DescriptorHeap* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12DescriptorHeap_SetPrivateData(ID3D12DescriptorHeap* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12DescriptorHeap_SetPrivateDataInterface(ID3D12DescriptorHeap* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12DescriptorHeap_SetName(ID3D12DescriptorHeap* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12DescriptorHeap_GetDevice(ID3D12DescriptorHeap* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12DescriptorHeap methods ***/
static FORCEINLINE D3D12_DESCRIPTOR_HEAP_DESC ID3D12DescriptorHeap_GetDesc(ID3D12DescriptorHeap* This) {
    D3D12_DESCRIPTOR_HEAP_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
static FORCEINLINE D3D12_CPU_DESCRIPTOR_HANDLE ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(ID3D12DescriptorHeap* This) {
    D3D12_CPU_DESCRIPTOR_HANDLE __ret;
    return *This->lpVtbl->GetCPUDescriptorHandleForHeapStart(This,&__ret);
}
static FORCEINLINE D3D12_GPU_DESCRIPTOR_HANDLE ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(ID3D12DescriptorHeap* This) {
    D3D12_GPU_DESCRIPTOR_HANDLE __ret;
    return *This->lpVtbl->GetGPUDescriptorHandleForHeapStart(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12DescriptorHeap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12QueryHeap interface
 */
#ifndef __ID3D12QueryHeap_INTERFACE_DEFINED__
#define __ID3D12QueryHeap_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12QueryHeap, 0x0d9658ae, 0xed45, 0x469e, 0xa6,0x1d, 0x97,0x0e,0xc5,0x83,0xca,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0d9658ae-ed45-469e-a61d-970ec583cab4")
ID3D12QueryHeap : public ID3D12Pageable
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12QueryHeap, 0x0d9658ae, 0xed45, 0x469e, 0xa6,0x1d, 0x97,0x0e,0xc5,0x83,0xca,0xb4)
#endif
#else
typedef struct ID3D12QueryHeapVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12QueryHeap *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12QueryHeap *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12QueryHeap *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12QueryHeap *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12QueryHeap *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12QueryHeap *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12QueryHeap *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12QueryHeap *This,
        REFIID riid,
        void **device);

    END_INTERFACE
} ID3D12QueryHeapVtbl;

interface ID3D12QueryHeap {
    CONST_VTBL ID3D12QueryHeapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12QueryHeap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12QueryHeap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12QueryHeap_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12QueryHeap_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12QueryHeap_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12QueryHeap_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12QueryHeap_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12QueryHeap_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12QueryHeap_QueryInterface(ID3D12QueryHeap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12QueryHeap_AddRef(ID3D12QueryHeap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12QueryHeap_Release(ID3D12QueryHeap* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12QueryHeap_GetPrivateData(ID3D12QueryHeap* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12QueryHeap_SetPrivateData(ID3D12QueryHeap* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12QueryHeap_SetPrivateDataInterface(ID3D12QueryHeap* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12QueryHeap_SetName(ID3D12QueryHeap* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12QueryHeap_GetDevice(ID3D12QueryHeap* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
#endif
#endif

#endif


#endif  /* __ID3D12QueryHeap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12CommandSignature interface
 */
#ifndef __ID3D12CommandSignature_INTERFACE_DEFINED__
#define __ID3D12CommandSignature_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12CommandSignature, 0xc36a797c, 0xec80, 0x4f0a, 0x89,0x85, 0xa7,0xb2,0x47,0x50,0x82,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c36a797c-ec80-4f0a-8985-a7b2475082d1")
ID3D12CommandSignature : public ID3D12Pageable
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12CommandSignature, 0xc36a797c, 0xec80, 0x4f0a, 0x89,0x85, 0xa7,0xb2,0x47,0x50,0x82,0xd1)
#endif
#else
typedef struct ID3D12CommandSignatureVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12CommandSignature *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12CommandSignature *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12CommandSignature *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12CommandSignature *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12CommandSignature *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12CommandSignature *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12CommandSignature *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12CommandSignature *This,
        REFIID riid,
        void **device);

    END_INTERFACE
} ID3D12CommandSignatureVtbl;

interface ID3D12CommandSignature {
    CONST_VTBL ID3D12CommandSignatureVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12CommandSignature_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12CommandSignature_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12CommandSignature_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12CommandSignature_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12CommandSignature_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12CommandSignature_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12CommandSignature_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12CommandSignature_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12CommandSignature_QueryInterface(ID3D12CommandSignature* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12CommandSignature_AddRef(ID3D12CommandSignature* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12CommandSignature_Release(ID3D12CommandSignature* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12CommandSignature_GetPrivateData(ID3D12CommandSignature* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandSignature_SetPrivateData(ID3D12CommandSignature* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandSignature_SetPrivateDataInterface(ID3D12CommandSignature* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12CommandSignature_SetName(ID3D12CommandSignature* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12CommandSignature_GetDevice(ID3D12CommandSignature* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
#endif
#endif

#endif


#endif  /* __ID3D12CommandSignature_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12GraphicsCommandList interface
 */
#ifndef __ID3D12GraphicsCommandList_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList, 0x5b160d0f, 0xac1b, 0x4185, 0x8b,0xa8, 0xb3,0xae,0x42,0xa5,0xa4,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5b160d0f-ac1b-4185-8ba8-b3ae42a5a455")
ID3D12GraphicsCommandList : public ID3D12CommandList
{
    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ID3D12CommandAllocator *allocator,
        ID3D12PipelineState *initial_state) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearState(
        ID3D12PipelineState *pipeline_state) = 0;

    virtual void STDMETHODCALLTYPE DrawInstanced(
        UINT vertex_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        UINT start_instance_location) = 0;

    virtual void STDMETHODCALLTYPE DrawIndexedInstanced(
        UINT index_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        INT base_vertex_location,
        UINT start_instance_location) = 0;

    virtual void STDMETHODCALLTYPE Dispatch(
        UINT x,
        UINT u,
        UINT z) = 0;

    virtual void STDMETHODCALLTYPE CopyBufferRegion(
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT64 byte_count) = 0;

    virtual void STDMETHODCALLTYPE CopyTextureRegion(
        const D3D12_TEXTURE_COPY_LOCATION *dst,
        UINT dst_x,
        UINT dst_y,
        UINT dst_z,
        const D3D12_TEXTURE_COPY_LOCATION *src,
        const D3D12_BOX *src_box) = 0;

    virtual void STDMETHODCALLTYPE CopyResource(
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource) = 0;

    virtual void STDMETHODCALLTYPE CopyTiles(
        ID3D12Resource *tiled_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,
        const D3D12_TILE_REGION_SIZE *tile_region_size,
        ID3D12Resource *buffer,
        UINT64 buffer_offset,
        D3D12_TILE_COPY_FLAGS flags) = 0;

    virtual void STDMETHODCALLTYPE ResolveSubresource(
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format) = 0;

    virtual void STDMETHODCALLTYPE IASetPrimitiveTopology(
        D3D12_PRIMITIVE_TOPOLOGY primitive_topology) = 0;

    virtual void STDMETHODCALLTYPE RSSetViewports(
        UINT viewport_count,
        const D3D12_VIEWPORT *viewports) = 0;

    virtual void STDMETHODCALLTYPE RSSetScissorRects(
        UINT rect_count,
        const D3D12_RECT *rects) = 0;

    virtual void STDMETHODCALLTYPE OMSetBlendFactor(
        const FLOAT blend_factor[4]) = 0;

    virtual void STDMETHODCALLTYPE OMSetStencilRef(
        UINT stencil_ref) = 0;

    virtual void STDMETHODCALLTYPE SetPipelineState(
        ID3D12PipelineState *pipeline_state) = 0;

    virtual void STDMETHODCALLTYPE ResourceBarrier(
        UINT barrier_count,
        const D3D12_RESOURCE_BARRIER *barriers) = 0;

    virtual void STDMETHODCALLTYPE ExecuteBundle(
        ID3D12GraphicsCommandList *command_list) = 0;

    virtual void STDMETHODCALLTYPE SetDescriptorHeaps(
        UINT heap_count,
        ID3D12DescriptorHeap *const *heaps) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRootSignature(
        ID3D12RootSignature *root_signature) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRootSignature(
        ID3D12RootSignature *root_signature) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRootDescriptorTable(
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRootDescriptorTable(
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRoot32BitConstant(
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRoot32BitConstant(
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRoot32BitConstants(
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRoot32BitConstants(
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRootConstantBufferView(
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRootConstantBufferView(
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRootShaderResourceView(
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRootShaderResourceView(
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address) = 0;

    virtual void STDMETHODCALLTYPE SetComputeRootUnorderedAccessView(
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address) = 0;

    virtual void STDMETHODCALLTYPE SetGraphicsRootUnorderedAccessView(
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address) = 0;

    virtual void STDMETHODCALLTYPE IASetIndexBuffer(
        const D3D12_INDEX_BUFFER_VIEW *view) = 0;

    virtual void STDMETHODCALLTYPE IASetVertexBuffers(
        UINT start_slot,
        UINT view_count,
        const D3D12_VERTEX_BUFFER_VIEW *views) = 0;

    virtual void STDMETHODCALLTYPE SOSetTargets(
        UINT start_slot,
        UINT view_count,
        const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) = 0;

    virtual void STDMETHODCALLTYPE OMSetRenderTargets(
        UINT render_target_descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,
        WINBOOL single_descriptor_handle,
        const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor) = 0;

    virtual void STDMETHODCALLTYPE ClearDepthStencilView(
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects) = 0;

    virtual void STDMETHODCALLTYPE ClearRenderTargetView(
        D3D12_CPU_DESCRIPTOR_HANDLE rtv,
        const FLOAT color[4],
        UINT rect_count,
        const D3D12_RECT *rects) = 0;

    virtual void STDMETHODCALLTYPE ClearUnorderedAccessViewUint(
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const UINT values[4],
        UINT rect_count,
        const D3D12_RECT *rects) = 0;

    virtual void STDMETHODCALLTYPE ClearUnorderedAccessViewFloat(
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const float values[4],
        UINT rect_count,
        const D3D12_RECT *rects) = 0;

    virtual void STDMETHODCALLTYPE DiscardResource(
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region) = 0;

    virtual void STDMETHODCALLTYPE BeginQuery(
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index) = 0;

    virtual void STDMETHODCALLTYPE EndQuery(
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index) = 0;

    virtual void STDMETHODCALLTYPE ResolveQueryData(
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT start_index,
        UINT query_count,
        ID3D12Resource *dst_buffer,
        UINT64 aligned_dst_buffer_offset) = 0;

    virtual void STDMETHODCALLTYPE SetPredication(
        ID3D12Resource *buffer,
        UINT64 aligned_buffer_offset,
        D3D12_PREDICATION_OP operation) = 0;

    virtual void STDMETHODCALLTYPE SetMarker(
        UINT metadata,
        const void *data,
        UINT size) = 0;

    virtual void STDMETHODCALLTYPE BeginEvent(
        UINT metadata,
        const void *data,
        UINT size) = 0;

    virtual void STDMETHODCALLTYPE EndEvent(
        ) = 0;

    virtual void STDMETHODCALLTYPE ExecuteIndirect(
        ID3D12CommandSignature *command_signature,
        UINT max_command_count,
        ID3D12Resource *arg_buffer,
        UINT64 arg_buffer_offset,
        ID3D12Resource *count_buffer,
        UINT64 count_buffer_offset) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList, 0x5b160d0f, 0xac1b, 0x4185, 0x8b,0xa8, 0xb3,0xae,0x42,0xa5,0xa4,0x55)
#endif
#else
typedef struct ID3D12GraphicsCommandListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12GraphicsCommandList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12GraphicsCommandList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12GraphicsCommandList *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12GraphicsCommandList *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12GraphicsCommandList *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12GraphicsCommandList *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12GraphicsCommandList *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12GraphicsCommandList *This,
        REFIID riid,
        void **device);

    /*** ID3D12CommandList methods ***/
    D3D12_COMMAND_LIST_TYPE (STDMETHODCALLTYPE *GetType)(
        ID3D12GraphicsCommandList *This);

    /*** ID3D12GraphicsCommandList methods ***/
    HRESULT (STDMETHODCALLTYPE *Close)(
        ID3D12GraphicsCommandList *This);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        ID3D12GraphicsCommandList *This,
        ID3D12CommandAllocator *allocator,
        ID3D12PipelineState *initial_state);

    HRESULT (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList *This,
        ID3D12PipelineState *pipeline_state);

    void (STDMETHODCALLTYPE *DrawInstanced)(
        ID3D12GraphicsCommandList *This,
        UINT vertex_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        UINT start_instance_location);

    void (STDMETHODCALLTYPE *DrawIndexedInstanced)(
        ID3D12GraphicsCommandList *This,
        UINT index_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        INT base_vertex_location,
        UINT start_instance_location);

    void (STDMETHODCALLTYPE *Dispatch)(
        ID3D12GraphicsCommandList *This,
        UINT x,
        UINT u,
        UINT z);

    void (STDMETHODCALLTYPE *CopyBufferRegion)(
        ID3D12GraphicsCommandList *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT64 byte_count);

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList *This,
        const D3D12_TEXTURE_COPY_LOCATION *dst,
        UINT dst_x,
        UINT dst_y,
        UINT dst_z,
        const D3D12_TEXTURE_COPY_LOCATION *src,
        const D3D12_BOX *src_box);

    void (STDMETHODCALLTYPE *CopyResource)(
        ID3D12GraphicsCommandList *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList *This,
        ID3D12Resource *tiled_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,
        const D3D12_TILE_REGION_SIZE *tile_region_size,
        ID3D12Resource *buffer,
        UINT64 buffer_offset,
        D3D12_TILE_COPY_FLAGS flags);

    void (STDMETHODCALLTYPE *ResolveSubresource)(
        ID3D12GraphicsCommandList *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

    void (STDMETHODCALLTYPE *IASetPrimitiveTopology)(
        ID3D12GraphicsCommandList *This,
        D3D12_PRIMITIVE_TOPOLOGY primitive_topology);

    void (STDMETHODCALLTYPE *RSSetViewports)(
        ID3D12GraphicsCommandList *This,
        UINT viewport_count,
        const D3D12_VIEWPORT *viewports);

    void (STDMETHODCALLTYPE *RSSetScissorRects)(
        ID3D12GraphicsCommandList *This,
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *OMSetBlendFactor)(
        ID3D12GraphicsCommandList *This,
        const FLOAT blend_factor[4]);

    void (STDMETHODCALLTYPE *OMSetStencilRef)(
        ID3D12GraphicsCommandList *This,
        UINT stencil_ref);

    void (STDMETHODCALLTYPE *SetPipelineState)(
        ID3D12GraphicsCommandList *This,
        ID3D12PipelineState *pipeline_state);

    void (STDMETHODCALLTYPE *ResourceBarrier)(
        ID3D12GraphicsCommandList *This,
        UINT barrier_count,
        const D3D12_RESOURCE_BARRIER *barriers);

    void (STDMETHODCALLTYPE *ExecuteBundle)(
        ID3D12GraphicsCommandList *This,
        ID3D12GraphicsCommandList *command_list);

    void (STDMETHODCALLTYPE *SetDescriptorHeaps)(
        ID3D12GraphicsCommandList *This,
        UINT heap_count,
        ID3D12DescriptorHeap *const *heaps);

    void (STDMETHODCALLTYPE *SetComputeRootSignature)(
        ID3D12GraphicsCommandList *This,
        ID3D12RootSignature *root_signature);

    void (STDMETHODCALLTYPE *SetGraphicsRootSignature)(
        ID3D12GraphicsCommandList *This,
        ID3D12RootSignature *root_signature);

    void (STDMETHODCALLTYPE *SetComputeRootDescriptorTable)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor);

    void (STDMETHODCALLTYPE *SetGraphicsRootDescriptorTable)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor);

    void (STDMETHODCALLTYPE *SetComputeRoot32BitConstant)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetGraphicsRoot32BitConstant)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetComputeRoot32BitConstants)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetGraphicsRoot32BitConstants)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetComputeRootConstantBufferView)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootConstantBufferView)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetComputeRootShaderResourceView)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootShaderResourceView)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetComputeRootUnorderedAccessView)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootUnorderedAccessView)(
        ID3D12GraphicsCommandList *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *IASetIndexBuffer)(
        ID3D12GraphicsCommandList *This,
        const D3D12_INDEX_BUFFER_VIEW *view);

    void (STDMETHODCALLTYPE *IASetVertexBuffers)(
        ID3D12GraphicsCommandList *This,
        UINT start_slot,
        UINT view_count,
        const D3D12_VERTEX_BUFFER_VIEW *views);

    void (STDMETHODCALLTYPE *SOSetTargets)(
        ID3D12GraphicsCommandList *This,
        UINT start_slot,
        UINT view_count,
        const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views);

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList *This,
        UINT render_target_descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,
        WINBOOL single_descriptor_handle,
        const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor);

    void (STDMETHODCALLTYPE *ClearDepthStencilView)(
        ID3D12GraphicsCommandList *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearRenderTargetView)(
        ID3D12GraphicsCommandList *This,
        D3D12_CPU_DESCRIPTOR_HANDLE rtv,
        const FLOAT color[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList *This,
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const UINT values[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewFloat)(
        ID3D12GraphicsCommandList *This,
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const float values[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *DiscardResource)(
        ID3D12GraphicsCommandList *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

    void (STDMETHODCALLTYPE *BeginQuery)(
        ID3D12GraphicsCommandList *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index);

    void (STDMETHODCALLTYPE *EndQuery)(
        ID3D12GraphicsCommandList *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index);

    void (STDMETHODCALLTYPE *ResolveQueryData)(
        ID3D12GraphicsCommandList *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT start_index,
        UINT query_count,
        ID3D12Resource *dst_buffer,
        UINT64 aligned_dst_buffer_offset);

    void (STDMETHODCALLTYPE *SetPredication)(
        ID3D12GraphicsCommandList *This,
        ID3D12Resource *buffer,
        UINT64 aligned_buffer_offset,
        D3D12_PREDICATION_OP operation);

    void (STDMETHODCALLTYPE *SetMarker)(
        ID3D12GraphicsCommandList *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *BeginEvent)(
        ID3D12GraphicsCommandList *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *EndEvent)(
        ID3D12GraphicsCommandList *This);

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList *This,
        ID3D12CommandSignature *command_signature,
        UINT max_command_count,
        ID3D12Resource *arg_buffer,
        UINT64 arg_buffer_offset,
        ID3D12Resource *count_buffer,
        UINT64 count_buffer_offset);

    END_INTERFACE
} ID3D12GraphicsCommandListVtbl;

interface ID3D12GraphicsCommandList {
    CONST_VTBL ID3D12GraphicsCommandListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList_DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location) (This)->lpVtbl->DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location)
#define ID3D12GraphicsCommandList_DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location) (This)->lpVtbl->DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location)
#define ID3D12GraphicsCommandList_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList_CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count) (This)->lpVtbl->CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count)
#define ID3D12GraphicsCommandList_CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box) (This)->lpVtbl->CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box)
#define ID3D12GraphicsCommandList_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList_CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags) (This)->lpVtbl->CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags)
#define ID3D12GraphicsCommandList_ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format) (This)->lpVtbl->ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format)
#define ID3D12GraphicsCommandList_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList_OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor) (This)->lpVtbl->OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor)
#define ID3D12GraphicsCommandList_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList_ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects) (This)->lpVtbl->ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects)
#define ID3D12GraphicsCommandList_ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects) (This)->lpVtbl->ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects)
#define ID3D12GraphicsCommandList_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList_ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset) (This)->lpVtbl->ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset)
#define ID3D12GraphicsCommandList_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList_ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset) (This)->lpVtbl->ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_QueryInterface(ID3D12GraphicsCommandList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12GraphicsCommandList_AddRef(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12GraphicsCommandList_Release(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_GetPrivateData(ID3D12GraphicsCommandList* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_SetPrivateData(ID3D12GraphicsCommandList* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_SetPrivateDataInterface(ID3D12GraphicsCommandList* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_SetName(ID3D12GraphicsCommandList* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_GetDevice(ID3D12GraphicsCommandList* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static FORCEINLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList_GetType(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_Close(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_Reset(ID3D12GraphicsCommandList* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList_ClearState(ID3D12GraphicsCommandList* This,ID3D12PipelineState *pipeline_state) {
    return This->lpVtbl->ClearState(This,pipeline_state);
}
static FORCEINLINE void ID3D12GraphicsCommandList_DrawInstanced(ID3D12GraphicsCommandList* This,UINT vertex_count_per_instance,UINT instance_count,UINT start_vertex_location,UINT start_instance_location) {
    This->lpVtbl->DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location);
}
static FORCEINLINE void ID3D12GraphicsCommandList_DrawIndexedInstanced(ID3D12GraphicsCommandList* This,UINT index_count_per_instance,UINT instance_count,UINT start_vertex_location,INT base_vertex_location,UINT start_instance_location) {
    This->lpVtbl->DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location);
}
static FORCEINLINE void ID3D12GraphicsCommandList_Dispatch(ID3D12GraphicsCommandList* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static FORCEINLINE void ID3D12GraphicsCommandList_CopyBufferRegion(ID3D12GraphicsCommandList* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT64 byte_count) {
    This->lpVtbl->CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count);
}
static FORCEINLINE void ID3D12GraphicsCommandList_CopyTextureRegion(ID3D12GraphicsCommandList* This,const D3D12_TEXTURE_COPY_LOCATION *dst,UINT dst_x,UINT dst_y,UINT dst_z,const D3D12_TEXTURE_COPY_LOCATION *src,const D3D12_BOX *src_box) {
    This->lpVtbl->CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box);
}
static FORCEINLINE void ID3D12GraphicsCommandList_CopyResource(ID3D12GraphicsCommandList* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static FORCEINLINE void ID3D12GraphicsCommandList_CopyTiles(ID3D12GraphicsCommandList* This,ID3D12Resource *tiled_resource,const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,const D3D12_TILE_REGION_SIZE *tile_region_size,ID3D12Resource *buffer,UINT64 buffer_offset,D3D12_TILE_COPY_FLAGS flags) {
    This->lpVtbl->CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ResolveSubresource(ID3D12GraphicsCommandList* This,ID3D12Resource *dst_resource,UINT dst_sub_resource,ID3D12Resource *src_resource,UINT src_sub_resource,DXGI_FORMAT format) {
    This->lpVtbl->ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format);
}
static FORCEINLINE void ID3D12GraphicsCommandList_IASetPrimitiveTopology(ID3D12GraphicsCommandList* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static FORCEINLINE void ID3D12GraphicsCommandList_RSSetViewports(ID3D12GraphicsCommandList* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static FORCEINLINE void ID3D12GraphicsCommandList_RSSetScissorRects(ID3D12GraphicsCommandList* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList_OMSetBlendFactor(ID3D12GraphicsCommandList* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static FORCEINLINE void ID3D12GraphicsCommandList_OMSetStencilRef(ID3D12GraphicsCommandList* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetPipelineState(ID3D12GraphicsCommandList* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ResourceBarrier(ID3D12GraphicsCommandList* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ExecuteBundle(ID3D12GraphicsCommandList* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetDescriptorHeaps(ID3D12GraphicsCommandList* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRootSignature(ID3D12GraphicsCommandList* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRootSignature(ID3D12GraphicsCommandList* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList* This,UINT root_parameter_index,UINT constant_count,const void *data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList* This,UINT root_parameter_index,UINT constant_count,const void *data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList_IASetIndexBuffer(ID3D12GraphicsCommandList* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static FORCEINLINE void ID3D12GraphicsCommandList_IASetVertexBuffers(ID3D12GraphicsCommandList* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SOSetTargets(ID3D12GraphicsCommandList* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static FORCEINLINE void ID3D12GraphicsCommandList_OMSetRenderTargets(ID3D12GraphicsCommandList* This,UINT render_target_descriptor_count,const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,WINBOOL single_descriptor_handle,const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor) {
    This->lpVtbl->OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ClearDepthStencilView(ID3D12GraphicsCommandList* This,D3D12_CPU_DESCRIPTOR_HANDLE dsv,D3D12_CLEAR_FLAGS flags,FLOAT depth,UINT8 stencil,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ClearRenderTargetView(ID3D12GraphicsCommandList* This,D3D12_CPU_DESCRIPTOR_HANDLE rtv,const FLOAT color[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList* This,D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,ID3D12Resource *resource,const UINT values[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList* This,D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,ID3D12Resource *resource,const float values[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList_DiscardResource(ID3D12GraphicsCommandList* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static FORCEINLINE void ID3D12GraphicsCommandList_BeginQuery(ID3D12GraphicsCommandList* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static FORCEINLINE void ID3D12GraphicsCommandList_EndQuery(ID3D12GraphicsCommandList* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ResolveQueryData(ID3D12GraphicsCommandList* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT start_index,UINT query_count,ID3D12Resource *dst_buffer,UINT64 aligned_dst_buffer_offset) {
    This->lpVtbl->ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetPredication(ID3D12GraphicsCommandList* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static FORCEINLINE void ID3D12GraphicsCommandList_SetMarker(ID3D12GraphicsCommandList* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static FORCEINLINE void ID3D12GraphicsCommandList_BeginEvent(ID3D12GraphicsCommandList* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static FORCEINLINE void ID3D12GraphicsCommandList_EndEvent(ID3D12GraphicsCommandList* This) {
    This->lpVtbl->EndEvent(This);
}
static FORCEINLINE void ID3D12GraphicsCommandList_ExecuteIndirect(ID3D12GraphicsCommandList* This,ID3D12CommandSignature *command_signature,UINT max_command_count,ID3D12Resource *arg_buffer,UINT64 arg_buffer_offset,ID3D12Resource *count_buffer,UINT64 count_buffer_offset) {
    This->lpVtbl->ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12GraphicsCommandList1 interface
 */
#ifndef __ID3D12GraphicsCommandList1_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList1, 0x553103fb, 0x1fe7, 0x4557, 0xbb,0x38, 0x94,0x6d,0x7d,0x0e,0x7c,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("553103fb-1fe7-4557-bb38-946d7d0e7ca7")
ID3D12GraphicsCommandList1 : public ID3D12GraphicsCommandList
{
    virtual void STDMETHODCALLTYPE AtomicCopyBufferUINT(
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT dependent_resource_count,
        ID3D12Resource *const *dependent_resources,
        const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges) = 0;

    virtual void STDMETHODCALLTYPE AtomicCopyBufferUINT64(
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT dependent_resource_count,
        ID3D12Resource *const *dependent_resources,
        const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges) = 0;

    virtual void STDMETHODCALLTYPE OMSetDepthBounds(
        FLOAT min,
        FLOAT max) = 0;

    virtual void STDMETHODCALLTYPE SetSamplePositions(
        UINT sample_count,
        UINT pixel_count,
        D3D12_SAMPLE_POSITION *sample_positions) = 0;

    virtual void STDMETHODCALLTYPE ResolveSubresourceRegion(
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource_idx,
        UINT dst_x,
        UINT dst_y,
        ID3D12Resource *src_resource,
        UINT src_sub_resource_idx,
        D3D12_RECT *src_rect,
        DXGI_FORMAT format,
        D3D12_RESOLVE_MODE mode) = 0;

    virtual void STDMETHODCALLTYPE SetViewInstanceMask(
        UINT mask) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList1, 0x553103fb, 0x1fe7, 0x4557, 0xbb,0x38, 0x94,0x6d,0x7d,0x0e,0x7c,0xa7)
#endif
#else
typedef struct ID3D12GraphicsCommandList1Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12GraphicsCommandList1 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12GraphicsCommandList1 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12GraphicsCommandList1 *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12GraphicsCommandList1 *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12GraphicsCommandList1 *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12GraphicsCommandList1 *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12GraphicsCommandList1 *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12GraphicsCommandList1 *This,
        REFIID riid,
        void **device);

    /*** ID3D12CommandList methods ***/
    D3D12_COMMAND_LIST_TYPE (STDMETHODCALLTYPE *GetType)(
        ID3D12GraphicsCommandList1 *This);

    /*** ID3D12GraphicsCommandList methods ***/
    HRESULT (STDMETHODCALLTYPE *Close)(
        ID3D12GraphicsCommandList1 *This);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12CommandAllocator *allocator,
        ID3D12PipelineState *initial_state);

    HRESULT (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12PipelineState *pipeline_state);

    void (STDMETHODCALLTYPE *DrawInstanced)(
        ID3D12GraphicsCommandList1 *This,
        UINT vertex_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        UINT start_instance_location);

    void (STDMETHODCALLTYPE *DrawIndexedInstanced)(
        ID3D12GraphicsCommandList1 *This,
        UINT index_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        INT base_vertex_location,
        UINT start_instance_location);

    void (STDMETHODCALLTYPE *Dispatch)(
        ID3D12GraphicsCommandList1 *This,
        UINT x,
        UINT u,
        UINT z);

    void (STDMETHODCALLTYPE *CopyBufferRegion)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT64 byte_count);

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList1 *This,
        const D3D12_TEXTURE_COPY_LOCATION *dst,
        UINT dst_x,
        UINT dst_y,
        UINT dst_z,
        const D3D12_TEXTURE_COPY_LOCATION *src,
        const D3D12_BOX *src_box);

    void (STDMETHODCALLTYPE *CopyResource)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *tiled_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,
        const D3D12_TILE_REGION_SIZE *tile_region_size,
        ID3D12Resource *buffer,
        UINT64 buffer_offset,
        D3D12_TILE_COPY_FLAGS flags);

    void (STDMETHODCALLTYPE *ResolveSubresource)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

    void (STDMETHODCALLTYPE *IASetPrimitiveTopology)(
        ID3D12GraphicsCommandList1 *This,
        D3D12_PRIMITIVE_TOPOLOGY primitive_topology);

    void (STDMETHODCALLTYPE *RSSetViewports)(
        ID3D12GraphicsCommandList1 *This,
        UINT viewport_count,
        const D3D12_VIEWPORT *viewports);

    void (STDMETHODCALLTYPE *RSSetScissorRects)(
        ID3D12GraphicsCommandList1 *This,
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *OMSetBlendFactor)(
        ID3D12GraphicsCommandList1 *This,
        const FLOAT blend_factor[4]);

    void (STDMETHODCALLTYPE *OMSetStencilRef)(
        ID3D12GraphicsCommandList1 *This,
        UINT stencil_ref);

    void (STDMETHODCALLTYPE *SetPipelineState)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12PipelineState *pipeline_state);

    void (STDMETHODCALLTYPE *ResourceBarrier)(
        ID3D12GraphicsCommandList1 *This,
        UINT barrier_count,
        const D3D12_RESOURCE_BARRIER *barriers);

    void (STDMETHODCALLTYPE *ExecuteBundle)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12GraphicsCommandList *command_list);

    void (STDMETHODCALLTYPE *SetDescriptorHeaps)(
        ID3D12GraphicsCommandList1 *This,
        UINT heap_count,
        ID3D12DescriptorHeap *const *heaps);

    void (STDMETHODCALLTYPE *SetComputeRootSignature)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12RootSignature *root_signature);

    void (STDMETHODCALLTYPE *SetGraphicsRootSignature)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12RootSignature *root_signature);

    void (STDMETHODCALLTYPE *SetComputeRootDescriptorTable)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor);

    void (STDMETHODCALLTYPE *SetGraphicsRootDescriptorTable)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor);

    void (STDMETHODCALLTYPE *SetComputeRoot32BitConstant)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetGraphicsRoot32BitConstant)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetComputeRoot32BitConstants)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetGraphicsRoot32BitConstants)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetComputeRootConstantBufferView)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootConstantBufferView)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetComputeRootShaderResourceView)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootShaderResourceView)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetComputeRootUnorderedAccessView)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootUnorderedAccessView)(
        ID3D12GraphicsCommandList1 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *IASetIndexBuffer)(
        ID3D12GraphicsCommandList1 *This,
        const D3D12_INDEX_BUFFER_VIEW *view);

    void (STDMETHODCALLTYPE *IASetVertexBuffers)(
        ID3D12GraphicsCommandList1 *This,
        UINT start_slot,
        UINT view_count,
        const D3D12_VERTEX_BUFFER_VIEW *views);

    void (STDMETHODCALLTYPE *SOSetTargets)(
        ID3D12GraphicsCommandList1 *This,
        UINT start_slot,
        UINT view_count,
        const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views);

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList1 *This,
        UINT render_target_descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,
        WINBOOL single_descriptor_handle,
        const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor);

    void (STDMETHODCALLTYPE *ClearDepthStencilView)(
        ID3D12GraphicsCommandList1 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearRenderTargetView)(
        ID3D12GraphicsCommandList1 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE rtv,
        const FLOAT color[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList1 *This,
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const UINT values[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewFloat)(
        ID3D12GraphicsCommandList1 *This,
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const float values[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *DiscardResource)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

    void (STDMETHODCALLTYPE *BeginQuery)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index);

    void (STDMETHODCALLTYPE *EndQuery)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index);

    void (STDMETHODCALLTYPE *ResolveQueryData)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT start_index,
        UINT query_count,
        ID3D12Resource *dst_buffer,
        UINT64 aligned_dst_buffer_offset);

    void (STDMETHODCALLTYPE *SetPredication)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *buffer,
        UINT64 aligned_buffer_offset,
        D3D12_PREDICATION_OP operation);

    void (STDMETHODCALLTYPE *SetMarker)(
        ID3D12GraphicsCommandList1 *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *BeginEvent)(
        ID3D12GraphicsCommandList1 *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *EndEvent)(
        ID3D12GraphicsCommandList1 *This);

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12CommandSignature *command_signature,
        UINT max_command_count,
        ID3D12Resource *arg_buffer,
        UINT64 arg_buffer_offset,
        ID3D12Resource *count_buffer,
        UINT64 count_buffer_offset);

    /*** ID3D12GraphicsCommandList1 methods ***/
    void (STDMETHODCALLTYPE *AtomicCopyBufferUINT)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT dependent_resource_count,
        ID3D12Resource *const *dependent_resources,
        const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges);

    void (STDMETHODCALLTYPE *AtomicCopyBufferUINT64)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT dependent_resource_count,
        ID3D12Resource *const *dependent_resources,
        const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges);

    void (STDMETHODCALLTYPE *OMSetDepthBounds)(
        ID3D12GraphicsCommandList1 *This,
        FLOAT min,
        FLOAT max);

    void (STDMETHODCALLTYPE *SetSamplePositions)(
        ID3D12GraphicsCommandList1 *This,
        UINT sample_count,
        UINT pixel_count,
        D3D12_SAMPLE_POSITION *sample_positions);

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList1 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource_idx,
        UINT dst_x,
        UINT dst_y,
        ID3D12Resource *src_resource,
        UINT src_sub_resource_idx,
        D3D12_RECT *src_rect,
        DXGI_FORMAT format,
        D3D12_RESOLVE_MODE mode);

    void (STDMETHODCALLTYPE *SetViewInstanceMask)(
        ID3D12GraphicsCommandList1 *This,
        UINT mask);

    END_INTERFACE
} ID3D12GraphicsCommandList1Vtbl;

interface ID3D12GraphicsCommandList1 {
    CONST_VTBL ID3D12GraphicsCommandList1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList1_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList1_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList1_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList1_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList1_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList1_DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location) (This)->lpVtbl->DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location)
#define ID3D12GraphicsCommandList1_DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location) (This)->lpVtbl->DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location)
#define ID3D12GraphicsCommandList1_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList1_CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count) (This)->lpVtbl->CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count)
#define ID3D12GraphicsCommandList1_CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box) (This)->lpVtbl->CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box)
#define ID3D12GraphicsCommandList1_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList1_CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags) (This)->lpVtbl->CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags)
#define ID3D12GraphicsCommandList1_ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format) (This)->lpVtbl->ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format)
#define ID3D12GraphicsCommandList1_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList1_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList1_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList1_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList1_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList1_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList1_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList1_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList1_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList1_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList1_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList1_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList1_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList1_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList1_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList1_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList1_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList1_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList1_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList1_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList1_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList1_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList1_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList1_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList1_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList1_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList1_OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor) (This)->lpVtbl->OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor)
#define ID3D12GraphicsCommandList1_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList1_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList1_ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects) (This)->lpVtbl->ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects)
#define ID3D12GraphicsCommandList1_ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects) (This)->lpVtbl->ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects)
#define ID3D12GraphicsCommandList1_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList1_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList1_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList1_ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset) (This)->lpVtbl->ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset)
#define ID3D12GraphicsCommandList1_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList1_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList1_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList1_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList1_ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset) (This)->lpVtbl->ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset)
/*** ID3D12GraphicsCommandList1 methods ***/
#define ID3D12GraphicsCommandList1_AtomicCopyBufferUINT(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges) (This)->lpVtbl->AtomicCopyBufferUINT(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges)
#define ID3D12GraphicsCommandList1_AtomicCopyBufferUINT64(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges) (This)->lpVtbl->AtomicCopyBufferUINT64(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges)
#define ID3D12GraphicsCommandList1_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList1_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList1_ResolveSubresourceRegion(This,dst_resource,dst_sub_resource_idx,dst_x,dst_y,src_resource,src_sub_resource_idx,src_rect,format,mode) (This)->lpVtbl->ResolveSubresourceRegion(This,dst_resource,dst_sub_resource_idx,dst_x,dst_y,src_resource,src_sub_resource_idx,src_rect,format,mode)
#define ID3D12GraphicsCommandList1_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_QueryInterface(ID3D12GraphicsCommandList1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12GraphicsCommandList1_AddRef(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12GraphicsCommandList1_Release(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_GetPrivateData(ID3D12GraphicsCommandList1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_SetPrivateData(ID3D12GraphicsCommandList1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_SetPrivateDataInterface(ID3D12GraphicsCommandList1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_SetName(ID3D12GraphicsCommandList1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_GetDevice(ID3D12GraphicsCommandList1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static FORCEINLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList1_GetType(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_Close(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_Reset(ID3D12GraphicsCommandList1* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList1_ClearState(ID3D12GraphicsCommandList1* This,ID3D12PipelineState *pipeline_state) {
    return This->lpVtbl->ClearState(This,pipeline_state);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_DrawInstanced(ID3D12GraphicsCommandList1* This,UINT vertex_count_per_instance,UINT instance_count,UINT start_vertex_location,UINT start_instance_location) {
    This->lpVtbl->DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_DrawIndexedInstanced(ID3D12GraphicsCommandList1* This,UINT index_count_per_instance,UINT instance_count,UINT start_vertex_location,INT base_vertex_location,UINT start_instance_location) {
    This->lpVtbl->DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_Dispatch(ID3D12GraphicsCommandList1* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_CopyBufferRegion(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT64 byte_count) {
    This->lpVtbl->CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_CopyTextureRegion(ID3D12GraphicsCommandList1* This,const D3D12_TEXTURE_COPY_LOCATION *dst,UINT dst_x,UINT dst_y,UINT dst_z,const D3D12_TEXTURE_COPY_LOCATION *src,const D3D12_BOX *src_box) {
    This->lpVtbl->CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_CopyResource(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_CopyTiles(ID3D12GraphicsCommandList1* This,ID3D12Resource *tiled_resource,const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,const D3D12_TILE_REGION_SIZE *tile_region_size,ID3D12Resource *buffer,UINT64 buffer_offset,D3D12_TILE_COPY_FLAGS flags) {
    This->lpVtbl->CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ResolveSubresource(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_resource,UINT dst_sub_resource,ID3D12Resource *src_resource,UINT src_sub_resource,DXGI_FORMAT format) {
    This->lpVtbl->ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_IASetPrimitiveTopology(ID3D12GraphicsCommandList1* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_RSSetViewports(ID3D12GraphicsCommandList1* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_RSSetScissorRects(ID3D12GraphicsCommandList1* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_OMSetBlendFactor(ID3D12GraphicsCommandList1* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_OMSetStencilRef(ID3D12GraphicsCommandList1* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetPipelineState(ID3D12GraphicsCommandList1* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ResourceBarrier(ID3D12GraphicsCommandList1* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ExecuteBundle(ID3D12GraphicsCommandList1* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetDescriptorHeaps(ID3D12GraphicsCommandList1* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRootSignature(ID3D12GraphicsCommandList1* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRootSignature(ID3D12GraphicsCommandList1* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,UINT constant_count,const void *data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,UINT constant_count,const void *data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_IASetIndexBuffer(ID3D12GraphicsCommandList1* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_IASetVertexBuffers(ID3D12GraphicsCommandList1* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SOSetTargets(ID3D12GraphicsCommandList1* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_OMSetRenderTargets(ID3D12GraphicsCommandList1* This,UINT render_target_descriptor_count,const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,WINBOOL single_descriptor_handle,const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor) {
    This->lpVtbl->OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ClearDepthStencilView(ID3D12GraphicsCommandList1* This,D3D12_CPU_DESCRIPTOR_HANDLE dsv,D3D12_CLEAR_FLAGS flags,FLOAT depth,UINT8 stencil,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ClearRenderTargetView(ID3D12GraphicsCommandList1* This,D3D12_CPU_DESCRIPTOR_HANDLE rtv,const FLOAT color[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList1* This,D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,ID3D12Resource *resource,const UINT values[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList1* This,D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,ID3D12Resource *resource,const float values[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_DiscardResource(ID3D12GraphicsCommandList1* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_BeginQuery(ID3D12GraphicsCommandList1* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_EndQuery(ID3D12GraphicsCommandList1* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ResolveQueryData(ID3D12GraphicsCommandList1* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT start_index,UINT query_count,ID3D12Resource *dst_buffer,UINT64 aligned_dst_buffer_offset) {
    This->lpVtbl->ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetPredication(ID3D12GraphicsCommandList1* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetMarker(ID3D12GraphicsCommandList1* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_BeginEvent(ID3D12GraphicsCommandList1* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_EndEvent(ID3D12GraphicsCommandList1* This) {
    This->lpVtbl->EndEvent(This);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ExecuteIndirect(ID3D12GraphicsCommandList1* This,ID3D12CommandSignature *command_signature,UINT max_command_count,ID3D12Resource *arg_buffer,UINT64 arg_buffer_offset,ID3D12Resource *count_buffer,UINT64 count_buffer_offset) {
    This->lpVtbl->ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset);
}
/*** ID3D12GraphicsCommandList1 methods ***/
static FORCEINLINE void ID3D12GraphicsCommandList1_AtomicCopyBufferUINT(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT dependent_resource_count,ID3D12Resource *const *dependent_resources,const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges) {
    This->lpVtbl->AtomicCopyBufferUINT(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT dependent_resource_count,ID3D12Resource *const *dependent_resources,const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges) {
    This->lpVtbl->AtomicCopyBufferUINT64(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_OMSetDepthBounds(ID3D12GraphicsCommandList1* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetSamplePositions(ID3D12GraphicsCommandList1* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_ResolveSubresourceRegion(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_resource,UINT dst_sub_resource_idx,UINT dst_x,UINT dst_y,ID3D12Resource *src_resource,UINT src_sub_resource_idx,D3D12_RECT *src_rect,DXGI_FORMAT format,D3D12_RESOLVE_MODE mode) {
    This->lpVtbl->ResolveSubresourceRegion(This,dst_resource,dst_sub_resource_idx,dst_x,dst_y,src_resource,src_sub_resource_idx,src_rect,format,mode);
}
static FORCEINLINE void ID3D12GraphicsCommandList1_SetViewInstanceMask(ID3D12GraphicsCommandList1* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList1_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12GraphicsCommandList2 interface
 */
#ifndef __ID3D12GraphicsCommandList2_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList2, 0x38c3e585, 0xff17, 0x412c, 0x91,0x50, 0x4f,0xc6,0xf9,0xd7,0x2a,0x28);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("38c3e585-ff17-412c-9150-4fc6f9d72a28")
ID3D12GraphicsCommandList2 : public ID3D12GraphicsCommandList1
{
    virtual void STDMETHODCALLTYPE WriteBufferImmediate(
        UINT count,
        const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,
        const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList2, 0x38c3e585, 0xff17, 0x412c, 0x91,0x50, 0x4f,0xc6,0xf9,0xd7,0x2a,0x28)
#endif
#else
typedef struct ID3D12GraphicsCommandList2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12GraphicsCommandList2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12GraphicsCommandList2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12GraphicsCommandList2 *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12GraphicsCommandList2 *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12GraphicsCommandList2 *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12GraphicsCommandList2 *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12GraphicsCommandList2 *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12GraphicsCommandList2 *This,
        REFIID riid,
        void **device);

    /*** ID3D12CommandList methods ***/
    D3D12_COMMAND_LIST_TYPE (STDMETHODCALLTYPE *GetType)(
        ID3D12GraphicsCommandList2 *This);

    /*** ID3D12GraphicsCommandList methods ***/
    HRESULT (STDMETHODCALLTYPE *Close)(
        ID3D12GraphicsCommandList2 *This);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12CommandAllocator *allocator,
        ID3D12PipelineState *initial_state);

    HRESULT (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12PipelineState *pipeline_state);

    void (STDMETHODCALLTYPE *DrawInstanced)(
        ID3D12GraphicsCommandList2 *This,
        UINT vertex_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        UINT start_instance_location);

    void (STDMETHODCALLTYPE *DrawIndexedInstanced)(
        ID3D12GraphicsCommandList2 *This,
        UINT index_count_per_instance,
        UINT instance_count,
        UINT start_vertex_location,
        INT base_vertex_location,
        UINT start_instance_location);

    void (STDMETHODCALLTYPE *Dispatch)(
        ID3D12GraphicsCommandList2 *This,
        UINT x,
        UINT u,
        UINT z);

    void (STDMETHODCALLTYPE *CopyBufferRegion)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT64 byte_count);

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList2 *This,
        const D3D12_TEXTURE_COPY_LOCATION *dst,
        UINT dst_x,
        UINT dst_y,
        UINT dst_z,
        const D3D12_TEXTURE_COPY_LOCATION *src,
        const D3D12_BOX *src_box);

    void (STDMETHODCALLTYPE *CopyResource)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *tiled_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,
        const D3D12_TILE_REGION_SIZE *tile_region_size,
        ID3D12Resource *buffer,
        UINT64 buffer_offset,
        D3D12_TILE_COPY_FLAGS flags);

    void (STDMETHODCALLTYPE *ResolveSubresource)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

    void (STDMETHODCALLTYPE *IASetPrimitiveTopology)(
        ID3D12GraphicsCommandList2 *This,
        D3D12_PRIMITIVE_TOPOLOGY primitive_topology);

    void (STDMETHODCALLTYPE *RSSetViewports)(
        ID3D12GraphicsCommandList2 *This,
        UINT viewport_count,
        const D3D12_VIEWPORT *viewports);

    void (STDMETHODCALLTYPE *RSSetScissorRects)(
        ID3D12GraphicsCommandList2 *This,
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *OMSetBlendFactor)(
        ID3D12GraphicsCommandList2 *This,
        const FLOAT blend_factor[4]);

    void (STDMETHODCALLTYPE *OMSetStencilRef)(
        ID3D12GraphicsCommandList2 *This,
        UINT stencil_ref);

    void (STDMETHODCALLTYPE *SetPipelineState)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12PipelineState *pipeline_state);

    void (STDMETHODCALLTYPE *ResourceBarrier)(
        ID3D12GraphicsCommandList2 *This,
        UINT barrier_count,
        const D3D12_RESOURCE_BARRIER *barriers);

    void (STDMETHODCALLTYPE *ExecuteBundle)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12GraphicsCommandList *command_list);

    void (STDMETHODCALLTYPE *SetDescriptorHeaps)(
        ID3D12GraphicsCommandList2 *This,
        UINT heap_count,
        ID3D12DescriptorHeap *const *heaps);

    void (STDMETHODCALLTYPE *SetComputeRootSignature)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12RootSignature *root_signature);

    void (STDMETHODCALLTYPE *SetGraphicsRootSignature)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12RootSignature *root_signature);

    void (STDMETHODCALLTYPE *SetComputeRootDescriptorTable)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor);

    void (STDMETHODCALLTYPE *SetGraphicsRootDescriptorTable)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor);

    void (STDMETHODCALLTYPE *SetComputeRoot32BitConstant)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetGraphicsRoot32BitConstant)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        UINT data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetComputeRoot32BitConstants)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetGraphicsRoot32BitConstants)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        UINT constant_count,
        const void *data,
        UINT dst_offset);

    void (STDMETHODCALLTYPE *SetComputeRootConstantBufferView)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootConstantBufferView)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetComputeRootShaderResourceView)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootShaderResourceView)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetComputeRootUnorderedAccessView)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *SetGraphicsRootUnorderedAccessView)(
        ID3D12GraphicsCommandList2 *This,
        UINT root_parameter_index,
        D3D12_GPU_VIRTUAL_ADDRESS address);

    void (STDMETHODCALLTYPE *IASetIndexBuffer)(
        ID3D12GraphicsCommandList2 *This,
        const D3D12_INDEX_BUFFER_VIEW *view);

    void (STDMETHODCALLTYPE *IASetVertexBuffers)(
        ID3D12GraphicsCommandList2 *This,
        UINT start_slot,
        UINT view_count,
        const D3D12_VERTEX_BUFFER_VIEW *views);

    void (STDMETHODCALLTYPE *SOSetTargets)(
        ID3D12GraphicsCommandList2 *This,
        UINT start_slot,
        UINT view_count,
        const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views);

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList2 *This,
        UINT render_target_descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,
        WINBOOL single_descriptor_handle,
        const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor);

    void (STDMETHODCALLTYPE *ClearDepthStencilView)(
        ID3D12GraphicsCommandList2 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearRenderTargetView)(
        ID3D12GraphicsCommandList2 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE rtv,
        const FLOAT color[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList2 *This,
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const UINT values[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewFloat)(
        ID3D12GraphicsCommandList2 *This,
        D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,
        D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,
        ID3D12Resource *resource,
        const float values[4],
        UINT rect_count,
        const D3D12_RECT *rects);

    void (STDMETHODCALLTYPE *DiscardResource)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

    void (STDMETHODCALLTYPE *BeginQuery)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index);

    void (STDMETHODCALLTYPE *EndQuery)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT index);

    void (STDMETHODCALLTYPE *ResolveQueryData)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12QueryHeap *heap,
        D3D12_QUERY_TYPE type,
        UINT start_index,
        UINT query_count,
        ID3D12Resource *dst_buffer,
        UINT64 aligned_dst_buffer_offset);

    void (STDMETHODCALLTYPE *SetPredication)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *buffer,
        UINT64 aligned_buffer_offset,
        D3D12_PREDICATION_OP operation);

    void (STDMETHODCALLTYPE *SetMarker)(
        ID3D12GraphicsCommandList2 *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *BeginEvent)(
        ID3D12GraphicsCommandList2 *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *EndEvent)(
        ID3D12GraphicsCommandList2 *This);

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12CommandSignature *command_signature,
        UINT max_command_count,
        ID3D12Resource *arg_buffer,
        UINT64 arg_buffer_offset,
        ID3D12Resource *count_buffer,
        UINT64 count_buffer_offset);

    /*** ID3D12GraphicsCommandList1 methods ***/
    void (STDMETHODCALLTYPE *AtomicCopyBufferUINT)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT dependent_resource_count,
        ID3D12Resource *const *dependent_resources,
        const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges);

    void (STDMETHODCALLTYPE *AtomicCopyBufferUINT64)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *dst_buffer,
        UINT64 dst_offset,
        ID3D12Resource *src_buffer,
        UINT64 src_offset,
        UINT dependent_resource_count,
        ID3D12Resource *const *dependent_resources,
        const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges);

    void (STDMETHODCALLTYPE *OMSetDepthBounds)(
        ID3D12GraphicsCommandList2 *This,
        FLOAT min,
        FLOAT max);

    void (STDMETHODCALLTYPE *SetSamplePositions)(
        ID3D12GraphicsCommandList2 *This,
        UINT sample_count,
        UINT pixel_count,
        D3D12_SAMPLE_POSITION *sample_positions);

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList2 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource_idx,
        UINT dst_x,
        UINT dst_y,
        ID3D12Resource *src_resource,
        UINT src_sub_resource_idx,
        D3D12_RECT *src_rect,
        DXGI_FORMAT format,
        D3D12_RESOLVE_MODE mode);

    void (STDMETHODCALLTYPE *SetViewInstanceMask)(
        ID3D12GraphicsCommandList2 *This,
        UINT mask);

    /*** ID3D12GraphicsCommandList2 methods ***/
    void (STDMETHODCALLTYPE *WriteBufferImmediate)(
        ID3D12GraphicsCommandList2 *This,
        UINT count,
        const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,
        const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes);

    END_INTERFACE
} ID3D12GraphicsCommandList2Vtbl;

interface ID3D12GraphicsCommandList2 {
    CONST_VTBL ID3D12GraphicsCommandList2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList2_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList2_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList2_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList2_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList2_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList2_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList2_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList2_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList2_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList2_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList2_DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location) (This)->lpVtbl->DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location)
#define ID3D12GraphicsCommandList2_DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location) (This)->lpVtbl->DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location)
#define ID3D12GraphicsCommandList2_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList2_CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count) (This)->lpVtbl->CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count)
#define ID3D12GraphicsCommandList2_CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box) (This)->lpVtbl->CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box)
#define ID3D12GraphicsCommandList2_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList2_CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags) (This)->lpVtbl->CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags)
#define ID3D12GraphicsCommandList2_ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format) (This)->lpVtbl->ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format)
#define ID3D12GraphicsCommandList2_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList2_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList2_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList2_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList2_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList2_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList2_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList2_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList2_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList2_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList2_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList2_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList2_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList2_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList2_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList2_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList2_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList2_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList2_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList2_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList2_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList2_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList2_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList2_OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor) (This)->lpVtbl->OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor)
#define ID3D12GraphicsCommandList2_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList2_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList2_ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects) (This)->lpVtbl->ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects)
#define ID3D12GraphicsCommandList2_ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects) (This)->lpVtbl->ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects)
#define ID3D12GraphicsCommandList2_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList2_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList2_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList2_ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset) (This)->lpVtbl->ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset)
#define ID3D12GraphicsCommandList2_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList2_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList2_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList2_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList2_ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset) (This)->lpVtbl->ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset)
/*** ID3D12GraphicsCommandList1 methods ***/
#define ID3D12GraphicsCommandList2_AtomicCopyBufferUINT(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges) (This)->lpVtbl->AtomicCopyBufferUINT(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges)
#define ID3D12GraphicsCommandList2_AtomicCopyBufferUINT64(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges) (This)->lpVtbl->AtomicCopyBufferUINT64(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges)
#define ID3D12GraphicsCommandList2_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList2_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList2_ResolveSubresourceRegion(This,dst_resource,dst_sub_resource_idx,dst_x,dst_y,src_resource,src_sub_resource_idx,src_rect,format,mode) (This)->lpVtbl->ResolveSubresourceRegion(This,dst_resource,dst_sub_resource_idx,dst_x,dst_y,src_resource,src_sub_resource_idx,src_rect,format,mode)
#define ID3D12GraphicsCommandList2_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
/*** ID3D12GraphicsCommandList2 methods ***/
#define ID3D12GraphicsCommandList2_WriteBufferImmediate(This,count,parameters,modes) (This)->lpVtbl->WriteBufferImmediate(This,count,parameters,modes)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_QueryInterface(ID3D12GraphicsCommandList2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12GraphicsCommandList2_AddRef(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12GraphicsCommandList2_Release(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_GetPrivateData(ID3D12GraphicsCommandList2* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_SetPrivateData(ID3D12GraphicsCommandList2* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_SetPrivateDataInterface(ID3D12GraphicsCommandList2* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_SetName(ID3D12GraphicsCommandList2* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_GetDevice(ID3D12GraphicsCommandList2* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static FORCEINLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList2_GetType(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_Close(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_Reset(ID3D12GraphicsCommandList2* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static FORCEINLINE HRESULT ID3D12GraphicsCommandList2_ClearState(ID3D12GraphicsCommandList2* This,ID3D12PipelineState *pipeline_state) {
    return This->lpVtbl->ClearState(This,pipeline_state);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_DrawInstanced(ID3D12GraphicsCommandList2* This,UINT vertex_count_per_instance,UINT instance_count,UINT start_vertex_location,UINT start_instance_location) {
    This->lpVtbl->DrawInstanced(This,vertex_count_per_instance,instance_count,start_vertex_location,start_instance_location);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_DrawIndexedInstanced(ID3D12GraphicsCommandList2* This,UINT index_count_per_instance,UINT instance_count,UINT start_vertex_location,INT base_vertex_location,UINT start_instance_location) {
    This->lpVtbl->DrawIndexedInstanced(This,index_count_per_instance,instance_count,start_vertex_location,base_vertex_location,start_instance_location);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_Dispatch(ID3D12GraphicsCommandList2* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_CopyBufferRegion(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT64 byte_count) {
    This->lpVtbl->CopyBufferRegion(This,dst_buffer,dst_offset,src_buffer,src_offset,byte_count);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_CopyTextureRegion(ID3D12GraphicsCommandList2* This,const D3D12_TEXTURE_COPY_LOCATION *dst,UINT dst_x,UINT dst_y,UINT dst_z,const D3D12_TEXTURE_COPY_LOCATION *src,const D3D12_BOX *src_box) {
    This->lpVtbl->CopyTextureRegion(This,dst,dst_x,dst_y,dst_z,src,src_box);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_CopyResource(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_CopyTiles(ID3D12GraphicsCommandList2* This,ID3D12Resource *tiled_resource,const D3D12_TILED_RESOURCE_COORDINATE *tile_region_start_coordinate,const D3D12_TILE_REGION_SIZE *tile_region_size,ID3D12Resource *buffer,UINT64 buffer_offset,D3D12_TILE_COPY_FLAGS flags) {
    This->lpVtbl->CopyTiles(This,tiled_resource,tile_region_start_coordinate,tile_region_size,buffer,buffer_offset,flags);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ResolveSubresource(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_resource,UINT dst_sub_resource,ID3D12Resource *src_resource,UINT src_sub_resource,DXGI_FORMAT format) {
    This->lpVtbl->ResolveSubresource(This,dst_resource,dst_sub_resource,src_resource,src_sub_resource,format);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_IASetPrimitiveTopology(ID3D12GraphicsCommandList2* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_RSSetViewports(ID3D12GraphicsCommandList2* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_RSSetScissorRects(ID3D12GraphicsCommandList2* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_OMSetBlendFactor(ID3D12GraphicsCommandList2* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_OMSetStencilRef(ID3D12GraphicsCommandList2* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetPipelineState(ID3D12GraphicsCommandList2* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ResourceBarrier(ID3D12GraphicsCommandList2* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ExecuteBundle(ID3D12GraphicsCommandList2* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetDescriptorHeaps(ID3D12GraphicsCommandList2* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRootSignature(ID3D12GraphicsCommandList2* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRootSignature(ID3D12GraphicsCommandList2* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,UINT constant_count,const void *data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,UINT constant_count,const void *data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_IASetIndexBuffer(ID3D12GraphicsCommandList2* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_IASetVertexBuffers(ID3D12GraphicsCommandList2* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SOSetTargets(ID3D12GraphicsCommandList2* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_OMSetRenderTargets(ID3D12GraphicsCommandList2* This,UINT render_target_descriptor_count,const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors,WINBOOL single_descriptor_handle,const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor) {
    This->lpVtbl->OMSetRenderTargets(This,render_target_descriptor_count,render_target_descriptors,single_descriptor_handle,depth_stencil_descriptor);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ClearDepthStencilView(ID3D12GraphicsCommandList2* This,D3D12_CPU_DESCRIPTOR_HANDLE dsv,D3D12_CLEAR_FLAGS flags,FLOAT depth,UINT8 stencil,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ClearRenderTargetView(ID3D12GraphicsCommandList2* This,D3D12_CPU_DESCRIPTOR_HANDLE rtv,const FLOAT color[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList2* This,D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,ID3D12Resource *resource,const UINT values[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearUnorderedAccessViewUint(This,gpu_handle,cpu_handle,resource,values,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList2* This,D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle,D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle,ID3D12Resource *resource,const float values[4],UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->ClearUnorderedAccessViewFloat(This,gpu_handle,cpu_handle,resource,values,rect_count,rects);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_DiscardResource(ID3D12GraphicsCommandList2* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_BeginQuery(ID3D12GraphicsCommandList2* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_EndQuery(ID3D12GraphicsCommandList2* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ResolveQueryData(ID3D12GraphicsCommandList2* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT start_index,UINT query_count,ID3D12Resource *dst_buffer,UINT64 aligned_dst_buffer_offset) {
    This->lpVtbl->ResolveQueryData(This,heap,type,start_index,query_count,dst_buffer,aligned_dst_buffer_offset);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetPredication(ID3D12GraphicsCommandList2* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetMarker(ID3D12GraphicsCommandList2* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_BeginEvent(ID3D12GraphicsCommandList2* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_EndEvent(ID3D12GraphicsCommandList2* This) {
    This->lpVtbl->EndEvent(This);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ExecuteIndirect(ID3D12GraphicsCommandList2* This,ID3D12CommandSignature *command_signature,UINT max_command_count,ID3D12Resource *arg_buffer,UINT64 arg_buffer_offset,ID3D12Resource *count_buffer,UINT64 count_buffer_offset) {
    This->lpVtbl->ExecuteIndirect(This,command_signature,max_command_count,arg_buffer,arg_buffer_offset,count_buffer,count_buffer_offset);
}
/*** ID3D12GraphicsCommandList1 methods ***/
static FORCEINLINE void ID3D12GraphicsCommandList2_AtomicCopyBufferUINT(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT dependent_resource_count,ID3D12Resource *const *dependent_resources,const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges) {
    This->lpVtbl->AtomicCopyBufferUINT(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_buffer,UINT64 dst_offset,ID3D12Resource *src_buffer,UINT64 src_offset,UINT dependent_resource_count,ID3D12Resource *const *dependent_resources,const D3D12_SUBRESOURCE_RANGE_UINT64 *dependent_sub_resource_ranges) {
    This->lpVtbl->AtomicCopyBufferUINT64(This,dst_buffer,dst_offset,src_buffer,src_offset,dependent_resource_count,dependent_resources,dependent_sub_resource_ranges);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_OMSetDepthBounds(ID3D12GraphicsCommandList2* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetSamplePositions(ID3D12GraphicsCommandList2* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_ResolveSubresourceRegion(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_resource,UINT dst_sub_resource_idx,UINT dst_x,UINT dst_y,ID3D12Resource *src_resource,UINT src_sub_resource_idx,D3D12_RECT *src_rect,DXGI_FORMAT format,D3D12_RESOLVE_MODE mode) {
    This->lpVtbl->ResolveSubresourceRegion(This,dst_resource,dst_sub_resource_idx,dst_x,dst_y,src_resource,src_sub_resource_idx,src_rect,format,mode);
}
static FORCEINLINE void ID3D12GraphicsCommandList2_SetViewInstanceMask(ID3D12GraphicsCommandList2* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static FORCEINLINE void ID3D12GraphicsCommandList2_WriteBufferImmediate(ID3D12GraphicsCommandList2* This,UINT count,const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) {
    This->lpVtbl->WriteBufferImmediate(This,count,parameters,modes);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList2_INTERFACE_DEFINED__ */

typedef enum D3D12_TILE_RANGE_FLAGS {
    D3D12_TILE_RANGE_FLAG_NONE = 0x0,
    D3D12_TILE_RANGE_FLAG_NULL = 0x1,
    D3D12_TILE_RANGE_FLAG_SKIP = 0x2,
    D3D12_TILE_RANGE_FLAG_REUSE_SINGLE_TILE = 0x4
} D3D12_TILE_RANGE_FLAGS;
typedef enum D3D12_TILE_MAPPING_FLAGS {
    D3D12_TILE_MAPPING_FLAG_NONE = 0x0,
    D3D12_TILE_MAPPING_FLAG_NO_HAZARD = 0x1
} D3D12_TILE_MAPPING_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_TILE_MAPPING_FLAGS);
/*****************************************************************************
 * ID3D12CommandQueue interface
 */
#ifndef __ID3D12CommandQueue_INTERFACE_DEFINED__
#define __ID3D12CommandQueue_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12CommandQueue, 0x0ec870a6, 0x5d7e, 0x4c22, 0x8c,0xfc, 0x5b,0xaa,0xe0,0x76,0x16,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0ec870a6-5d7e-4c22-8cfc-5baae07616ed")
ID3D12CommandQueue : public ID3D12Pageable
{
    virtual void STDMETHODCALLTYPE UpdateTileMappings(
        ID3D12Resource *resource,
        UINT region_count,
        const D3D12_TILED_RESOURCE_COORDINATE *region_start_coordinates,
        const D3D12_TILE_REGION_SIZE *region_sizes,
        UINT range_count,
        const D3D12_TILE_RANGE_FLAGS *range_flags,
        UINT *heap_range_offsets,
        UINT *range_tile_counts,
        D3D12_TILE_MAPPING_FLAGS flags) = 0;

    virtual void STDMETHODCALLTYPE CopyTileMappings(
        ID3D12Resource *dst_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *dst_region_start_coordinate,
        ID3D12Resource *src_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *src_region_start_coordinate,
        const D3D12_TILE_REGION_SIZE *region_size,
        D3D12_TILE_MAPPING_FLAGS flags) = 0;

    virtual void STDMETHODCALLTYPE ExecuteCommandLists(
        UINT command_list_count,
        ID3D12CommandList *const *command_lists) = 0;

    virtual void STDMETHODCALLTYPE SetMarker(
        UINT metadata,
        const void *data,
        UINT size) = 0;

    virtual void STDMETHODCALLTYPE BeginEvent(
        UINT metadata,
        const void *data,
        UINT size) = 0;

    virtual void STDMETHODCALLTYPE EndEvent(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Signal(
        ID3D12Fence *fence,
        UINT64 value) = 0;

    virtual HRESULT STDMETHODCALLTYPE Wait(
        ID3D12Fence *fence,
        UINT64 value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimestampFrequency(
        UINT64 *frequency) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetClockCalibration(
        UINT64 *gpu_timestamp,
        UINT64 *cpu_timestamp) = 0;

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_COMMAND_QUEUE_DESC* STDMETHODCALLTYPE GetDesc(
        D3D12_COMMAND_QUEUE_DESC *__ret) = 0;
    D3D12_COMMAND_QUEUE_DESC STDMETHODCALLTYPE GetDesc(
        )
    {
        D3D12_COMMAND_QUEUE_DESC __ret;
        return *GetDesc(&__ret);
    }
#else
    virtual D3D12_COMMAND_QUEUE_DESC STDMETHODCALLTYPE GetDesc(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12CommandQueue, 0x0ec870a6, 0x5d7e, 0x4c22, 0x8c,0xfc, 0x5b,0xaa,0xe0,0x76,0x16,0xed)
#endif
#else
typedef struct ID3D12CommandQueueVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12CommandQueue *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12CommandQueue *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12CommandQueue *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12CommandQueue *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12CommandQueue *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12CommandQueue *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12CommandQueue *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12CommandQueue *This,
        REFIID riid,
        void **device);

    /*** ID3D12CommandQueue methods ***/
    void (STDMETHODCALLTYPE *UpdateTileMappings)(
        ID3D12CommandQueue *This,
        ID3D12Resource *resource,
        UINT region_count,
        const D3D12_TILED_RESOURCE_COORDINATE *region_start_coordinates,
        const D3D12_TILE_REGION_SIZE *region_sizes,
        UINT range_count,
        const D3D12_TILE_RANGE_FLAGS *range_flags,
        UINT *heap_range_offsets,
        UINT *range_tile_counts,
        D3D12_TILE_MAPPING_FLAGS flags);

    void (STDMETHODCALLTYPE *CopyTileMappings)(
        ID3D12CommandQueue *This,
        ID3D12Resource *dst_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *dst_region_start_coordinate,
        ID3D12Resource *src_resource,
        const D3D12_TILED_RESOURCE_COORDINATE *src_region_start_coordinate,
        const D3D12_TILE_REGION_SIZE *region_size,
        D3D12_TILE_MAPPING_FLAGS flags);

    void (STDMETHODCALLTYPE *ExecuteCommandLists)(
        ID3D12CommandQueue *This,
        UINT command_list_count,
        ID3D12CommandList *const *command_lists);

    void (STDMETHODCALLTYPE *SetMarker)(
        ID3D12CommandQueue *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *BeginEvent)(
        ID3D12CommandQueue *This,
        UINT metadata,
        const void *data,
        UINT size);

    void (STDMETHODCALLTYPE *EndEvent)(
        ID3D12CommandQueue *This);

    HRESULT (STDMETHODCALLTYPE *Signal)(
        ID3D12CommandQueue *This,
        ID3D12Fence *fence,
        UINT64 value);

    HRESULT (STDMETHODCALLTYPE *Wait)(
        ID3D12CommandQueue *This,
        ID3D12Fence *fence,
        UINT64 value);

    HRESULT (STDMETHODCALLTYPE *GetTimestampFrequency)(
        ID3D12CommandQueue *This,
        UINT64 *frequency);

    HRESULT (STDMETHODCALLTYPE *GetClockCalibration)(
        ID3D12CommandQueue *This,
        UINT64 *gpu_timestamp,
        UINT64 *cpu_timestamp);

    D3D12_COMMAND_QUEUE_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12CommandQueue *This,
        D3D12_COMMAND_QUEUE_DESC *__ret);

    END_INTERFACE
} ID3D12CommandQueueVtbl;

interface ID3D12CommandQueue {
    CONST_VTBL ID3D12CommandQueueVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12CommandQueue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12CommandQueue_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12CommandQueue_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12CommandQueue_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12CommandQueue_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12CommandQueue_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12CommandQueue_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12CommandQueue_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandQueue methods ***/
#define ID3D12CommandQueue_UpdateTileMappings(This,resource,region_count,region_start_coordinates,region_sizes,range_count,range_flags,heap_range_offsets,range_tile_counts,flags) (This)->lpVtbl->UpdateTileMappings(This,resource,region_count,region_start_coordinates,region_sizes,range_count,range_flags,heap_range_offsets,range_tile_counts,flags)
#define ID3D12CommandQueue_CopyTileMappings(This,dst_resource,dst_region_start_coordinate,src_resource,src_region_start_coordinate,region_size,flags) (This)->lpVtbl->CopyTileMappings(This,dst_resource,dst_region_start_coordinate,src_resource,src_region_start_coordinate,region_size,flags)
#define ID3D12CommandQueue_ExecuteCommandLists(This,command_list_count,command_lists) (This)->lpVtbl->ExecuteCommandLists(This,command_list_count,command_lists)
#define ID3D12CommandQueue_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12CommandQueue_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12CommandQueue_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12CommandQueue_Signal(This,fence,value) (This)->lpVtbl->Signal(This,fence,value)
#define ID3D12CommandQueue_Wait(This,fence,value) (This)->lpVtbl->Wait(This,fence,value)
#define ID3D12CommandQueue_GetTimestampFrequency(This,frequency) (This)->lpVtbl->GetTimestampFrequency(This,frequency)
#define ID3D12CommandQueue_GetClockCalibration(This,gpu_timestamp,cpu_timestamp) (This)->lpVtbl->GetClockCalibration(This,gpu_timestamp,cpu_timestamp)
#define ID3D12CommandQueue_GetDesc(This) ID3D12CommandQueue_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12CommandQueue_QueryInterface(ID3D12CommandQueue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12CommandQueue_AddRef(ID3D12CommandQueue* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12CommandQueue_Release(ID3D12CommandQueue* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12CommandQueue_GetPrivateData(ID3D12CommandQueue* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_SetPrivateData(ID3D12CommandQueue* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_SetPrivateDataInterface(ID3D12CommandQueue* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_SetName(ID3D12CommandQueue* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12CommandQueue_GetDevice(ID3D12CommandQueue* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandQueue methods ***/
static FORCEINLINE void ID3D12CommandQueue_UpdateTileMappings(ID3D12CommandQueue* This,ID3D12Resource *resource,UINT region_count,const D3D12_TILED_RESOURCE_COORDINATE *region_start_coordinates,const D3D12_TILE_REGION_SIZE *region_sizes,UINT range_count,const D3D12_TILE_RANGE_FLAGS *range_flags,UINT *heap_range_offsets,UINT *range_tile_counts,D3D12_TILE_MAPPING_FLAGS flags) {
    This->lpVtbl->UpdateTileMappings(This,resource,region_count,region_start_coordinates,region_sizes,range_count,range_flags,heap_range_offsets,range_tile_counts,flags);
}
static FORCEINLINE void ID3D12CommandQueue_CopyTileMappings(ID3D12CommandQueue* This,ID3D12Resource *dst_resource,const D3D12_TILED_RESOURCE_COORDINATE *dst_region_start_coordinate,ID3D12Resource *src_resource,const D3D12_TILED_RESOURCE_COORDINATE *src_region_start_coordinate,const D3D12_TILE_REGION_SIZE *region_size,D3D12_TILE_MAPPING_FLAGS flags) {
    This->lpVtbl->CopyTileMappings(This,dst_resource,dst_region_start_coordinate,src_resource,src_region_start_coordinate,region_size,flags);
}
static FORCEINLINE void ID3D12CommandQueue_ExecuteCommandLists(ID3D12CommandQueue* This,UINT command_list_count,ID3D12CommandList *const *command_lists) {
    This->lpVtbl->ExecuteCommandLists(This,command_list_count,command_lists);
}
static FORCEINLINE void ID3D12CommandQueue_SetMarker(ID3D12CommandQueue* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static FORCEINLINE void ID3D12CommandQueue_BeginEvent(ID3D12CommandQueue* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static FORCEINLINE void ID3D12CommandQueue_EndEvent(ID3D12CommandQueue* This) {
    This->lpVtbl->EndEvent(This);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_Signal(ID3D12CommandQueue* This,ID3D12Fence *fence,UINT64 value) {
    return This->lpVtbl->Signal(This,fence,value);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_Wait(ID3D12CommandQueue* This,ID3D12Fence *fence,UINT64 value) {
    return This->lpVtbl->Wait(This,fence,value);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_GetTimestampFrequency(ID3D12CommandQueue* This,UINT64 *frequency) {
    return This->lpVtbl->GetTimestampFrequency(This,frequency);
}
static FORCEINLINE HRESULT ID3D12CommandQueue_GetClockCalibration(ID3D12CommandQueue* This,UINT64 *gpu_timestamp,UINT64 *cpu_timestamp) {
    return This->lpVtbl->GetClockCalibration(This,gpu_timestamp,cpu_timestamp);
}
static FORCEINLINE D3D12_COMMAND_QUEUE_DESC ID3D12CommandQueue_GetDesc(ID3D12CommandQueue* This) {
    D3D12_COMMAND_QUEUE_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12CommandQueue_INTERFACE_DEFINED__ */

typedef enum D3D12_FENCE_FLAGS {
    D3D12_FENCE_FLAG_NONE = 0x0,
    D3D12_FENCE_FLAG_SHARED = 0x1,
    D3D12_FENCE_FLAG_SHARED_CROSS_ADAPTER = 0x2
} D3D12_FENCE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_FENCE_FLAGS);
typedef enum D3D12_QUERY_HEAP_TYPE {
    D3D12_QUERY_HEAP_TYPE_OCCLUSION = 0,
    D3D12_QUERY_HEAP_TYPE_TIMESTAMP = 1,
    D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS = 2,
    D3D12_QUERY_HEAP_TYPE_SO_STATISTICS = 3
} D3D12_QUERY_HEAP_TYPE;
typedef struct D3D12_QUERY_HEAP_DESC {
    D3D12_QUERY_HEAP_TYPE Type;
    UINT Count;
    UINT NodeMask;
} D3D12_QUERY_HEAP_DESC;
typedef enum D3D12_INDIRECT_ARGUMENT_TYPE {
    D3D12_INDIRECT_ARGUMENT_TYPE_DRAW = 0,
    D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED = 1,
    D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH = 2,
    D3D12_INDIRECT_ARGUMENT_TYPE_VERTEX_BUFFER_VIEW = 3,
    D3D12_INDIRECT_ARGUMENT_TYPE_INDEX_BUFFER_VIEW = 4,
    D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT = 5,
    D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT_BUFFER_VIEW = 6,
    D3D12_INDIRECT_ARGUMENT_TYPE_SHADER_RESOURCE_VIEW = 7,
    D3D12_INDIRECT_ARGUMENT_TYPE_UNORDERED_ACCESS_VIEW = 8
} D3D12_INDIRECT_ARGUMENT_TYPE;
typedef struct D3D12_INDIRECT_ARGUMENT_DESC {
    D3D12_INDIRECT_ARGUMENT_TYPE Type;
    __C89_NAMELESS union {
        struct {
            UINT Slot;
        } VertexBuffer;
        struct {
            UINT RootParameterIndex;
            UINT DestOffsetIn32BitValues;
            UINT Num32BitValuesToSet;
        } Constant;
        struct {
            UINT RootParameterIndex;
        } ConstantBufferView;
        struct {
            UINT RootParameterIndex;
        } ShaderResourceView;
        struct {
            UINT RootParameterIndex;
        } UnorderedAccessView;
    } __C89_NAMELESSUNIONNAME;
} D3D12_INDIRECT_ARGUMENT_DESC;
typedef struct D3D12_COMMAND_SIGNATURE_DESC {
    UINT ByteStride;
    UINT NumArgumentDescs;
    const D3D12_INDIRECT_ARGUMENT_DESC *pArgumentDescs;
    UINT NodeMask;
} D3D12_COMMAND_SIGNATURE_DESC;
/*****************************************************************************
 * ID3D12RootSignature interface
 */
#ifndef __ID3D12RootSignature_INTERFACE_DEFINED__
#define __ID3D12RootSignature_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12RootSignature, 0xc54a6b66, 0x72df, 0x4ee8, 0x8b,0xe5, 0xa9,0x46,0xa1,0x42,0x92,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c54a6b66-72df-4ee8-8be5-a946a1429214")
ID3D12RootSignature : public ID3D12DeviceChild
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12RootSignature, 0xc54a6b66, 0x72df, 0x4ee8, 0x8b,0xe5, 0xa9,0x46,0xa1,0x42,0x92,0x14)
#endif
#else
typedef struct ID3D12RootSignatureVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12RootSignature *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12RootSignature *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12RootSignature *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12RootSignature *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12RootSignature *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12RootSignature *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12RootSignature *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12RootSignature *This,
        REFIID riid,
        void **device);

    END_INTERFACE
} ID3D12RootSignatureVtbl;

interface ID3D12RootSignature {
    CONST_VTBL ID3D12RootSignatureVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12RootSignature_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12RootSignature_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12RootSignature_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12RootSignature_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12RootSignature_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12RootSignature_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12RootSignature_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12RootSignature_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12RootSignature_QueryInterface(ID3D12RootSignature* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12RootSignature_AddRef(ID3D12RootSignature* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12RootSignature_Release(ID3D12RootSignature* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12RootSignature_GetPrivateData(ID3D12RootSignature* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12RootSignature_SetPrivateData(ID3D12RootSignature* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12RootSignature_SetPrivateDataInterface(ID3D12RootSignature* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12RootSignature_SetName(ID3D12RootSignature* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12RootSignature_GetDevice(ID3D12RootSignature* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
#endif
#endif

#endif


#endif  /* __ID3D12RootSignature_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12PipelineState interface
 */
#ifndef __ID3D12PipelineState_INTERFACE_DEFINED__
#define __ID3D12PipelineState_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12PipelineState, 0x765a30f3, 0xf624, 0x4c6f, 0xa8,0x28, 0xac,0xe9,0x48,0x62,0x24,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("765a30f3-f624-4c6f-a828-ace948622445")
ID3D12PipelineState : public ID3D12Pageable
{
    virtual HRESULT STDMETHODCALLTYPE GetCachedBlob(
        ID3DBlob **blob) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12PipelineState, 0x765a30f3, 0xf624, 0x4c6f, 0xa8,0x28, 0xac,0xe9,0x48,0x62,0x24,0x45)
#endif
#else
typedef struct ID3D12PipelineStateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12PipelineState *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12PipelineState *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12PipelineState *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12PipelineState *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12PipelineState *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12PipelineState *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12PipelineState *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12PipelineState *This,
        REFIID riid,
        void **device);

    /*** ID3D12PipelineState methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCachedBlob)(
        ID3D12PipelineState *This,
        ID3DBlob **blob);

    END_INTERFACE
} ID3D12PipelineStateVtbl;

interface ID3D12PipelineState {
    CONST_VTBL ID3D12PipelineStateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12PipelineState_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12PipelineState_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12PipelineState_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12PipelineState_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12PipelineState_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12PipelineState_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12PipelineState_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12PipelineState_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12PipelineState methods ***/
#define ID3D12PipelineState_GetCachedBlob(This,blob) (This)->lpVtbl->GetCachedBlob(This,blob)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12PipelineState_QueryInterface(ID3D12PipelineState* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12PipelineState_AddRef(ID3D12PipelineState* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12PipelineState_Release(ID3D12PipelineState* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12PipelineState_GetPrivateData(ID3D12PipelineState* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12PipelineState_SetPrivateData(ID3D12PipelineState* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12PipelineState_SetPrivateDataInterface(ID3D12PipelineState* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12PipelineState_SetName(ID3D12PipelineState* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12PipelineState_GetDevice(ID3D12PipelineState* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12PipelineState methods ***/
static FORCEINLINE HRESULT ID3D12PipelineState_GetCachedBlob(ID3D12PipelineState* This,ID3DBlob **blob) {
    return This->lpVtbl->GetCachedBlob(This,blob);
}
#endif
#endif

#endif


#endif  /* __ID3D12PipelineState_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Fence interface
 */
#ifndef __ID3D12Fence_INTERFACE_DEFINED__
#define __ID3D12Fence_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Fence, 0x0a753dcf, 0xc4d8, 0x4b91, 0xad,0xf6, 0xbe,0x5a,0x60,0xd9,0x5a,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0a753dcf-c4d8-4b91-adf6-be5a60d95a76")
ID3D12Fence : public ID3D12Pageable
{
    virtual UINT64 STDMETHODCALLTYPE GetCompletedValue(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEventOnCompletion(
        UINT64 value,
        HANDLE event) = 0;

    virtual HRESULT STDMETHODCALLTYPE Signal(
        UINT64 value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Fence, 0x0a753dcf, 0xc4d8, 0x4b91, 0xad,0xf6, 0xbe,0x5a,0x60,0xd9,0x5a,0x76)
#endif
#else
typedef struct ID3D12FenceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Fence *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Fence *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Fence *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Fence *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Fence *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Fence *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Fence *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12Fence *This,
        REFIID riid,
        void **device);

    /*** ID3D12Fence methods ***/
    UINT64 (STDMETHODCALLTYPE *GetCompletedValue)(
        ID3D12Fence *This);

    HRESULT (STDMETHODCALLTYPE *SetEventOnCompletion)(
        ID3D12Fence *This,
        UINT64 value,
        HANDLE event);

    HRESULT (STDMETHODCALLTYPE *Signal)(
        ID3D12Fence *This,
        UINT64 value);

    END_INTERFACE
} ID3D12FenceVtbl;

interface ID3D12Fence {
    CONST_VTBL ID3D12FenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Fence_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Fence_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Fence_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Fence_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Fence_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Fence_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Fence_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Fence_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Fence methods ***/
#define ID3D12Fence_GetCompletedValue(This) (This)->lpVtbl->GetCompletedValue(This)
#define ID3D12Fence_SetEventOnCompletion(This,value,event) (This)->lpVtbl->SetEventOnCompletion(This,value,event)
#define ID3D12Fence_Signal(This,value) (This)->lpVtbl->Signal(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Fence_QueryInterface(ID3D12Fence* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Fence_AddRef(ID3D12Fence* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Fence_Release(ID3D12Fence* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Fence_GetPrivateData(ID3D12Fence* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Fence_SetPrivateData(ID3D12Fence* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Fence_SetPrivateDataInterface(ID3D12Fence* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Fence_SetName(ID3D12Fence* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12Fence_GetDevice(ID3D12Fence* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Fence methods ***/
static FORCEINLINE UINT64 ID3D12Fence_GetCompletedValue(ID3D12Fence* This) {
    return This->lpVtbl->GetCompletedValue(This);
}
static FORCEINLINE HRESULT ID3D12Fence_SetEventOnCompletion(ID3D12Fence* This,UINT64 value,HANDLE event) {
    return This->lpVtbl->SetEventOnCompletion(This,value,event);
}
static FORCEINLINE HRESULT ID3D12Fence_Signal(ID3D12Fence* This,UINT64 value) {
    return This->lpVtbl->Signal(This,value);
}
#endif
#endif

#endif


#endif  /* __ID3D12Fence_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12CommandAllocator interface
 */
#ifndef __ID3D12CommandAllocator_INTERFACE_DEFINED__
#define __ID3D12CommandAllocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12CommandAllocator, 0x6102dee4, 0xaf59, 0x4b09, 0xb9,0x99, 0xb4,0x4d,0x73,0xf0,0x9b,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6102dee4-af59-4b09-b999-b44d73f09b24")
ID3D12CommandAllocator : public ID3D12Pageable
{
    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12CommandAllocator, 0x6102dee4, 0xaf59, 0x4b09, 0xb9,0x99, 0xb4,0x4d,0x73,0xf0,0x9b,0x24)
#endif
#else
typedef struct ID3D12CommandAllocatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12CommandAllocator *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12CommandAllocator *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12CommandAllocator *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12CommandAllocator *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12CommandAllocator *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12CommandAllocator *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12CommandAllocator *This,
        const WCHAR *name);

    /*** ID3D12DeviceChild methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D12CommandAllocator *This,
        REFIID riid,
        void **device);

    /*** ID3D12CommandAllocator methods ***/
    HRESULT (STDMETHODCALLTYPE *Reset)(
        ID3D12CommandAllocator *This);

    END_INTERFACE
} ID3D12CommandAllocatorVtbl;

interface ID3D12CommandAllocator {
    CONST_VTBL ID3D12CommandAllocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12CommandAllocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12CommandAllocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12CommandAllocator_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12CommandAllocator_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12CommandAllocator_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12CommandAllocator_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12CommandAllocator_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12CommandAllocator_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandAllocator methods ***/
#define ID3D12CommandAllocator_Reset(This) (This)->lpVtbl->Reset(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12CommandAllocator_QueryInterface(ID3D12CommandAllocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12CommandAllocator_AddRef(ID3D12CommandAllocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12CommandAllocator_Release(ID3D12CommandAllocator* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12CommandAllocator_GetPrivateData(ID3D12CommandAllocator* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandAllocator_SetPrivateData(ID3D12CommandAllocator* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12CommandAllocator_SetPrivateDataInterface(ID3D12CommandAllocator* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12CommandAllocator_SetName(ID3D12CommandAllocator* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static FORCEINLINE HRESULT ID3D12CommandAllocator_GetDevice(ID3D12CommandAllocator* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandAllocator methods ***/
static FORCEINLINE HRESULT ID3D12CommandAllocator_Reset(ID3D12CommandAllocator* This) {
    return This->lpVtbl->Reset(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12CommandAllocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Device interface
 */
#ifndef __ID3D12Device_INTERFACE_DEFINED__
#define __ID3D12Device_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device, 0x189819f1, 0x1db6, 0x4b57, 0xbe,0x54, 0x18,0x21,0x33,0x9b,0x85,0xf7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("189819f1-1db6-4b57-be54-1821339b85f7")
ID3D12Device : public ID3D12Object
{
    virtual UINT STDMETHODCALLTYPE GetNodeCount(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCommandQueue(
        const D3D12_COMMAND_QUEUE_DESC *desc,
        REFIID riid,
        void **command_queue) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCommandAllocator(
        D3D12_COMMAND_LIST_TYPE type,
        REFIID riid,
        void **command_allocator) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateGraphicsPipelineState(
        const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateComputePipelineState(
        const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCommandList(
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        ID3D12CommandAllocator *command_allocator,
        ID3D12PipelineState *initial_pipeline_state,
        REFIID riid,
        void **command_list) = 0;

    virtual HRESULT STDMETHODCALLTYPE CheckFeatureSupport(
        D3D12_FEATURE feature,
        void *feature_data,
        UINT feature_data_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDescriptorHeap(
        const D3D12_DESCRIPTOR_HEAP_DESC *desc,
        REFIID riid,
        void **descriptor_heap) = 0;

    virtual UINT STDMETHODCALLTYPE GetDescriptorHandleIncrementSize(
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRootSignature(
        UINT node_mask,
        const void *bytecode,
        SIZE_T bytecode_length,
        REFIID riid,
        void **root_signature) = 0;

    virtual void STDMETHODCALLTYPE CreateConstantBufferView(
        const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor) = 0;

    virtual void STDMETHODCALLTYPE CreateShaderResourceView(
        ID3D12Resource *resource,
        const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor) = 0;

    virtual void STDMETHODCALLTYPE CreateUnorderedAccessView(
        ID3D12Resource *resource,
        ID3D12Resource *counter_resource,
        const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor) = 0;

    virtual void STDMETHODCALLTYPE CreateRenderTargetView(
        ID3D12Resource *resource,
        const D3D12_RENDER_TARGET_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor) = 0;

    virtual void STDMETHODCALLTYPE CreateDepthStencilView(
        ID3D12Resource *resource,
        const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor) = 0;

    virtual void STDMETHODCALLTYPE CreateSampler(
        const D3D12_SAMPLER_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor) = 0;

    virtual void STDMETHODCALLTYPE CopyDescriptors(
        UINT dst_descriptor_range_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *dst_descriptor_range_offsets,
        const UINT *dst_descriptor_range_sizes,
        UINT src_descriptor_range_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *src_descriptor_range_offsets,
        const UINT *src_descriptor_range_sizes,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) = 0;

    virtual void STDMETHODCALLTYPE CopyDescriptorsSimple(
        UINT descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor_range_offset,
        const D3D12_CPU_DESCRIPTOR_HANDLE src_descriptor_range_offset,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) = 0;

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_RESOURCE_ALLOCATION_INFO* STDMETHODCALLTYPE GetResourceAllocationInfo(
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs) = 0;
    D3D12_RESOURCE_ALLOCATION_INFO STDMETHODCALLTYPE GetResourceAllocationInfo(
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs)
    {
        D3D12_RESOURCE_ALLOCATION_INFO __ret;
        return *GetResourceAllocationInfo(&__ret, visible_mask, reource_desc_count, resource_descs);
    }
#else
    virtual D3D12_RESOURCE_ALLOCATION_INFO STDMETHODCALLTYPE GetResourceAllocationInfo(
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs) = 0;
#endif

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_HEAP_PROPERTIES* STDMETHODCALLTYPE GetCustomHeapProperties(
        D3D12_HEAP_PROPERTIES *__ret,
        UINT node_mask,
        D3D12_HEAP_TYPE heap_type) = 0;
    D3D12_HEAP_PROPERTIES STDMETHODCALLTYPE GetCustomHeapProperties(
        UINT node_mask,
        D3D12_HEAP_TYPE heap_type)
    {
        D3D12_HEAP_PROPERTIES __ret;
        return *GetCustomHeapProperties(&__ret, node_mask, heap_type);
    }
#else
    virtual D3D12_HEAP_PROPERTIES STDMETHODCALLTYPE GetCustomHeapProperties(
        UINT node_mask,
        D3D12_HEAP_TYPE heap_type) = 0;
#endif

    virtual HRESULT STDMETHODCALLTYPE CreateCommittedResource(
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateHeap(
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePlacedResource(
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReservedResource(
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSharedHandle(
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenSharedHandle(
        HANDLE handle,
        REFIID riid,
        void **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenSharedHandleByName(
        const WCHAR *name,
        DWORD access,
        HANDLE *handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE MakeResident(
        UINT object_count,
        ID3D12Pageable *const *objects) = 0;

    virtual HRESULT STDMETHODCALLTYPE Evict(
        UINT object_count,
        ID3D12Pageable *const *objects) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFence(
        UINT64 initial_value,
        D3D12_FENCE_FLAGS flags,
        REFIID riid,
        void **fence) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceRemovedReason(
        ) = 0;

    virtual void STDMETHODCALLTYPE GetCopyableFootprints(
        const D3D12_RESOURCE_DESC *desc,
        UINT first_sub_resource,
        UINT sub_resource_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *row_count,
        UINT64 *row_size,
        UINT64 *total_bytes) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQueryHeap(
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStablePowerState(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCommandSignature(
        const D3D12_COMMAND_SIGNATURE_DESC *desc,
        ID3D12RootSignature *root_signature,
        REFIID riid,
        void **command_signature) = 0;

    virtual void STDMETHODCALLTYPE GetResourceTiling(
        ID3D12Resource *resource,
        UINT *total_tile_count,
        D3D12_PACKED_MIP_INFO *packed_mip_info,
        D3D12_TILE_SHAPE *standard_tile_shape,
        UINT *sub_resource_tiling_count,
        UINT first_sub_resource_tiling,
        D3D12_SUBRESOURCE_TILING *sub_resource_tilings) = 0;

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual LUID* STDMETHODCALLTYPE GetAdapterLuid(
        LUID *__ret) = 0;
    LUID STDMETHODCALLTYPE GetAdapterLuid(
        )
    {
        LUID __ret;
        return *GetAdapterLuid(&__ret);
    }
#else
    virtual LUID STDMETHODCALLTYPE GetAdapterLuid(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device, 0x189819f1, 0x1db6, 0x4b57, 0xbe,0x54, 0x18,0x21,0x33,0x9b,0x85,0xf7)
#endif
#else
typedef struct ID3D12DeviceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Device *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Device *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Device *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Device *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Device *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Device *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Device *This,
        const WCHAR *name);

    /*** ID3D12Device methods ***/
    UINT (STDMETHODCALLTYPE *GetNodeCount)(
        ID3D12Device *This);

    HRESULT (STDMETHODCALLTYPE *CreateCommandQueue)(
        ID3D12Device *This,
        const D3D12_COMMAND_QUEUE_DESC *desc,
        REFIID riid,
        void **command_queue);

    HRESULT (STDMETHODCALLTYPE *CreateCommandAllocator)(
        ID3D12Device *This,
        D3D12_COMMAND_LIST_TYPE type,
        REFIID riid,
        void **command_allocator);

    HRESULT (STDMETHODCALLTYPE *CreateGraphicsPipelineState)(
        ID3D12Device *This,
        const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    HRESULT (STDMETHODCALLTYPE *CreateComputePipelineState)(
        ID3D12Device *This,
        const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    HRESULT (STDMETHODCALLTYPE *CreateCommandList)(
        ID3D12Device *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        ID3D12CommandAllocator *command_allocator,
        ID3D12PipelineState *initial_pipeline_state,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CheckFeatureSupport)(
        ID3D12Device *This,
        D3D12_FEATURE feature,
        void *feature_data,
        UINT feature_data_size);

    HRESULT (STDMETHODCALLTYPE *CreateDescriptorHeap)(
        ID3D12Device *This,
        const D3D12_DESCRIPTOR_HEAP_DESC *desc,
        REFIID riid,
        void **descriptor_heap);

    UINT (STDMETHODCALLTYPE *GetDescriptorHandleIncrementSize)(
        ID3D12Device *This,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type);

    HRESULT (STDMETHODCALLTYPE *CreateRootSignature)(
        ID3D12Device *This,
        UINT node_mask,
        const void *bytecode,
        SIZE_T bytecode_length,
        REFIID riid,
        void **root_signature);

    void (STDMETHODCALLTYPE *CreateConstantBufferView)(
        ID3D12Device *This,
        const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateShaderResourceView)(
        ID3D12Device *This,
        ID3D12Resource *resource,
        const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateUnorderedAccessView)(
        ID3D12Device *This,
        ID3D12Resource *resource,
        ID3D12Resource *counter_resource,
        const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateRenderTargetView)(
        ID3D12Device *This,
        ID3D12Resource *resource,
        const D3D12_RENDER_TARGET_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateDepthStencilView)(
        ID3D12Device *This,
        ID3D12Resource *resource,
        const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateSampler)(
        ID3D12Device *This,
        const D3D12_SAMPLER_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device *This,
        UINT dst_descriptor_range_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *dst_descriptor_range_offsets,
        const UINT *dst_descriptor_range_sizes,
        UINT src_descriptor_range_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *src_descriptor_range_offsets,
        const UINT *src_descriptor_range_sizes,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type);

    void (STDMETHODCALLTYPE *CopyDescriptorsSimple)(
        ID3D12Device *This,
        UINT descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor_range_offset,
        const D3D12_CPU_DESCRIPTOR_HANDLE src_descriptor_range_offset,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo)(
        ID3D12Device *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

    D3D12_HEAP_PROPERTIES * (STDMETHODCALLTYPE *GetCustomHeapProperties)(
        ID3D12Device *This,
        D3D12_HEAP_PROPERTIES *__ret,
        UINT node_mask,
        D3D12_HEAP_TYPE heap_type);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap)(
        ID3D12Device *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device *This,
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource)(
        ID3D12Device *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateSharedHandle)(
        ID3D12Device *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

    HRESULT (STDMETHODCALLTYPE *OpenSharedHandle)(
        ID3D12Device *This,
        HANDLE handle,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *OpenSharedHandleByName)(
        ID3D12Device *This,
        const WCHAR *name,
        DWORD access,
        HANDLE *handle);

    HRESULT (STDMETHODCALLTYPE *MakeResident)(
        ID3D12Device *This,
        UINT object_count,
        ID3D12Pageable *const *objects);

    HRESULT (STDMETHODCALLTYPE *Evict)(
        ID3D12Device *This,
        UINT object_count,
        ID3D12Pageable *const *objects);

    HRESULT (STDMETHODCALLTYPE *CreateFence)(
        ID3D12Device *This,
        UINT64 initial_value,
        D3D12_FENCE_FLAGS flags,
        REFIID riid,
        void **fence);

    HRESULT (STDMETHODCALLTYPE *GetDeviceRemovedReason)(
        ID3D12Device *This);

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device *This,
        const D3D12_RESOURCE_DESC *desc,
        UINT first_sub_resource,
        UINT sub_resource_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *row_count,
        UINT64 *row_size,
        UINT64 *total_bytes);

    HRESULT (STDMETHODCALLTYPE *CreateQueryHeap)(
        ID3D12Device *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *SetStablePowerState)(
        ID3D12Device *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *CreateCommandSignature)(
        ID3D12Device *This,
        const D3D12_COMMAND_SIGNATURE_DESC *desc,
        ID3D12RootSignature *root_signature,
        REFIID riid,
        void **command_signature);

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device *This,
        ID3D12Resource *resource,
        UINT *total_tile_count,
        D3D12_PACKED_MIP_INFO *packed_mip_info,
        D3D12_TILE_SHAPE *standard_tile_shape,
        UINT *sub_resource_tiling_count,
        UINT first_sub_resource_tiling,
        D3D12_SUBRESOURCE_TILING *sub_resource_tilings);

    LUID * (STDMETHODCALLTYPE *GetAdapterLuid)(
        ID3D12Device *This,
        LUID *__ret);

    END_INTERFACE
} ID3D12DeviceVtbl;

interface ID3D12Device {
    CONST_VTBL ID3D12DeviceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device_CreateCommandList(This,node_mask,type,command_allocator,initial_pipeline_state,riid,command_list) (This)->lpVtbl->CreateCommandList(This,node_mask,type,command_allocator,initial_pipeline_state,riid,command_list)
#define ID3D12Device_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device_CopyDescriptors(This,dst_descriptor_range_count,dst_descriptor_range_offsets,dst_descriptor_range_sizes,src_descriptor_range_count,src_descriptor_range_offsets,src_descriptor_range_sizes,descriptor_heap_type) (This)->lpVtbl->CopyDescriptors(This,dst_descriptor_range_count,dst_descriptor_range_offsets,dst_descriptor_range_sizes,src_descriptor_range_count,src_descriptor_range_offsets,src_descriptor_range_sizes,descriptor_heap_type)
#define ID3D12Device_CopyDescriptorsSimple(This,descriptor_count,dst_descriptor_range_offset,src_descriptor_range_offset,descriptor_heap_type) (This)->lpVtbl->CopyDescriptorsSimple(This,descriptor_count,dst_descriptor_range_offset,src_descriptor_range_offset,descriptor_heap_type)
#define ID3D12Device_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device_CreateCommittedResource(This,heap_properties,heap_flags,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateCommittedResource(This,heap_properties,heap_flags,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device_CreatePlacedResource(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreatePlacedResource(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device_GetCopyableFootprints(This,desc,first_sub_resource,sub_resource_count,base_offset,layouts,row_count,row_size,total_bytes) (This)->lpVtbl->GetCopyableFootprints(This,desc,first_sub_resource,sub_resource_count,base_offset,layouts,row_count,row_size,total_bytes)
#define ID3D12Device_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device_GetResourceTiling(This,resource,total_tile_count,packed_mip_info,standard_tile_shape,sub_resource_tiling_count,first_sub_resource_tiling,sub_resource_tilings) (This)->lpVtbl->GetResourceTiling(This,resource,total_tile_count,packed_mip_info,standard_tile_shape,sub_resource_tiling_count,first_sub_resource_tiling,sub_resource_tilings)
#define ID3D12Device_GetAdapterLuid(This) ID3D12Device_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Device_QueryInterface(ID3D12Device* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Device_AddRef(ID3D12Device* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Device_Release(ID3D12Device* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Device_GetPrivateData(ID3D12Device* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Device_SetPrivateData(ID3D12Device* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Device_SetPrivateDataInterface(ID3D12Device* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Device_SetName(ID3D12Device* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static FORCEINLINE UINT ID3D12Device_GetNodeCount(ID3D12Device* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static FORCEINLINE HRESULT ID3D12Device_CreateCommandQueue(ID3D12Device* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static FORCEINLINE HRESULT ID3D12Device_CreateCommandAllocator(ID3D12Device* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static FORCEINLINE HRESULT ID3D12Device_CreateGraphicsPipelineState(ID3D12Device* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static FORCEINLINE HRESULT ID3D12Device_CreateComputePipelineState(ID3D12Device* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static FORCEINLINE HRESULT ID3D12Device_CreateCommandList(ID3D12Device* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,ID3D12CommandAllocator *command_allocator,ID3D12PipelineState *initial_pipeline_state,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList(This,node_mask,type,command_allocator,initial_pipeline_state,riid,command_list);
}
static FORCEINLINE HRESULT ID3D12Device_CheckFeatureSupport(ID3D12Device* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static FORCEINLINE HRESULT ID3D12Device_CreateDescriptorHeap(ID3D12Device* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static FORCEINLINE UINT ID3D12Device_GetDescriptorHandleIncrementSize(ID3D12Device* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static FORCEINLINE HRESULT ID3D12Device_CreateRootSignature(ID3D12Device* This,UINT node_mask,const void *bytecode,SIZE_T bytecode_length,REFIID riid,void **root_signature) {
    return This->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature);
}
static FORCEINLINE void ID3D12Device_CreateConstantBufferView(ID3D12Device* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static FORCEINLINE void ID3D12Device_CreateShaderResourceView(ID3D12Device* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device_CreateUnorderedAccessView(ID3D12Device* This,ID3D12Resource *resource,ID3D12Resource *counter_resource,const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device_CreateRenderTargetView(ID3D12Device* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device_CreateDepthStencilView(ID3D12Device* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device_CreateSampler(ID3D12Device* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static FORCEINLINE void ID3D12Device_CopyDescriptors(ID3D12Device* This,UINT dst_descriptor_range_count,const D3D12_CPU_DESCRIPTOR_HANDLE *dst_descriptor_range_offsets,const UINT *dst_descriptor_range_sizes,UINT src_descriptor_range_count,const D3D12_CPU_DESCRIPTOR_HANDLE *src_descriptor_range_offsets,const UINT *src_descriptor_range_sizes,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    This->lpVtbl->CopyDescriptors(This,dst_descriptor_range_count,dst_descriptor_range_offsets,dst_descriptor_range_sizes,src_descriptor_range_count,src_descriptor_range_offsets,src_descriptor_range_sizes,descriptor_heap_type);
}
static FORCEINLINE void ID3D12Device_CopyDescriptorsSimple(ID3D12Device* This,UINT descriptor_count,const D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor_range_offset,const D3D12_CPU_DESCRIPTOR_HANDLE src_descriptor_range_offset,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    This->lpVtbl->CopyDescriptorsSimple(This,descriptor_count,dst_descriptor_range_offset,src_descriptor_range_offset,descriptor_heap_type);
}
static FORCEINLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device_GetResourceAllocationInfo(ID3D12Device* This,UINT visible_mask,UINT reource_desc_count,const D3D12_RESOURCE_DESC *resource_descs) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo(This,&__ret,visible_mask,reource_desc_count,resource_descs);
}
static FORCEINLINE D3D12_HEAP_PROPERTIES ID3D12Device_GetCustomHeapProperties(ID3D12Device* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static FORCEINLINE HRESULT ID3D12Device_CreateCommittedResource(ID3D12Device* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreateCommittedResource(This,heap_properties,heap_flags,desc,initial_state,optimized_clear_value,riid,resource);
}
static FORCEINLINE HRESULT ID3D12Device_CreateHeap(ID3D12Device* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static FORCEINLINE HRESULT ID3D12Device_CreatePlacedResource(ID3D12Device* This,ID3D12Heap *heap,UINT64 heap_offset,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreatePlacedResource(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource);
}
static FORCEINLINE HRESULT ID3D12Device_CreateReservedResource(ID3D12Device* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource);
}
static FORCEINLINE HRESULT ID3D12Device_CreateSharedHandle(ID3D12Device* This,ID3D12DeviceChild *object,const SECURITY_ATTRIBUTES *attributes,DWORD access,const WCHAR *name,HANDLE *handle) {
    return This->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle);
}
static FORCEINLINE HRESULT ID3D12Device_OpenSharedHandle(ID3D12Device* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static FORCEINLINE HRESULT ID3D12Device_OpenSharedHandleByName(ID3D12Device* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static FORCEINLINE HRESULT ID3D12Device_MakeResident(ID3D12Device* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static FORCEINLINE HRESULT ID3D12Device_Evict(ID3D12Device* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static FORCEINLINE HRESULT ID3D12Device_CreateFence(ID3D12Device* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static FORCEINLINE HRESULT ID3D12Device_GetDeviceRemovedReason(ID3D12Device* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static FORCEINLINE void ID3D12Device_GetCopyableFootprints(ID3D12Device* This,const D3D12_RESOURCE_DESC *desc,UINT first_sub_resource,UINT sub_resource_count,UINT64 base_offset,D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,UINT *row_count,UINT64 *row_size,UINT64 *total_bytes) {
    This->lpVtbl->GetCopyableFootprints(This,desc,first_sub_resource,sub_resource_count,base_offset,layouts,row_count,row_size,total_bytes);
}
static FORCEINLINE HRESULT ID3D12Device_CreateQueryHeap(ID3D12Device* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static FORCEINLINE HRESULT ID3D12Device_SetStablePowerState(ID3D12Device* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static FORCEINLINE HRESULT ID3D12Device_CreateCommandSignature(ID3D12Device* This,const D3D12_COMMAND_SIGNATURE_DESC *desc,ID3D12RootSignature *root_signature,REFIID riid,void **command_signature) {
    return This->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature);
}
static FORCEINLINE void ID3D12Device_GetResourceTiling(ID3D12Device* This,ID3D12Resource *resource,UINT *total_tile_count,D3D12_PACKED_MIP_INFO *packed_mip_info,D3D12_TILE_SHAPE *standard_tile_shape,UINT *sub_resource_tiling_count,UINT first_sub_resource_tiling,D3D12_SUBRESOURCE_TILING *sub_resource_tilings) {
    This->lpVtbl->GetResourceTiling(This,resource,total_tile_count,packed_mip_info,standard_tile_shape,sub_resource_tiling_count,first_sub_resource_tiling,sub_resource_tilings);
}
static FORCEINLINE LUID ID3D12Device_GetAdapterLuid(ID3D12Device* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Device1 interface
 */
#ifndef __ID3D12Device1_INTERFACE_DEFINED__
#define __ID3D12Device1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device1, 0x77acce80, 0x638e, 0x4e65, 0x88,0x95, 0xc1,0xf2,0x33,0x86,0x86,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("77acce80-638e-4e65-8895-c1f23386863e")
ID3D12Device1 : public ID3D12Device
{
    virtual HRESULT STDMETHODCALLTYPE CreatePipelineLibrary(
        const void *blob,
        SIZE_T blob_size,
        REFIID iid,
        void **lib) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEventOnMultipleFenceCompletion(
        ID3D12Fence *const *fences,
        const UINT64 *values,
        UINT fence_count,
        D3D12_MULTIPLE_FENCE_WAIT_FLAGS flags,
        HANDLE event) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetResidencyPriority(
        UINT object_count,
        ID3D12Pageable *const *objects,
        const D3D12_RESIDENCY_PRIORITY *priorities) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device1, 0x77acce80, 0x638e, 0x4e65, 0x88,0x95, 0xc1,0xf2,0x33,0x86,0x86,0x3e)
#endif
#else
typedef struct ID3D12Device1Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12Device1 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12Device1 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12Device1 *This);

    /*** ID3D12Object methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        ID3D12Device1 *This,
        REFGUID guid,
        UINT *data_size,
        void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        ID3D12Device1 *This,
        REFGUID guid,
        UINT data_size,
        const void *data);

    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
        ID3D12Device1 *This,
        REFGUID guid,
        const IUnknown *data);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ID3D12Device1 *This,
        const WCHAR *name);

    /*** ID3D12Device methods ***/
    UINT (STDMETHODCALLTYPE *GetNodeCount)(
        ID3D12Device1 *This);

    HRESULT (STDMETHODCALLTYPE *CreateCommandQueue)(
        ID3D12Device1 *This,
        const D3D12_COMMAND_QUEUE_DESC *desc,
        REFIID riid,
        void **command_queue);

    HRESULT (STDMETHODCALLTYPE *CreateCommandAllocator)(
        ID3D12Device1 *This,
        D3D12_COMMAND_LIST_TYPE type,
        REFIID riid,
        void **command_allocator);

    HRESULT (STDMETHODCALLTYPE *CreateGraphicsPipelineState)(
        ID3D12Device1 *This,
        const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    HRESULT (STDMETHODCALLTYPE *CreateComputePipelineState)(
        ID3D12Device1 *This,
        const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    HRESULT (STDMETHODCALLTYPE *CreateCommandList)(
        ID3D12Device1 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        ID3D12CommandAllocator *command_allocator,
        ID3D12PipelineState *initial_pipeline_state,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CheckFeatureSupport)(
        ID3D12Device1 *This,
        D3D12_FEATURE feature,
        void *feature_data,
        UINT feature_data_size);

    HRESULT (STDMETHODCALLTYPE *CreateDescriptorHeap)(
        ID3D12Device1 *This,
        const D3D12_DESCRIPTOR_HEAP_DESC *desc,
        REFIID riid,
        void **descriptor_heap);

    UINT (STDMETHODCALLTYPE *GetDescriptorHandleIncrementSize)(
        ID3D12Device1 *This,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type);

    HRESULT (STDMETHODCALLTYPE *CreateRootSignature)(
        ID3D12Device1 *This,
        UINT node_mask,
        const void *bytecode,
        SIZE_T bytecode_length,
        REFIID riid,
        void **root_signature);

    void (STDMETHODCALLTYPE *CreateConstantBufferView)(
        ID3D12Device1 *This,
        const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateShaderResourceView)(
        ID3D12Device1 *This,
        ID3D12Resource *resource,
        const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateUnorderedAccessView)(
        ID3D12Device1 *This,
        ID3D12Resource *resource,
        ID3D12Resource *counter_resource,
        const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateRenderTargetView)(
        ID3D12Device1 *This,
        ID3D12Resource *resource,
        const D3D12_RENDER_TARGET_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateDepthStencilView)(
        ID3D12Device1 *This,
        ID3D12Resource *resource,
        const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CreateSampler)(
        ID3D12Device1 *This,
        const D3D12_SAMPLER_DESC *desc,
        D3D12_CPU_DESCRIPTOR_HANDLE descriptor);

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device1 *This,
        UINT dst_descriptor_range_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *dst_descriptor_range_offsets,
        const UINT *dst_descriptor_range_sizes,
        UINT src_descriptor_range_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE *src_descriptor_range_offsets,
        const UINT *src_descriptor_range_sizes,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type);

    void (STDMETHODCALLTYPE *CopyDescriptorsSimple)(
        ID3D12Device1 *This,
        UINT descriptor_count,
        const D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor_range_offset,
        const D3D12_CPU_DESCRIPTOR_HANDLE src_descriptor_range_offset,
        D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo)(
        ID3D12Device1 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

    D3D12_HEAP_PROPERTIES * (STDMETHODCALLTYPE *GetCustomHeapProperties)(
        ID3D12Device1 *This,
        D3D12_HEAP_PROPERTIES *__ret,
        UINT node_mask,
        D3D12_HEAP_TYPE heap_type);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device1 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap)(
        ID3D12Device1 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device1 *This,
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource)(
        ID3D12Device1 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateSharedHandle)(
        ID3D12Device1 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

    HRESULT (STDMETHODCALLTYPE *OpenSharedHandle)(
        ID3D12Device1 *This,
        HANDLE handle,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *OpenSharedHandleByName)(
        ID3D12Device1 *This,
        const WCHAR *name,
        DWORD access,
        HANDLE *handle);

    HRESULT (STDMETHODCALLTYPE *MakeResident)(
        ID3D12Device1 *This,
        UINT object_count,
        ID3D12Pageable *const *objects);

    HRESULT (STDMETHODCALLTYPE *Evict)(
        ID3D12Device1 *This,
        UINT object_count,
        ID3D12Pageable *const *objects);

    HRESULT (STDMETHODCALLTYPE *CreateFence)(
        ID3D12Device1 *This,
        UINT64 initial_value,
        D3D12_FENCE_FLAGS flags,
        REFIID riid,
        void **fence);

    HRESULT (STDMETHODCALLTYPE *GetDeviceRemovedReason)(
        ID3D12Device1 *This);

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device1 *This,
        const D3D12_RESOURCE_DESC *desc,
        UINT first_sub_resource,
        UINT sub_resource_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *row_count,
        UINT64 *row_size,
        UINT64 *total_bytes);

    HRESULT (STDMETHODCALLTYPE *CreateQueryHeap)(
        ID3D12Device1 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *SetStablePowerState)(
        ID3D12Device1 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *CreateCommandSignature)(
        ID3D12Device1 *This,
        const D3D12_COMMAND_SIGNATURE_DESC *desc,
        ID3D12RootSignature *root_signature,
        REFIID riid,
        void **command_signature);

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device1 *This,
        ID3D12Resource *resource,
        UINT *total_tile_count,
        D3D12_PACKED_MIP_INFO *packed_mip_info,
        D3D12_TILE_SHAPE *standard_tile_shape,
        UINT *sub_resource_tiling_count,
        UINT first_sub_resource_tiling,
        D3D12_SUBRESOURCE_TILING *sub_resource_tilings);

    LUID * (STDMETHODCALLTYPE *GetAdapterLuid)(
        ID3D12Device1 *This,
        LUID *__ret);

    /*** ID3D12Device1 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineLibrary)(
        ID3D12Device1 *This,
        const void *blob,
        SIZE_T blob_size,
        REFIID iid,
        void **lib);

    HRESULT (STDMETHODCALLTYPE *SetEventOnMultipleFenceCompletion)(
        ID3D12Device1 *This,
        ID3D12Fence *const *fences,
        const UINT64 *values,
        UINT fence_count,
        D3D12_MULTIPLE_FENCE_WAIT_FLAGS flags,
        HANDLE event);

    HRESULT (STDMETHODCALLTYPE *SetResidencyPriority)(
        ID3D12Device1 *This,
        UINT object_count,
        ID3D12Pageable *const *objects,
        const D3D12_RESIDENCY_PRIORITY *priorities);

    END_INTERFACE
} ID3D12Device1Vtbl;

interface ID3D12Device1 {
    CONST_VTBL ID3D12Device1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device1_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device1_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device1_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device1_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device1_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device1_CreateCommandList(This,node_mask,type,command_allocator,initial_pipeline_state,riid,command_list) (This)->lpVtbl->CreateCommandList(This,node_mask,type,command_allocator,initial_pipeline_state,riid,command_list)
#define ID3D12Device1_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device1_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device1_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device1_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device1_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device1_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device1_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device1_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device1_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device1_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device1_CopyDescriptors(This,dst_descriptor_range_count,dst_descriptor_range_offsets,dst_descriptor_range_sizes,src_descriptor_range_count,src_descriptor_range_offsets,src_descriptor_range_sizes,descriptor_heap_type) (This)->lpVtbl->CopyDescriptors(This,dst_descriptor_range_count,dst_descriptor_range_offsets,dst_descriptor_range_sizes,src_descriptor_range_count,src_descriptor_range_offsets,src_descriptor_range_sizes,descriptor_heap_type)
#define ID3D12Device1_CopyDescriptorsSimple(This,descriptor_count,dst_descriptor_range_offset,src_descriptor_range_offset,descriptor_heap_type) (This)->lpVtbl->CopyDescriptorsSimple(This,descriptor_count,dst_descriptor_range_offset,src_descriptor_range_offset,descriptor_heap_type)
#define ID3D12Device1_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device1_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device1_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device1_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device1_CreateCommittedResource(This,heap_properties,heap_flags,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateCommittedResource(This,heap_properties,heap_flags,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device1_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device1_CreatePlacedResource(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreatePlacedResource(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device1_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device1_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device1_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device1_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device1_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device1_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device1_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device1_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device1_GetCopyableFootprints(This,desc,first_sub_resource,sub_resource_count,base_offset,layouts,row_count,row_size,total_bytes) (This)->lpVtbl->GetCopyableFootprints(This,desc,first_sub_resource,sub_resource_count,base_offset,layouts,row_count,row_size,total_bytes)
#define ID3D12Device1_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device1_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device1_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device1_GetResourceTiling(This,resource,total_tile_count,packed_mip_info,standard_tile_shape,sub_resource_tiling_count,first_sub_resource_tiling,sub_resource_tilings) (This)->lpVtbl->GetResourceTiling(This,resource,total_tile_count,packed_mip_info,standard_tile_shape,sub_resource_tiling_count,first_sub_resource_tiling,sub_resource_tilings)
#define ID3D12Device1_GetAdapterLuid(This) ID3D12Device1_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device1_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device1_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device1_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12Device1_QueryInterface(ID3D12Device1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12Device1_AddRef(ID3D12Device1* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12Device1_Release(ID3D12Device1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static FORCEINLINE HRESULT ID3D12Device1_GetPrivateData(ID3D12Device1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Device1_SetPrivateData(ID3D12Device1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static FORCEINLINE HRESULT ID3D12Device1_SetPrivateDataInterface(ID3D12Device1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static FORCEINLINE HRESULT ID3D12Device1_SetName(ID3D12Device1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static FORCEINLINE UINT ID3D12Device1_GetNodeCount(ID3D12Device1* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateCommandQueue(ID3D12Device1* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateCommandAllocator(ID3D12Device1* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateGraphicsPipelineState(ID3D12Device1* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateComputePipelineState(ID3D12Device1* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateCommandList(ID3D12Device1* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,ID3D12CommandAllocator *command_allocator,ID3D12PipelineState *initial_pipeline_state,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList(This,node_mask,type,command_allocator,initial_pipeline_state,riid,command_list);
}
static FORCEINLINE HRESULT ID3D12Device1_CheckFeatureSupport(ID3D12Device1* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateDescriptorHeap(ID3D12Device1* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static FORCEINLINE UINT ID3D12Device1_GetDescriptorHandleIncrementSize(ID3D12Device1* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateRootSignature(ID3D12Device1* This,UINT node_mask,const void *bytecode,SIZE_T bytecode_length,REFIID riid,void **root_signature) {
    return This->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature);
}
static FORCEINLINE void ID3D12Device1_CreateConstantBufferView(ID3D12Device1* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static FORCEINLINE void ID3D12Device1_CreateShaderResourceView(ID3D12Device1* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device1_CreateUnorderedAccessView(ID3D12Device1* This,ID3D12Resource *resource,ID3D12Resource *counter_resource,const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device1_CreateRenderTargetView(ID3D12Device1* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device1_CreateDepthStencilView(ID3D12Device1* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static FORCEINLINE void ID3D12Device1_CreateSampler(ID3D12Device1* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static FORCEINLINE void ID3D12Device1_CopyDescriptors(ID3D12Device1* This,UINT dst_descriptor_range_count,const D3D12_CPU_DESCRIPTOR_HANDLE *dst_descriptor_range_offsets,const UINT *dst_descriptor_range_sizes,UINT src_descriptor_range_count,const D3D12_CPU_DESCRIPTOR_HANDLE *src_descriptor_range_offsets,const UINT *src_descriptor_range_sizes,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    This->lpVtbl->CopyDescriptors(This,dst_descriptor_range_count,dst_descriptor_range_offsets,dst_descriptor_range_sizes,src_descriptor_range_count,src_descriptor_range_offsets,src_descriptor_range_sizes,descriptor_heap_type);
}
static FORCEINLINE void ID3D12Device1_CopyDescriptorsSimple(ID3D12Device1* This,UINT descriptor_count,const D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor_range_offset,const D3D12_CPU_DESCRIPTOR_HANDLE src_descriptor_range_offset,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    This->lpVtbl->CopyDescriptorsSimple(This,descriptor_count,dst_descriptor_range_offset,src_descriptor_range_offset,descriptor_heap_type);
}
static FORCEINLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device1_GetResourceAllocationInfo(ID3D12Device1* This,UINT visible_mask,UINT reource_desc_count,const D3D12_RESOURCE_DESC *resource_descs) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo(This,&__ret,visible_mask,reource_desc_count,resource_descs);
}
static FORCEINLINE D3D12_HEAP_PROPERTIES ID3D12Device1_GetCustomHeapProperties(ID3D12Device1* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateCommittedResource(ID3D12Device1* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreateCommittedResource(This,heap_properties,heap_flags,desc,initial_state,optimized_clear_value,riid,resource);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateHeap(ID3D12Device1* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static FORCEINLINE HRESULT ID3D12Device1_CreatePlacedResource(ID3D12Device1* This,ID3D12Heap *heap,UINT64 heap_offset,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreatePlacedResource(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateReservedResource(ID3D12Device1* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateSharedHandle(ID3D12Device1* This,ID3D12DeviceChild *object,const SECURITY_ATTRIBUTES *attributes,DWORD access,const WCHAR *name,HANDLE *handle) {
    return This->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle);
}
static FORCEINLINE HRESULT ID3D12Device1_OpenSharedHandle(ID3D12Device1* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static FORCEINLINE HRESULT ID3D12Device1_OpenSharedHandleByName(ID3D12Device1* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static FORCEINLINE HRESULT ID3D12Device1_MakeResident(ID3D12Device1* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static FORCEINLINE HRESULT ID3D12Device1_Evict(ID3D12Device1* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateFence(ID3D12Device1* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static FORCEINLINE HRESULT ID3D12Device1_GetDeviceRemovedReason(ID3D12Device1* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static FORCEINLINE void ID3D12Device1_GetCopyableFootprints(ID3D12Device1* This,const D3D12_RESOURCE_DESC *desc,UINT first_sub_resource,UINT sub_resource_count,UINT64 base_offset,D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,UINT *row_count,UINT64 *row_size,UINT64 *total_bytes) {
    This->lpVtbl->GetCopyableFootprints(This,desc,first_sub_resource,sub_resource_count,base_offset,layouts,row_count,row_size,total_bytes);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateQueryHeap(ID3D12Device1* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static FORCEINLINE HRESULT ID3D12Device1_SetStablePowerState(ID3D12Device1* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static FORCEINLINE HRESULT ID3D12Device1_CreateCommandSignature(ID3D12Device1* This,const D3D12_COMMAND_SIGNATURE_DESC *desc,ID3D12RootSignature *root_signature,REFIID riid,void **command_signature) {
    return This->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature);
}
static FORCEINLINE void ID3D12Device1_GetResourceTiling(ID3D12Device1* This,ID3D12Resource *resource,UINT *total_tile_count,D3D12_PACKED_MIP_INFO *packed_mip_info,D3D12_TILE_SHAPE *standard_tile_shape,UINT *sub_resource_tiling_count,UINT first_sub_resource_tiling,D3D12_SUBRESOURCE_TILING *sub_resource_tilings) {
    This->lpVtbl->GetResourceTiling(This,resource,total_tile_count,packed_mip_info,standard_tile_shape,sub_resource_tiling_count,first_sub_resource_tiling,sub_resource_tilings);
}
static FORCEINLINE LUID ID3D12Device1_GetAdapterLuid(ID3D12Device1* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static FORCEINLINE HRESULT ID3D12Device1_CreatePipelineLibrary(ID3D12Device1* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static FORCEINLINE HRESULT ID3D12Device1_SetEventOnMultipleFenceCompletion(ID3D12Device1* This,ID3D12Fence *const *fences,const UINT64 *values,UINT fence_count,D3D12_MULTIPLE_FENCE_WAIT_FLAGS flags,HANDLE event) {
    return This->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event);
}
static FORCEINLINE HRESULT ID3D12Device1_SetResidencyPriority(ID3D12Device1* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device1_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12RootSignatureDeserializer interface
 */
#ifndef __ID3D12RootSignatureDeserializer_INTERFACE_DEFINED__
#define __ID3D12RootSignatureDeserializer_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12RootSignatureDeserializer, 0x34ab647b, 0x3cc8, 0x46ac, 0x84,0x1b, 0xc0,0x96,0x56,0x45,0xc0,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("34ab647b-3cc8-46ac-841b-c0965645c046")
ID3D12RootSignatureDeserializer : public IUnknown
{
    virtual const D3D12_ROOT_SIGNATURE_DESC * STDMETHODCALLTYPE GetRootSignatureDesc(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12RootSignatureDeserializer, 0x34ab647b, 0x3cc8, 0x46ac, 0x84,0x1b, 0xc0,0x96,0x56,0x45,0xc0,0x46)
#endif
#else
typedef struct ID3D12RootSignatureDeserializerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12RootSignatureDeserializer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12RootSignatureDeserializer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12RootSignatureDeserializer *This);

    /*** ID3D12RootSignatureDeserializer methods ***/
    const D3D12_ROOT_SIGNATURE_DESC * (STDMETHODCALLTYPE *GetRootSignatureDesc)(
        ID3D12RootSignatureDeserializer *This);

    END_INTERFACE
} ID3D12RootSignatureDeserializerVtbl;

interface ID3D12RootSignatureDeserializer {
    CONST_VTBL ID3D12RootSignatureDeserializerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12RootSignatureDeserializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12RootSignatureDeserializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12RootSignatureDeserializer_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12RootSignatureDeserializer methods ***/
#define ID3D12RootSignatureDeserializer_GetRootSignatureDesc(This) (This)->lpVtbl->GetRootSignatureDesc(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12RootSignatureDeserializer_QueryInterface(ID3D12RootSignatureDeserializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12RootSignatureDeserializer_AddRef(ID3D12RootSignatureDeserializer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12RootSignatureDeserializer_Release(ID3D12RootSignatureDeserializer* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12RootSignatureDeserializer methods ***/
static FORCEINLINE const D3D12_ROOT_SIGNATURE_DESC * ID3D12RootSignatureDeserializer_GetRootSignatureDesc(ID3D12RootSignatureDeserializer* This) {
    return This->lpVtbl->GetRootSignatureDesc(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12RootSignatureDeserializer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12VersionedRootSignatureDeserializer interface
 */
#ifndef __ID3D12VersionedRootSignatureDeserializer_INTERFACE_DEFINED__
#define __ID3D12VersionedRootSignatureDeserializer_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12VersionedRootSignatureDeserializer, 0x7f91ce67, 0x090c, 0x4bb7, 0xb7,0x8e, 0xed,0x8f,0xf2,0xe3,0x1d,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f91ce67-090c-4bb7-b78e-ed8ff2e31da0")
ID3D12VersionedRootSignatureDeserializer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRootSignatureDescAtVersion(
        D3D_ROOT_SIGNATURE_VERSION version,
        const D3D12_VERSIONED_ROOT_SIGNATURE_DESC **desc) = 0;

    virtual const D3D12_VERSIONED_ROOT_SIGNATURE_DESC * STDMETHODCALLTYPE GetUnconvertedRootSignatureDesc(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12VersionedRootSignatureDeserializer, 0x7f91ce67, 0x090c, 0x4bb7, 0xb7,0x8e, 0xed,0x8f,0xf2,0xe3,0x1d,0xa0)
#endif
#else
typedef struct ID3D12VersionedRootSignatureDeserializerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12VersionedRootSignatureDeserializer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12VersionedRootSignatureDeserializer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12VersionedRootSignatureDeserializer *This);

    /*** ID3D12VersionedRootSignatureDeserializer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRootSignatureDescAtVersion)(
        ID3D12VersionedRootSignatureDeserializer *This,
        D3D_ROOT_SIGNATURE_VERSION version,
        const D3D12_VERSIONED_ROOT_SIGNATURE_DESC **desc);

    const D3D12_VERSIONED_ROOT_SIGNATURE_DESC * (STDMETHODCALLTYPE *GetUnconvertedRootSignatureDesc)(
        ID3D12VersionedRootSignatureDeserializer *This);

    END_INTERFACE
} ID3D12VersionedRootSignatureDeserializerVtbl;

interface ID3D12VersionedRootSignatureDeserializer {
    CONST_VTBL ID3D12VersionedRootSignatureDeserializerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12VersionedRootSignatureDeserializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12VersionedRootSignatureDeserializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12VersionedRootSignatureDeserializer_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12VersionedRootSignatureDeserializer methods ***/
#define ID3D12VersionedRootSignatureDeserializer_GetRootSignatureDescAtVersion(This,version,desc) (This)->lpVtbl->GetRootSignatureDescAtVersion(This,version,desc)
#define ID3D12VersionedRootSignatureDeserializer_GetUnconvertedRootSignatureDesc(This) (This)->lpVtbl->GetUnconvertedRootSignatureDesc(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12VersionedRootSignatureDeserializer_QueryInterface(ID3D12VersionedRootSignatureDeserializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12VersionedRootSignatureDeserializer_AddRef(ID3D12VersionedRootSignatureDeserializer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12VersionedRootSignatureDeserializer_Release(ID3D12VersionedRootSignatureDeserializer* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12VersionedRootSignatureDeserializer methods ***/
static FORCEINLINE HRESULT ID3D12VersionedRootSignatureDeserializer_GetRootSignatureDescAtVersion(ID3D12VersionedRootSignatureDeserializer* This,D3D_ROOT_SIGNATURE_VERSION version,const D3D12_VERSIONED_ROOT_SIGNATURE_DESC **desc) {
    return This->lpVtbl->GetRootSignatureDescAtVersion(This,version,desc);
}
static FORCEINLINE const D3D12_VERSIONED_ROOT_SIGNATURE_DESC * ID3D12VersionedRootSignatureDeserializer_GetUnconvertedRootSignatureDesc(ID3D12VersionedRootSignatureDeserializer* This) {
    return This->lpVtbl->GetUnconvertedRootSignatureDesc(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12VersionedRootSignatureDeserializer_INTERFACE_DEFINED__ */

HRESULT __stdcall  D3D12CreateRootSignatureDeserializer(const void *data,SIZE_T data_size,REFIID iid,void **deserializer);

typedef HRESULT (__stdcall *PFN_D3D12_CREATE_VERSIONED_ROOT_SIGNATURE_DESERIALIZER)(const void *data,SIZE_T data_size,REFIID iid,void **deserializer);
HRESULT __stdcall  D3D12CreateVersionedRootSignatureDeserializer(const void *data,SIZE_T data_size,REFIID iid,void **deserializer);

HRESULT __stdcall  D3D12SerializeRootSignature(const D3D12_ROOT_SIGNATURE_DESC *root_signature_desc,D3D_ROOT_SIGNATURE_VERSION version,ID3DBlob **blob,ID3DBlob **error_blob);

typedef HRESULT (__stdcall *PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,ID3DBlob **blob,ID3DBlob **error_blob);
HRESULT __stdcall  D3D12SerializeVersionedRootSignature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *root_signature_desc,ID3DBlob **blob,ID3DBlob **error_blob);

typedef HRESULT (__stdcall *PFN_D3D12_CREATE_DEVICE)(IUnknown *adapter,D3D_FEATURE_LEVEL minimum_feature_level,REFIID iid,void **device);
HRESULT __stdcall  D3D12CreateDevice(IUnknown *adapter,D3D_FEATURE_LEVEL minimum_feature_level,REFIID iid,void **device);

typedef HRESULT (__stdcall *PFN_D3D12_GET_DEBUG_INTERFACE)(REFIID iid,void **debug);
HRESULT __stdcall  D3D12GetDebugInterface(REFIID iid,void **debug);

HRESULT __stdcall  D3D12EnableExperimentalFeatures(UINT feature_count,const IID *iids,void *configurations,UINT *configurations_sizes);

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __d3d12_h__ */
