/*** Autogenerated by WIDL 9.8 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__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* 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 __ID3D12ProtectedSession_FWD_DEFINED__
#define __ID3D12ProtectedSession_FWD_DEFINED__
typedef interface ID3D12ProtectedSession ID3D12ProtectedSession;
#ifdef __cplusplus
interface ID3D12ProtectedSession;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12ProtectedResourceSession_FWD_DEFINED__
#define __ID3D12ProtectedResourceSession_FWD_DEFINED__
typedef interface ID3D12ProtectedResourceSession ID3D12ProtectedResourceSession;
#ifdef __cplusplus
interface ID3D12ProtectedResourceSession;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList3_FWD_DEFINED__
#define __ID3D12GraphicsCommandList3_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList3 ID3D12GraphicsCommandList3;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList3;
#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 __ID3D12Fence1_FWD_DEFINED__
#define __ID3D12Fence1_FWD_DEFINED__
typedef interface ID3D12Fence1 ID3D12Fence1;
#ifdef __cplusplus
interface ID3D12Fence1;
#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 __ID3D12PipelineLibrary_FWD_DEFINED__
#define __ID3D12PipelineLibrary_FWD_DEFINED__
typedef interface ID3D12PipelineLibrary ID3D12PipelineLibrary;
#ifdef __cplusplus
interface ID3D12PipelineLibrary;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12PipelineLibrary1_FWD_DEFINED__
#define __ID3D12PipelineLibrary1_FWD_DEFINED__
typedef interface ID3D12PipelineLibrary1 ID3D12PipelineLibrary1;
#ifdef __cplusplus
interface ID3D12PipelineLibrary1;
#endif /* __cplusplus */
#endif

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

#ifndef __ID3D12Device2_FWD_DEFINED__
#define __ID3D12Device2_FWD_DEFINED__
typedef interface ID3D12Device2 ID3D12Device2;
#ifdef __cplusplus
interface ID3D12Device2;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device3_FWD_DEFINED__
#define __ID3D12Device3_FWD_DEFINED__
typedef interface ID3D12Device3 ID3D12Device3;
#ifdef __cplusplus
interface ID3D12Device3;
#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

#ifndef __ID3D12Device4_FWD_DEFINED__
#define __ID3D12Device4_FWD_DEFINED__
typedef interface ID3D12Device4 ID3D12Device4;
#ifdef __cplusplus
interface ID3D12Device4;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12LifetimeOwner_FWD_DEFINED__
#define __ID3D12LifetimeOwner_FWD_DEFINED__
typedef interface ID3D12LifetimeOwner ID3D12LifetimeOwner;
#ifdef __cplusplus
interface ID3D12LifetimeOwner;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12SwapChainAssistant_FWD_DEFINED__
#define __ID3D12SwapChainAssistant_FWD_DEFINED__
typedef interface ID3D12SwapChainAssistant ID3D12SwapChainAssistant;
#ifdef __cplusplus
interface ID3D12SwapChainAssistant;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12LifetimeTracker_FWD_DEFINED__
#define __ID3D12LifetimeTracker_FWD_DEFINED__
typedef interface ID3D12LifetimeTracker ID3D12LifetimeTracker;
#ifdef __cplusplus
interface ID3D12LifetimeTracker;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12StateObject_FWD_DEFINED__
#define __ID3D12StateObject_FWD_DEFINED__
typedef interface ID3D12StateObject ID3D12StateObject;
#ifdef __cplusplus
interface ID3D12StateObject;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12StateObjectProperties_FWD_DEFINED__
#define __ID3D12StateObjectProperties_FWD_DEFINED__
typedef interface ID3D12StateObjectProperties ID3D12StateObjectProperties;
#ifdef __cplusplus
interface ID3D12StateObjectProperties;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device5_FWD_DEFINED__
#define __ID3D12Device5_FWD_DEFINED__
typedef interface ID3D12Device5 ID3D12Device5;
#ifdef __cplusplus
interface ID3D12Device5;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DeviceRemovedExtendedDataSettings_FWD_DEFINED__
#define __ID3D12DeviceRemovedExtendedDataSettings_FWD_DEFINED__
typedef interface ID3D12DeviceRemovedExtendedDataSettings ID3D12DeviceRemovedExtendedDataSettings;
#ifdef __cplusplus
interface ID3D12DeviceRemovedExtendedDataSettings;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DeviceRemovedExtendedDataSettings1_FWD_DEFINED__
#define __ID3D12DeviceRemovedExtendedDataSettings1_FWD_DEFINED__
typedef interface ID3D12DeviceRemovedExtendedDataSettings1 ID3D12DeviceRemovedExtendedDataSettings1;
#ifdef __cplusplus
interface ID3D12DeviceRemovedExtendedDataSettings1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DeviceRemovedExtendedData_FWD_DEFINED__
#define __ID3D12DeviceRemovedExtendedData_FWD_DEFINED__
typedef interface ID3D12DeviceRemovedExtendedData ID3D12DeviceRemovedExtendedData;
#ifdef __cplusplus
interface ID3D12DeviceRemovedExtendedData;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DeviceRemovedExtendedData1_FWD_DEFINED__
#define __ID3D12DeviceRemovedExtendedData1_FWD_DEFINED__
typedef interface ID3D12DeviceRemovedExtendedData1 ID3D12DeviceRemovedExtendedData1;
#ifdef __cplusplus
interface ID3D12DeviceRemovedExtendedData1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12DeviceRemovedExtendedData2_FWD_DEFINED__
#define __ID3D12DeviceRemovedExtendedData2_FWD_DEFINED__
typedef interface ID3D12DeviceRemovedExtendedData2 ID3D12DeviceRemovedExtendedData2;
#ifdef __cplusplus
interface ID3D12DeviceRemovedExtendedData2;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device6_FWD_DEFINED__
#define __ID3D12Device6_FWD_DEFINED__
typedef interface ID3D12Device6 ID3D12Device6;
#ifdef __cplusplus
interface ID3D12Device6;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12ProtectedResourceSession1_FWD_DEFINED__
#define __ID3D12ProtectedResourceSession1_FWD_DEFINED__
typedef interface ID3D12ProtectedResourceSession1 ID3D12ProtectedResourceSession1;
#ifdef __cplusplus
interface ID3D12ProtectedResourceSession1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device7_FWD_DEFINED__
#define __ID3D12Device7_FWD_DEFINED__
typedef interface ID3D12Device7 ID3D12Device7;
#ifdef __cplusplus
interface ID3D12Device7;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device8_FWD_DEFINED__
#define __ID3D12Device8_FWD_DEFINED__
typedef interface ID3D12Device8 ID3D12Device8;
#ifdef __cplusplus
interface ID3D12Device8;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Resource1_FWD_DEFINED__
#define __ID3D12Resource1_FWD_DEFINED__
typedef interface ID3D12Resource1 ID3D12Resource1;
#ifdef __cplusplus
interface ID3D12Resource1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Resource2_FWD_DEFINED__
#define __ID3D12Resource2_FWD_DEFINED__
typedef interface ID3D12Resource2 ID3D12Resource2;
#ifdef __cplusplus
interface ID3D12Resource2;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Heap1_FWD_DEFINED__
#define __ID3D12Heap1_FWD_DEFINED__
typedef interface ID3D12Heap1 ID3D12Heap1;
#ifdef __cplusplus
interface ID3D12Heap1;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12MetaCommand_FWD_DEFINED__
#define __ID3D12MetaCommand_FWD_DEFINED__
typedef interface ID3D12MetaCommand ID3D12MetaCommand;
#ifdef __cplusplus
interface ID3D12MetaCommand;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList4_FWD_DEFINED__
#define __ID3D12GraphicsCommandList4_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList4 ID3D12GraphicsCommandList4;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList4;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12ShaderCacheSession_FWD_DEFINED__
#define __ID3D12ShaderCacheSession_FWD_DEFINED__
typedef interface ID3D12ShaderCacheSession ID3D12ShaderCacheSession;
#ifdef __cplusplus
interface ID3D12ShaderCacheSession;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device9_FWD_DEFINED__
#define __ID3D12Device9_FWD_DEFINED__
typedef interface ID3D12Device9 ID3D12Device9;
#ifdef __cplusplus
interface ID3D12Device9;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Device10_FWD_DEFINED__
#define __ID3D12Device10_FWD_DEFINED__
typedef interface ID3D12Device10 ID3D12Device10;
#ifdef __cplusplus
interface ID3D12Device10;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12VirtualizationGuestDevice_FWD_DEFINED__
#define __ID3D12VirtualizationGuestDevice_FWD_DEFINED__
typedef interface ID3D12VirtualizationGuestDevice ID3D12VirtualizationGuestDevice;
#ifdef __cplusplus
interface ID3D12VirtualizationGuestDevice;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12Tools_FWD_DEFINED__
#define __ID3D12Tools_FWD_DEFINED__
typedef interface ID3D12Tools ID3D12Tools;
#ifdef __cplusplus
interface ID3D12Tools;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12SDKConfiguration_FWD_DEFINED__
#define __ID3D12SDKConfiguration_FWD_DEFINED__
typedef interface ID3D12SDKConfiguration ID3D12SDKConfiguration;
#ifdef __cplusplus
interface ID3D12SDKConfiguration;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList5_FWD_DEFINED__
#define __ID3D12GraphicsCommandList5_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList5 ID3D12GraphicsCommandList5;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList5;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList6_FWD_DEFINED__
#define __ID3D12GraphicsCommandList6_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList6 ID3D12GraphicsCommandList6;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList6;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12GraphicsCommandList7_FWD_DEFINED__
#define __ID3D12GraphicsCommandList7_FWD_DEFINED__
typedef interface ID3D12GraphicsCommandList7 ID3D12GraphicsCommandList7;
#ifdef __cplusplus
interface ID3D12GraphicsCommandList7;
#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_16BIT_INDEX_STRIP_CUT_VALUE (0xffff)

#define D3D12_32BIT_INDEX_STRIP_CUT_VALUE (0xffffffff)

#define D3D12_8BIT_INDEX_STRIP_CUT_VALUE (0xff)

#define D3D12_APPEND_ALIGNED_ELEMENT (0xffffffff)

#define D3D12_ARRAY_AXIS_ADDRESS_RANGE_BIT_COUNT (9)

#define D3D12_CLIP_OR_CULL_DISTANCE_COUNT (8)

#define D3D12_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT (2)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT (14)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_COMPONENTS (4)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_COMPONENT_BIT_COUNT (32)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT (15)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_PARTIAL_UPDATE_EXTENTS_BYTE_ALIGNMENT (16)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COMPONENTS (4)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COUNT (15)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_REGISTER_READS_PER_INST (1)

#define D3D12_COMMONSHADER_CONSTANT_BUFFER_REGISTER_READ_PORTS (1)

#define D3D12_COMMONSHADER_FLOWCONTROL_NESTING_LIMIT (64)

#define D3D12_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_COMPONENTS (4)

#define D3D12_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_COUNT (1)

#define D3D12_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_READS_PER_INST (1)

#define D3D12_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_READ_PORTS (1)

#define D3D12_COMMONSHADER_IMMEDIATE_VALUE_COMPONENT_BIT_COUNT (32)

#define D3D12_COMMONSHADER_INPUT_RESOURCE_REGISTER_COMPONENTS (1)

#define D3D12_COMMONSHADER_INPUT_RESOURCE_REGISTER_COUNT (128)

#define D3D12_COMMONSHADER_INPUT_RESOURCE_REGISTER_READS_PER_INST (1)

#define D3D12_COMMONSHADER_INPUT_RESOURCE_REGISTER_READ_PORTS (1)

#define D3D12_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT (128)

#define D3D12_COMMONSHADER_SAMPLER_REGISTER_COMPONENTS (1)

#define D3D12_COMMONSHADER_SAMPLER_REGISTER_COUNT (16)

#define D3D12_COMMONSHADER_SAMPLER_REGISTER_READS_PER_INST (1)

#define D3D12_COMMONSHADER_SAMPLER_REGISTER_READ_PORTS (1)

#define D3D12_COMMONSHADER_SAMPLER_SLOT_COUNT (16)

#define D3D12_COMMONSHADER_SUBROUTINE_NESTING_LIMIT (32)

#define D3D12_COMMONSHADER_TEMP_REGISTER_COMPONENTS (4)

#define D3D12_COMMONSHADER_TEMP_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_COMMONSHADER_TEMP_REGISTER_COUNT (4096)

#define D3D12_COMMONSHADER_TEMP_REGISTER_READS_PER_INST (3)

#define D3D12_COMMONSHADER_TEMP_REGISTER_READ_PORTS (3)

#define D3D12_COMMONSHADER_TEXCOORD_RANGE_REDUCTION_MAX (10)

#define D3D12_COMMONSHADER_TEXCOORD_RANGE_REDUCTION_MIN (-10)

#define D3D12_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE (-8)

#define D3D12_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE (7)

#define D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256)

#define D3D12_CS_4_X_BUCKET00_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (256)

#define D3D12_CS_4_X_BUCKET00_MAX_NUM_THREADS_PER_GROUP (64)

#define D3D12_CS_4_X_BUCKET01_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (240)

#define D3D12_CS_4_X_BUCKET01_MAX_NUM_THREADS_PER_GROUP (68)

#define D3D12_CS_4_X_BUCKET02_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (224)

#define D3D12_CS_4_X_BUCKET02_MAX_NUM_THREADS_PER_GROUP (72)

#define D3D12_CS_4_X_BUCKET03_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (208)

#define D3D12_CS_4_X_BUCKET03_MAX_NUM_THREADS_PER_GROUP (76)

#define D3D12_CS_4_X_BUCKET04_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (192)

#define D3D12_CS_4_X_BUCKET04_MAX_NUM_THREADS_PER_GROUP (84)

#define D3D12_CS_4_X_BUCKET05_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (176)

#define D3D12_CS_4_X_BUCKET05_MAX_NUM_THREADS_PER_GROUP (92)

#define D3D12_CS_4_X_BUCKET06_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (160)

#define D3D12_CS_4_X_BUCKET06_MAX_NUM_THREADS_PER_GROUP (100)

#define D3D12_CS_4_X_BUCKET07_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (144)

#define D3D12_CS_4_X_BUCKET07_MAX_NUM_THREADS_PER_GROUP (112)

#define D3D12_CS_4_X_BUCKET08_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (128)

#define D3D12_CS_4_X_BUCKET08_MAX_NUM_THREADS_PER_GROUP (128)

#define D3D12_CS_4_X_BUCKET09_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (112)

#define D3D12_CS_4_X_BUCKET09_MAX_NUM_THREADS_PER_GROUP (144)

#define D3D12_CS_4_X_BUCKET10_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (96)

#define D3D12_CS_4_X_BUCKET10_MAX_NUM_THREADS_PER_GROUP (168)

#define D3D12_CS_4_X_BUCKET11_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (80)

#define D3D12_CS_4_X_BUCKET11_MAX_NUM_THREADS_PER_GROUP (204)

#define D3D12_CS_4_X_BUCKET12_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (64)

#define D3D12_CS_4_X_BUCKET12_MAX_NUM_THREADS_PER_GROUP (256)

#define D3D12_CS_4_X_BUCKET13_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (48)

#define D3D12_CS_4_X_BUCKET13_MAX_NUM_THREADS_PER_GROUP (340)

#define D3D12_CS_4_X_BUCKET14_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (32)

#define D3D12_CS_4_X_BUCKET14_MAX_NUM_THREADS_PER_GROUP (512)

#define D3D12_CS_4_X_BUCKET15_MAX_BYTES_TGSM_WRITABLE_PER_THREAD (16)

#define D3D12_CS_4_X_BUCKET15_MAX_NUM_THREADS_PER_GROUP (768)

#define D3D12_CS_4_X_DISPATCH_MAX_THREAD_GROUPS_IN_Z_DIMENSION (1)

#define D3D12_CS_4_X_RAW_UAV_BYTE_ALIGNMENT (256)

#define D3D12_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP (768)

#define D3D12_CS_4_X_THREAD_GROUP_MAX_X (768)

#define D3D12_CS_4_X_THREAD_GROUP_MAX_Y (768)

#define D3D12_CS_4_X_UAV_REGISTER_COUNT (1)

#define D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65535)

#define D3D12_CS_TGSM_REGISTER_COUNT (8192)

#define D3D12_CS_TGSM_REGISTER_READS_PER_INST (1)

#define D3D12_CS_TGSM_RESOURCE_REGISTER_COMPONENTS (1)

#define D3D12_CS_TGSM_RESOURCE_REGISTER_READ_PORTS (1)

#define D3D12_CS_THREADGROUPID_REGISTER_COMPONENTS (3)

#define D3D12_CS_THREADGROUPID_REGISTER_COUNT (1)

#define D3D12_CS_THREADIDINGROUPFLATTENED_REGISTER_COMPONENTS (1)

#define D3D12_CS_THREADIDINGROUPFLATTENED_REGISTER_COUNT (1)

#define D3D12_CS_THREADIDINGROUP_REGISTER_COMPONENTS (3)

#define D3D12_CS_THREADIDINGROUP_REGISTER_COUNT (1)

#define D3D12_CS_THREADID_REGISTER_COMPONENTS (3)

#define D3D12_CS_THREADID_REGISTER_COUNT (1)

#define D3D12_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP (1024)

#define D3D12_CS_THREAD_GROUP_MAX_X (1024)

#define D3D12_CS_THREAD_GROUP_MAX_Y (1024)

#define D3D12_CS_THREAD_GROUP_MAX_Z (64)

#define D3D12_CS_THREAD_GROUP_MIN_X (1)

#define D3D12_CS_THREAD_GROUP_MIN_Y (1)

#define D3D12_CS_THREAD_GROUP_MIN_Z (1)

#define D3D12_CS_THREAD_LOCAL_TEMP_REGISTER_POOL (16384)

#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_BORDER_COLOR_COMPONENT (0.0f)
#define D3D12_DEFAULT_DEPTH_BIAS (0)

#define D3D12_DEFAULT_DEPTH_BIAS_CLAMP (0.0f)
#define D3D12_DEFAULT_MAX_ANISOTROPY (16)

#define D3D12_DEFAULT_MIP_LOD_BIAS (0.0f)
#define D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4194304)

#define D3D12_DEFAULT_RENDER_TARGET_ARRAY_INDEX (0)

#define D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (65536)

#define D3D12_DEFAULT_SAMPLE_MASK (0xffffffff)

#define D3D12_DEFAULT_SCISSOR_ENDX (0)

#define D3D12_DEFAULT_SCISSOR_ENDY (0)

#define D3D12_DEFAULT_SCISSOR_STARTX (0)

#define D3D12_DEFAULT_SCISSOR_STARTY (0)

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

#define D3D12_DEFAULT_STENCIL_REFERENCE (0)

#define D3D12_DEFAULT_STENCIL_WRITE_MASK (0xff)

#define D3D12_DEFAULT_VIEWPORT_AND_SCISSORRECT_INDEX (0)

#define D3D12_DEFAULT_VIEWPORT_HEIGHT (0)

#define D3D12_DEFAULT_VIEWPORT_MAX_DEPTH (0.0f)
#define D3D12_DEFAULT_VIEWPORT_MIN_DEPTH (0.0f)
#define D3D12_DEFAULT_VIEWPORT_TOPLEFTX (0)

#define D3D12_DEFAULT_VIEWPORT_TOPLEFTY (0)

#define D3D12_DEFAULT_VIEWPORT_WIDTH (0)

#define D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND (0xffffffff)

#define D3D12_DRIVER_RESERVED_REGISTER_SPACE_VALUES_END (0xfffffff7)

#define D3D12_DRIVER_RESERVED_REGISTER_SPACE_VALUES_START (0xfffffff0)

#define D3D12_DS_INPUT_CONTROL_POINTS_MAX_TOTAL_SCALARS (3968)

#define D3D12_DS_INPUT_CONTROL_POINT_REGISTER_COMPONENTS (4)

#define D3D12_DS_INPUT_CONTROL_POINT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_DS_INPUT_CONTROL_POINT_REGISTER_COUNT (32)

#define D3D12_DS_INPUT_CONTROL_POINT_REGISTER_READS_PER_INST (2)

#define D3D12_DS_INPUT_CONTROL_POINT_REGISTER_READ_PORTS (1)

#define D3D12_DS_INPUT_DOMAIN_POINT_REGISTER_COMPONENTS (3)

#define D3D12_DS_INPUT_DOMAIN_POINT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_DS_INPUT_DOMAIN_POINT_REGISTER_COUNT (1)

#define D3D12_DS_INPUT_DOMAIN_POINT_REGISTER_READS_PER_INST (2)

#define D3D12_DS_INPUT_DOMAIN_POINT_REGISTER_READ_PORTS (1)

#define D3D12_DS_INPUT_PATCH_CONSTANT_REGISTER_COMPONENTS (4)

#define D3D12_DS_INPUT_PATCH_CONSTANT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_DS_INPUT_PATCH_CONSTANT_REGISTER_COUNT (32)

#define D3D12_DS_INPUT_PATCH_CONSTANT_REGISTER_READS_PER_INST (2)

#define D3D12_DS_INPUT_PATCH_CONSTANT_REGISTER_READ_PORTS (1)

#define D3D12_DS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENTS (1)

#define D3D12_DS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_DS_INPUT_PRIMITIVE_ID_REGISTER_COUNT (1)

#define D3D12_DS_INPUT_PRIMITIVE_ID_REGISTER_READS_PER_INST (2)

#define D3D12_DS_INPUT_PRIMITIVE_ID_REGISTER_READ_PORTS (1)

#define D3D12_DS_OUTPUT_REGISTER_COMPONENTS (4)

#define D3D12_DS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_DS_OUTPUT_REGISTER_COUNT (32)

#define D3D12_FLOAT16_FUSED_TOLERANCE_IN_ULP (0.6)
#define D3D12_FLOAT32_MAX (3.402823466e+38f)
#define D3D12_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP (0.6f)
#define D3D12_FLOAT_TO_SRGB_EXPONENT_DENOMINATOR (2.4f)
#define D3D12_FLOAT_TO_SRGB_EXPONENT_NUMERATOR (1.0f)
#define D3D12_FLOAT_TO_SRGB_OFFSET (0.055f)
#define D3D12_FLOAT_TO_SRGB_SCALE_1 (12.92f)
#define D3D12_FLOAT_TO_SRGB_SCALE_2 (1.055f)
#define D3D12_FLOAT_TO_SRGB_THRESHOLD (0.0031308f)
#define D3D12_FTOI_INSTRUCTION_MAX_INPUT (2147483647.999f)
#define D3D12_FTOI_INSTRUCTION_MIN_INPUT (-2147483648.999f)
#define D3D12_FTOU_INSTRUCTION_MAX_INPUT (4294967295.999f)
#define D3D12_FTOU_INSTRUCTION_MIN_INPUT (0.0f)
#define D3D12_GS_INPUT_INSTANCE_ID_READS_PER_INST (2)

#define D3D12_GS_INPUT_INSTANCE_ID_READ_PORTS (1)

#define D3D12_GS_INPUT_INSTANCE_ID_REGISTER_COMPONENTS (1)

#define D3D12_GS_INPUT_INSTANCE_ID_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_GS_INPUT_INSTANCE_ID_REGISTER_COUNT (1)

#define D3D12_GS_INPUT_PRIM_CONST_REGISTER_COMPONENTS (1)

#define D3D12_GS_INPUT_PRIM_CONST_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_GS_INPUT_PRIM_CONST_REGISTER_COUNT (1)

#define D3D12_GS_INPUT_PRIM_CONST_REGISTER_READS_PER_INST (2)

#define D3D12_GS_INPUT_PRIM_CONST_REGISTER_READ_PORTS (1)

#define D3D12_GS_INPUT_REGISTER_COMPONENTS (4)

#define D3D12_GS_INPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_GS_INPUT_REGISTER_COUNT (32)

#define D3D12_GS_INPUT_REGISTER_READS_PER_INST (2)

#define D3D12_GS_INPUT_REGISTER_READ_PORTS (1)

#define D3D12_GS_INPUT_REGISTER_VERTICES (32)

#define D3D12_GS_MAX_INSTANCE_COUNT (32)

#define D3D12_GS_MAX_OUTPUT_VERTEX_COUNT_ACROSS_INSTANCES (1024)

#define D3D12_GS_OUTPUT_ELEMENTS (32)

#define D3D12_GS_OUTPUT_REGISTER_COMPONENTS (4)

#define D3D12_GS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_GS_OUTPUT_REGISTER_COUNT (32)

#define D3D12_HS_CONTROL_POINT_PHASE_INPUT_REGISTER_COUNT (32)

#define D3D12_HS_CONTROL_POINT_PHASE_OUTPUT_REGISTER_COUNT (32)

#define D3D12_HS_CONTROL_POINT_REGISTER_COMPONENTS (4)

#define D3D12_HS_CONTROL_POINT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_HS_CONTROL_POINT_REGISTER_READS_PER_INST (2)

#define D3D12_HS_CONTROL_POINT_REGISTER_READ_PORTS (1)

#define D3D12_HS_FORK_PHASE_INSTANCE_COUNT_UPPER_BOUND (0xffffffff)

#define D3D12_HS_INPUT_FORK_INSTANCE_ID_REGISTER_COMPONENTS (1)

#define D3D12_HS_INPUT_FORK_INSTANCE_ID_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_HS_INPUT_FORK_INSTANCE_ID_REGISTER_COUNT (1)

#define D3D12_HS_INPUT_FORK_INSTANCE_ID_REGISTER_READS_PER_INST (2)

#define D3D12_HS_INPUT_FORK_INSTANCE_ID_REGISTER_READ_PORTS (1)

#define D3D12_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_COMPONENTS (1)

#define D3D12_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_COUNT (1)

#define D3D12_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_READS_PER_INST (2)

#define D3D12_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_READ_PORTS (1)

#define D3D12_HS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENTS (1)

#define D3D12_HS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_HS_INPUT_PRIMITIVE_ID_REGISTER_COUNT (1)

#define D3D12_HS_INPUT_PRIMITIVE_ID_REGISTER_READS_PER_INST (2)

#define D3D12_HS_INPUT_PRIMITIVE_ID_REGISTER_READ_PORTS (1)

#define D3D12_HS_JOIN_PHASE_INSTANCE_COUNT_UPPER_BOUND (0xffffffff)

#define D3D12_HS_MAXTESSFACTOR_LOWER_BOUND (1.0f)
#define D3D12_HS_MAXTESSFACTOR_UPPER_BOUND (64.0f)
#define D3D12_HS_OUTPUT_CONTROL_POINTS_MAX_TOTAL_SCALARS (3968)

#define D3D12_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_COMPONENTS (1)

#define D3D12_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_COUNT (1)

#define D3D12_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_READS_PER_INST (2)

#define D3D12_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_READ_PORTS (1)

#define D3D12_HS_OUTPUT_PATCH_CONSTANT_REGISTER_COMPONENTS (4)

#define D3D12_HS_OUTPUT_PATCH_CONSTANT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_HS_OUTPUT_PATCH_CONSTANT_REGISTER_COUNT (32)

#define D3D12_HS_OUTPUT_PATCH_CONSTANT_REGISTER_READS_PER_INST (2)

#define D3D12_HS_OUTPUT_PATCH_CONSTANT_REGISTER_READ_PORTS (1)

#define D3D12_HS_OUTPUT_PATCH_CONSTANT_REGISTER_SCALAR_COMPONENTS (128)

#define D3D12_IA_DEFAULT_INDEX_BUFFER_OFFSET_IN_BYTES (0)

#define D3D12_IA_DEFAULT_PRIMITIVE_TOPOLOGY (0)

#define D3D12_IA_DEFAULT_VERTEX_BUFFER_OFFSET_IN_BYTES (0)

#define D3D12_IA_INDEX_INPUT_RESOURCE_SLOT_COUNT (1)

#define D3D12_IA_INSTANCE_ID_BIT_COUNT (32)

#define D3D12_IA_INTEGER_ARITHMETIC_BIT_COUNT (32)

#define D3D12_IA_PATCH_MAX_CONTROL_POINT_COUNT (32)

#define D3D12_IA_PRIMITIVE_ID_BIT_COUNT (32)

#define D3D12_IA_VERTEX_ID_BIT_COUNT (32)

#define D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT (32)

#define D3D12_IA_VERTEX_INPUT_STRUCTURE_ELEMENTS_COMPONENTS (128)

#define D3D12_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT (32)

#define D3D12_INTEGER_DIVIDE_BY_ZERO_QUOTIENT (0xffffffff)

#define D3D12_INTEGER_DIVIDE_BY_ZERO_REMAINDER (0xffffffff)

#define D3D12_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL (0xffffffff)

#define D3D12_KEEP_UNORDERED_ACCESS_VIEWS (0xffffffff)

#define D3D12_LINEAR_GAMMA (1.0f)
#define D3D12_MAJOR_VERSION (12)

#define D3D12_MAX_BORDER_COLOR_COMPONENT (1.0f)
#define D3D12_MAX_DEPTH (1.0f)
#define D3D12_MAX_LIVE_STATIC_SAMPLERS (2032)

#define D3D12_MAX_MAXANISOTROPY (16)

#define D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT (32)

#define D3D12_MAX_POSITION_VALUE (3.402823466e+34f)
#define D3D12_MAX_ROOT_COST (64)

#define D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1 (1000000)

#define D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_2 (1000000)

#define D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE (2048)

#define D3D12_MAX_TEXTURE_DIMENSION_2_TO_EXP (17)

#define D3D12_MAX_VIEW_INSTANCE_COUNT (4)

#define D3D12_MINOR_VERSION (0)

#define D3D12_MIN_BORDER_COLOR_COMPONENT (0.0f)
#define D3D12_MIN_DEPTH (0.0f)
#define D3D12_MIN_MAXANISOTROPY (0)

#define D3D12_MIP_LOD_BIAS_MAX (15.99f)
#define D3D12_MIP_LOD_BIAS_MIN (-16.0f)
#define D3D12_MIP_LOD_FRACTIONAL_BIT_COUNT (8)

#define D3D12_MIP_LOD_RANGE_BIT_COUNT (8)

#define D3D12_MULTISAMPLE_ANTIALIAS_LINE_WIDTH (1.4f)
#define D3D12_NONSAMPLE_FETCH_OUT_OF_RANGE_ACCESS_RESULT (0)

#define D3D12_OS_RESERVED_REGISTER_SPACE_VALUES_END (0xffffffff)

#define D3D12_OS_RESERVED_REGISTER_SPACE_VALUES_START (0xfffffff8)

#define D3D12_PACKED_TILE (0xffffffff)

#define D3D12_PIXEL_ADDRESS_RANGE_BIT_COUNT (15)

#define D3D12_PREVIEW_SDK_VERSION (702)

#define D3D12_PRE_SCISSOR_PIXEL_ADDRESS_RANGE_BIT_COUNT (16)

#define D3D12_PS_CS_UAV_REGISTER_COMPONENTS (1)

#define D3D12_PS_CS_UAV_REGISTER_COUNT (8)

#define D3D12_PS_CS_UAV_REGISTER_READS_PER_INST (1)

#define D3D12_PS_CS_UAV_REGISTER_READ_PORTS (1)

#define D3D12_PS_FRONTFACING_DEFAULT_VALUE (0xffffffff)

#define D3D12_PS_FRONTFACING_FALSE_VALUE (0x0)

#define D3D12_PS_FRONTFACING_TRUE_VALUE (0xffffffff)

#define D3D12_PS_INPUT_REGISTER_COMPONENTS (4)

#define D3D12_PS_INPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_PS_INPUT_REGISTER_COUNT (32)

#define D3D12_PS_INPUT_REGISTER_READS_PER_INST (2)

#define D3D12_PS_INPUT_REGISTER_READ_PORTS (1)

#define D3D12_PS_LEGACY_PIXEL_CENTER_FRACTIONAL_COMPONENT (0.0f)
#define D3D12_PS_OUTPUT_DEPTH_REGISTER_COMPONENTS (1)

#define D3D12_PS_OUTPUT_DEPTH_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_PS_OUTPUT_DEPTH_REGISTER_COUNT (1)

#define D3D12_PS_OUTPUT_MASK_REGISTER_COMPONENTS (1)

#define D3D12_PS_OUTPUT_MASK_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_PS_OUTPUT_MASK_REGISTER_COUNT (1)

#define D3D12_PS_OUTPUT_REGISTER_COMPONENTS (4)

#define D3D12_PS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_PS_OUTPUT_REGISTER_COUNT (8)

#define D3D12_PS_PIXEL_CENTER_FRACTIONAL_COMPONENT (0.5f)
#define D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT (16)

#define D3D12_RAYTRACING_AABB_BYTE_ALIGNMENT (8)

#define D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT (256)

#define D3D12_RAYTRACING_INSTANCE_DESCS_BYTE_ALIGNMENT (16)

#define D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES (32)

#define D3D12_RAYTRACING_MAX_DECLARABLE_TRACE_RECURSION_DEPTH (31)

#define D3D12_RAYTRACING_MAX_GEOMETRIES_PER_BOTTOM_LEVEL_ACCELERATION_STRUCTURE (16777216)

#define D3D12_RAYTRACING_MAX_INSTANCES_PER_TOP_LEVEL_ACCELERATION_STRUCTURE (16777216)

#define D3D12_RAYTRACING_MAX_PRIMITIVES_PER_BOTTOM_LEVEL_ACCELERATION_STRUCTURE (536870912)

#define D3D12_RAYTRACING_MAX_RAY_GENERATION_SHADER_THREADS (1073741824)

#define D3D12_RAYTRACING_MAX_SHADER_RECORD_STRIDE (4096)

#define D3D12_RAYTRACING_SHADER_RECORD_BYTE_ALIGNMENT (32)

#define D3D12_RAYTRACING_SHADER_TABLE_BYTE_ALIGNMENT (64)

#define D3D12_RAYTRACING_TRANSFORM3X4_BYTE_ALIGNMENT (16)

#define D3D12_REQ_BLEND_OBJECT_COUNT_PER_DEVICE (4096)

#define D3D12_REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP (27)

#define D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT (4096)

#define D3D12_REQ_DEPTH_STENCIL_OBJECT_COUNT_PER_DEVICE (4096)

#define D3D12_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP (32)

#define D3D12_REQ_DRAW_VERTEX_COUNT_2_TO_EXP (32)

#define D3D12_REQ_FILTERING_HW_ADDRESSABLE_RESOURCE_DIMENSION (16384)

#define D3D12_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT (1024)

#define D3D12_REQ_IMMEDIATE_CONSTANT_BUFFER_ELEMENT_COUNT (4096)

#define D3D12_REQ_MAXANISOTROPY (16)

#define D3D12_REQ_MIP_LEVELS (15)

#define D3D12_REQ_MULTI_ELEMENT_STRUCTURE_SIZE_IN_BYTES (2048)

#define D3D12_REQ_RASTERIZER_OBJECT_COUNT_PER_DEVICE (4096)

#define D3D12_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH (16384)

#define D3D12_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_A_TERM (128)

#define D3D12_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_B_TERM (0.25f)
#define D3D12_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_C_TERM (2048)

#define D3D12_REQ_RESOURCE_VIEW_COUNT_PER_DEVICE_2_TO_EXP (20)

#define D3D12_REQ_SAMPLER_OBJECT_COUNT_PER_DEVICE (4096)

#define D3D12_REQ_SUBRESOURCES (30720)

#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_RESINFO_INSTRUCTION_MISSING_COMPONENT_RETVAL (0)

#define D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES (0xffffffff)

#define D3D12_RS_SET_SHADING_RATE_COMBINER_COUNT (2)

#define D3D12_SDK_VERSION (602)

#define D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES (32)

#define D3D12_SHADER_MAJOR_VERSION (5)

#define D3D12_SHADER_MAX_INSTANCES (65535)

#define D3D12_SHADER_MAX_INTERFACES (253)

#define D3D12_SHADER_MAX_INTERFACE_CALL_SITES (4096)

#define D3D12_SHADER_MAX_TYPES (65535)

#define D3D12_SHADER_MINOR_VERSION (1)

#define D3D12_SHIFT_INSTRUCTION_PAD_VALUE (0)

#define D3D12_SHIFT_INSTRUCTION_SHIFT_VALUE_BIT_COUNT (5)

#define D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8)

#define D3D12_SMALL_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (65536)

#define D3D12_SMALL_RESOURCE_PLACEMENT_ALIGNMENT (4096)

#define D3D12_SO_BUFFER_MAX_STRIDE_IN_BYTES (2048)

#define D3D12_SO_BUFFER_MAX_WRITE_WINDOW_IN_BYTES (512)

#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_SPEC_DATE_DAY (14)

#define D3D12_SPEC_DATE_MONTH (11)

#define D3D12_SPEC_DATE_YEAR (2014)

#define D3D12_SPEC_VERSION (1.16)
#define D3D12_SRGB_GAMMA (2.2f)
#define D3D12_SRGB_TO_FLOAT_DENOMINATOR_1 (12.92f)
#define D3D12_SRGB_TO_FLOAT_DENOMINATOR_2 (1.055f)
#define D3D12_SRGB_TO_FLOAT_EXPONENT (2.4f)
#define D3D12_SRGB_TO_FLOAT_OFFSET (0.055f)
#define D3D12_SRGB_TO_FLOAT_THRESHOLD (0.04045f)
#define D3D12_SRGB_TO_FLOAT_TOLERANCE_IN_ULP (0.5f)
#define D3D12_STANDARD_COMPONENT_BIT_COUNT (32)

#define D3D12_STANDARD_COMPONENT_BIT_COUNT_DOUBLED (64)

#define D3D12_STANDARD_MAXIMUM_ELEMENT_ALIGNMENT_BYTE_MULTIPLE (4)

#define D3D12_STANDARD_PIXEL_COMPONENT_COUNT (128)

#define D3D12_STANDARD_PIXEL_ELEMENT_COUNT (32)

#define D3D12_STANDARD_VECTOR_SIZE (4)

#define D3D12_STANDARD_VERTEX_ELEMENT_COUNT (32)

#define D3D12_STANDARD_VERTEX_TOTAL_COMPONENT_COUNT (64)

#define D3D12_SUBPIXEL_FRACTIONAL_BIT_COUNT (8)

#define D3D12_SUBTEXEL_FRACTIONAL_BIT_COUNT (8)

#define D3D12_SYSTEM_RESERVED_REGISTER_SPACE_VALUES_END (0xffffffff)

#define D3D12_SYSTEM_RESERVED_REGISTER_SPACE_VALUES_START (0xfffffff0)

#define D3D12_TESSELLATOR_MAX_EVEN_TESSELLATION_FACTOR (64)

#define D3D12_TESSELLATOR_MAX_ISOLINE_DENSITY_TESSELLATION_FACTOR (64)

#define D3D12_TESSELLATOR_MAX_ODD_TESSELLATION_FACTOR (63)

#define D3D12_TESSELLATOR_MAX_TESSELLATION_FACTOR (64)

#define D3D12_TESSELLATOR_MIN_EVEN_TESSELLATION_FACTOR (2)

#define D3D12_TESSELLATOR_MIN_ISOLINE_DENSITY_TESSELLATION_FACTOR (1)

#define D3D12_TESSELLATOR_MIN_ODD_TESSELLATION_FACTOR (1)

#define D3D12_TEXEL_ADDRESS_RANGE_BIT_COUNT (16)

#define D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256)

#define D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512)

#define D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES (65536)

#define D3D12_TRACKED_WORKLOAD_MAX_INSTANCES (32)

#define D3D12_UAV_COUNTER_PLACEMENT_ALIGNMENT (4096)

#define D3D12_UAV_SLOT_COUNT (64)

#define D3D12_UNBOUND_MEMORY_ACCESS_RESULT (0)

#define D3D12_VIDEO_DECODE_MAX_ARGUMENTS (10)

#define D3D12_VIDEO_DECODE_MAX_HISTOGRAM_COMPONENTS (4)

#define D3D12_VIDEO_DECODE_MIN_BITSTREAM_OFFSET_ALIGNMENT (256)

#define D3D12_VIDEO_DECODE_MIN_HISTOGRAM_OFFSET_ALIGNMENT (256)

#define D3D12_VIDEO_DECODE_STATUS_MACROBLOCKS_AFFECTED_UNKNOWN (0xffffffff)

#define D3D12_VIDEO_PROCESS_MAX_FILTERS (32)

#define D3D12_VIDEO_PROCESS_STEREO_VIEWS (2)

#define D3D12_VIEWPORT_AND_SCISSORRECT_MAX_INDEX (15)

#define D3D12_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE (16)

#define D3D12_VIEWPORT_BOUNDS_MAX (32767)

#define D3D12_VIEWPORT_BOUNDS_MIN (-32768)

#define D3D12_VS_INPUT_REGISTER_COMPONENTS (4)

#define D3D12_VS_INPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_VS_INPUT_REGISTER_COUNT (32)

#define D3D12_VS_INPUT_REGISTER_READS_PER_INST (2)

#define D3D12_VS_INPUT_REGISTER_READ_PORTS (1)

#define D3D12_VS_OUTPUT_REGISTER_COMPONENTS (4)

#define D3D12_VS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT (32)

#define D3D12_VS_OUTPUT_REGISTER_COUNT (32)

#define D3D12_WHQL_CONTEXT_COUNT_FOR_RESOURCE_LIMIT (10)

#define D3D12_WHQL_DRAWINDEXED_INDEX_COUNT_2_TO_EXP (25)

#define D3D12_WHQL_DRAW_VERTEX_COUNT_2_TO_EXP (25)

#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_3 = 4
} 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_SAMPLER_FEEDBACK = 0x8000
} 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_DRIVER_MANAGED_CACHE = 0x10,
    D3D12_SHADER_CACHE_SUPPORT_SHADER_CONTROL_CLEAR = 0x20,
    D3D12_SHADER_CACHE_SUPPORT_SHADER_SESSION_DELETE = 0x40
} 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_2 = 0x2
} D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER;
typedef struct D3D12_FEATURE_DATA_DISPLAYABLE {
    WINBOOL DisplayableTexture;
    D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER SharedResourceCompatibilityTier;
} D3D12_FEATURE_DATA_DISPLAYABLE;
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_1_1 = 0xb
} D3D12_RAYTRACING_TIER;
typedef enum D3D12_RESIDENCY_FLAGS {
    D3D12_RESIDENCY_FLAG_NONE = 0x0,
    D3D12_RESIDENCY_FLAG_DENY_OVERBUDGET = 0x1
} D3D12_RESIDENCY_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RESIDENCY_FLAGS);
#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_SUBRESOURCE_INFO {
    UINT64 Offset;
    UINT RowPitch;
    UINT DepthPitch;
} D3D12_SUBRESOURCE_INFO;
typedef struct D3D12_RESOURCE_ALLOCATION_INFO {
    UINT64 SizeInBytes;
    UINT64 Alignment;
} D3D12_RESOURCE_ALLOCATION_INFO;
typedef struct D3D12_RESOURCE_ALLOCATION_INFO1 {
    UINT64 Offset;
    UINT64 Alignment;
    UINT64 SizeInBytes;
} D3D12_RESOURCE_ALLOCATION_INFO1;
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_HARDWARE_PROTECTED = 0x100,
    D3D12_HEAP_FLAG_ALLOW_WRITE_WATCH = 0x200,
    D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS = 0x400,
    D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT = 0x800,
    D3D12_HEAP_FLAG_CREATE_NOT_ZEROED = 0x1000,
    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_RAYTRACING_ACCELERATION_STRUCTURE = 0x400000,
    D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE = 0x1000000,
    D3D12_RESOURCE_STATE_GENERIC_READ = ((((0x1 | 0x2) | 0x40) | 0x80) | 0x200) | 0x800,
    D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE = 0x40 | 0x80,
    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_FLAG_VIDEO_DECODE_REFERENCE_ONLY = 0x40,
    D3D12_RESOURCE_FLAG_VIDEO_ENCODE_REFERENCE_ONLY = 0x80,
    D3D12_RESOURCE_FLAG_RAYTRACING_ACCELERATION_STRUCTURE = 0x100
} D3D12_RESOURCE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RESOURCE_FLAGS);
typedef struct D3D12_MIP_REGION {
    UINT Width;
    UINT Height;
    UINT Depth;
} D3D12_MIP_REGION;
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 struct D3D12_RESOURCE_DESC1 {
    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_MIP_REGION SamplerFeedbackMipRegion;
} D3D12_RESOURCE_DESC1;
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_ENCODE_SAMPLER_FEEDBACK = 4,
    D3D12_RESOLVE_MODE_DECODE_SAMPLER_FEEDBACK = 5
} 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_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS = 0x10000
} 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_AMPLIFICATION = 6,
    D3D12_SHADER_VISIBILITY_MESH = 7
} 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_ENCODE_BASIC_FILTER(min, mag, mip, reduction) \
    ((D3D12_FILTER) ( \
    (((min) & D3D12_FILTER_TYPE_MASK) << D3D12_MIN_FILTER_SHIFT) \
    | (((mag) & D3D12_FILTER_TYPE_MASK) << D3D12_MAG_FILTER_SHIFT) \
    | (((mip) & D3D12_FILTER_TYPE_MASK) << D3D12_MIP_FILTER_SHIFT) \
    | (((reduction) & D3D12_FILTER_REDUCTION_TYPE_MASK) << D3D12_FILTER_REDUCTION_TYPE_SHIFT)))
#define D3D12_ENCODE_ANISOTROPIC_FILTER(reduction) \
    ((D3D12_FILTER) ( \
     D3D12_ANISOTROPIC_FILTERING_BIT \
     | D3D12_ENCODE_BASIC_FILTER(D3D12_FILTER_TYPE_LINEAR, \
                                 D3D12_FILTER_TYPE_LINEAR, \
                                 D3D12_FILTER_TYPE_LINEAR, \
                                 reduction)))
#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_FLAG_LOCAL_ROOT_SIGNATURE = 0x80,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_AMPLIFICATION_SHADER_ROOT_ACCESS = 0x100,
    D3D12_ROOT_SIGNATURE_FLAG_DENY_MESH_SHADER_ROOT_ACCESS = 0x200,
    D3D12_ROOT_SIGNATURE_FLAG_CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED = 0x400,
    D3D12_ROOT_SIGNATURE_FLAG_SAMPLER_HEAP_DIRECTLY_INDEXED = 0x800
} 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_RAYTRACING_ACCELERATION_STRUCTURE = 11
} 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_RAYTRACING_ACCELERATION_STRUCTURE_SRV {
    D3D12_GPU_VIRTUAL_ADDRESS Location;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_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;
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV RaytracingAccelerationStructure;
    } __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 struct D3D12_DEPTH_STENCIL_DESC1 {
    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;
    WINBOOL DepthBoundsTestEnable;
} D3D12_DEPTH_STENCIL_DESC1;
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_ALPHA_FACTOR = 20,
    D3D12_BLEND_INV_ALPHA_FACTOR = 21
} 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 = 0x0,
    D3D12_LOGIC_OP_SET = 0x1,
    D3D12_LOGIC_OP_COPY = 0x2,
    D3D12_LOGIC_OP_COPY_INVERTED = 0x3,
    D3D12_LOGIC_OP_NOOP = 0x4,
    D3D12_LOGIC_OP_INVERT = 0x5,
    D3D12_LOGIC_OP_AND = 0x6,
    D3D12_LOGIC_OP_NAND = 0x7,
    D3D12_LOGIC_OP_OR = 0x8,
    D3D12_LOGIC_OP_NOR = 0x9,
    D3D12_LOGIC_OP_XOR = 0xa,
    D3D12_LOGIC_OP_EQUIV = 0xb,
    D3D12_LOGIC_OP_AND_REVERSE = 0xc,
    D3D12_LOGIC_OP_AND_INVERTED = 0xd,
    D3D12_LOGIC_OP_OR_REVERSE = 0xe,
    D3D12_LOGIC_OP_OR_INVERTED = 0xf
} 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 D3D_PRIMITIVE D3D12_PRIMITIVE;
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 struct D3D12_PIPELINE_STATE_STREAM_DESC {
    SIZE_T SizeInBytes;
    void *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
struct D3D12_RT_FORMAT_ARRAY {
    DXGI_FORMAT RTFormats[8];
    UINT NumRenderTargets;
};
typedef enum D3D12_PIPELINE_STATE_SUBOBJECT_TYPE {
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE = 0x0,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS = 0x1,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS = 0x2,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS = 0x3,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS = 0x4,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS = 0x5,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS = 0x6,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT = 0x7,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND = 0x8,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK = 0x9,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER = 0xa,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL = 0xb,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT = 0xc,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE = 0xd,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY = 0xe,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS = 0xf,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT = 0x10,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC = 0x11,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK = 0x12,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO = 0x13,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS = 0x14,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1 = 0x15,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING = 0x16,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS = 0x18,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS = 0x19,
    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID = 0x1a
} D3D12_PIPELINE_STATE_SUBOBJECT_TYPE;
typedef struct D3D12_VIEW_INSTANCE_LOCATION {
    UINT ViewportArrayIndex;
    UINT RenderTargetArrayIndex;
} D3D12_VIEW_INSTANCE_LOCATION;
typedef enum D3D12_VIEW_INSTANCING_FLAGS {
    D3D12_VIEW_INSTANCING_FLAG_NONE = 0x0,
    D3D12_VIEW_INSTANCING_FLAG_ENABLE_VIEW_INSTANCE_MASKING = 0x1
} D3D12_VIEW_INSTANCING_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_VIEW_INSTANCING_FLAGS);
typedef struct D3D12_VIEW_INSTANCING_DESC {
    UINT ViewInstanceCount;
    const D3D12_VIEW_INSTANCE_LOCATION *pViewInstanceLocations;
    D3D12_VIEW_INSTANCING_FLAGS Flags;
} D3D12_VIEW_INSTANCING_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_VIDEO_DECODE = 4,
    D3D12_COMMAND_LIST_TYPE_VIDEO_PROCESS = 5,
    D3D12_COMMAND_LIST_TYPE_VIDEO_ENCODE = 6
} 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_6_1 = 0x61,
    D3D_SHADER_MODEL_6_2 = 0x62,
    D3D_SHADER_MODEL_6_3 = 0x63,
    D3D_SHADER_MODEL_6_4 = 0x64,
    D3D_SHADER_MODEL_6_5 = 0x65,
    D3D_SHADER_MODEL_6_6 = 0x66,
    D3D_SHADER_MODEL_6_7 = 0x67,
    D3D_HIGHEST_SHADER_MODEL = D3D_SHADER_MODEL_6_7
} 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_VARIABLE_SHADING_RATE_TIER {
    D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED = 0x0,
    D3D12_VARIABLE_SHADING_RATE_TIER_1 = 0x1,
    D3D12_VARIABLE_SHADING_RATE_TIER_2 = 0x2
} D3D12_VARIABLE_SHADING_RATE_TIER;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS6 {
    WINBOOL AdditionalShadingRatesSupported;
    WINBOOL PerPrimitiveShadingRateSupportedWithViewportIndexing;
    D3D12_VARIABLE_SHADING_RATE_TIER VariableShadingRateTier;
    UINT ShadingRateImageTileSize;
    WINBOOL BackgroundProcessingSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS6;
typedef enum D3D12_MESH_SHADER_TIER {
    D3D12_MESH_SHADER_TIER_NOT_SUPPORTED = 0x0,
    D3D12_MESH_SHADER_TIER_1 = 0xa
} D3D12_MESH_SHADER_TIER;
typedef enum D3D12_SAMPLER_FEEDBACK_TIER {
    D3D12_SAMPLER_FEEDBACK_TIER_NOT_SUPPORTED = 0x0,
    D3D12_SAMPLER_FEEDBACK_TIER_0_9 = 0x5a,
    D3D12_SAMPLER_FEEDBACK_TIER_1_0 = 0x64
} D3D12_SAMPLER_FEEDBACK_TIER;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS7 {
    D3D12_MESH_SHADER_TIER MeshShaderTier;
    D3D12_SAMPLER_FEEDBACK_TIER SamplerFeedbackTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS7;
typedef struct D3D12_FEATURE_DATA_QUERY_META_COMMAND {
    GUID CommandId;
    UINT NodeMask;
    const void *pQueryInputData;
    SIZE_T QueryInputDataSizeInBytes;
    void *pQueryOutputData;
    SIZE_T QueryOutputDataSizeInBytes;
} D3D12_FEATURE_DATA_QUERY_META_COMMAND;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS8 {
    WINBOOL UnalignedBlockTexturesSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS8;
typedef enum D3D12_WAVE_MMA_TIER {
    D3D12_WAVE_MMA_TIER_NOT_SUPPORTED = 0x0,
    D3D12_WAVE_MMA_TIER_1_0 = 0xa
} D3D12_WAVE_MMA_TIER;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS9 {
    WINBOOL MeshShaderPipelineStatsSupported;
    WINBOOL MeshShaderSupportsFullRangeRenderTargetArrayIndex;
    WINBOOL AtomicInt64OnTypedResourceSupported;
    WINBOOL AtomicInt64OnGroupSharedSupported;
    WINBOOL DerivativesInMeshAndAmplificationShadersSupported;
    D3D12_WAVE_MMA_TIER WaveMMATier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS9;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS10 {
    WINBOOL VariableRateShadingSumCombinerSupported;
    WINBOOL MeshShaderPerPrimitiveShadingRateSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS10;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS11 {
    WINBOOL AtomicInt64OnDescriptorHeapResourceSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS11;
typedef enum D3D12_TRI_STATE {
    D3D12_TRI_STATE_UNKNOWN = -0x1,
    D3D12_TRI_STATE_FALSE = 0x0,
    D3D12_TRI_STATE_TRUE = 0x1
} D3D12_TRI_STATE;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS12 {
    D3D12_TRI_STATE MSPrimitivesPipelineStatisticIncludesCulledPrimitives;
    WINBOOL EnhancedBarriersSupported;
    WINBOOL RelaxedFormatCastingSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS12;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS13 {
    WINBOOL UnrestrictedBufferTextureCopyPitchSupported;
    WINBOOL UnrestrictedVertexElementAlignmentSupported;
    WINBOOL InvertedViewportHeightFlipsYSupported;
    WINBOOL InvertedViewportDepthFlipsZSupported;
    WINBOOL TextureCopyBetweenDimensionsSupported;
    WINBOOL AlphaBlendFactorSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS13;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS14 {
    WINBOOL AdvancedTextureOpsSupported;
    WINBOOL WriteableMSAATexturesSupported;
    WINBOOL IndependentFrontAndBackStencilRefMaskSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS14;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS15 {
    WINBOOL TriangleFanSupported;
    WINBOOL DynamicIndexBufferStripCutSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS15;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS16 {
    WINBOOL DynamicDepthBiasSupported;
    WINBOOL GPUUploadHeapSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS16;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS17 {
    WINBOOL NonNormalizedCoordinateSamplersSupported;
    WINBOOL ManualWriteTrackingResourceSupported;
} D3D12_FEATURE_DATA_D3D12_OPTIONS17;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS18 {
    WINBOOL RenderPassesValid;
} D3D12_FEATURE_DATA_D3D12_OPTIONS18;
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_DISPLAYABLE = 28,
    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_D3D12_OPTIONS8 = 36,
    D3D12_FEATURE_D3D12_OPTIONS9 = 37,
    D3D12_FEATURE_D3D12_OPTIONS10 = 39,
    D3D12_FEATURE_D3D12_OPTIONS11 = 40,
    D3D12_FEATURE_D3D12_OPTIONS12 = 41,
    D3D12_FEATURE_D3D12_OPTIONS13 = 42,
    D3D12_FEATURE_D3D12_OPTIONS14 = 43,
    D3D12_FEATURE_D3D12_OPTIONS15 = 44,
    D3D12_FEATURE_D3D12_OPTIONS16 = 45,
    D3D12_FEATURE_D3D12_OPTIONS17 = 46,
    D3D12_FEATURE_D3D12_OPTIONS18 = 47
} 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;
typedef enum D3D12_PROTECTED_RESOURCE_SESSION_FLAGS {
    D3D12_PROTECTED_RESOURCE_SESSION_FLAG_NONE = 0
} D3D12_PROTECTED_RESOURCE_SESSION_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_PROTECTED_RESOURCE_SESSION_FLAGS);
typedef enum D3D12_PROTECTED_SESSION_STATUS {
    D3D12_PROTECTED_SESSION_STATUS_OK = 0,
    D3D12_PROTECTED_SESSION_STATUS_INVALID = 1
} D3D12_PROTECTED_SESSION_STATUS;
typedef struct D3D12_PROTECTED_RESOURCE_SESSION_DESC {
    UINT NodeMask;
    D3D12_PROTECTED_RESOURCE_SESSION_FLAGS Flags;
} D3D12_PROTECTED_RESOURCE_SESSION_DESC;
/*****************************************************************************
 * 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 __WIDL_INLINE HRESULT ID3D12Object_QueryInterface(ID3D12Object* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Object_AddRef(ID3D12Object* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Object_Release(ID3D12Object* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Object_GetPrivateData(ID3D12Object* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Object_SetPrivateData(ID3D12Object* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Object_SetPrivateDataInterface(ID3D12Object* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12DeviceChild_QueryInterface(ID3D12DeviceChild* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DeviceChild_AddRef(ID3D12DeviceChild* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DeviceChild_Release(ID3D12DeviceChild* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceChild_GetPrivateData(ID3D12DeviceChild* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12DeviceChild_SetPrivateData(ID3D12DeviceChild* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12DeviceChild_SetPrivateDataInterface(ID3D12DeviceChild* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12DeviceChild_SetName(ID3D12DeviceChild* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Pageable_QueryInterface(ID3D12Pageable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Pageable_AddRef(ID3D12Pageable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Pageable_Release(ID3D12Pageable* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Pageable_GetPrivateData(ID3D12Pageable* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Pageable_SetPrivateData(ID3D12Pageable* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Pageable_SetPrivateDataInterface(ID3D12Pageable* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Pageable_SetName(ID3D12Pageable* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Heap_QueryInterface(ID3D12Heap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Heap_AddRef(ID3D12Heap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Heap_Release(ID3D12Heap* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Heap_GetPrivateData(ID3D12Heap* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Heap_SetPrivateData(ID3D12Heap* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Heap_SetPrivateDataInterface(ID3D12Heap* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Heap_SetName(ID3D12Heap* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Heap_GetDevice(ID3D12Heap* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Heap methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Resource_QueryInterface(ID3D12Resource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Resource_AddRef(ID3D12Resource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Resource_Release(ID3D12Resource* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource_GetPrivateData(ID3D12Resource* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource_SetPrivateData(ID3D12Resource* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource_SetPrivateDataInterface(ID3D12Resource* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource_SetName(ID3D12Resource* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource_GetDevice(ID3D12Resource* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Resource methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE void ID3D12Resource_Unmap(ID3D12Resource* This,UINT sub_resource,const D3D12_RANGE *written_range) {
    This->lpVtbl->Unmap(This,sub_resource,written_range);
}
static __WIDL_INLINE D3D12_RESOURCE_DESC ID3D12Resource_GetDesc(ID3D12Resource* This) {
    D3D12_RESOURCE_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
static __WIDL_INLINE D3D12_GPU_VIRTUAL_ADDRESS ID3D12Resource_GetGPUVirtualAddress(ID3D12Resource* This) {
    return This->lpVtbl->GetGPUVirtualAddress(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12CommandList_QueryInterface(ID3D12CommandList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12CommandList_AddRef(ID3D12CommandList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12CommandList_Release(ID3D12CommandList* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandList_GetPrivateData(ID3D12CommandList* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandList_SetPrivateData(ID3D12CommandList* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandList_SetPrivateDataInterface(ID3D12CommandList* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandList_SetName(ID3D12CommandList* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandList_GetDevice(ID3D12CommandList* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE 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_VIDEO_DECODE_STATISTICS = 8,
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS1 = 10
} 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_PIPELINE_STATISTICS1 {
    UINT64 IAVertices;
    UINT64 IAPrimitives;
    UINT64 VSInvocations;
    UINT64 GSInvocations;
    UINT64 GSPrimitives;
    UINT64 CInvocations;
    UINT64 CPrimitives;
    UINT64 PSInvocations;
    UINT64 HSInvocations;
    UINT64 DSInvocations;
    UINT64 CSInvocations;
    UINT64 ASInvocations;
    UINT64 MSInvocations;
    UINT64 MSPrimitives;
} D3D12_QUERY_DATA_PIPELINE_STATISTICS1;
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 __WIDL_INLINE HRESULT ID3D12DescriptorHeap_QueryInterface(ID3D12DescriptorHeap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DescriptorHeap_AddRef(ID3D12DescriptorHeap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DescriptorHeap_Release(ID3D12DescriptorHeap* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12DescriptorHeap_GetPrivateData(ID3D12DescriptorHeap* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12DescriptorHeap_SetPrivateData(ID3D12DescriptorHeap* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12DescriptorHeap_SetPrivateDataInterface(ID3D12DescriptorHeap* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12DescriptorHeap_SetName(ID3D12DescriptorHeap* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12DescriptorHeap_GetDevice(ID3D12DescriptorHeap* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12DescriptorHeap methods ***/
static __WIDL_INLINE D3D12_DESCRIPTOR_HEAP_DESC ID3D12DescriptorHeap_GetDesc(ID3D12DescriptorHeap* This) {
    D3D12_DESCRIPTOR_HEAP_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
static __WIDL_INLINE D3D12_CPU_DESCRIPTOR_HANDLE ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(ID3D12DescriptorHeap* This) {
    D3D12_CPU_DESCRIPTOR_HANDLE __ret;
    return *This->lpVtbl->GetCPUDescriptorHandleForHeapStart(This,&__ret);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12QueryHeap_QueryInterface(ID3D12QueryHeap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12QueryHeap_AddRef(ID3D12QueryHeap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12QueryHeap_Release(ID3D12QueryHeap* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12QueryHeap_GetPrivateData(ID3D12QueryHeap* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12QueryHeap_SetPrivateData(ID3D12QueryHeap* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12QueryHeap_SetPrivateDataInterface(ID3D12QueryHeap* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12QueryHeap_SetName(ID3D12QueryHeap* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12CommandSignature_QueryInterface(ID3D12CommandSignature* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12CommandSignature_AddRef(ID3D12CommandSignature* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12CommandSignature_Release(ID3D12CommandSignature* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandSignature_GetPrivateData(ID3D12CommandSignature* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandSignature_SetPrivateData(ID3D12CommandSignature* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandSignature_SetPrivateDataInterface(ID3D12CommandSignature* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandSignature_SetName(ID3D12CommandSignature* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE 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 void 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);

    void (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 __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_QueryInterface(ID3D12GraphicsCommandList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList_AddRef(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList_Release(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_GetPrivateData(ID3D12GraphicsCommandList* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_SetPrivateData(ID3D12GraphicsCommandList* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_SetPrivateDataInterface(ID3D12GraphicsCommandList* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_SetName(ID3D12GraphicsCommandList* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_GetDevice(ID3D12GraphicsCommandList* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList_GetType(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_Close(ID3D12GraphicsCommandList* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList_Reset(ID3D12GraphicsCommandList* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_ClearState(ID3D12GraphicsCommandList* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList_Dispatch(ID3D12GraphicsCommandList* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList_CopyResource(ID3D12GraphicsCommandList* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList_IASetPrimitiveTopology(ID3D12GraphicsCommandList* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_RSSetViewports(ID3D12GraphicsCommandList* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_RSSetScissorRects(ID3D12GraphicsCommandList* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_OMSetBlendFactor(ID3D12GraphicsCommandList* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_OMSetStencilRef(ID3D12GraphicsCommandList* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetPipelineState(ID3D12GraphicsCommandList* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_ResourceBarrier(ID3D12GraphicsCommandList* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_ExecuteBundle(ID3D12GraphicsCommandList* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetDescriptorHeaps(ID3D12GraphicsCommandList* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetComputeRootSignature(ID3D12GraphicsCommandList* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetGraphicsRootSignature(ID3D12GraphicsCommandList* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_IASetIndexBuffer(ID3D12GraphicsCommandList* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList_DiscardResource(ID3D12GraphicsCommandList* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_BeginQuery(ID3D12GraphicsCommandList* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_EndQuery(ID3D12GraphicsCommandList* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList_SetMarker(ID3D12GraphicsCommandList* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_BeginEvent(ID3D12GraphicsCommandList* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList_EndEvent(ID3D12GraphicsCommandList* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE 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);

    void (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 __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_QueryInterface(ID3D12GraphicsCommandList1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList1_AddRef(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList1_Release(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_GetPrivateData(ID3D12GraphicsCommandList1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_SetPrivateData(ID3D12GraphicsCommandList1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_SetPrivateDataInterface(ID3D12GraphicsCommandList1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_SetName(ID3D12GraphicsCommandList1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_GetDevice(ID3D12GraphicsCommandList1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList1_GetType(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_Close(ID3D12GraphicsCommandList1* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList1_Reset(ID3D12GraphicsCommandList1* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_ClearState(ID3D12GraphicsCommandList1* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_Dispatch(ID3D12GraphicsCommandList1* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_CopyResource(ID3D12GraphicsCommandList1* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_IASetPrimitiveTopology(ID3D12GraphicsCommandList1* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_RSSetViewports(ID3D12GraphicsCommandList1* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_RSSetScissorRects(ID3D12GraphicsCommandList1* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_OMSetBlendFactor(ID3D12GraphicsCommandList1* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_OMSetStencilRef(ID3D12GraphicsCommandList1* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetPipelineState(ID3D12GraphicsCommandList1* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_ResourceBarrier(ID3D12GraphicsCommandList1* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_ExecuteBundle(ID3D12GraphicsCommandList1* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetDescriptorHeaps(ID3D12GraphicsCommandList1* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetComputeRootSignature(ID3D12GraphicsCommandList1* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetGraphicsRootSignature(ID3D12GraphicsCommandList1* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList1* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_IASetIndexBuffer(ID3D12GraphicsCommandList1* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_DiscardResource(ID3D12GraphicsCommandList1* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_BeginQuery(ID3D12GraphicsCommandList1* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_EndQuery(ID3D12GraphicsCommandList1* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_SetMarker(ID3D12GraphicsCommandList1* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_BeginEvent(ID3D12GraphicsCommandList1* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList1_EndEvent(ID3D12GraphicsCommandList1* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList1_OMSetDepthBounds(ID3D12GraphicsCommandList1* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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);

    void (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 __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_QueryInterface(ID3D12GraphicsCommandList2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList2_AddRef(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList2_Release(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_GetPrivateData(ID3D12GraphicsCommandList2* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_SetPrivateData(ID3D12GraphicsCommandList2* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_SetPrivateDataInterface(ID3D12GraphicsCommandList2* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_SetName(ID3D12GraphicsCommandList2* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_GetDevice(ID3D12GraphicsCommandList2* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList2_GetType(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_Close(ID3D12GraphicsCommandList2* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList2_Reset(ID3D12GraphicsCommandList2* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_ClearState(ID3D12GraphicsCommandList2* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_Dispatch(ID3D12GraphicsCommandList2* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_CopyResource(ID3D12GraphicsCommandList2* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_IASetPrimitiveTopology(ID3D12GraphicsCommandList2* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_RSSetViewports(ID3D12GraphicsCommandList2* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_RSSetScissorRects(ID3D12GraphicsCommandList2* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_OMSetBlendFactor(ID3D12GraphicsCommandList2* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_OMSetStencilRef(ID3D12GraphicsCommandList2* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetPipelineState(ID3D12GraphicsCommandList2* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_ResourceBarrier(ID3D12GraphicsCommandList2* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_ExecuteBundle(ID3D12GraphicsCommandList2* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetDescriptorHeaps(ID3D12GraphicsCommandList2* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetComputeRootSignature(ID3D12GraphicsCommandList2* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetGraphicsRootSignature(ID3D12GraphicsCommandList2* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList2* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_IASetIndexBuffer(ID3D12GraphicsCommandList2* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_DiscardResource(ID3D12GraphicsCommandList2* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_BeginQuery(ID3D12GraphicsCommandList2* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_EndQuery(ID3D12GraphicsCommandList2* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_SetMarker(ID3D12GraphicsCommandList2* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_BeginEvent(ID3D12GraphicsCommandList2* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList2_EndEvent(ID3D12GraphicsCommandList2* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_OMSetDepthBounds(ID3D12GraphicsCommandList2* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12GraphicsCommandList2_SetViewInstanceMask(ID3D12GraphicsCommandList2* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static __WIDL_INLINE 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__ */

/*****************************************************************************
 * ID3D12ProtectedSession interface
 */
#ifndef __ID3D12ProtectedSession_INTERFACE_DEFINED__
#define __ID3D12ProtectedSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ProtectedSession, 0xa1533d18, 0x0ac1, 0x4084, 0x85,0xb9, 0x89,0xa9,0x61,0x16,0x80,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1533d18-0ac1-4084-85b9-89a96116806b")
ID3D12ProtectedSession : public ID3D12DeviceChild
{
    virtual HRESULT STDMETHODCALLTYPE GetStatusFence(
        REFIID riid,
        void **fence) = 0;

    virtual D3D12_PROTECTED_SESSION_STATUS STDMETHODCALLTYPE GetSessionStatus(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ProtectedSession, 0xa1533d18, 0x0ac1, 0x4084, 0x85,0xb9, 0x89,0xa9,0x61,0x16,0x80,0x6b)
#endif
#else
typedef struct ID3D12ProtectedSessionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12ProtectedSession methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatusFence)(
        ID3D12ProtectedSession *This,
        REFIID riid,
        void **fence);

    D3D12_PROTECTED_SESSION_STATUS (STDMETHODCALLTYPE *GetSessionStatus)(
        ID3D12ProtectedSession *This);

    END_INTERFACE
} ID3D12ProtectedSessionVtbl;

interface ID3D12ProtectedSession {
    CONST_VTBL ID3D12ProtectedSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12ProtectedSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12ProtectedSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12ProtectedSession_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12ProtectedSession_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12ProtectedSession_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12ProtectedSession_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12ProtectedSession_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12ProtectedSession_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12ProtectedSession methods ***/
#define ID3D12ProtectedSession_GetStatusFence(This,riid,fence) (This)->lpVtbl->GetStatusFence(This,riid,fence)
#define ID3D12ProtectedSession_GetSessionStatus(This) (This)->lpVtbl->GetSessionStatus(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_QueryInterface(ID3D12ProtectedSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12ProtectedSession_AddRef(ID3D12ProtectedSession* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12ProtectedSession_Release(ID3D12ProtectedSession* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_GetPrivateData(ID3D12ProtectedSession* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_SetPrivateData(ID3D12ProtectedSession* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_SetPrivateDataInterface(ID3D12ProtectedSession* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_SetName(ID3D12ProtectedSession* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_GetDevice(ID3D12ProtectedSession* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12ProtectedSession methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedSession_GetStatusFence(ID3D12ProtectedSession* This,REFIID riid,void **fence) {
    return This->lpVtbl->GetStatusFence(This,riid,fence);
}
static __WIDL_INLINE D3D12_PROTECTED_SESSION_STATUS ID3D12ProtectedSession_GetSessionStatus(ID3D12ProtectedSession* This) {
    return This->lpVtbl->GetSessionStatus(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12ProtectedSession_INTERFACE_DEFINED__ */

typedef enum D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS {
    D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAG_NONE = 0x0,
    D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAG_SUPPORTED = 0x1
} D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS);
typedef struct D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_SUPPORT {
    UINT NodeIndex;
    D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS Support;
} D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_SUPPORT;
/*****************************************************************************
 * ID3D12ProtectedResourceSession interface
 */
#ifndef __ID3D12ProtectedResourceSession_INTERFACE_DEFINED__
#define __ID3D12ProtectedResourceSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ProtectedResourceSession, 0x6cd696f4, 0xf289, 0x40cc, 0x80,0x91, 0x5a,0x6c,0x0a,0x09,0x9c,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6cd696f4-f289-40cc-8091-5a6c0a099c3d")
ID3D12ProtectedResourceSession : public ID3D12ProtectedSession
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_PROTECTED_RESOURCE_SESSION_DESC* STDMETHODCALLTYPE GetDesc(
        D3D12_PROTECTED_RESOURCE_SESSION_DESC *__ret) = 0;
    D3D12_PROTECTED_RESOURCE_SESSION_DESC STDMETHODCALLTYPE GetDesc(
        )
    {
        D3D12_PROTECTED_RESOURCE_SESSION_DESC __ret;
        return *GetDesc(&__ret);
    }
#else
    virtual D3D12_PROTECTED_RESOURCE_SESSION_DESC STDMETHODCALLTYPE GetDesc(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ProtectedResourceSession, 0x6cd696f4, 0xf289, 0x40cc, 0x80,0x91, 0x5a,0x6c,0x0a,0x09,0x9c,0x3d)
#endif
#else
typedef struct ID3D12ProtectedResourceSessionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12ProtectedSession methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatusFence)(
        ID3D12ProtectedResourceSession *This,
        REFIID riid,
        void **fence);

    D3D12_PROTECTED_SESSION_STATUS (STDMETHODCALLTYPE *GetSessionStatus)(
        ID3D12ProtectedResourceSession *This);

    /*** ID3D12ProtectedResourceSession methods ***/
    D3D12_PROTECTED_RESOURCE_SESSION_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ProtectedResourceSession *This,
        D3D12_PROTECTED_RESOURCE_SESSION_DESC *__ret);

    END_INTERFACE
} ID3D12ProtectedResourceSessionVtbl;

interface ID3D12ProtectedResourceSession {
    CONST_VTBL ID3D12ProtectedResourceSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12ProtectedResourceSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12ProtectedResourceSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12ProtectedResourceSession_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12ProtectedResourceSession_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12ProtectedResourceSession_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12ProtectedResourceSession_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12ProtectedResourceSession_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12ProtectedResourceSession_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12ProtectedSession methods ***/
#define ID3D12ProtectedResourceSession_GetStatusFence(This,riid,fence) (This)->lpVtbl->GetStatusFence(This,riid,fence)
#define ID3D12ProtectedResourceSession_GetSessionStatus(This) (This)->lpVtbl->GetSessionStatus(This)
/*** ID3D12ProtectedResourceSession methods ***/
#define ID3D12ProtectedResourceSession_GetDesc(This) ID3D12ProtectedResourceSession_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_QueryInterface(ID3D12ProtectedResourceSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12ProtectedResourceSession_AddRef(ID3D12ProtectedResourceSession* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12ProtectedResourceSession_Release(ID3D12ProtectedResourceSession* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_GetPrivateData(ID3D12ProtectedResourceSession* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_SetPrivateData(ID3D12ProtectedResourceSession* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_SetPrivateDataInterface(ID3D12ProtectedResourceSession* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_SetName(ID3D12ProtectedResourceSession* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_GetDevice(ID3D12ProtectedResourceSession* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12ProtectedSession methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession_GetStatusFence(ID3D12ProtectedResourceSession* This,REFIID riid,void **fence) {
    return This->lpVtbl->GetStatusFence(This,riid,fence);
}
static __WIDL_INLINE D3D12_PROTECTED_SESSION_STATUS ID3D12ProtectedResourceSession_GetSessionStatus(ID3D12ProtectedResourceSession* This) {
    return This->lpVtbl->GetSessionStatus(This);
}
/*** ID3D12ProtectedResourceSession methods ***/
static __WIDL_INLINE D3D12_PROTECTED_RESOURCE_SESSION_DESC ID3D12ProtectedResourceSession_GetDesc(ID3D12ProtectedResourceSession* This) {
    D3D12_PROTECTED_RESOURCE_SESSION_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12ProtectedResourceSession_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12GraphicsCommandList3 interface
 */
#ifndef __ID3D12GraphicsCommandList3_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList3_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList3, 0x6fda83a7, 0xb84c, 0x4e38, 0x9a,0xc8, 0xc7,0xbd,0x22,0x01,0x6b,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6fda83a7-b84c-4e38-9ac8-c7bd22016b3d")
ID3D12GraphicsCommandList3 : public ID3D12GraphicsCommandList2
{
    virtual void STDMETHODCALLTYPE SetProtectedResourceSession(
        ID3D12ProtectedResourceSession *protected_resource_session) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList3, 0x6fda83a7, 0xb84c, 0x4e38, 0x9a,0xc8, 0xc7,0xbd,0x22,0x01,0x6b,0x3d)
#endif
#else
typedef struct ID3D12GraphicsCommandList3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList3 *This,
        ID3D12PipelineState *pipeline_state);

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

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

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

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

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

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

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *This,
        FLOAT min,
        FLOAT max);

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

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList3 *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)(
        ID3D12GraphicsCommandList3 *This,
        UINT mask);

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

    /*** ID3D12GraphicsCommandList3 methods ***/
    void (STDMETHODCALLTYPE *SetProtectedResourceSession)(
        ID3D12GraphicsCommandList3 *This,
        ID3D12ProtectedResourceSession *protected_resource_session);

    END_INTERFACE
} ID3D12GraphicsCommandList3Vtbl;

interface ID3D12GraphicsCommandList3 {
    CONST_VTBL ID3D12GraphicsCommandList3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList3_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList3_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList3_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList3_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList3_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList3_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList3_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList3_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList3_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList3_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList3_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList3_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList3_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList3_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList3_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList3_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList3_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList3_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList3_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList3_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList3_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList3_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList3_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList3_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList3_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList3_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList3_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList3_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList3_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList3_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList3_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList3_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList3_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList3_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList3_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList3_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList3_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList3_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList3_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList3_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList3_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList3_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList3_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 ID3D12GraphicsCommandList3_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
/*** ID3D12GraphicsCommandList2 methods ***/
#define ID3D12GraphicsCommandList3_WriteBufferImmediate(This,count,parameters,modes) (This)->lpVtbl->WriteBufferImmediate(This,count,parameters,modes)
/*** ID3D12GraphicsCommandList3 methods ***/
#define ID3D12GraphicsCommandList3_SetProtectedResourceSession(This,protected_resource_session) (This)->lpVtbl->SetProtectedResourceSession(This,protected_resource_session)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_QueryInterface(ID3D12GraphicsCommandList3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList3_AddRef(ID3D12GraphicsCommandList3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList3_Release(ID3D12GraphicsCommandList3* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_GetPrivateData(ID3D12GraphicsCommandList3* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_SetPrivateData(ID3D12GraphicsCommandList3* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_SetPrivateDataInterface(ID3D12GraphicsCommandList3* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_SetName(ID3D12GraphicsCommandList3* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_GetDevice(ID3D12GraphicsCommandList3* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList3_GetType(ID3D12GraphicsCommandList3* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_Close(ID3D12GraphicsCommandList3* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList3_Reset(ID3D12GraphicsCommandList3* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_ClearState(ID3D12GraphicsCommandList3* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_DrawInstanced(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_DrawIndexedInstanced(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_Dispatch(ID3D12GraphicsCommandList3* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_CopyBufferRegion(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_CopyTextureRegion(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_CopyResource(ID3D12GraphicsCommandList3* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_CopyTiles(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_ResolveSubresource(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_IASetPrimitiveTopology(ID3D12GraphicsCommandList3* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_RSSetViewports(ID3D12GraphicsCommandList3* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_RSSetScissorRects(ID3D12GraphicsCommandList3* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_OMSetBlendFactor(ID3D12GraphicsCommandList3* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_OMSetStencilRef(ID3D12GraphicsCommandList3* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetPipelineState(ID3D12GraphicsCommandList3* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_ResourceBarrier(ID3D12GraphicsCommandList3* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_ExecuteBundle(ID3D12GraphicsCommandList3* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetDescriptorHeaps(ID3D12GraphicsCommandList3* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRootSignature(ID3D12GraphicsCommandList3* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRootSignature(ID3D12GraphicsCommandList3* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList3* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_IASetIndexBuffer(ID3D12GraphicsCommandList3* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_IASetVertexBuffers(ID3D12GraphicsCommandList3* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SOSetTargets(ID3D12GraphicsCommandList3* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_OMSetRenderTargets(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_ClearDepthStencilView(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_ClearRenderTargetView(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_DiscardResource(ID3D12GraphicsCommandList3* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_BeginQuery(ID3D12GraphicsCommandList3* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_EndQuery(ID3D12GraphicsCommandList3* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_ResolveQueryData(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_SetPredication(ID3D12GraphicsCommandList3* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetMarker(ID3D12GraphicsCommandList3* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_BeginEvent(ID3D12GraphicsCommandList3* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_EndEvent(ID3D12GraphicsCommandList3* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_ExecuteIndirect(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_AtomicCopyBufferUINT(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_OMSetDepthBounds(ID3D12GraphicsCommandList3* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetSamplePositions(ID3D12GraphicsCommandList3* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList3_ResolveSubresourceRegion(ID3D12GraphicsCommandList3* 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 __WIDL_INLINE void ID3D12GraphicsCommandList3_SetViewInstanceMask(ID3D12GraphicsCommandList3* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList3_WriteBufferImmediate(ID3D12GraphicsCommandList3* This,UINT count,const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) {
    This->lpVtbl->WriteBufferImmediate(This,count,parameters,modes);
}
/*** ID3D12GraphicsCommandList3 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList3_SetProtectedResourceSession(ID3D12GraphicsCommandList3* This,ID3D12ProtectedResourceSession *protected_resource_session) {
    This->lpVtbl->SetProtectedResourceSession(This,protected_resource_session);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList3_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,
        ID3D12Heap *heap,
        UINT range_count,
        const D3D12_TILE_RANGE_FLAGS *range_flags,
        const UINT *heap_range_offsets,
        const 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,
        ID3D12Heap *heap,
        UINT range_count,
        const D3D12_TILE_RANGE_FLAGS *range_flags,
        const UINT *heap_range_offsets,
        const 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,heap,range_count,range_flags,heap_range_offsets,range_tile_counts,flags) (This)->lpVtbl->UpdateTileMappings(This,resource,region_count,region_start_coordinates,region_sizes,heap,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 __WIDL_INLINE HRESULT ID3D12CommandQueue_QueryInterface(ID3D12CommandQueue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12CommandQueue_AddRef(ID3D12CommandQueue* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12CommandQueue_Release(ID3D12CommandQueue* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandQueue_GetPrivateData(ID3D12CommandQueue* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_SetPrivateData(ID3D12CommandQueue* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_SetPrivateDataInterface(ID3D12CommandQueue* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_SetName(ID3D12CommandQueue* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandQueue_GetDevice(ID3D12CommandQueue* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandQueue methods ***/
static __WIDL_INLINE 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,ID3D12Heap *heap,UINT range_count,const D3D12_TILE_RANGE_FLAGS *range_flags,const UINT *heap_range_offsets,const UINT *range_tile_counts,D3D12_TILE_MAPPING_FLAGS flags) {
    This->lpVtbl->UpdateTileMappings(This,resource,region_count,region_start_coordinates,region_sizes,heap,range_count,range_flags,heap_range_offsets,range_tile_counts,flags);
}
static __WIDL_INLINE 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 __WIDL_INLINE void ID3D12CommandQueue_ExecuteCommandLists(ID3D12CommandQueue* This,UINT command_list_count,ID3D12CommandList *const *command_lists) {
    This->lpVtbl->ExecuteCommandLists(This,command_list_count,command_lists);
}
static __WIDL_INLINE void ID3D12CommandQueue_SetMarker(ID3D12CommandQueue* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12CommandQueue_BeginEvent(ID3D12CommandQueue* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12CommandQueue_EndEvent(ID3D12CommandQueue* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_Signal(ID3D12CommandQueue* This,ID3D12Fence *fence,UINT64 value) {
    return This->lpVtbl->Signal(This,fence,value);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_Wait(ID3D12CommandQueue* This,ID3D12Fence *fence,UINT64 value) {
    return This->lpVtbl->Wait(This,fence,value);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_GetTimestampFrequency(ID3D12CommandQueue* This,UINT64 *frequency) {
    return This->lpVtbl->GetTimestampFrequency(This,frequency);
}
static __WIDL_INLINE HRESULT ID3D12CommandQueue_GetClockCalibration(ID3D12CommandQueue* This,UINT64 *gpu_timestamp,UINT64 *cpu_timestamp) {
    return This->lpVtbl->GetClockCalibration(This,gpu_timestamp,cpu_timestamp);
}
static __WIDL_INLINE 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_FLAG_NON_MONITORED = 0x4
} 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_VIDEO_DECODE_STATISTICS = 4,
    D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP = 5,
    D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS1 = 7
} 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_DISPATCH_RAYS = 9,
    D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH = 10
} 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 __WIDL_INLINE HRESULT ID3D12RootSignature_QueryInterface(ID3D12RootSignature* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12RootSignature_AddRef(ID3D12RootSignature* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12RootSignature_Release(ID3D12RootSignature* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12RootSignature_GetPrivateData(ID3D12RootSignature* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12RootSignature_SetPrivateData(ID3D12RootSignature* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12RootSignature_SetPrivateDataInterface(ID3D12RootSignature* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12RootSignature_SetName(ID3D12RootSignature* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12PipelineState_QueryInterface(ID3D12PipelineState* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12PipelineState_AddRef(ID3D12PipelineState* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12PipelineState_Release(ID3D12PipelineState* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineState_GetPrivateData(ID3D12PipelineState* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineState_SetPrivateData(ID3D12PipelineState* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineState_SetPrivateDataInterface(ID3D12PipelineState* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineState_SetName(ID3D12PipelineState* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineState_GetDevice(ID3D12PipelineState* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12PipelineState methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Fence_QueryInterface(ID3D12Fence* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Fence_AddRef(ID3D12Fence* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Fence_Release(ID3D12Fence* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Fence_GetPrivateData(ID3D12Fence* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Fence_SetPrivateData(ID3D12Fence* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Fence_SetPrivateDataInterface(ID3D12Fence* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Fence_SetName(ID3D12Fence* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Fence_GetDevice(ID3D12Fence* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Fence methods ***/
static __WIDL_INLINE UINT64 ID3D12Fence_GetCompletedValue(ID3D12Fence* This) {
    return This->lpVtbl->GetCompletedValue(This);
}
static __WIDL_INLINE HRESULT ID3D12Fence_SetEventOnCompletion(ID3D12Fence* This,UINT64 value,HANDLE event) {
    return This->lpVtbl->SetEventOnCompletion(This,value,event);
}
static __WIDL_INLINE HRESULT ID3D12Fence_Signal(ID3D12Fence* This,UINT64 value) {
    return This->lpVtbl->Signal(This,value);
}
#endif
#endif

#endif


#endif  /* __ID3D12Fence_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Fence1 interface
 */
#ifndef __ID3D12Fence1_INTERFACE_DEFINED__
#define __ID3D12Fence1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Fence1, 0x433685fe, 0xe22b, 0x4ca0, 0xa8,0xdb, 0xb5,0xb4,0xf4,0xdd,0x0e,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("433685fe-e22b-4ca0-a8db-b5b4f4dd0e4a")
ID3D12Fence1 : public ID3D12Fence
{
    virtual D3D12_FENCE_FLAGS STDMETHODCALLTYPE GetCreationFlags(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Fence1, 0x433685fe, 0xe22b, 0x4ca0, 0xa8,0xdb, 0xb5,0xb4,0xf4,0xdd,0x0e,0x4a)
#endif
#else
typedef struct ID3D12Fence1Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

    /*** ID3D12Fence1 methods ***/
    D3D12_FENCE_FLAGS (STDMETHODCALLTYPE *GetCreationFlags)(
        ID3D12Fence1 *This);

    END_INTERFACE
} ID3D12Fence1Vtbl;

interface ID3D12Fence1 {
    CONST_VTBL ID3D12Fence1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Fence1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Fence1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Fence1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Fence1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Fence1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Fence1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Fence1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Fence1_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Fence methods ***/
#define ID3D12Fence1_GetCompletedValue(This) (This)->lpVtbl->GetCompletedValue(This)
#define ID3D12Fence1_SetEventOnCompletion(This,value,event) (This)->lpVtbl->SetEventOnCompletion(This,value,event)
#define ID3D12Fence1_Signal(This,value) (This)->lpVtbl->Signal(This,value)
/*** ID3D12Fence1 methods ***/
#define ID3D12Fence1_GetCreationFlags(This) (This)->lpVtbl->GetCreationFlags(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Fence1_QueryInterface(ID3D12Fence1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Fence1_AddRef(ID3D12Fence1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Fence1_Release(ID3D12Fence1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Fence1_GetPrivateData(ID3D12Fence1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Fence1_SetPrivateData(ID3D12Fence1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Fence1_SetPrivateDataInterface(ID3D12Fence1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Fence1_SetName(ID3D12Fence1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Fence1_GetDevice(ID3D12Fence1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Fence methods ***/
static __WIDL_INLINE UINT64 ID3D12Fence1_GetCompletedValue(ID3D12Fence1* This) {
    return This->lpVtbl->GetCompletedValue(This);
}
static __WIDL_INLINE HRESULT ID3D12Fence1_SetEventOnCompletion(ID3D12Fence1* This,UINT64 value,HANDLE event) {
    return This->lpVtbl->SetEventOnCompletion(This,value,event);
}
static __WIDL_INLINE HRESULT ID3D12Fence1_Signal(ID3D12Fence1* This,UINT64 value) {
    return This->lpVtbl->Signal(This,value);
}
/*** ID3D12Fence1 methods ***/
static __WIDL_INLINE D3D12_FENCE_FLAGS ID3D12Fence1_GetCreationFlags(ID3D12Fence1* This) {
    return This->lpVtbl->GetCreationFlags(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12Fence1_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 __WIDL_INLINE HRESULT ID3D12CommandAllocator_QueryInterface(ID3D12CommandAllocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12CommandAllocator_AddRef(ID3D12CommandAllocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12CommandAllocator_Release(ID3D12CommandAllocator* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandAllocator_GetPrivateData(ID3D12CommandAllocator* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandAllocator_SetPrivateData(ID3D12CommandAllocator* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandAllocator_SetPrivateDataInterface(ID3D12CommandAllocator* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12CommandAllocator_SetName(ID3D12CommandAllocator* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12CommandAllocator_GetDevice(ID3D12CommandAllocator* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandAllocator methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device_QueryInterface(ID3D12Device* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device_AddRef(ID3D12Device* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device_Release(ID3D12Device* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device_GetPrivateData(ID3D12Device* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device_SetPrivateData(ID3D12Device* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device_SetPrivateDataInterface(ID3D12Device* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device_SetName(ID3D12Device* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device_GetNodeCount(ID3D12Device* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE UINT ID3D12Device_GetDescriptorHandleIncrementSize(ID3D12Device* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE 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 __WIDL_INLINE void ID3D12Device_CreateConstantBufferView(ID3D12Device* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12Device_CreateSampler(ID3D12Device* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device_CreateHeap(ID3D12Device* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device_OpenSharedHandle(ID3D12Device* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device_OpenSharedHandleByName(ID3D12Device* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device_MakeResident(ID3D12Device* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device_Evict(ID3D12Device* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device_GetDeviceRemovedReason(ID3D12Device* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device_CreateQueryHeap(ID3D12Device* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device_SetStablePowerState(ID3D12Device* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE LUID ID3D12Device_GetAdapterLuid(ID3D12Device* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12PipelineLibrary interface
 */
#ifndef __ID3D12PipelineLibrary_INTERFACE_DEFINED__
#define __ID3D12PipelineLibrary_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12PipelineLibrary, 0xc64226a8, 0x9201, 0x46af, 0xb4,0xcc, 0x53,0xfb,0x9f,0xf7,0x41,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c64226a8-9201-46af-b4cc-53fb9ff7414f")
ID3D12PipelineLibrary : public ID3D12DeviceChild
{
    virtual HRESULT STDMETHODCALLTYPE StorePipeline(
        const WCHAR *name,
        ID3D12PipelineState *pipeline) = 0;

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

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

    virtual SIZE_T STDMETHODCALLTYPE GetSerializedSize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Serialize(
        void *data,
        SIZE_T data_size_in_bytes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12PipelineLibrary, 0xc64226a8, 0x9201, 0x46af, 0xb4,0xcc, 0x53,0xfb,0x9f,0xf7,0x41,0x4f)
#endif
#else
typedef struct ID3D12PipelineLibraryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12PipelineLibrary methods ***/
    HRESULT (STDMETHODCALLTYPE *StorePipeline)(
        ID3D12PipelineLibrary *This,
        const WCHAR *name,
        ID3D12PipelineState *pipeline);

    HRESULT (STDMETHODCALLTYPE *LoadGraphicsPipeline)(
        ID3D12PipelineLibrary *This,
        const WCHAR *name,
        const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    HRESULT (STDMETHODCALLTYPE *LoadComputePipeline)(
        ID3D12PipelineLibrary *This,
        const WCHAR *name,
        const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    SIZE_T (STDMETHODCALLTYPE *GetSerializedSize)(
        ID3D12PipelineLibrary *This);

    HRESULT (STDMETHODCALLTYPE *Serialize)(
        ID3D12PipelineLibrary *This,
        void *data,
        SIZE_T data_size_in_bytes);

    END_INTERFACE
} ID3D12PipelineLibraryVtbl;

interface ID3D12PipelineLibrary {
    CONST_VTBL ID3D12PipelineLibraryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12PipelineLibrary_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12PipelineLibrary_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12PipelineLibrary_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12PipelineLibrary_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12PipelineLibrary_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12PipelineLibrary_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12PipelineLibrary_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12PipelineLibrary_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12PipelineLibrary methods ***/
#define ID3D12PipelineLibrary_StorePipeline(This,name,pipeline) (This)->lpVtbl->StorePipeline(This,name,pipeline)
#define ID3D12PipelineLibrary_LoadGraphicsPipeline(This,name,desc,riid,pipeline_state) (This)->lpVtbl->LoadGraphicsPipeline(This,name,desc,riid,pipeline_state)
#define ID3D12PipelineLibrary_LoadComputePipeline(This,name,desc,riid,pipeline_state) (This)->lpVtbl->LoadComputePipeline(This,name,desc,riid,pipeline_state)
#define ID3D12PipelineLibrary_GetSerializedSize(This) (This)->lpVtbl->GetSerializedSize(This)
#define ID3D12PipelineLibrary_Serialize(This,data,data_size_in_bytes) (This)->lpVtbl->Serialize(This,data,data_size_in_bytes)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_QueryInterface(ID3D12PipelineLibrary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12PipelineLibrary_AddRef(ID3D12PipelineLibrary* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12PipelineLibrary_Release(ID3D12PipelineLibrary* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_GetPrivateData(ID3D12PipelineLibrary* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_SetPrivateData(ID3D12PipelineLibrary* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_SetPrivateDataInterface(ID3D12PipelineLibrary* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_SetName(ID3D12PipelineLibrary* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_GetDevice(ID3D12PipelineLibrary* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12PipelineLibrary methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_StorePipeline(ID3D12PipelineLibrary* This,const WCHAR *name,ID3D12PipelineState *pipeline) {
    return This->lpVtbl->StorePipeline(This,name,pipeline);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_LoadGraphicsPipeline(ID3D12PipelineLibrary* This,const WCHAR *name,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->LoadGraphicsPipeline(This,name,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_LoadComputePipeline(ID3D12PipelineLibrary* This,const WCHAR *name,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->LoadComputePipeline(This,name,desc,riid,pipeline_state);
}
static __WIDL_INLINE SIZE_T ID3D12PipelineLibrary_GetSerializedSize(ID3D12PipelineLibrary* This) {
    return This->lpVtbl->GetSerializedSize(This);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary_Serialize(ID3D12PipelineLibrary* This,void *data,SIZE_T data_size_in_bytes) {
    return This->lpVtbl->Serialize(This,data,data_size_in_bytes);
}
#endif
#endif

#endif


#endif  /* __ID3D12PipelineLibrary_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12PipelineLibrary1 interface
 */
#ifndef __ID3D12PipelineLibrary1_INTERFACE_DEFINED__
#define __ID3D12PipelineLibrary1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12PipelineLibrary1, 0x80eabf42, 0x2568, 0x4e5e, 0xbd,0x82, 0xc3,0x7f,0x86,0x96,0x1d,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("80eabf42-2568-4e5e-bd82-c37f86961dc3")
ID3D12PipelineLibrary1 : public ID3D12PipelineLibrary
{
    virtual HRESULT STDMETHODCALLTYPE LoadPipeline(
        const WCHAR *name,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12PipelineLibrary1, 0x80eabf42, 0x2568, 0x4e5e, 0xbd,0x82, 0xc3,0x7f,0x86,0x96,0x1d,0xc3)
#endif
#else
typedef struct ID3D12PipelineLibrary1Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12PipelineLibrary methods ***/
    HRESULT (STDMETHODCALLTYPE *StorePipeline)(
        ID3D12PipelineLibrary1 *This,
        const WCHAR *name,
        ID3D12PipelineState *pipeline);

    HRESULT (STDMETHODCALLTYPE *LoadGraphicsPipeline)(
        ID3D12PipelineLibrary1 *This,
        const WCHAR *name,
        const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    HRESULT (STDMETHODCALLTYPE *LoadComputePipeline)(
        ID3D12PipelineLibrary1 *This,
        const WCHAR *name,
        const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    SIZE_T (STDMETHODCALLTYPE *GetSerializedSize)(
        ID3D12PipelineLibrary1 *This);

    HRESULT (STDMETHODCALLTYPE *Serialize)(
        ID3D12PipelineLibrary1 *This,
        void *data,
        SIZE_T data_size_in_bytes);

    /*** ID3D12PipelineLibrary1 methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadPipeline)(
        ID3D12PipelineLibrary1 *This,
        const WCHAR *name,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    END_INTERFACE
} ID3D12PipelineLibrary1Vtbl;

interface ID3D12PipelineLibrary1 {
    CONST_VTBL ID3D12PipelineLibrary1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12PipelineLibrary1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12PipelineLibrary1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12PipelineLibrary1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12PipelineLibrary1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12PipelineLibrary1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12PipelineLibrary1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12PipelineLibrary1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12PipelineLibrary1_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12PipelineLibrary methods ***/
#define ID3D12PipelineLibrary1_StorePipeline(This,name,pipeline) (This)->lpVtbl->StorePipeline(This,name,pipeline)
#define ID3D12PipelineLibrary1_LoadGraphicsPipeline(This,name,desc,riid,pipeline_state) (This)->lpVtbl->LoadGraphicsPipeline(This,name,desc,riid,pipeline_state)
#define ID3D12PipelineLibrary1_LoadComputePipeline(This,name,desc,riid,pipeline_state) (This)->lpVtbl->LoadComputePipeline(This,name,desc,riid,pipeline_state)
#define ID3D12PipelineLibrary1_GetSerializedSize(This) (This)->lpVtbl->GetSerializedSize(This)
#define ID3D12PipelineLibrary1_Serialize(This,data,data_size_in_bytes) (This)->lpVtbl->Serialize(This,data,data_size_in_bytes)
/*** ID3D12PipelineLibrary1 methods ***/
#define ID3D12PipelineLibrary1_LoadPipeline(This,name,desc,riid,pipeline_state) (This)->lpVtbl->LoadPipeline(This,name,desc,riid,pipeline_state)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_QueryInterface(ID3D12PipelineLibrary1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12PipelineLibrary1_AddRef(ID3D12PipelineLibrary1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12PipelineLibrary1_Release(ID3D12PipelineLibrary1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_GetPrivateData(ID3D12PipelineLibrary1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_SetPrivateData(ID3D12PipelineLibrary1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_SetPrivateDataInterface(ID3D12PipelineLibrary1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_SetName(ID3D12PipelineLibrary1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_GetDevice(ID3D12PipelineLibrary1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12PipelineLibrary methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_StorePipeline(ID3D12PipelineLibrary1* This,const WCHAR *name,ID3D12PipelineState *pipeline) {
    return This->lpVtbl->StorePipeline(This,name,pipeline);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_LoadGraphicsPipeline(ID3D12PipelineLibrary1* This,const WCHAR *name,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->LoadGraphicsPipeline(This,name,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_LoadComputePipeline(ID3D12PipelineLibrary1* This,const WCHAR *name,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->LoadComputePipeline(This,name,desc,riid,pipeline_state);
}
static __WIDL_INLINE SIZE_T ID3D12PipelineLibrary1_GetSerializedSize(ID3D12PipelineLibrary1* This) {
    return This->lpVtbl->GetSerializedSize(This);
}
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_Serialize(ID3D12PipelineLibrary1* This,void *data,SIZE_T data_size_in_bytes) {
    return This->lpVtbl->Serialize(This,data,data_size_in_bytes);
}
/*** ID3D12PipelineLibrary1 methods ***/
static __WIDL_INLINE HRESULT ID3D12PipelineLibrary1_LoadPipeline(ID3D12PipelineLibrary1* This,const WCHAR *name,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->LoadPipeline(This,name,desc,riid,pipeline_state);
}
#endif
#endif

#endif


#endif  /* __ID3D12PipelineLibrary1_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 __WIDL_INLINE HRESULT ID3D12Device1_QueryInterface(ID3D12Device1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device1_AddRef(ID3D12Device1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device1_Release(ID3D12Device1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device1_GetPrivateData(ID3D12Device1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device1_SetPrivateData(ID3D12Device1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device1_SetPrivateDataInterface(ID3D12Device1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device1_SetName(ID3D12Device1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device1_GetNodeCount(ID3D12Device1* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE UINT ID3D12Device1_GetDescriptorHandleIncrementSize(ID3D12Device1* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE 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 __WIDL_INLINE void ID3D12Device1_CreateConstantBufferView(ID3D12Device1* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void ID3D12Device1_CreateSampler(ID3D12Device1* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device1_CreateHeap(ID3D12Device1* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device1_OpenSharedHandle(ID3D12Device1* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device1_OpenSharedHandleByName(ID3D12Device1* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device1_MakeResident(ID3D12Device1* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device1_Evict(ID3D12Device1* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device1_GetDeviceRemovedReason(ID3D12Device1* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12Device1_CreateQueryHeap(ID3D12Device1* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device1_SetStablePowerState(ID3D12Device1* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE LUID ID3D12Device1_GetAdapterLuid(ID3D12Device1* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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__ */

/*****************************************************************************
 * ID3D12Device2 interface
 */
#ifndef __ID3D12Device2_INTERFACE_DEFINED__
#define __ID3D12Device2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device2, 0x30baa41e, 0xb15b, 0x475c, 0xa0,0xbb, 0x1a,0xf5,0xc5,0xb6,0x43,0x28);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30baa41e-b15b-475c-a0bb-1af5c5b64328")
ID3D12Device2 : public ID3D12Device1
{
    virtual HRESULT STDMETHODCALLTYPE CreatePipelineState(
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device2, 0x30baa41e, 0xb15b, 0x475c, 0xa0,0xbb, 0x1a,0xf5,0xc5,0xb6,0x43,0x28)
#endif
#else
typedef struct ID3D12Device2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device2 *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)(
        ID3D12Device2 *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)(
        ID3D12Device2 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device2 *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)(
        ID3D12Device2 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device2 *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)(
        ID3D12Device2 *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)(
        ID3D12Device2 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device2 *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)(
        ID3D12Device2 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device2 *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)(
        ID3D12Device2 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device2 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    END_INTERFACE
} ID3D12Device2Vtbl;

interface ID3D12Device2 {
    CONST_VTBL ID3D12Device2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device2_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device2_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device2_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device2_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device2_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device2_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device2_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device2_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device2_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device2_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device2_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 ID3D12Device2_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device2_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device2_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device2_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device2_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device2_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device2_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device2_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device2_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device2_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device2_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 ID3D12Device2_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 ID3D12Device2_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device2_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device2_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device2_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device2_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 ID3D12Device2_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device2_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 ID3D12Device2_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device2_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device2_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device2_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device2_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device2_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device2_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device2_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device2_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 ID3D12Device2_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device2_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device2_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device2_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 ID3D12Device2_GetAdapterLuid(This) ID3D12Device2_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device2_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device2_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device2_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device2_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device2_QueryInterface(ID3D12Device2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device2_AddRef(ID3D12Device2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device2_Release(ID3D12Device2* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device2_GetPrivateData(ID3D12Device2* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device2_SetPrivateData(ID3D12Device2* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device2_SetPrivateDataInterface(ID3D12Device2* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device2_SetName(ID3D12Device2* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device2_GetNodeCount(ID3D12Device2* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateCommandQueue(ID3D12Device2* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateCommandAllocator(ID3D12Device2* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateGraphicsPipelineState(ID3D12Device2* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateComputePipelineState(ID3D12Device2* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateCommandList(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_CheckFeatureSupport(ID3D12Device2* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateDescriptorHeap(ID3D12Device2* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device2_GetDescriptorHandleIncrementSize(ID3D12Device2* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateRootSignature(ID3D12Device2* 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 __WIDL_INLINE void ID3D12Device2_CreateConstantBufferView(ID3D12Device2* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device2_CreateShaderResourceView(ID3D12Device2* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device2_CreateUnorderedAccessView(ID3D12Device2* 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 __WIDL_INLINE void ID3D12Device2_CreateRenderTargetView(ID3D12Device2* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device2_CreateDepthStencilView(ID3D12Device2* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device2_CreateSampler(ID3D12Device2* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device2_CopyDescriptors(ID3D12Device2* 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 __WIDL_INLINE void ID3D12Device2_CopyDescriptorsSimple(ID3D12Device2* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device2_GetResourceAllocationInfo(ID3D12Device2* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device2_GetCustomHeapProperties(ID3D12Device2* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateCommittedResource(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_CreateHeap(ID3D12Device2* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreatePlacedResource(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_CreateReservedResource(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_CreateSharedHandle(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_OpenSharedHandle(ID3D12Device2* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device2_OpenSharedHandleByName(ID3D12Device2* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device2_MakeResident(ID3D12Device2* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device2_Evict(ID3D12Device2* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateFence(ID3D12Device2* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device2_GetDeviceRemovedReason(ID3D12Device2* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device2_GetCopyableFootprints(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_CreateQueryHeap(ID3D12Device2* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device2_SetStablePowerState(ID3D12Device2* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device2_CreateCommandSignature(ID3D12Device2* 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 __WIDL_INLINE void ID3D12Device2_GetResourceTiling(ID3D12Device2* 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 __WIDL_INLINE LUID ID3D12Device2_GetAdapterLuid(ID3D12Device2* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device2_CreatePipelineLibrary(ID3D12Device2* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device2_SetEventOnMultipleFenceCompletion(ID3D12Device2* 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 __WIDL_INLINE HRESULT ID3D12Device2_SetResidencyPriority(ID3D12Device2* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device2_CreatePipelineState(ID3D12Device2* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Device3 interface
 */
#ifndef __ID3D12Device3_INTERFACE_DEFINED__
#define __ID3D12Device3_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device3, 0x81dadc15, 0x2bad, 0x4392, 0x93,0xc5, 0x10,0x13,0x45,0xc4,0xaa,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("81dadc15-2bad-4392-93c5-101345c4aa98")
ID3D12Device3 : public ID3D12Device2
{
    virtual HRESULT STDMETHODCALLTYPE OpenExistingHeapFromAddress(
        const void *address,
        REFIID riid,
        void **heap) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenExistingHeapFromFileMapping(
        HANDLE file_mapping,
        REFIID riid,
        void **heap) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnqueueMakeResident(
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device3, 0x81dadc15, 0x2bad, 0x4392, 0x93,0xc5, 0x10,0x13,0x45,0xc4,0xaa,0x98)
#endif
#else
typedef struct ID3D12Device3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device3 *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)(
        ID3D12Device3 *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)(
        ID3D12Device3 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device3 *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)(
        ID3D12Device3 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device3 *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)(
        ID3D12Device3 *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)(
        ID3D12Device3 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device3 *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)(
        ID3D12Device3 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device3 *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)(
        ID3D12Device3 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device3 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device3 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device3 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device3 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    END_INTERFACE
} ID3D12Device3Vtbl;

interface ID3D12Device3 {
    CONST_VTBL ID3D12Device3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device3_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device3_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device3_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device3_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device3_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device3_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device3_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device3_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device3_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device3_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device3_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 ID3D12Device3_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device3_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device3_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device3_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device3_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device3_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device3_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device3_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device3_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device3_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device3_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 ID3D12Device3_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 ID3D12Device3_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device3_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device3_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device3_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device3_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 ID3D12Device3_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device3_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 ID3D12Device3_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device3_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device3_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device3_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device3_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device3_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device3_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device3_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device3_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 ID3D12Device3_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device3_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device3_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device3_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 ID3D12Device3_GetAdapterLuid(This) ID3D12Device3_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device3_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device3_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device3_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device3_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device3_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device3_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device3_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device3_QueryInterface(ID3D12Device3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device3_AddRef(ID3D12Device3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device3_Release(ID3D12Device3* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device3_GetPrivateData(ID3D12Device3* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device3_SetPrivateData(ID3D12Device3* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device3_SetPrivateDataInterface(ID3D12Device3* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device3_SetName(ID3D12Device3* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device3_GetNodeCount(ID3D12Device3* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateCommandQueue(ID3D12Device3* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateCommandAllocator(ID3D12Device3* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateGraphicsPipelineState(ID3D12Device3* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateComputePipelineState(ID3D12Device3* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateCommandList(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_CheckFeatureSupport(ID3D12Device3* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateDescriptorHeap(ID3D12Device3* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device3_GetDescriptorHandleIncrementSize(ID3D12Device3* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateRootSignature(ID3D12Device3* 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 __WIDL_INLINE void ID3D12Device3_CreateConstantBufferView(ID3D12Device3* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device3_CreateShaderResourceView(ID3D12Device3* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device3_CreateUnorderedAccessView(ID3D12Device3* 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 __WIDL_INLINE void ID3D12Device3_CreateRenderTargetView(ID3D12Device3* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device3_CreateDepthStencilView(ID3D12Device3* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device3_CreateSampler(ID3D12Device3* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device3_CopyDescriptors(ID3D12Device3* 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 __WIDL_INLINE void ID3D12Device3_CopyDescriptorsSimple(ID3D12Device3* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device3_GetResourceAllocationInfo(ID3D12Device3* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device3_GetCustomHeapProperties(ID3D12Device3* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateCommittedResource(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_CreateHeap(ID3D12Device3* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreatePlacedResource(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_CreateReservedResource(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_CreateSharedHandle(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_OpenSharedHandle(ID3D12Device3* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device3_OpenSharedHandleByName(ID3D12Device3* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device3_MakeResident(ID3D12Device3* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device3_Evict(ID3D12Device3* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateFence(ID3D12Device3* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device3_GetDeviceRemovedReason(ID3D12Device3* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device3_GetCopyableFootprints(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_CreateQueryHeap(ID3D12Device3* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device3_SetStablePowerState(ID3D12Device3* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device3_CreateCommandSignature(ID3D12Device3* 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 __WIDL_INLINE void ID3D12Device3_GetResourceTiling(ID3D12Device3* 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 __WIDL_INLINE LUID ID3D12Device3_GetAdapterLuid(ID3D12Device3* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device3_CreatePipelineLibrary(ID3D12Device3* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device3_SetEventOnMultipleFenceCompletion(ID3D12Device3* 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 __WIDL_INLINE HRESULT ID3D12Device3_SetResidencyPriority(ID3D12Device3* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device3_CreatePipelineState(ID3D12Device3* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device3_OpenExistingHeapFromAddress(ID3D12Device3* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device3_OpenExistingHeapFromFileMapping(ID3D12Device3* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device3_EnqueueMakeResident(ID3D12Device3* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device3_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 __WIDL_INLINE HRESULT ID3D12RootSignatureDeserializer_QueryInterface(ID3D12RootSignatureDeserializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12RootSignatureDeserializer_AddRef(ID3D12RootSignatureDeserializer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12RootSignatureDeserializer_Release(ID3D12RootSignatureDeserializer* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12RootSignatureDeserializer methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ID3D12VersionedRootSignatureDeserializer_QueryInterface(ID3D12VersionedRootSignatureDeserializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12VersionedRootSignatureDeserializer_AddRef(ID3D12VersionedRootSignatureDeserializer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12VersionedRootSignatureDeserializer_Release(ID3D12VersionedRootSignatureDeserializer* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12VersionedRootSignatureDeserializer methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE const D3D12_VERSIONED_ROOT_SIGNATURE_DESC * ID3D12VersionedRootSignatureDeserializer_GetUnconvertedRootSignatureDesc(ID3D12VersionedRootSignatureDeserializer* This) {
    return This->lpVtbl->GetUnconvertedRootSignatureDesc(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12VersionedRootSignatureDeserializer_INTERFACE_DEFINED__ */

typedef enum D3D12_COMMAND_LIST_FLAGS {
    D3D12_COMMAND_LIST_FLAG_NONE = 0x0
} D3D12_COMMAND_LIST_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_COMMAND_LIST_FLAGS);
typedef enum D3D12_COMMAND_POOL_FLAGS {
    D3D12_COMMAND_POOL_FLAG_NONE = 0x0
} D3D12_COMMAND_POOL_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_COMMAND_POOL_FLAGS);
typedef enum D3D12_COMMAND_RECORDER_FLAGS {
    D3D12_COMMAND_RECORDER_FLAG_NONE = 0x0
} D3D12_COMMAND_RECORDER_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_COMMAND_RECORDER_FLAGS);
/*****************************************************************************
 * ID3D12Device4 interface
 */
#ifndef __ID3D12Device4_INTERFACE_DEFINED__
#define __ID3D12Device4_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device4, 0xe865df17, 0xa9ee, 0x46f9, 0xa4,0x63, 0x30,0x98,0x31,0x5a,0xa2,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e865df17-a9ee-46f9-a463-3098315aa2e5")
ID3D12Device4 : public ID3D12Device3
{
    virtual HRESULT STDMETHODCALLTYPE CreateCommandList1(
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateProtectedResourceSession(
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCommittedResource1(
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource) = 0;

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

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device4, 0xe865df17, 0xa9ee, 0x46f9, 0xa4,0x63, 0x30,0x98,0x31,0x5a,0xa2,0xe5)
#endif
#else
typedef struct ID3D12Device4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device4 *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)(
        ID3D12Device4 *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)(
        ID3D12Device4 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device4 *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)(
        ID3D12Device4 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device4 *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)(
        ID3D12Device4 *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)(
        ID3D12Device4 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device4 *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)(
        ID3D12Device4 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device4 *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)(
        ID3D12Device4 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device4 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device4 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device4 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device4 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device4 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device4 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device4 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device4 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device4 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device4 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    END_INTERFACE
} ID3D12Device4Vtbl;

interface ID3D12Device4 {
    CONST_VTBL ID3D12Device4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device4_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device4_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device4_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device4_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device4_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device4_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device4_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device4_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device4_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device4_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device4_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 ID3D12Device4_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device4_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device4_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device4_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device4_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device4_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device4_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device4_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device4_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device4_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device4_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 ID3D12Device4_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 ID3D12Device4_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device4_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device4_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device4_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device4_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 ID3D12Device4_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device4_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 ID3D12Device4_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device4_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device4_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device4_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device4_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device4_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device4_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device4_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device4_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 ID3D12Device4_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device4_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device4_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device4_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 ID3D12Device4_GetAdapterLuid(This) ID3D12Device4_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device4_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device4_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device4_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device4_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device4_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device4_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device4_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device4_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device4_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device4_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device4_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device4_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device4_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device4_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device4_QueryInterface(ID3D12Device4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device4_AddRef(ID3D12Device4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device4_Release(ID3D12Device4* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device4_GetPrivateData(ID3D12Device4* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device4_SetPrivateData(ID3D12Device4* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device4_SetPrivateDataInterface(ID3D12Device4* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device4_SetName(ID3D12Device4* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device4_GetNodeCount(ID3D12Device4* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommandQueue(ID3D12Device4* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommandAllocator(ID3D12Device4* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateGraphicsPipelineState(ID3D12Device4* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateComputePipelineState(ID3D12Device4* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommandList(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_CheckFeatureSupport(ID3D12Device4* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateDescriptorHeap(ID3D12Device4* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device4_GetDescriptorHandleIncrementSize(ID3D12Device4* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateRootSignature(ID3D12Device4* 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 __WIDL_INLINE void ID3D12Device4_CreateConstantBufferView(ID3D12Device4* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device4_CreateShaderResourceView(ID3D12Device4* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device4_CreateUnorderedAccessView(ID3D12Device4* 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 __WIDL_INLINE void ID3D12Device4_CreateRenderTargetView(ID3D12Device4* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device4_CreateDepthStencilView(ID3D12Device4* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device4_CreateSampler(ID3D12Device4* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device4_CopyDescriptors(ID3D12Device4* 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 __WIDL_INLINE void ID3D12Device4_CopyDescriptorsSimple(ID3D12Device4* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device4_GetResourceAllocationInfo(ID3D12Device4* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device4_GetCustomHeapProperties(ID3D12Device4* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommittedResource(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_CreateHeap(ID3D12Device4* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreatePlacedResource(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_CreateReservedResource(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_CreateSharedHandle(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_OpenSharedHandle(ID3D12Device4* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device4_OpenSharedHandleByName(ID3D12Device4* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device4_MakeResident(ID3D12Device4* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device4_Evict(ID3D12Device4* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateFence(ID3D12Device4* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device4_GetDeviceRemovedReason(ID3D12Device4* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device4_GetCopyableFootprints(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_CreateQueryHeap(ID3D12Device4* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device4_SetStablePowerState(ID3D12Device4* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommandSignature(ID3D12Device4* 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 __WIDL_INLINE void ID3D12Device4_GetResourceTiling(ID3D12Device4* 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 __WIDL_INLINE LUID ID3D12Device4_GetAdapterLuid(ID3D12Device4* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device4_CreatePipelineLibrary(ID3D12Device4* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device4_SetEventOnMultipleFenceCompletion(ID3D12Device4* 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 __WIDL_INLINE HRESULT ID3D12Device4_SetResidencyPriority(ID3D12Device4* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device4_CreatePipelineState(ID3D12Device4* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device4_OpenExistingHeapFromAddress(ID3D12Device4* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device4_OpenExistingHeapFromFileMapping(ID3D12Device4* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device4_EnqueueMakeResident(ID3D12Device4* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommandList1(ID3D12Device4* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateProtectedResourceSession(ID3D12Device4* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateCommittedResource1(ID3D12Device4* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateHeap1(ID3D12Device4* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device4_CreateReservedResource1(ID3D12Device4* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device4_GetResourceAllocationInfo1(ID3D12Device4* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device4_INTERFACE_DEFINED__ */

typedef enum D3D12_LIFETIME_STATE {
    D3D12_LIFETIME_STATE_IN_USE = 0x0,
    D3D12_LIFETIME_STATE_NOT_IN_USE = 0x1
} D3D12_LIFETIME_STATE;
/*****************************************************************************
 * ID3D12LifetimeOwner interface
 */
#ifndef __ID3D12LifetimeOwner_INTERFACE_DEFINED__
#define __ID3D12LifetimeOwner_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12LifetimeOwner, 0xe667af9f, 0xcd56, 0x4f46, 0x83,0xce, 0x03,0x2e,0x59,0x5d,0x70,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e667af9f-cd56-4f46-83ce-032e595d70a8")
ID3D12LifetimeOwner : public IUnknown
{
    virtual void STDMETHODCALLTYPE LifetimeStateUpdated(
        D3D12_LIFETIME_STATE NewState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12LifetimeOwner, 0xe667af9f, 0xcd56, 0x4f46, 0x83,0xce, 0x03,0x2e,0x59,0x5d,0x70,0xa8)
#endif
#else
typedef struct ID3D12LifetimeOwnerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12LifetimeOwner methods ***/
    void (STDMETHODCALLTYPE *LifetimeStateUpdated)(
        ID3D12LifetimeOwner *This,
        D3D12_LIFETIME_STATE NewState);

    END_INTERFACE
} ID3D12LifetimeOwnerVtbl;

interface ID3D12LifetimeOwner {
    CONST_VTBL ID3D12LifetimeOwnerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12LifetimeOwner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12LifetimeOwner_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12LifetimeOwner_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12LifetimeOwner methods ***/
#define ID3D12LifetimeOwner_LifetimeStateUpdated(This,NewState) (This)->lpVtbl->LifetimeStateUpdated(This,NewState)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12LifetimeOwner_QueryInterface(ID3D12LifetimeOwner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12LifetimeOwner_AddRef(ID3D12LifetimeOwner* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12LifetimeOwner_Release(ID3D12LifetimeOwner* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12LifetimeOwner methods ***/
static __WIDL_INLINE void ID3D12LifetimeOwner_LifetimeStateUpdated(ID3D12LifetimeOwner* This,D3D12_LIFETIME_STATE NewState) {
    This->lpVtbl->LifetimeStateUpdated(This,NewState);
}
#endif
#endif

#endif


#endif  /* __ID3D12LifetimeOwner_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12SwapChainAssistant interface
 */
#ifndef __ID3D12SwapChainAssistant_INTERFACE_DEFINED__
#define __ID3D12SwapChainAssistant_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12SwapChainAssistant, 0xf1df64b6, 0x57fd, 0x49cd, 0x88,0x07, 0xc0,0xeb,0x88,0xb4,0x5c,0x8f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f1df64b6-57fd-49cd-8807-c0eb88b45c8f")
ID3D12SwapChainAssistant : public IUnknown
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual LUID* STDMETHODCALLTYPE GetLUID(
        LUID *__ret) = 0;
    LUID STDMETHODCALLTYPE GetLUID(
        )
    {
        LUID __ret;
        return *GetLUID(&__ret);
    }
#else
    virtual LUID STDMETHODCALLTYPE GetLUID(
        ) = 0;
#endif

    virtual HRESULT STDMETHODCALLTYPE GetSwapChainObject(
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentResourceAndCommandQueue(
        REFIID riid_resource,
        void **resource,
        REFIID riid_queue,
        void **queue) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertImplicitSync(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12SwapChainAssistant, 0xf1df64b6, 0x57fd, 0x49cd, 0x88,0x07, 0xc0,0xeb,0x88,0xb4,0x5c,0x8f)
#endif
#else
typedef struct ID3D12SwapChainAssistantVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12SwapChainAssistant methods ***/
    LUID * (STDMETHODCALLTYPE *GetLUID)(
        ID3D12SwapChainAssistant *This,
        LUID *__ret);

    HRESULT (STDMETHODCALLTYPE *GetSwapChainObject)(
        ID3D12SwapChainAssistant *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetCurrentResourceAndCommandQueue)(
        ID3D12SwapChainAssistant *This,
        REFIID riid_resource,
        void **resource,
        REFIID riid_queue,
        void **queue);

    HRESULT (STDMETHODCALLTYPE *InsertImplicitSync)(
        ID3D12SwapChainAssistant *This);

    END_INTERFACE
} ID3D12SwapChainAssistantVtbl;

interface ID3D12SwapChainAssistant {
    CONST_VTBL ID3D12SwapChainAssistantVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12SwapChainAssistant_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12SwapChainAssistant_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12SwapChainAssistant_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12SwapChainAssistant methods ***/
#define ID3D12SwapChainAssistant_GetLUID(This) ID3D12SwapChainAssistant_GetLUID_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12SwapChainAssistant_GetSwapChainObject(This,riid,ppv) (This)->lpVtbl->GetSwapChainObject(This,riid,ppv)
#define ID3D12SwapChainAssistant_GetCurrentResourceAndCommandQueue(This,riid_resource,resource,riid_queue,queue) (This)->lpVtbl->GetCurrentResourceAndCommandQueue(This,riid_resource,resource,riid_queue,queue)
#define ID3D12SwapChainAssistant_InsertImplicitSync(This) (This)->lpVtbl->InsertImplicitSync(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12SwapChainAssistant_QueryInterface(ID3D12SwapChainAssistant* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12SwapChainAssistant_AddRef(ID3D12SwapChainAssistant* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12SwapChainAssistant_Release(ID3D12SwapChainAssistant* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12SwapChainAssistant methods ***/
static __WIDL_INLINE LUID ID3D12SwapChainAssistant_GetLUID(ID3D12SwapChainAssistant* This) {
    LUID __ret;
    return *This->lpVtbl->GetLUID(This,&__ret);
}
static __WIDL_INLINE HRESULT ID3D12SwapChainAssistant_GetSwapChainObject(ID3D12SwapChainAssistant* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetSwapChainObject(This,riid,ppv);
}
static __WIDL_INLINE HRESULT ID3D12SwapChainAssistant_GetCurrentResourceAndCommandQueue(ID3D12SwapChainAssistant* This,REFIID riid_resource,void **resource,REFIID riid_queue,void **queue) {
    return This->lpVtbl->GetCurrentResourceAndCommandQueue(This,riid_resource,resource,riid_queue,queue);
}
static __WIDL_INLINE HRESULT ID3D12SwapChainAssistant_InsertImplicitSync(ID3D12SwapChainAssistant* This) {
    return This->lpVtbl->InsertImplicitSync(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12SwapChainAssistant_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12LifetimeTracker interface
 */
#ifndef __ID3D12LifetimeTracker_INTERFACE_DEFINED__
#define __ID3D12LifetimeTracker_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12LifetimeTracker, 0x3fd03d36, 0x4eb1, 0x424a, 0xa5,0x82, 0x49,0x4e,0xcb,0x8b,0xa8,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3fd03d36-4eb1-424a-a582-494ecb8ba813")
ID3D12LifetimeTracker : public ID3D12DeviceChild
{
    virtual HRESULT STDMETHODCALLTYPE DestroyOwnedObject(
        ID3D12DeviceChild *object) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12LifetimeTracker, 0x3fd03d36, 0x4eb1, 0x424a, 0xa5,0x82, 0x49,0x4e,0xcb,0x8b,0xa8,0x13)
#endif
#else
typedef struct ID3D12LifetimeTrackerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12LifetimeTracker methods ***/
    HRESULT (STDMETHODCALLTYPE *DestroyOwnedObject)(
        ID3D12LifetimeTracker *This,
        ID3D12DeviceChild *object);

    END_INTERFACE
} ID3D12LifetimeTrackerVtbl;

interface ID3D12LifetimeTracker {
    CONST_VTBL ID3D12LifetimeTrackerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12LifetimeTracker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12LifetimeTracker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12LifetimeTracker_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12LifetimeTracker_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12LifetimeTracker_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12LifetimeTracker_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12LifetimeTracker_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12LifetimeTracker_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12LifetimeTracker methods ***/
#define ID3D12LifetimeTracker_DestroyOwnedObject(This,object) (This)->lpVtbl->DestroyOwnedObject(This,object)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_QueryInterface(ID3D12LifetimeTracker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12LifetimeTracker_AddRef(ID3D12LifetimeTracker* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12LifetimeTracker_Release(ID3D12LifetimeTracker* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_GetPrivateData(ID3D12LifetimeTracker* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_SetPrivateData(ID3D12LifetimeTracker* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_SetPrivateDataInterface(ID3D12LifetimeTracker* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_SetName(ID3D12LifetimeTracker* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_GetDevice(ID3D12LifetimeTracker* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12LifetimeTracker methods ***/
static __WIDL_INLINE HRESULT ID3D12LifetimeTracker_DestroyOwnedObject(ID3D12LifetimeTracker* This,ID3D12DeviceChild *object) {
    return This->lpVtbl->DestroyOwnedObject(This,object);
}
#endif
#endif

#endif


#endif  /* __ID3D12LifetimeTracker_INTERFACE_DEFINED__ */

typedef enum D3D12_META_COMMAND_PARAMETER_TYPE {
    D3D12_META_COMMAND_PARAMETER_TYPE_FLOAT = 0x0,
    D3D12_META_COMMAND_PARAMETER_TYPE_UINT64 = 0x1,
    D3D12_META_COMMAND_PARAMETER_TYPE_GPU_VIRTUAL_ADDRESS = 0x2,
    D3D12_META_COMMAND_PARAMETER_TYPE_CPU_DESCRIPTOR_HANDLE_HEAP_TYPE_CBV_SRV_UAV = 0x3,
    D3D12_META_COMMAND_PARAMETER_TYPE_GPU_DESCRIPTOR_HANDLE_HEAP_TYPE_CBV_SRV_UAV = 0x4
} D3D12_META_COMMAND_PARAMETER_TYPE;
typedef enum D3D12_META_COMMAND_PARAMETER_FLAGS {
    D3D12_META_COMMAND_PARAMETER_FLAG_INPUT = 0x1,
    D3D12_META_COMMAND_PARAMETER_FLAG_OUTPUT = 0x2
} D3D12_META_COMMAND_PARAMETER_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_META_COMMAND_PARAMETER_FLAGS);
typedef enum D3D12_META_COMMAND_PARAMETER_STAGE {
    D3D12_META_COMMAND_PARAMETER_STAGE_CREATION = 0x0,
    D3D12_META_COMMAND_PARAMETER_STAGE_INITIALIZATION = 0x1,
    D3D12_META_COMMAND_PARAMETER_STAGE_EXECUTION = 0x2
} D3D12_META_COMMAND_PARAMETER_STAGE;
typedef struct D3D12_META_COMMAND_PARAMETER_DESC {
    const WCHAR *Name;
    D3D12_META_COMMAND_PARAMETER_TYPE Type;
    D3D12_META_COMMAND_PARAMETER_FLAGS Flags;
    D3D12_RESOURCE_STATES RequiredResourceState;
    UINT StructureOffset;
} D3D12_META_COMMAND_PARAMETER_DESC;
typedef enum D3D12_GRAPHICS_STATES {
    D3D12_GRAPHICS_STATE_NONE = 0x0,
    D3D12_GRAPHICS_STATE_IA_VERTEX_BUFFERS = 0x1,
    D3D12_GRAPHICS_STATE_IA_INDEX_BUFFER = 0x2,
    D3D12_GRAPHICS_STATE_IA_PRIMITIVE_TOPOLOGY = 0x4,
    D3D12_GRAPHICS_STATE_DESCRIPTOR_HEAP = 0x8,
    D3D12_GRAPHICS_STATE_GRAPHICS_ROOT_SIGNATURE = 0x10,
    D3D12_GRAPHICS_STATE_COMPUTE_ROOT_SIGNATURE = 0x20,
    D3D12_GRAPHICS_STATE_RS_VIEWPORTS = 0x40,
    D3D12_GRAPHICS_STATE_RS_SCISSOR_RECTS = 0x80,
    D3D12_GRAPHICS_STATE_PREDICATION = 0x100,
    D3D12_GRAPHICS_STATE_OM_RENDER_TARGETS = 0x200,
    D3D12_GRAPHICS_STATE_OM_STENCIL_REF = 0x400,
    D3D12_GRAPHICS_STATE_OM_BLEND_FACTOR = 0x800,
    D3D12_GRAPHICS_STATE_PIPELINE_STATE = 0x1000,
    D3D12_GRAPHICS_STATE_SO_TARGETS = 0x2000,
    D3D12_GRAPHICS_STATE_OM_DEPTH_BOUNDS = 0x4000,
    D3D12_GRAPHICS_STATE_SAMPLE_POSITIONS = 0x8000,
    D3D12_GRAPHICS_STATE_VIEW_INSTANCE_MASK = 0x10000
} D3D12_GRAPHICS_STATES;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_GRAPHICS_STATES);
typedef struct D3D12_META_COMMAND_DESC {
    GUID Id;
    const WCHAR *Name;
    D3D12_GRAPHICS_STATES InitializationDirtyState;
    D3D12_GRAPHICS_STATES ExecutionDirtyState;
} D3D12_META_COMMAND_DESC;
/*****************************************************************************
 * ID3D12StateObject interface
 */
#ifndef __ID3D12StateObject_INTERFACE_DEFINED__
#define __ID3D12StateObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12StateObject, 0x47016943, 0xfca8, 0x4594, 0x93,0xea, 0xaf,0x25,0x8b,0x55,0x34,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("47016943-fca8-4594-93ea-af258b55346d")
ID3D12StateObject : public ID3D12Pageable
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12StateObject, 0x47016943, 0xfca8, 0x4594, 0x93,0xea, 0xaf,0x25,0x8b,0x55,0x34,0x6d)
#endif
#else
typedef struct ID3D12StateObjectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    END_INTERFACE
} ID3D12StateObjectVtbl;

interface ID3D12StateObject {
    CONST_VTBL ID3D12StateObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12StateObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12StateObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12StateObject_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12StateObject_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12StateObject_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12StateObject_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12StateObject_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12StateObject_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12StateObject_QueryInterface(ID3D12StateObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12StateObject_AddRef(ID3D12StateObject* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12StateObject_Release(ID3D12StateObject* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12StateObject_GetPrivateData(ID3D12StateObject* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12StateObject_SetPrivateData(ID3D12StateObject* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12StateObject_SetPrivateDataInterface(ID3D12StateObject* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12StateObject_SetName(ID3D12StateObject* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12StateObject_GetDevice(ID3D12StateObject* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
#endif
#endif

#endif


#endif  /* __ID3D12StateObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12StateObjectProperties interface
 */
#ifndef __ID3D12StateObjectProperties_INTERFACE_DEFINED__
#define __ID3D12StateObjectProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12StateObjectProperties, 0xde5fa827, 0x9bf9, 0x4f26, 0x89,0xff, 0xd7,0xf5,0x6f,0xde,0x38,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("de5fa827-9bf9-4f26-89ff-d7f56fde3860")
ID3D12StateObjectProperties : public IUnknown
{
    virtual void * STDMETHODCALLTYPE GetShaderIdentifier(
        const WCHAR *export_name) = 0;

    virtual UINT64 STDMETHODCALLTYPE GetShaderStackSize(
        const WCHAR *export_name) = 0;

    virtual UINT64 STDMETHODCALLTYPE GetPipelineStackSize(
        ) = 0;

    virtual void STDMETHODCALLTYPE SetPipelineStackSize(
        UINT64 pipeline_stack_size_in_bytes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12StateObjectProperties, 0xde5fa827, 0x9bf9, 0x4f26, 0x89,0xff, 0xd7,0xf5,0x6f,0xde,0x38,0x60)
#endif
#else
typedef struct ID3D12StateObjectPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12StateObjectProperties methods ***/
    void * (STDMETHODCALLTYPE *GetShaderIdentifier)(
        ID3D12StateObjectProperties *This,
        const WCHAR *export_name);

    UINT64 (STDMETHODCALLTYPE *GetShaderStackSize)(
        ID3D12StateObjectProperties *This,
        const WCHAR *export_name);

    UINT64 (STDMETHODCALLTYPE *GetPipelineStackSize)(
        ID3D12StateObjectProperties *This);

    void (STDMETHODCALLTYPE *SetPipelineStackSize)(
        ID3D12StateObjectProperties *This,
        UINT64 pipeline_stack_size_in_bytes);

    END_INTERFACE
} ID3D12StateObjectPropertiesVtbl;

interface ID3D12StateObjectProperties {
    CONST_VTBL ID3D12StateObjectPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12StateObjectProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12StateObjectProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12StateObjectProperties_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12StateObjectProperties methods ***/
#define ID3D12StateObjectProperties_GetShaderIdentifier(This,export_name) (This)->lpVtbl->GetShaderIdentifier(This,export_name)
#define ID3D12StateObjectProperties_GetShaderStackSize(This,export_name) (This)->lpVtbl->GetShaderStackSize(This,export_name)
#define ID3D12StateObjectProperties_GetPipelineStackSize(This) (This)->lpVtbl->GetPipelineStackSize(This)
#define ID3D12StateObjectProperties_SetPipelineStackSize(This,pipeline_stack_size_in_bytes) (This)->lpVtbl->SetPipelineStackSize(This,pipeline_stack_size_in_bytes)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12StateObjectProperties_QueryInterface(ID3D12StateObjectProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12StateObjectProperties_AddRef(ID3D12StateObjectProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12StateObjectProperties_Release(ID3D12StateObjectProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12StateObjectProperties methods ***/
static __WIDL_INLINE void * ID3D12StateObjectProperties_GetShaderIdentifier(ID3D12StateObjectProperties* This,const WCHAR *export_name) {
    return This->lpVtbl->GetShaderIdentifier(This,export_name);
}
static __WIDL_INLINE UINT64 ID3D12StateObjectProperties_GetShaderStackSize(ID3D12StateObjectProperties* This,const WCHAR *export_name) {
    return This->lpVtbl->GetShaderStackSize(This,export_name);
}
static __WIDL_INLINE UINT64 ID3D12StateObjectProperties_GetPipelineStackSize(ID3D12StateObjectProperties* This) {
    return This->lpVtbl->GetPipelineStackSize(This);
}
static __WIDL_INLINE void ID3D12StateObjectProperties_SetPipelineStackSize(ID3D12StateObjectProperties* This,UINT64 pipeline_stack_size_in_bytes) {
    This->lpVtbl->SetPipelineStackSize(This,pipeline_stack_size_in_bytes);
}
#endif
#endif

#endif


#endif  /* __ID3D12StateObjectProperties_INTERFACE_DEFINED__ */

typedef enum D3D12_STATE_SUBOBJECT_TYPE {
    D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG = 0x0,
    D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE = 0x1,
    D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE = 0x2,
    D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK = 0x3,
    D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY = 0x5,
    D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION = 0x6,
    D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION = 0x7,
    D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION = 0x8,
    D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG = 0x9,
    D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG = 0xa,
    D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP = 0xb,
    D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1 = 0xc,
    D3D12_STATE_SUBOBJECT_TYPE_MAX_VALID = 0xd
} D3D12_STATE_SUBOBJECT_TYPE;
typedef struct D3D12_STATE_SUBOBJECT {
    D3D12_STATE_SUBOBJECT_TYPE Type;
    const void *pDesc;
} D3D12_STATE_SUBOBJECT;
typedef enum D3D12_STATE_OBJECT_FLAGS {
    D3D12_STATE_OBJECT_FLAG_NONE = 0x0,
    D3D12_STATE_OBJECT_FLAG_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITIONS = 0x1,
    D3D12_STATE_OBJECT_FLAG_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS = 0x2,
    D3D12_STATE_OBJECT_FLAG_ALLOW_STATE_OBJECT_ADDITIONS = 0x4
} D3D12_STATE_OBJECT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_STATE_OBJECT_FLAGS);
typedef struct D3D12_STATE_OBJECT_CONFIG {
    D3D12_STATE_OBJECT_FLAGS Flags;
} D3D12_STATE_OBJECT_CONFIG;
typedef struct D3D12_GLOBAL_ROOT_SIGNATURE {
    ID3D12RootSignature *pGlobalRootSignature;
} D3D12_GLOBAL_ROOT_SIGNATURE;
typedef struct D3D12_LOCAL_ROOT_SIGNATURE {
    ID3D12RootSignature *pLocalRootSignature;
} D3D12_LOCAL_ROOT_SIGNATURE;
typedef struct D3D12_NODE_MASK {
    UINT NodeMask;
} D3D12_NODE_MASK;
typedef enum D3D12_EXPORT_FLAGS {
    D3D12_EXPORT_FLAG_NONE = 0x0
} D3D12_EXPORT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_EXPORT_FLAGS);
typedef struct D3D12_EXPORT_DESC {
    const WCHAR *Name;
    const WCHAR *ExportToRename;
    D3D12_EXPORT_FLAGS Flags;
} D3D12_EXPORT_DESC;
typedef struct D3D12_DXIL_LIBRARY_DESC {
    D3D12_SHADER_BYTECODE DXILLibrary;
    UINT NumExports;
    D3D12_EXPORT_DESC *pExports;
} D3D12_DXIL_LIBRARY_DESC;
typedef struct D3D12_EXISTING_COLLECTION_DESC {
    ID3D12StateObject *pExistingCollection;
    UINT NumExports;
    D3D12_EXPORT_DESC *pExports;
} D3D12_EXISTING_COLLECTION_DESC;
typedef struct D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION {
    const D3D12_STATE_SUBOBJECT *pSubobjectToAssociate;
    UINT NumExports;
    const WCHAR **pExports;
} D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
typedef struct D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION {
    const WCHAR *SubobjectToAssociate;
    UINT NumExports;
    const WCHAR **pExports;
} D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
typedef enum D3D12_HIT_GROUP_TYPE {
    D3D12_HIT_GROUP_TYPE_TRIANGLES = 0x0,
    D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE = 0x1
} D3D12_HIT_GROUP_TYPE;
typedef struct D3D12_HIT_GROUP_DESC {
    const WCHAR *HitGroupExport;
    D3D12_HIT_GROUP_TYPE Type;
    const WCHAR *AnyHitShaderImport;
    const WCHAR *ClosestHitShaderImport;
    const WCHAR *IntersectionShaderImport;
} D3D12_HIT_GROUP_DESC;
typedef struct D3D12_RAYTRACING_SHADER_CONFIG {
    UINT MaxPayloadSizeInBytes;
    UINT MaxAttributeSizeInBytes;
} D3D12_RAYTRACING_SHADER_CONFIG;
typedef struct D3D12_RAYTRACING_PIPELINE_CONFIG {
    UINT MaxTraceRecursionDepth;
} D3D12_RAYTRACING_PIPELINE_CONFIG;
typedef enum D3D12_RAYTRACING_PIPELINE_FLAGS {
    D3D12_RAYTRACING_PIPELINE_FLAG_NONE = 0x0,
    D3D12_RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES = 0x100,
    D3D12_RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES = 0x200
} D3D12_RAYTRACING_PIPELINE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RAYTRACING_PIPELINE_FLAGS);
typedef struct D3D12_RAYTRACING_PIPELINE_CONFIG1 {
    UINT MaxTraceRecursionDepth;
    D3D12_RAYTRACING_PIPELINE_FLAGS Flags;
} D3D12_RAYTRACING_PIPELINE_CONFIG1;
typedef enum D3D12_STATE_OBJECT_TYPE {
    D3D12_STATE_OBJECT_TYPE_COLLECTION = 0x0,
    D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE = 0x3
} D3D12_STATE_OBJECT_TYPE;
typedef struct D3D12_STATE_OBJECT_DESC {
    D3D12_STATE_OBJECT_TYPE Type;
    UINT NumSubobjects;
    const D3D12_STATE_SUBOBJECT *pSubobjects;
} D3D12_STATE_OBJECT_DESC;
typedef enum D3D12_RAYTRACING_GEOMETRY_FLAGS {
    D3D12_RAYTRACING_GEOMETRY_FLAG_NONE = 0x0,
    D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE = 0x1,
    D3D12_RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION = 0x2
} D3D12_RAYTRACING_GEOMETRY_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RAYTRACING_GEOMETRY_FLAGS);
typedef enum D3D12_RAYTRACING_GEOMETRY_TYPE {
    D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES = 0x0,
    D3D12_RAYTRACING_GEOMETRY_TYPE_PROCEDURAL_PRIMITIVE_AABBS = 0x1
} D3D12_RAYTRACING_GEOMETRY_TYPE;
typedef enum D3D12_RAYTRACING_INSTANCE_FLAGS {
    D3D12_RAYTRACING_INSTANCE_FLAG_NONE = 0x0,
    D3D12_RAYTRACING_INSTANCE_FLAG_TRIANGLE_CULL_DISABLE = 0x1,
    D3D12_RAYTRACING_INSTANCE_FLAG_TRIANGLE_FRONT_COUNTERCLOCKWISE = 0x2,
    D3D12_RAYTRACING_INSTANCE_FLAG_FORCE_OPAQUE = 0x4,
    D3D12_RAYTRACING_INSTANCE_FLAG_FORCE_NON_OPAQUE = 0x8
} D3D12_RAYTRACING_INSTANCE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RAYTRACING_INSTANCE_FLAGS);
typedef struct D3D12_GPU_VIRTUAL_ADDRESS_AND_STRIDE {
    D3D12_GPU_VIRTUAL_ADDRESS StartAddress;
    UINT64 StrideInBytes;
} D3D12_GPU_VIRTUAL_ADDRESS_AND_STRIDE;
typedef struct D3D12_GPU_VIRTUAL_ADDRESS_RANGE {
    D3D12_GPU_VIRTUAL_ADDRESS StartAddress;
    UINT64 SizeInBytes;
} D3D12_GPU_VIRTUAL_ADDRESS_RANGE;
typedef struct D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE {
    D3D12_GPU_VIRTUAL_ADDRESS StartAddress;
    UINT64 SizeInBytes;
    UINT64 StrideInBytes;
} D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE;
typedef struct D3D12_RAYTRACING_GEOMETRY_TRIANGLES_DESC {
    D3D12_GPU_VIRTUAL_ADDRESS Transform3x4;
    DXGI_FORMAT IndexFormat;
    DXGI_FORMAT VertexFormat;
    UINT IndexCount;
    UINT VertexCount;
    D3D12_GPU_VIRTUAL_ADDRESS IndexBuffer;
    D3D12_GPU_VIRTUAL_ADDRESS_AND_STRIDE VertexBuffer;
} D3D12_RAYTRACING_GEOMETRY_TRIANGLES_DESC;
typedef struct D3D12_RAYTRACING_AABB {
    FLOAT MinX;
    FLOAT MinY;
    FLOAT MinZ;
    FLOAT MaxX;
    FLOAT MaxY;
    FLOAT MaxZ;
} D3D12_RAYTRACING_AABB;
typedef struct D3D12_RAYTRACING_GEOMETRY_AABBS_DESC {
    UINT64 AABBCount;
    D3D12_GPU_VIRTUAL_ADDRESS_AND_STRIDE AABBs;
} D3D12_RAYTRACING_GEOMETRY_AABBS_DESC;
typedef enum D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS {
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE = 0x0,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE = 0x1,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_COMPACTION = 0x2,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_TRACE = 0x4,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_BUILD = 0x8,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_MINIMIZE_MEMORY = 0x10,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE = 0x20
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS);
typedef enum D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE {
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_CLONE = 0x0,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_COMPACT = 0x1,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_VISUALIZATION_DECODE_FOR_TOOLS = 0x2,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_SERIALIZE = 0x3,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_DESERIALIZE = 0x4
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE;
typedef enum D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE {
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL = 0x0,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL = 0x1
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE;
typedef enum D3D12_ELEMENTS_LAYOUT {
    D3D12_ELEMENTS_LAYOUT_ARRAY = 0x0,
    D3D12_ELEMENTS_LAYOUT_ARRAY_OF_POINTERS = 0x1
} D3D12_ELEMENTS_LAYOUT;
typedef enum D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_TYPE {
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_COMPACTED_SIZE = 0x0,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_TOOLS_VISUALIZATION = 0x1,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_SERIALIZATION = 0x2,
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_CURRENT_SIZE = 0x3
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_TYPE;
typedef struct D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC {
    D3D12_GPU_VIRTUAL_ADDRESS DestBuffer;
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_TYPE InfoType;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC;
typedef struct D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_COMPACTED_SIZE_DESC {
    UINT64 CompactedSizeInBytes;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_COMPACTED_SIZE_DESC;
typedef struct D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_TOOLS_VISUALIZATION_DESC {
    UINT64 DecodedSizeInBytes;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_TOOLS_VISUALIZATION_DESC;
typedef struct D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_TOOLS_VISUALIZATION_HEADER {
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE Type;
    UINT NumDescs;
} D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_TOOLS_VISUALIZATION_HEADER;
typedef struct D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_SERIALIZATION_DESC {
    UINT64 SerializedSizeInBytes;
    UINT64 NumBottomLevelAccelerationStructurePointers;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_SERIALIZATION_DESC;
typedef struct D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER {
    GUID DriverOpaqueGUID;
    BYTE DriverOpaqueVersioningData[16];
} D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER;
typedef enum D3D12_SERIALIZED_DATA_TYPE {
    D3D12_SERIALIZED_DATA_RAYTRACING_ACCELERATION_STRUCTURE = 0x0
} D3D12_SERIALIZED_DATA_TYPE;
typedef enum D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS {
    D3D12_DRIVER_MATCHING_IDENTIFIER_COMPATIBLE_WITH_DEVICE = 0x0,
    D3D12_DRIVER_MATCHING_IDENTIFIER_UNSUPPORTED_TYPE = 0x1,
    D3D12_DRIVER_MATCHING_IDENTIFIER_UNRECOGNIZED = 0x2,
    D3D12_DRIVER_MATCHING_IDENTIFIER_INCOMPATIBLE_VERSION = 0x3,
    D3D12_DRIVER_MATCHING_IDENTIFIER_INCOMPATIBLE_TYPE = 0x4
} D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS;
typedef struct D3D12_SERIALIZED_RAYTRACING_ACCELERATION_STRUCTURE_HEADER {
    D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER DriverMatchingIdentifier;
    UINT64 SerializedSizeInBytesIncludingHeader;
    UINT64 DeserializedSizeInBytes;
    UINT64 NumBottomLevelAccelerationStructurePointersAfterHeader;
} D3D12_SERIALIZED_RAYTRACING_ACCELERATION_STRUCTURE_HEADER;
typedef struct D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_CURRENT_SIZE_DESC {
    UINT64 CurrentSizeInBytes;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_CURRENT_SIZE_DESC;
typedef struct D3D12_RAYTRACING_INSTANCE_DESC {
    FLOAT Transform[3][4];
    UINT InstanceID : 24;
    UINT InstanceMask : 8;
    UINT InstanceContributionToHitGroupIndex : 24;
    UINT Flags : 8;
    D3D12_GPU_VIRTUAL_ADDRESS AccelerationStructure;
} D3D12_RAYTRACING_INSTANCE_DESC;
typedef struct D3D12_RAYTRACING_GEOMETRY_DESC {
    D3D12_RAYTRACING_GEOMETRY_TYPE Type;
    D3D12_RAYTRACING_GEOMETRY_FLAGS Flags;
    __C89_NAMELESS union {
        D3D12_RAYTRACING_GEOMETRY_TRIANGLES_DESC Triangles;
        D3D12_RAYTRACING_GEOMETRY_AABBS_DESC AABBs;
    } __C89_NAMELESSUNIONNAME;
} D3D12_RAYTRACING_GEOMETRY_DESC;
typedef struct D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS {
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE Type;
    D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS Flags;
    UINT NumDescs;
    D3D12_ELEMENTS_LAYOUT DescsLayout;
    __C89_NAMELESS union {
        D3D12_GPU_VIRTUAL_ADDRESS InstanceDescs;
        const D3D12_RAYTRACING_GEOMETRY_DESC *pGeometryDescs;
        const D3D12_RAYTRACING_GEOMETRY_DESC *const *ppGeometryDescs;
    } __C89_NAMELESSUNIONNAME;
} D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS;
typedef struct D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC {
    D3D12_GPU_VIRTUAL_ADDRESS DestAccelerationStructureData;
    D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS Inputs;
    D3D12_GPU_VIRTUAL_ADDRESS SourceAccelerationStructureData;
    D3D12_GPU_VIRTUAL_ADDRESS ScratchAccelerationStructureData;
} D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC;
typedef struct D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO {
    UINT64 ResultDataMaxSizeInBytes;
    UINT64 ScratchDataSizeInBytes;
    UINT64 UpdateScratchDataSizeInBytes;
} D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO;
typedef enum D3D12_RAY_FLAGS {
    D3D12_RAY_FLAG_NONE = 0x0,
    D3D12_RAY_FLAG_FORCE_OPAQUE = 0x1,
    D3D12_RAY_FLAG_FORCE_NON_OPAQUE = 0x2,
    D3D12_RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH = 0x4,
    D3D12_RAY_FLAG_SKIP_CLOSEST_HIT_SHADER = 0x8,
    D3D12_RAY_FLAG_CULL_BACK_FACING_TRIANGLES = 0x10,
    D3D12_RAY_FLAG_CULL_FRONT_FACING_TRIANGLES = 0x20,
    D3D12_RAY_FLAG_CULL_OPAQUE = 0x40,
    D3D12_RAY_FLAG_CULL_NON_OPAQUE = 0x80,
    D3D12_RAY_FLAG_SKIP_TRIANGLES = 0x100,
    D3D12_RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES = 0x200
} D3D12_RAY_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RAY_FLAGS);
typedef enum D3D12_HIT_KIND {
    D3D12_HIT_KIND_TRIANGLE_FRONT_FACE = 0xfe,
    D3D12_HIT_KIND_TRIANGLE_BACK_FACE = 0xff
} D3D12_HIT_KIND;
/*****************************************************************************
 * ID3D12Device5 interface
 */
#ifndef __ID3D12Device5_INTERFACE_DEFINED__
#define __ID3D12Device5_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device5, 0x8b4f173b, 0x2fea, 0x4b80, 0x8f,0x58, 0x43,0x07,0x19,0x1a,0xb9,0x5d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8b4f173b-2fea-4b80-8f58-4307191ab95d")
ID3D12Device5 : public ID3D12Device4
{
    virtual HRESULT STDMETHODCALLTYPE CreateLifetimeTracker(
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker) = 0;

    virtual void STDMETHODCALLTYPE RemoveDevice(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerateMetaCommands(
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerateMetaCommandParameters(
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMetaCommand(
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStateObject(
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object) = 0;

    virtual void STDMETHODCALLTYPE GetRaytracingAccelerationStructurePrebuildInfo(
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) = 0;

    virtual D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS STDMETHODCALLTYPE CheckDriverMatchingIdentifier(
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device5, 0x8b4f173b, 0x2fea, 0x4b80, 0x8f,0x58, 0x43,0x07,0x19,0x1a,0xb9,0x5d)
#endif
#else
typedef struct ID3D12Device5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device5 *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)(
        ID3D12Device5 *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)(
        ID3D12Device5 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device5 *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)(
        ID3D12Device5 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device5 *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)(
        ID3D12Device5 *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)(
        ID3D12Device5 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device5 *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)(
        ID3D12Device5 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device5 *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)(
        ID3D12Device5 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device5 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device5 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device5 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device5 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device5 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device5 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device5 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device5 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device5 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device5 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    /*** ID3D12Device5 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLifetimeTracker)(
        ID3D12Device5 *This,
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker);

    void (STDMETHODCALLTYPE *RemoveDevice)(
        ID3D12Device5 *This);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommands)(
        ID3D12Device5 *This,
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommandParameters)(
        ID3D12Device5 *This,
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs);

    HRESULT (STDMETHODCALLTYPE *CreateMetaCommand)(
        ID3D12Device5 *This,
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command);

    HRESULT (STDMETHODCALLTYPE *CreateStateObject)(
        ID3D12Device5 *This,
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object);

    void (STDMETHODCALLTYPE *GetRaytracingAccelerationStructurePrebuildInfo)(
        ID3D12Device5 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info);

    D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS (STDMETHODCALLTYPE *CheckDriverMatchingIdentifier)(
        ID3D12Device5 *This,
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check);

    END_INTERFACE
} ID3D12Device5Vtbl;

interface ID3D12Device5 {
    CONST_VTBL ID3D12Device5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device5_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device5_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device5_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device5_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device5_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device5_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device5_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device5_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device5_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device5_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device5_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 ID3D12Device5_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device5_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device5_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device5_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device5_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device5_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device5_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device5_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device5_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device5_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device5_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 ID3D12Device5_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 ID3D12Device5_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device5_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device5_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device5_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device5_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 ID3D12Device5_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device5_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 ID3D12Device5_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device5_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device5_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device5_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device5_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device5_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device5_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device5_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device5_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 ID3D12Device5_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device5_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device5_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device5_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 ID3D12Device5_GetAdapterLuid(This) ID3D12Device5_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device5_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device5_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device5_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device5_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device5_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device5_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device5_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device5_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device5_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device5_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device5_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device5_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device5_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device5_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device5 methods ***/
#define ID3D12Device5_CreateLifetimeTracker(This,owner,riid,tracker) (This)->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker)
#define ID3D12Device5_RemoveDevice(This) (This)->lpVtbl->RemoveDevice(This)
#define ID3D12Device5_EnumerateMetaCommands(This,meta_commands_count,descs) (This)->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs)
#define ID3D12Device5_EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs) (This)->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs)
#define ID3D12Device5_CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command) (This)->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command)
#define ID3D12Device5_CreateStateObject(This,desc,riid,state_object) (This)->lpVtbl->CreateStateObject(This,desc,riid,state_object)
#define ID3D12Device5_GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info) (This)->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info)
#define ID3D12Device5_CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check) (This)->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_QueryInterface(ID3D12Device5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device5_AddRef(ID3D12Device5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device5_Release(ID3D12Device5* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_GetPrivateData(ID3D12Device5* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device5_SetPrivateData(ID3D12Device5* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device5_SetPrivateDataInterface(ID3D12Device5* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device5_SetName(ID3D12Device5* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device5_GetNodeCount(ID3D12Device5* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommandQueue(ID3D12Device5* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommandAllocator(ID3D12Device5* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateGraphicsPipelineState(ID3D12Device5* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateComputePipelineState(ID3D12Device5* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommandList(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_CheckFeatureSupport(ID3D12Device5* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateDescriptorHeap(ID3D12Device5* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device5_GetDescriptorHandleIncrementSize(ID3D12Device5* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateRootSignature(ID3D12Device5* 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 __WIDL_INLINE void ID3D12Device5_CreateConstantBufferView(ID3D12Device5* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device5_CreateShaderResourceView(ID3D12Device5* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device5_CreateUnorderedAccessView(ID3D12Device5* 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 __WIDL_INLINE void ID3D12Device5_CreateRenderTargetView(ID3D12Device5* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device5_CreateDepthStencilView(ID3D12Device5* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device5_CreateSampler(ID3D12Device5* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device5_CopyDescriptors(ID3D12Device5* 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 __WIDL_INLINE void ID3D12Device5_CopyDescriptorsSimple(ID3D12Device5* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device5_GetResourceAllocationInfo(ID3D12Device5* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device5_GetCustomHeapProperties(ID3D12Device5* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommittedResource(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_CreateHeap(ID3D12Device5* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreatePlacedResource(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_CreateReservedResource(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_CreateSharedHandle(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_OpenSharedHandle(ID3D12Device5* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device5_OpenSharedHandleByName(ID3D12Device5* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device5_MakeResident(ID3D12Device5* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device5_Evict(ID3D12Device5* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateFence(ID3D12Device5* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device5_GetDeviceRemovedReason(ID3D12Device5* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device5_GetCopyableFootprints(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_CreateQueryHeap(ID3D12Device5* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device5_SetStablePowerState(ID3D12Device5* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommandSignature(ID3D12Device5* 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 __WIDL_INLINE void ID3D12Device5_GetResourceTiling(ID3D12Device5* 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 __WIDL_INLINE LUID ID3D12Device5_GetAdapterLuid(ID3D12Device5* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_CreatePipelineLibrary(ID3D12Device5* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device5_SetEventOnMultipleFenceCompletion(ID3D12Device5* 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 __WIDL_INLINE HRESULT ID3D12Device5_SetResidencyPriority(ID3D12Device5* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_CreatePipelineState(ID3D12Device5* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_OpenExistingHeapFromAddress(ID3D12Device5* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device5_OpenExistingHeapFromFileMapping(ID3D12Device5* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device5_EnqueueMakeResident(ID3D12Device5* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommandList1(ID3D12Device5* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateProtectedResourceSession(ID3D12Device5* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateCommittedResource1(ID3D12Device5* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateHeap1(ID3D12Device5* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateReservedResource1(ID3D12Device5* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device5_GetResourceAllocationInfo1(ID3D12Device5* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
/*** ID3D12Device5 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device5_CreateLifetimeTracker(ID3D12Device5* This,ID3D12LifetimeOwner *owner,REFIID riid,void **tracker) {
    return This->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker);
}
static __WIDL_INLINE void ID3D12Device5_RemoveDevice(ID3D12Device5* This) {
    This->lpVtbl->RemoveDevice(This);
}
static __WIDL_INLINE HRESULT ID3D12Device5_EnumerateMetaCommands(ID3D12Device5* This,UINT *meta_commands_count,D3D12_META_COMMAND_DESC *descs) {
    return This->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs);
}
static __WIDL_INLINE HRESULT ID3D12Device5_EnumerateMetaCommandParameters(ID3D12Device5* This,REFGUID command_id,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT *total_structure_size_in_bytes,UINT *parameter_count,D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) {
    return This->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateMetaCommand(ID3D12Device5* This,REFGUID command_id,UINT node_mask,const void *creation_parameters_data,SIZE_T creation_parameters_data_size_in_bytes,REFIID riid,void **meta_command) {
    return This->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command);
}
static __WIDL_INLINE HRESULT ID3D12Device5_CreateStateObject(ID3D12Device5* This,const D3D12_STATE_OBJECT_DESC *desc,REFIID riid,void **state_object) {
    return This->lpVtbl->CreateStateObject(This,desc,riid,state_object);
}
static __WIDL_INLINE void ID3D12Device5_GetRaytracingAccelerationStructurePrebuildInfo(ID3D12Device5* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) {
    This->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info);
}
static __WIDL_INLINE D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS ID3D12Device5_CheckDriverMatchingIdentifier(ID3D12Device5* This,D3D12_SERIALIZED_DATA_TYPE serialized_data_type,const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) {
    return This->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device5_INTERFACE_DEFINED__ */

typedef enum D3D12_AUTO_BREADCRUMB_OP {
    D3D12_AUTO_BREADCRUMB_OP_SETMARKER = 0x0,
    D3D12_AUTO_BREADCRUMB_OP_BEGINEVENT = 0x1,
    D3D12_AUTO_BREADCRUMB_OP_ENDEVENT = 0x2,
    D3D12_AUTO_BREADCRUMB_OP_DRAWINSTANCED = 0x3,
    D3D12_AUTO_BREADCRUMB_OP_DRAWINDEXEDINSTANCED = 0x4,
    D3D12_AUTO_BREADCRUMB_OP_EXECUTEINDIRECT = 0x5,
    D3D12_AUTO_BREADCRUMB_OP_DISPATCH = 0x6,
    D3D12_AUTO_BREADCRUMB_OP_COPYBUFFERREGION = 0x7,
    D3D12_AUTO_BREADCRUMB_OP_COPYTEXTUREREGION = 0x8,
    D3D12_AUTO_BREADCRUMB_OP_COPYRESOURCE = 0x9,
    D3D12_AUTO_BREADCRUMB_OP_COPYTILES = 0xa,
    D3D12_AUTO_BREADCRUMB_OP_RESOLVESUBRESOURCE = 0xb,
    D3D12_AUTO_BREADCRUMB_OP_CLEARRENDERTARGETVIEW = 0xc,
    D3D12_AUTO_BREADCRUMB_OP_CLEARUNORDEREDACCESSVIEW = 0xd,
    D3D12_AUTO_BREADCRUMB_OP_CLEARDEPTHSTENCILVIEW = 0xe,
    D3D12_AUTO_BREADCRUMB_OP_RESOURCEBARRIER = 0xf,
    D3D12_AUTO_BREADCRUMB_OP_EXECUTEBUNDLE = 0x10,
    D3D12_AUTO_BREADCRUMB_OP_PRESENT = 0x11,
    D3D12_AUTO_BREADCRUMB_OP_RESOLVEQUERYDATA = 0x12,
    D3D12_AUTO_BREADCRUMB_OP_BEGINSUBMISSION = 0x13,
    D3D12_AUTO_BREADCRUMB_OP_ENDSUBMISSION = 0x14,
    D3D12_AUTO_BREADCRUMB_OP_DECODEFRAME = 0x15,
    D3D12_AUTO_BREADCRUMB_OP_PROCESSFRAMES = 0x16,
    D3D12_AUTO_BREADCRUMB_OP_ATOMICCOPYBUFFERUINT = 0x17,
    D3D12_AUTO_BREADCRUMB_OP_ATOMICCOPYBUFFERUINT64 = 0x18,
    D3D12_AUTO_BREADCRUMB_OP_RESOLVESUBRESOURCEREGION = 0x19,
    D3D12_AUTO_BREADCRUMB_OP_WRITEBUFFERIMMEDIATE = 0x1a,
    D3D12_AUTO_BREADCRUMB_OP_DECODEFRAME1 = 0x1b,
    D3D12_AUTO_BREADCRUMB_OP_SETPROTECTEDRESOURCESESSION = 0x1c,
    D3D12_AUTO_BREADCRUMB_OP_DECODEFRAME2 = 0x1d,
    D3D12_AUTO_BREADCRUMB_OP_PROCESSFRAMES1 = 0x1e,
    D3D12_AUTO_BREADCRUMB_OP_BUILDRAYTRACINGACCELERATIONSTRUCTURE = 0x1f,
    D3D12_AUTO_BREADCRUMB_OP_EMITRAYTRACINGACCELERATIONSTRUCTUREPOSTBUILDINFO = 0x20,
    D3D12_AUTO_BREADCRUMB_OP_COPYRAYTRACINGACCELERATIONSTRUCTURE = 0x21,
    D3D12_AUTO_BREADCRUMB_OP_DISPATCHRAYS = 0x22,
    D3D12_AUTO_BREADCRUMB_OP_INITIALIZEMETACOMMAND = 0x23,
    D3D12_AUTO_BREADCRUMB_OP_EXECUTEMETACOMMAND = 0x24,
    D3D12_AUTO_BREADCRUMB_OP_ESTIMATEMOTION = 0x25,
    D3D12_AUTO_BREADCRUMB_OP_RESOLVEMOTIONVECTORHEAP = 0x26,
    D3D12_AUTO_BREADCRUMB_OP_SETPIPELINESTATE1 = 0x27,
    D3D12_AUTO_BREADCRUMB_OP_INITIALIZEEXTENSIONCOMMAND = 0x28,
    D3D12_AUTO_BREADCRUMB_OP_EXECUTEEXTENSIONCOMMAND = 0x29,
    D3D12_AUTO_BREADCRUMB_OP_DISPATCHMESH = 0x2a,
    D3D12_AUTO_BREADCRUMB_OP_ENCODEFRAME = 0x2b,
    D3D12_AUTO_BREADCRUMB_OP_RESOLVEENCODEROUTPUTMETADATA = 0x2c
} D3D12_AUTO_BREADCRUMB_OP;
typedef struct D3D12_AUTO_BREADCRUMB_NODE {
    const char *pCommandListDebugNameA;
    const WCHAR *pCommandListDebugNameW;
    const char *pCommandQueueDebugNameA;
    const WCHAR *pCommandQueueDebugNameW;
    ID3D12GraphicsCommandList *pCommandList;
    ID3D12CommandQueue *pCommandQueue;
    UINT32 BreadcrumbCount;
    const UINT32 *pLastBreadcrumbValue;
    const D3D12_AUTO_BREADCRUMB_OP *pCommandHistory;
    const struct D3D12_AUTO_BREADCRUMB_NODE *pNext;
} D3D12_AUTO_BREADCRUMB_NODE;
typedef struct D3D12_DRED_BREADCRUMB_CONTEXT {
    UINT BreadcrumbIndex;
    const WCHAR *pContextString;
} D3D12_DRED_BREADCRUMB_CONTEXT;
typedef struct D3D12_AUTO_BREADCRUMB_NODE1 {
    const char *pCommandListDebugNameA;
    const WCHAR *pCommandListDebugNameW;
    const char *pCommandQueueDebugNameA;
    const WCHAR *pCommandQueueDebugNameW;
    ID3D12GraphicsCommandList *pCommandList;
    ID3D12CommandQueue *pCommandQueue;
    UINT BreadcrumbCount;
    const UINT *pLastBreadcrumbValue;
    const D3D12_AUTO_BREADCRUMB_OP *pCommandHistory;
    const struct D3D12_AUTO_BREADCRUMB_NODE1 *pNext;
    UINT BreadcrumbContextsCount;
    D3D12_DRED_BREADCRUMB_CONTEXT *pBreadcrumbContexts;
} D3D12_AUTO_BREADCRUMB_NODE1;
typedef enum D3D12_DRED_VERSION {
    D3D12_DRED_VERSION_1_0 = 0x1,
    D3D12_DRED_VERSION_1_1 = 0x2,
    D3D12_DRED_VERSION_1_2 = 0x3,
    D3D12_DRED_VERSION_1_3 = 0x4
} D3D12_DRED_VERSION;
typedef enum D3D12_DRED_FLAGS {
    D3D12_DRED_FLAG_NONE = 0x0,
    D3D12_DRED_FLAG_FORCE_ENABLE = 0x1,
    D3D12_DRED_FLAG_DISABLE_AUTOBREADCRUMBS = 0x2
} D3D12_DRED_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_DRED_FLAGS);
typedef enum D3D12_DRED_ENABLEMENT {
    D3D12_DRED_ENABLEMENT_SYSTEM_CONTROLLED = 0x0,
    D3D12_DRED_ENABLEMENT_FORCED_OFF = 0x1,
    D3D12_DRED_ENABLEMENT_FORCED_ON = 0x2
} D3D12_DRED_ENABLEMENT;
typedef struct D3D12_DEVICE_REMOVED_EXTENDED_DATA {
    D3D12_DRED_FLAGS Flags;
    D3D12_AUTO_BREADCRUMB_NODE *pHeadAutoBreadcrumbNode;
} D3D12_DEVICE_REMOVED_EXTENDED_DATA;
typedef enum D3D12_DRED_ALLOCATION_TYPE {
    D3D12_DRED_ALLOCATION_TYPE_COMMAND_QUEUE = 0x13,
    D3D12_DRED_ALLOCATION_TYPE_COMMAND_ALLOCATOR = 0x14,
    D3D12_DRED_ALLOCATION_TYPE_PIPELINE_STATE = 0x15,
    D3D12_DRED_ALLOCATION_TYPE_COMMAND_LIST = 0x16,
    D3D12_DRED_ALLOCATION_TYPE_FENCE = 0x17,
    D3D12_DRED_ALLOCATION_TYPE_DESCRIPTOR_HEAP = 0x18,
    D3D12_DRED_ALLOCATION_TYPE_HEAP = 0x19,
    D3D12_DRED_ALLOCATION_TYPE_QUERY_HEAP = 0x1b,
    D3D12_DRED_ALLOCATION_TYPE_COMMAND_SIGNATURE = 0x1c,
    D3D12_DRED_ALLOCATION_TYPE_PIPELINE_LIBRARY = 0x1d,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_DECODER = 0x1e,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_PROCESSOR = 0x20,
    D3D12_DRED_ALLOCATION_TYPE_RESOURCE = 0x22,
    D3D12_DRED_ALLOCATION_TYPE_PASS = 0x23,
    D3D12_DRED_ALLOCATION_TYPE_CRYPTOSESSION = 0x24,
    D3D12_DRED_ALLOCATION_TYPE_CRYPTOSESSIONPOLICY = 0x25,
    D3D12_DRED_ALLOCATION_TYPE_PROTECTEDRESOURCESESSION = 0x26,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_DECODER_HEAP = 0x27,
    D3D12_DRED_ALLOCATION_TYPE_COMMAND_POOL = 0x28,
    D3D12_DRED_ALLOCATION_TYPE_COMMAND_RECORDER = 0x29,
    D3D12_DRED_ALLOCATION_TYPE_STATE_OBJECT = 0x2a,
    D3D12_DRED_ALLOCATION_TYPE_METACOMMAND = 0x2b,
    D3D12_DRED_ALLOCATION_TYPE_SCHEDULINGGROUP = 0x2c,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_MOTION_ESTIMATOR = 0x2d,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_MOTION_VECTOR_HEAP = 0x2e,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_EXTENSION_COMMAND = 0x2f,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_ENCODER = 0x30,
    D3D12_DRED_ALLOCATION_TYPE_VIDEO_ENCODER_HEAP = 0x31,
    D3D12_DRED_ALLOCATION_TYPE_INVALID = 0xffffffff
} D3D12_DRED_ALLOCATION_TYPE;
typedef struct D3D12_DRED_ALLOCATION_NODE {
    const char *ObjectNameA;
    const WCHAR *ObjectNameW;
    D3D12_DRED_ALLOCATION_TYPE AllocationType;
    const struct D3D12_DRED_ALLOCATION_NODE *pNext;
} D3D12_DRED_ALLOCATION_NODE;
typedef struct D3D12_DRED_ALLOCATION_NODE1 {
    const char *ObjectNameA;
    const WCHAR *ObjectNameW;
    D3D12_DRED_ALLOCATION_TYPE AllocationType;
    const struct D3D12_DRED_ALLOCATION_NODE1 *pNext;
    const IUnknown *pObject;
} D3D12_DRED_ALLOCATION_NODE1;
typedef struct D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT {
    const D3D12_AUTO_BREADCRUMB_NODE *pHeadAutoBreadcrumbNode;
} D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT;
typedef struct D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 {
    const D3D12_AUTO_BREADCRUMB_NODE1 *pHeadAutoBreadcrumbNode;
} D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1;
typedef struct D3D12_DRED_PAGE_FAULT_OUTPUT {
    D3D12_GPU_VIRTUAL_ADDRESS PageFaultVA;
    const D3D12_DRED_ALLOCATION_NODE *pHeadExistingAllocationNode;
    const D3D12_DRED_ALLOCATION_NODE *pHeadRecentFreedAllocationNode;
} D3D12_DRED_PAGE_FAULT_OUTPUT;
typedef struct D3D12_DRED_PAGE_FAULT_OUTPUT1 {
    D3D12_GPU_VIRTUAL_ADDRESS PageFaultVA;
    const D3D12_DRED_ALLOCATION_NODE1 *pHeadExistingAllocationNode;
    const D3D12_DRED_ALLOCATION_NODE1 *pHeadRecentFreedAllocationNode;
} D3D12_DRED_PAGE_FAULT_OUTPUT1;
typedef enum D3D12_DRED_PAGE_FAULT_FLAGS {
    D3D12_DRED_PAGE_FAULT_FLAGS_NONE = 0x0
} D3D12_DRED_PAGE_FAULT_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_DRED_PAGE_FAULT_FLAGS);
typedef enum D3D12_DRED_DEVICE_STATE {
    D3D12_DRED_DEVICE_STATE_UNKNOWN = 0x0,
    D3D12_DRED_DEVICE_STATE_HUNG = 0x3,
    D3D12_DRED_DEVICE_STATE_FAULT = 0x6,
    D3D12_DRED_DEVICE_STATE_PAGEFAULT = 0x7
} D3D12_DRED_DEVICE_STATE;
typedef struct D3D12_DRED_PAGE_FAULT_OUTPUT2 {
    D3D12_GPU_VIRTUAL_ADDRESS PageFaultVA;
    const D3D12_DRED_ALLOCATION_NODE1 *pHeadExistingAllocationNode;
    const D3D12_DRED_ALLOCATION_NODE1 *pHeadRecentFreedAllocationNode;
    D3D12_DRED_PAGE_FAULT_FLAGS PageFaultFlags;
} D3D12_DRED_PAGE_FAULT_OUTPUT2;
typedef struct D3D12_DEVICE_REMOVED_EXTENDED_DATA1 {
    HRESULT DeviceRemovedReason;
    D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT AutoBreadcrumbsOutput;
    D3D12_DRED_PAGE_FAULT_OUTPUT PageFaultOutput;
} D3D12_DEVICE_REMOVED_EXTENDED_DATA1;
typedef struct D3D12_DEVICE_REMOVED_EXTENDED_DATA2 {
    HRESULT DeviceRemovedReason;
    D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 AutoBreadcrumbsOutput;
    D3D12_DRED_PAGE_FAULT_OUTPUT1 PageFaultOutput;
} D3D12_DEVICE_REMOVED_EXTENDED_DATA2;
typedef struct D3D12_DEVICE_REMOVED_EXTENDED_DATA3 {
    HRESULT DeviceRemovedReason;
    D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 AutoBreadcrumbsOutput;
    D3D12_DRED_PAGE_FAULT_OUTPUT2 PageFaultOutput;
    D3D12_DRED_DEVICE_STATE DeviceState;
} D3D12_DEVICE_REMOVED_EXTENDED_DATA3;
typedef struct D3D12_VERSIONED_DEVICE_REMOVED_EXTENDED_DATA {
    D3D12_DRED_VERSION Version;
    __C89_NAMELESS union {
        D3D12_DEVICE_REMOVED_EXTENDED_DATA Dred_1_0;
        D3D12_DEVICE_REMOVED_EXTENDED_DATA1 Dred_1_1;
        D3D12_DEVICE_REMOVED_EXTENDED_DATA2 Dred_1_2;
        D3D12_DEVICE_REMOVED_EXTENDED_DATA3 Dred_1_3;
    } __C89_NAMELESSUNIONNAME;
} D3D12_VERSIONED_DEVICE_REMOVED_EXTENDED_DATA;
/*****************************************************************************
 * ID3D12DeviceRemovedExtendedDataSettings interface
 */
#ifndef __ID3D12DeviceRemovedExtendedDataSettings_INTERFACE_DEFINED__
#define __ID3D12DeviceRemovedExtendedDataSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DeviceRemovedExtendedDataSettings, 0x82bc481c, 0x6b9b, 0x4030, 0xae,0xdb, 0x7e,0xe3,0xd1,0xdf,0x1e,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("82bc481c-6b9b-4030-aedb-7ee3d1df1e63")
ID3D12DeviceRemovedExtendedDataSettings : public IUnknown
{
    virtual void STDMETHODCALLTYPE SetAutoBreadcrumbsEnablement(
        D3D12_DRED_ENABLEMENT enablement) = 0;

    virtual void STDMETHODCALLTYPE SetPageFaultEnablement(
        D3D12_DRED_ENABLEMENT enablement) = 0;

    virtual void STDMETHODCALLTYPE SetWatsonDumpEnablement(
        D3D12_DRED_ENABLEMENT enablement) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DeviceRemovedExtendedDataSettings, 0x82bc481c, 0x6b9b, 0x4030, 0xae,0xdb, 0x7e,0xe3,0xd1,0xdf,0x1e,0x63)
#endif
#else
typedef struct ID3D12DeviceRemovedExtendedDataSettingsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12DeviceRemovedExtendedDataSettings methods ***/
    void (STDMETHODCALLTYPE *SetAutoBreadcrumbsEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings *This,
        D3D12_DRED_ENABLEMENT enablement);

    void (STDMETHODCALLTYPE *SetPageFaultEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings *This,
        D3D12_DRED_ENABLEMENT enablement);

    void (STDMETHODCALLTYPE *SetWatsonDumpEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings *This,
        D3D12_DRED_ENABLEMENT enablement);

    END_INTERFACE
} ID3D12DeviceRemovedExtendedDataSettingsVtbl;

interface ID3D12DeviceRemovedExtendedDataSettings {
    CONST_VTBL ID3D12DeviceRemovedExtendedDataSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DeviceRemovedExtendedDataSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DeviceRemovedExtendedDataSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DeviceRemovedExtendedDataSettings_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12DeviceRemovedExtendedDataSettings methods ***/
#define ID3D12DeviceRemovedExtendedDataSettings_SetAutoBreadcrumbsEnablement(This,enablement) (This)->lpVtbl->SetAutoBreadcrumbsEnablement(This,enablement)
#define ID3D12DeviceRemovedExtendedDataSettings_SetPageFaultEnablement(This,enablement) (This)->lpVtbl->SetPageFaultEnablement(This,enablement)
#define ID3D12DeviceRemovedExtendedDataSettings_SetWatsonDumpEnablement(This,enablement) (This)->lpVtbl->SetWatsonDumpEnablement(This,enablement)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedDataSettings_QueryInterface(ID3D12DeviceRemovedExtendedDataSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedDataSettings_AddRef(ID3D12DeviceRemovedExtendedDataSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedDataSettings_Release(ID3D12DeviceRemovedExtendedDataSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12DeviceRemovedExtendedDataSettings methods ***/
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings_SetAutoBreadcrumbsEnablement(ID3D12DeviceRemovedExtendedDataSettings* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetAutoBreadcrumbsEnablement(This,enablement);
}
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings_SetPageFaultEnablement(ID3D12DeviceRemovedExtendedDataSettings* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetPageFaultEnablement(This,enablement);
}
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings_SetWatsonDumpEnablement(ID3D12DeviceRemovedExtendedDataSettings* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetWatsonDumpEnablement(This,enablement);
}
#endif
#endif

#endif


#endif  /* __ID3D12DeviceRemovedExtendedDataSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12DeviceRemovedExtendedDataSettings1 interface
 */
#ifndef __ID3D12DeviceRemovedExtendedDataSettings1_INTERFACE_DEFINED__
#define __ID3D12DeviceRemovedExtendedDataSettings1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DeviceRemovedExtendedDataSettings1, 0xdbd5ae51, 0x3317, 0x4f0a, 0xad,0xf9, 0x1d,0x7c,0xed,0xca,0xae,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dbd5ae51-3317-4f0a-adf9-1d7cedcaae0b")
ID3D12DeviceRemovedExtendedDataSettings1 : public ID3D12DeviceRemovedExtendedDataSettings
{
    virtual void STDMETHODCALLTYPE SetBreadcrumbContextEnablement(
        D3D12_DRED_ENABLEMENT enablement) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DeviceRemovedExtendedDataSettings1, 0xdbd5ae51, 0x3317, 0x4f0a, 0xad,0xf9, 0x1d,0x7c,0xed,0xca,0xae,0x0b)
#endif
#else
typedef struct ID3D12DeviceRemovedExtendedDataSettings1Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12DeviceRemovedExtendedDataSettings methods ***/
    void (STDMETHODCALLTYPE *SetAutoBreadcrumbsEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings1 *This,
        D3D12_DRED_ENABLEMENT enablement);

    void (STDMETHODCALLTYPE *SetPageFaultEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings1 *This,
        D3D12_DRED_ENABLEMENT enablement);

    void (STDMETHODCALLTYPE *SetWatsonDumpEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings1 *This,
        D3D12_DRED_ENABLEMENT enablement);

    /*** ID3D12DeviceRemovedExtendedDataSettings1 methods ***/
    void (STDMETHODCALLTYPE *SetBreadcrumbContextEnablement)(
        ID3D12DeviceRemovedExtendedDataSettings1 *This,
        D3D12_DRED_ENABLEMENT enablement);

    END_INTERFACE
} ID3D12DeviceRemovedExtendedDataSettings1Vtbl;

interface ID3D12DeviceRemovedExtendedDataSettings1 {
    CONST_VTBL ID3D12DeviceRemovedExtendedDataSettings1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DeviceRemovedExtendedDataSettings1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DeviceRemovedExtendedDataSettings1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DeviceRemovedExtendedDataSettings1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12DeviceRemovedExtendedDataSettings methods ***/
#define ID3D12DeviceRemovedExtendedDataSettings1_SetAutoBreadcrumbsEnablement(This,enablement) (This)->lpVtbl->SetAutoBreadcrumbsEnablement(This,enablement)
#define ID3D12DeviceRemovedExtendedDataSettings1_SetPageFaultEnablement(This,enablement) (This)->lpVtbl->SetPageFaultEnablement(This,enablement)
#define ID3D12DeviceRemovedExtendedDataSettings1_SetWatsonDumpEnablement(This,enablement) (This)->lpVtbl->SetWatsonDumpEnablement(This,enablement)
/*** ID3D12DeviceRemovedExtendedDataSettings1 methods ***/
#define ID3D12DeviceRemovedExtendedDataSettings1_SetBreadcrumbContextEnablement(This,enablement) (This)->lpVtbl->SetBreadcrumbContextEnablement(This,enablement)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedDataSettings1_QueryInterface(ID3D12DeviceRemovedExtendedDataSettings1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedDataSettings1_AddRef(ID3D12DeviceRemovedExtendedDataSettings1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedDataSettings1_Release(ID3D12DeviceRemovedExtendedDataSettings1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12DeviceRemovedExtendedDataSettings methods ***/
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings1_SetAutoBreadcrumbsEnablement(ID3D12DeviceRemovedExtendedDataSettings1* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetAutoBreadcrumbsEnablement(This,enablement);
}
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings1_SetPageFaultEnablement(ID3D12DeviceRemovedExtendedDataSettings1* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetPageFaultEnablement(This,enablement);
}
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings1_SetWatsonDumpEnablement(ID3D12DeviceRemovedExtendedDataSettings1* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetWatsonDumpEnablement(This,enablement);
}
/*** ID3D12DeviceRemovedExtendedDataSettings1 methods ***/
static __WIDL_INLINE void ID3D12DeviceRemovedExtendedDataSettings1_SetBreadcrumbContextEnablement(ID3D12DeviceRemovedExtendedDataSettings1* This,D3D12_DRED_ENABLEMENT enablement) {
    This->lpVtbl->SetBreadcrumbContextEnablement(This,enablement);
}
#endif
#endif

#endif


#endif  /* __ID3D12DeviceRemovedExtendedDataSettings1_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12DeviceRemovedExtendedData interface
 */
#ifndef __ID3D12DeviceRemovedExtendedData_INTERFACE_DEFINED__
#define __ID3D12DeviceRemovedExtendedData_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DeviceRemovedExtendedData, 0x98931d33, 0x5ae8, 0x4791, 0xaa,0x3c, 0x1a,0x73,0xa2,0x93,0x4e,0x71);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("98931d33-5ae8-4791-aa3c-1a73a2934e71")
ID3D12DeviceRemovedExtendedData : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAutoBreadcrumbsOutput(
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPageFaultAllocationOutput(
        D3D12_DRED_PAGE_FAULT_OUTPUT *output) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DeviceRemovedExtendedData, 0x98931d33, 0x5ae8, 0x4791, 0xaa,0x3c, 0x1a,0x73,0xa2,0x93,0x4e,0x71)
#endif
#else
typedef struct ID3D12DeviceRemovedExtendedDataVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12DeviceRemovedExtendedData methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAutoBreadcrumbsOutput)(
        ID3D12DeviceRemovedExtendedData *This,
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output);

    HRESULT (STDMETHODCALLTYPE *GetPageFaultAllocationOutput)(
        ID3D12DeviceRemovedExtendedData *This,
        D3D12_DRED_PAGE_FAULT_OUTPUT *output);

    END_INTERFACE
} ID3D12DeviceRemovedExtendedDataVtbl;

interface ID3D12DeviceRemovedExtendedData {
    CONST_VTBL ID3D12DeviceRemovedExtendedDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DeviceRemovedExtendedData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DeviceRemovedExtendedData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DeviceRemovedExtendedData_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12DeviceRemovedExtendedData methods ***/
#define ID3D12DeviceRemovedExtendedData_GetAutoBreadcrumbsOutput(This,output) (This)->lpVtbl->GetAutoBreadcrumbsOutput(This,output)
#define ID3D12DeviceRemovedExtendedData_GetPageFaultAllocationOutput(This,output) (This)->lpVtbl->GetPageFaultAllocationOutput(This,output)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData_QueryInterface(ID3D12DeviceRemovedExtendedData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedData_AddRef(ID3D12DeviceRemovedExtendedData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedData_Release(ID3D12DeviceRemovedExtendedData* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12DeviceRemovedExtendedData methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData_GetAutoBreadcrumbsOutput(ID3D12DeviceRemovedExtendedData* This,D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output) {
    return This->lpVtbl->GetAutoBreadcrumbsOutput(This,output);
}
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData_GetPageFaultAllocationOutput(ID3D12DeviceRemovedExtendedData* This,D3D12_DRED_PAGE_FAULT_OUTPUT *output) {
    return This->lpVtbl->GetPageFaultAllocationOutput(This,output);
}
#endif
#endif

#endif


#endif  /* __ID3D12DeviceRemovedExtendedData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12DeviceRemovedExtendedData1 interface
 */
#ifndef __ID3D12DeviceRemovedExtendedData1_INTERFACE_DEFINED__
#define __ID3D12DeviceRemovedExtendedData1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DeviceRemovedExtendedData1, 0x9727a022, 0xcf1d, 0x4dda, 0x9e,0xba, 0xef,0xfa,0x65,0x3f,0xc5,0x06);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9727a022-cf1d-4dda-9eba-effa653fc506")
ID3D12DeviceRemovedExtendedData1 : public ID3D12DeviceRemovedExtendedData
{
    virtual HRESULT STDMETHODCALLTYPE GetAutoBreadcrumbsOutput1(
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 *output) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPageFaultAllocationOutput1(
        D3D12_DRED_PAGE_FAULT_OUTPUT1 *output) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DeviceRemovedExtendedData1, 0x9727a022, 0xcf1d, 0x4dda, 0x9e,0xba, 0xef,0xfa,0x65,0x3f,0xc5,0x06)
#endif
#else
typedef struct ID3D12DeviceRemovedExtendedData1Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12DeviceRemovedExtendedData methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAutoBreadcrumbsOutput)(
        ID3D12DeviceRemovedExtendedData1 *This,
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output);

    HRESULT (STDMETHODCALLTYPE *GetPageFaultAllocationOutput)(
        ID3D12DeviceRemovedExtendedData1 *This,
        D3D12_DRED_PAGE_FAULT_OUTPUT *output);

    /*** ID3D12DeviceRemovedExtendedData1 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAutoBreadcrumbsOutput1)(
        ID3D12DeviceRemovedExtendedData1 *This,
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 *output);

    HRESULT (STDMETHODCALLTYPE *GetPageFaultAllocationOutput1)(
        ID3D12DeviceRemovedExtendedData1 *This,
        D3D12_DRED_PAGE_FAULT_OUTPUT1 *output);

    END_INTERFACE
} ID3D12DeviceRemovedExtendedData1Vtbl;

interface ID3D12DeviceRemovedExtendedData1 {
    CONST_VTBL ID3D12DeviceRemovedExtendedData1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DeviceRemovedExtendedData1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DeviceRemovedExtendedData1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DeviceRemovedExtendedData1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12DeviceRemovedExtendedData methods ***/
#define ID3D12DeviceRemovedExtendedData1_GetAutoBreadcrumbsOutput(This,output) (This)->lpVtbl->GetAutoBreadcrumbsOutput(This,output)
#define ID3D12DeviceRemovedExtendedData1_GetPageFaultAllocationOutput(This,output) (This)->lpVtbl->GetPageFaultAllocationOutput(This,output)
/*** ID3D12DeviceRemovedExtendedData1 methods ***/
#define ID3D12DeviceRemovedExtendedData1_GetAutoBreadcrumbsOutput1(This,output) (This)->lpVtbl->GetAutoBreadcrumbsOutput1(This,output)
#define ID3D12DeviceRemovedExtendedData1_GetPageFaultAllocationOutput1(This,output) (This)->lpVtbl->GetPageFaultAllocationOutput1(This,output)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData1_QueryInterface(ID3D12DeviceRemovedExtendedData1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedData1_AddRef(ID3D12DeviceRemovedExtendedData1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedData1_Release(ID3D12DeviceRemovedExtendedData1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12DeviceRemovedExtendedData methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData1_GetAutoBreadcrumbsOutput(ID3D12DeviceRemovedExtendedData1* This,D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output) {
    return This->lpVtbl->GetAutoBreadcrumbsOutput(This,output);
}
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData1_GetPageFaultAllocationOutput(ID3D12DeviceRemovedExtendedData1* This,D3D12_DRED_PAGE_FAULT_OUTPUT *output) {
    return This->lpVtbl->GetPageFaultAllocationOutput(This,output);
}
/*** ID3D12DeviceRemovedExtendedData1 methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData1_GetAutoBreadcrumbsOutput1(ID3D12DeviceRemovedExtendedData1* This,D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 *output) {
    return This->lpVtbl->GetAutoBreadcrumbsOutput1(This,output);
}
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData1_GetPageFaultAllocationOutput1(ID3D12DeviceRemovedExtendedData1* This,D3D12_DRED_PAGE_FAULT_OUTPUT1 *output) {
    return This->lpVtbl->GetPageFaultAllocationOutput1(This,output);
}
#endif
#endif

#endif


#endif  /* __ID3D12DeviceRemovedExtendedData1_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12DeviceRemovedExtendedData2 interface
 */
#ifndef __ID3D12DeviceRemovedExtendedData2_INTERFACE_DEFINED__
#define __ID3D12DeviceRemovedExtendedData2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DeviceRemovedExtendedData2, 0x67fc5816, 0xe4ca, 0x4915, 0xbf,0x18, 0x42,0x54,0x12,0x72,0xda,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("67fc5816-e4ca-4915-bf18-42541272da54")
ID3D12DeviceRemovedExtendedData2 : public ID3D12DeviceRemovedExtendedData1
{
    virtual HRESULT STDMETHODCALLTYPE GetPageFaultAllocationOutput2(
        D3D12_DRED_PAGE_FAULT_OUTPUT2 *output) = 0;

    virtual D3D12_DRED_DEVICE_STATE STDMETHODCALLTYPE GetDeviceState(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12DeviceRemovedExtendedData2, 0x67fc5816, 0xe4ca, 0x4915, 0xbf,0x18, 0x42,0x54,0x12,0x72,0xda,0x54)
#endif
#else
typedef struct ID3D12DeviceRemovedExtendedData2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12DeviceRemovedExtendedData methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAutoBreadcrumbsOutput)(
        ID3D12DeviceRemovedExtendedData2 *This,
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output);

    HRESULT (STDMETHODCALLTYPE *GetPageFaultAllocationOutput)(
        ID3D12DeviceRemovedExtendedData2 *This,
        D3D12_DRED_PAGE_FAULT_OUTPUT *output);

    /*** ID3D12DeviceRemovedExtendedData1 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAutoBreadcrumbsOutput1)(
        ID3D12DeviceRemovedExtendedData2 *This,
        D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 *output);

    HRESULT (STDMETHODCALLTYPE *GetPageFaultAllocationOutput1)(
        ID3D12DeviceRemovedExtendedData2 *This,
        D3D12_DRED_PAGE_FAULT_OUTPUT1 *output);

    /*** ID3D12DeviceRemovedExtendedData2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPageFaultAllocationOutput2)(
        ID3D12DeviceRemovedExtendedData2 *This,
        D3D12_DRED_PAGE_FAULT_OUTPUT2 *output);

    D3D12_DRED_DEVICE_STATE (STDMETHODCALLTYPE *GetDeviceState)(
        ID3D12DeviceRemovedExtendedData2 *This);

    END_INTERFACE
} ID3D12DeviceRemovedExtendedData2Vtbl;

interface ID3D12DeviceRemovedExtendedData2 {
    CONST_VTBL ID3D12DeviceRemovedExtendedData2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12DeviceRemovedExtendedData2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12DeviceRemovedExtendedData2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12DeviceRemovedExtendedData2_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12DeviceRemovedExtendedData methods ***/
#define ID3D12DeviceRemovedExtendedData2_GetAutoBreadcrumbsOutput(This,output) (This)->lpVtbl->GetAutoBreadcrumbsOutput(This,output)
#define ID3D12DeviceRemovedExtendedData2_GetPageFaultAllocationOutput(This,output) (This)->lpVtbl->GetPageFaultAllocationOutput(This,output)
/*** ID3D12DeviceRemovedExtendedData1 methods ***/
#define ID3D12DeviceRemovedExtendedData2_GetAutoBreadcrumbsOutput1(This,output) (This)->lpVtbl->GetAutoBreadcrumbsOutput1(This,output)
#define ID3D12DeviceRemovedExtendedData2_GetPageFaultAllocationOutput1(This,output) (This)->lpVtbl->GetPageFaultAllocationOutput1(This,output)
/*** ID3D12DeviceRemovedExtendedData2 methods ***/
#define ID3D12DeviceRemovedExtendedData2_GetPageFaultAllocationOutput2(This,output) (This)->lpVtbl->GetPageFaultAllocationOutput2(This,output)
#define ID3D12DeviceRemovedExtendedData2_GetDeviceState(This) (This)->lpVtbl->GetDeviceState(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData2_QueryInterface(ID3D12DeviceRemovedExtendedData2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedData2_AddRef(ID3D12DeviceRemovedExtendedData2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12DeviceRemovedExtendedData2_Release(ID3D12DeviceRemovedExtendedData2* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12DeviceRemovedExtendedData methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData2_GetAutoBreadcrumbsOutput(ID3D12DeviceRemovedExtendedData2* This,D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT *output) {
    return This->lpVtbl->GetAutoBreadcrumbsOutput(This,output);
}
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData2_GetPageFaultAllocationOutput(ID3D12DeviceRemovedExtendedData2* This,D3D12_DRED_PAGE_FAULT_OUTPUT *output) {
    return This->lpVtbl->GetPageFaultAllocationOutput(This,output);
}
/*** ID3D12DeviceRemovedExtendedData1 methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData2_GetAutoBreadcrumbsOutput1(ID3D12DeviceRemovedExtendedData2* This,D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT1 *output) {
    return This->lpVtbl->GetAutoBreadcrumbsOutput1(This,output);
}
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData2_GetPageFaultAllocationOutput1(ID3D12DeviceRemovedExtendedData2* This,D3D12_DRED_PAGE_FAULT_OUTPUT1 *output) {
    return This->lpVtbl->GetPageFaultAllocationOutput1(This,output);
}
/*** ID3D12DeviceRemovedExtendedData2 methods ***/
static __WIDL_INLINE HRESULT ID3D12DeviceRemovedExtendedData2_GetPageFaultAllocationOutput2(ID3D12DeviceRemovedExtendedData2* This,D3D12_DRED_PAGE_FAULT_OUTPUT2 *output) {
    return This->lpVtbl->GetPageFaultAllocationOutput2(This,output);
}
static __WIDL_INLINE D3D12_DRED_DEVICE_STATE ID3D12DeviceRemovedExtendedData2_GetDeviceState(ID3D12DeviceRemovedExtendedData2* This) {
    return This->lpVtbl->GetDeviceState(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12DeviceRemovedExtendedData2_INTERFACE_DEFINED__ */

typedef enum D3D12_BACKGROUND_PROCESSING_MODE {
    D3D12_BACKGROUND_PROCESSING_MODE_ALLOWED = 0x0,
    D3D12_BACKGROUND_PROCESSING_MODE_ALLOW_INTRUSIVE_MEASUREMENTS = 0x1,
    D3D12_BACKGROUND_PROCESSING_MODE_DISABLE_BACKGROUND_WORK = 0x2,
    D3D12_BACKGROUND_PROCESSING_MODE_DISABLE_PROFILING_BY_SYSTEM = 0x3
} D3D12_BACKGROUND_PROCESSING_MODE;
typedef enum D3D12_MEASUREMENTS_ACTION {
    D3D12_MEASUREMENTS_ACTION_KEEP_ALL = 0x0,
    D3D12_MEASUREMENTS_ACTION_COMMIT_RESULTS = 0x1,
    D3D12_MEASUREMENTS_ACTION_COMMIT_RESULTS_HIGH_PRIORITY = 0x2,
    D3D12_MEASUREMENTS_ACTION_DISCARD_PREVIOUS = 0x3
} D3D12_MEASUREMENTS_ACTION;
/*****************************************************************************
 * ID3D12Device6 interface
 */
#ifndef __ID3D12Device6_INTERFACE_DEFINED__
#define __ID3D12Device6_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device6, 0xc70b221b, 0x40e4, 0x4a17, 0x89,0xaf, 0x02,0x5a,0x07,0x27,0xa6,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c70b221b-40e4-4a17-89af-025a0727a6dc")
ID3D12Device6 : public ID3D12Device5
{
    virtual HRESULT STDMETHODCALLTYPE SetBackgroundProcessingMode(
        D3D12_BACKGROUND_PROCESSING_MODE mode,
        D3D12_MEASUREMENTS_ACTION action,
        HANDLE event,
        WINBOOL *further_measurements_desired) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device6, 0xc70b221b, 0x40e4, 0x4a17, 0x89,0xaf, 0x02,0x5a,0x07,0x27,0xa6,0xdc)
#endif
#else
typedef struct ID3D12Device6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device6 *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)(
        ID3D12Device6 *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)(
        ID3D12Device6 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device6 *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)(
        ID3D12Device6 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device6 *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)(
        ID3D12Device6 *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)(
        ID3D12Device6 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device6 *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)(
        ID3D12Device6 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device6 *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)(
        ID3D12Device6 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device6 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device6 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device6 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device6 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device6 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device6 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device6 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device6 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device6 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device6 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    /*** ID3D12Device5 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLifetimeTracker)(
        ID3D12Device6 *This,
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker);

    void (STDMETHODCALLTYPE *RemoveDevice)(
        ID3D12Device6 *This);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommands)(
        ID3D12Device6 *This,
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommandParameters)(
        ID3D12Device6 *This,
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs);

    HRESULT (STDMETHODCALLTYPE *CreateMetaCommand)(
        ID3D12Device6 *This,
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command);

    HRESULT (STDMETHODCALLTYPE *CreateStateObject)(
        ID3D12Device6 *This,
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object);

    void (STDMETHODCALLTYPE *GetRaytracingAccelerationStructurePrebuildInfo)(
        ID3D12Device6 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info);

    D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS (STDMETHODCALLTYPE *CheckDriverMatchingIdentifier)(
        ID3D12Device6 *This,
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check);

    /*** ID3D12Device6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBackgroundProcessingMode)(
        ID3D12Device6 *This,
        D3D12_BACKGROUND_PROCESSING_MODE mode,
        D3D12_MEASUREMENTS_ACTION action,
        HANDLE event,
        WINBOOL *further_measurements_desired);

    END_INTERFACE
} ID3D12Device6Vtbl;

interface ID3D12Device6 {
    CONST_VTBL ID3D12Device6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device6_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device6_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device6_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device6_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device6_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device6_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device6_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device6_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device6_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device6_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device6_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 ID3D12Device6_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device6_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device6_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device6_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device6_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device6_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device6_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device6_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device6_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device6_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device6_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 ID3D12Device6_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 ID3D12Device6_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device6_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device6_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device6_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device6_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 ID3D12Device6_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device6_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 ID3D12Device6_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device6_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device6_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device6_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device6_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device6_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device6_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device6_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device6_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 ID3D12Device6_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device6_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device6_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device6_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 ID3D12Device6_GetAdapterLuid(This) ID3D12Device6_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device6_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device6_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device6_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device6_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device6_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device6_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device6_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device6_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device6_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device6_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device6_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device6_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device6_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device6_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device5 methods ***/
#define ID3D12Device6_CreateLifetimeTracker(This,owner,riid,tracker) (This)->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker)
#define ID3D12Device6_RemoveDevice(This) (This)->lpVtbl->RemoveDevice(This)
#define ID3D12Device6_EnumerateMetaCommands(This,meta_commands_count,descs) (This)->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs)
#define ID3D12Device6_EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs) (This)->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs)
#define ID3D12Device6_CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command) (This)->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command)
#define ID3D12Device6_CreateStateObject(This,desc,riid,state_object) (This)->lpVtbl->CreateStateObject(This,desc,riid,state_object)
#define ID3D12Device6_GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info) (This)->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info)
#define ID3D12Device6_CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check) (This)->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check)
/*** ID3D12Device6 methods ***/
#define ID3D12Device6_SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired) (This)->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_QueryInterface(ID3D12Device6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device6_AddRef(ID3D12Device6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device6_Release(ID3D12Device6* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_GetPrivateData(ID3D12Device6* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device6_SetPrivateData(ID3D12Device6* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device6_SetPrivateDataInterface(ID3D12Device6* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device6_SetName(ID3D12Device6* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device6_GetNodeCount(ID3D12Device6* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommandQueue(ID3D12Device6* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommandAllocator(ID3D12Device6* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateGraphicsPipelineState(ID3D12Device6* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateComputePipelineState(ID3D12Device6* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommandList(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_CheckFeatureSupport(ID3D12Device6* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateDescriptorHeap(ID3D12Device6* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device6_GetDescriptorHandleIncrementSize(ID3D12Device6* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateRootSignature(ID3D12Device6* 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 __WIDL_INLINE void ID3D12Device6_CreateConstantBufferView(ID3D12Device6* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device6_CreateShaderResourceView(ID3D12Device6* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device6_CreateUnorderedAccessView(ID3D12Device6* 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 __WIDL_INLINE void ID3D12Device6_CreateRenderTargetView(ID3D12Device6* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device6_CreateDepthStencilView(ID3D12Device6* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device6_CreateSampler(ID3D12Device6* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device6_CopyDescriptors(ID3D12Device6* 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 __WIDL_INLINE void ID3D12Device6_CopyDescriptorsSimple(ID3D12Device6* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device6_GetResourceAllocationInfo(ID3D12Device6* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device6_GetCustomHeapProperties(ID3D12Device6* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommittedResource(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_CreateHeap(ID3D12Device6* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreatePlacedResource(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_CreateReservedResource(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_CreateSharedHandle(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_OpenSharedHandle(ID3D12Device6* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device6_OpenSharedHandleByName(ID3D12Device6* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device6_MakeResident(ID3D12Device6* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device6_Evict(ID3D12Device6* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateFence(ID3D12Device6* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device6_GetDeviceRemovedReason(ID3D12Device6* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device6_GetCopyableFootprints(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_CreateQueryHeap(ID3D12Device6* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device6_SetStablePowerState(ID3D12Device6* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommandSignature(ID3D12Device6* 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 __WIDL_INLINE void ID3D12Device6_GetResourceTiling(ID3D12Device6* 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 __WIDL_INLINE LUID ID3D12Device6_GetAdapterLuid(ID3D12Device6* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_CreatePipelineLibrary(ID3D12Device6* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device6_SetEventOnMultipleFenceCompletion(ID3D12Device6* 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 __WIDL_INLINE HRESULT ID3D12Device6_SetResidencyPriority(ID3D12Device6* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_CreatePipelineState(ID3D12Device6* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_OpenExistingHeapFromAddress(ID3D12Device6* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device6_OpenExistingHeapFromFileMapping(ID3D12Device6* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device6_EnqueueMakeResident(ID3D12Device6* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommandList1(ID3D12Device6* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateProtectedResourceSession(ID3D12Device6* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateCommittedResource1(ID3D12Device6* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateHeap1(ID3D12Device6* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateReservedResource1(ID3D12Device6* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device6_GetResourceAllocationInfo1(ID3D12Device6* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
/*** ID3D12Device5 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_CreateLifetimeTracker(ID3D12Device6* This,ID3D12LifetimeOwner *owner,REFIID riid,void **tracker) {
    return This->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker);
}
static __WIDL_INLINE void ID3D12Device6_RemoveDevice(ID3D12Device6* This) {
    This->lpVtbl->RemoveDevice(This);
}
static __WIDL_INLINE HRESULT ID3D12Device6_EnumerateMetaCommands(ID3D12Device6* This,UINT *meta_commands_count,D3D12_META_COMMAND_DESC *descs) {
    return This->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs);
}
static __WIDL_INLINE HRESULT ID3D12Device6_EnumerateMetaCommandParameters(ID3D12Device6* This,REFGUID command_id,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT *total_structure_size_in_bytes,UINT *parameter_count,D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) {
    return This->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateMetaCommand(ID3D12Device6* This,REFGUID command_id,UINT node_mask,const void *creation_parameters_data,SIZE_T creation_parameters_data_size_in_bytes,REFIID riid,void **meta_command) {
    return This->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command);
}
static __WIDL_INLINE HRESULT ID3D12Device6_CreateStateObject(ID3D12Device6* This,const D3D12_STATE_OBJECT_DESC *desc,REFIID riid,void **state_object) {
    return This->lpVtbl->CreateStateObject(This,desc,riid,state_object);
}
static __WIDL_INLINE void ID3D12Device6_GetRaytracingAccelerationStructurePrebuildInfo(ID3D12Device6* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) {
    This->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info);
}
static __WIDL_INLINE D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS ID3D12Device6_CheckDriverMatchingIdentifier(ID3D12Device6* This,D3D12_SERIALIZED_DATA_TYPE serialized_data_type,const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) {
    return This->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check);
}
/*** ID3D12Device6 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device6_SetBackgroundProcessingMode(ID3D12Device6* This,D3D12_BACKGROUND_PROCESSING_MODE mode,D3D12_MEASUREMENTS_ACTION action,HANDLE event,WINBOOL *further_measurements_desired) {
    return This->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device6_INTERFACE_DEFINED__ */

DEFINE_GUID(D3D12_PROTECTED_RESOURCES_SESSION_HARDWARE_PROTECTED, 0x62b0084e, 0xc70e, 0x4daa, 0xa1, 0x09, 0x30, 0xff, 0x8d, 0x5a, 0x04, 0x82);
typedef struct D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPE_COUNT {
    UINT NodeIndex;
    UINT Count;
} D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPE_COUNT;
typedef struct D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES {
    UINT NodeIndex;
    UINT Count;
    GUID *pTypes;
} D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES;
typedef struct D3D12_PROTECTED_RESOURCE_SESSION_DESC1 {
    UINT NodeMask;
    D3D12_PROTECTED_RESOURCE_SESSION_FLAGS Flags;
    GUID ProtectionType;
} D3D12_PROTECTED_RESOURCE_SESSION_DESC1;
/*****************************************************************************
 * ID3D12ProtectedResourceSession1 interface
 */
#ifndef __ID3D12ProtectedResourceSession1_INTERFACE_DEFINED__
#define __ID3D12ProtectedResourceSession1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ProtectedResourceSession1, 0xd6f12dd6, 0x76fb, 0x406e, 0x89,0x61, 0x42,0x96,0xee,0xfc,0x04,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d6f12dd6-76fb-406e-8961-4296eefc0409")
ID3D12ProtectedResourceSession1 : public ID3D12ProtectedResourceSession
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_PROTECTED_RESOURCE_SESSION_DESC1* STDMETHODCALLTYPE GetDesc1(
        D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *__ret) = 0;
    D3D12_PROTECTED_RESOURCE_SESSION_DESC1 STDMETHODCALLTYPE GetDesc1(
        )
    {
        D3D12_PROTECTED_RESOURCE_SESSION_DESC1 __ret;
        return *GetDesc1(&__ret);
    }
#else
    virtual D3D12_PROTECTED_RESOURCE_SESSION_DESC1 STDMETHODCALLTYPE GetDesc1(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ProtectedResourceSession1, 0xd6f12dd6, 0x76fb, 0x406e, 0x89,0x61, 0x42,0x96,0xee,0xfc,0x04,0x09)
#endif
#else
typedef struct ID3D12ProtectedResourceSession1Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12ProtectedSession methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatusFence)(
        ID3D12ProtectedResourceSession1 *This,
        REFIID riid,
        void **fence);

    D3D12_PROTECTED_SESSION_STATUS (STDMETHODCALLTYPE *GetSessionStatus)(
        ID3D12ProtectedResourceSession1 *This);

    /*** ID3D12ProtectedResourceSession methods ***/
    D3D12_PROTECTED_RESOURCE_SESSION_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ProtectedResourceSession1 *This,
        D3D12_PROTECTED_RESOURCE_SESSION_DESC *__ret);

    /*** ID3D12ProtectedResourceSession1 methods ***/
    D3D12_PROTECTED_RESOURCE_SESSION_DESC1 * (STDMETHODCALLTYPE *GetDesc1)(
        ID3D12ProtectedResourceSession1 *This,
        D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *__ret);

    END_INTERFACE
} ID3D12ProtectedResourceSession1Vtbl;

interface ID3D12ProtectedResourceSession1 {
    CONST_VTBL ID3D12ProtectedResourceSession1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12ProtectedResourceSession1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12ProtectedResourceSession1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12ProtectedResourceSession1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12ProtectedResourceSession1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12ProtectedResourceSession1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12ProtectedResourceSession1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12ProtectedResourceSession1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12ProtectedResourceSession1_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12ProtectedSession methods ***/
#define ID3D12ProtectedResourceSession1_GetStatusFence(This,riid,fence) (This)->lpVtbl->GetStatusFence(This,riid,fence)
#define ID3D12ProtectedResourceSession1_GetSessionStatus(This) (This)->lpVtbl->GetSessionStatus(This)
/*** ID3D12ProtectedResourceSession methods ***/
#define ID3D12ProtectedResourceSession1_GetDesc(This) ID3D12ProtectedResourceSession1_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12ProtectedResourceSession1 methods ***/
#define ID3D12ProtectedResourceSession1_GetDesc1(This) ID3D12ProtectedResourceSession1_GetDesc1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_QueryInterface(ID3D12ProtectedResourceSession1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12ProtectedResourceSession1_AddRef(ID3D12ProtectedResourceSession1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12ProtectedResourceSession1_Release(ID3D12ProtectedResourceSession1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_GetPrivateData(ID3D12ProtectedResourceSession1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_SetPrivateData(ID3D12ProtectedResourceSession1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_SetPrivateDataInterface(ID3D12ProtectedResourceSession1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_SetName(ID3D12ProtectedResourceSession1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_GetDevice(ID3D12ProtectedResourceSession1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12ProtectedSession methods ***/
static __WIDL_INLINE HRESULT ID3D12ProtectedResourceSession1_GetStatusFence(ID3D12ProtectedResourceSession1* This,REFIID riid,void **fence) {
    return This->lpVtbl->GetStatusFence(This,riid,fence);
}
static __WIDL_INLINE D3D12_PROTECTED_SESSION_STATUS ID3D12ProtectedResourceSession1_GetSessionStatus(ID3D12ProtectedResourceSession1* This) {
    return This->lpVtbl->GetSessionStatus(This);
}
/*** ID3D12ProtectedResourceSession methods ***/
static __WIDL_INLINE D3D12_PROTECTED_RESOURCE_SESSION_DESC ID3D12ProtectedResourceSession1_GetDesc(ID3D12ProtectedResourceSession1* This) {
    D3D12_PROTECTED_RESOURCE_SESSION_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
/*** ID3D12ProtectedResourceSession1 methods ***/
static __WIDL_INLINE D3D12_PROTECTED_RESOURCE_SESSION_DESC1 ID3D12ProtectedResourceSession1_GetDesc1(ID3D12ProtectedResourceSession1* This) {
    D3D12_PROTECTED_RESOURCE_SESSION_DESC1 __ret;
    return *This->lpVtbl->GetDesc1(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12ProtectedResourceSession1_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Device7 interface
 */
#ifndef __ID3D12Device7_INTERFACE_DEFINED__
#define __ID3D12Device7_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device7, 0x5c014b53, 0x68a1, 0x4b9b, 0x8b,0xd1, 0xdd,0x60,0x46,0xb9,0x35,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5c014b53-68a1-4b9b-8bd1-dd6046b9358b")
ID3D12Device7 : public ID3D12Device6
{
    virtual HRESULT STDMETHODCALLTYPE AddToStateObject(
        const D3D12_STATE_OBJECT_DESC *addition,
        ID3D12StateObject *state_object_to_grow_from,
        REFIID riid,
        void **new_state_object) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateProtectedResourceSession1(
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,
        REFIID riid,
        void **session) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device7, 0x5c014b53, 0x68a1, 0x4b9b, 0x8b,0xd1, 0xdd,0x60,0x46,0xb9,0x35,0x8b)
#endif
#else
typedef struct ID3D12Device7Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device7 *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)(
        ID3D12Device7 *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)(
        ID3D12Device7 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device7 *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)(
        ID3D12Device7 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device7 *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)(
        ID3D12Device7 *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)(
        ID3D12Device7 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device7 *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)(
        ID3D12Device7 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device7 *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)(
        ID3D12Device7 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device7 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device7 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device7 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device7 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device7 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device7 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device7 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device7 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device7 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device7 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    /*** ID3D12Device5 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLifetimeTracker)(
        ID3D12Device7 *This,
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker);

    void (STDMETHODCALLTYPE *RemoveDevice)(
        ID3D12Device7 *This);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommands)(
        ID3D12Device7 *This,
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommandParameters)(
        ID3D12Device7 *This,
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs);

    HRESULT (STDMETHODCALLTYPE *CreateMetaCommand)(
        ID3D12Device7 *This,
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command);

    HRESULT (STDMETHODCALLTYPE *CreateStateObject)(
        ID3D12Device7 *This,
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object);

    void (STDMETHODCALLTYPE *GetRaytracingAccelerationStructurePrebuildInfo)(
        ID3D12Device7 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info);

    D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS (STDMETHODCALLTYPE *CheckDriverMatchingIdentifier)(
        ID3D12Device7 *This,
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check);

    /*** ID3D12Device6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBackgroundProcessingMode)(
        ID3D12Device7 *This,
        D3D12_BACKGROUND_PROCESSING_MODE mode,
        D3D12_MEASUREMENTS_ACTION action,
        HANDLE event,
        WINBOOL *further_measurements_desired);

    /*** ID3D12Device7 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToStateObject)(
        ID3D12Device7 *This,
        const D3D12_STATE_OBJECT_DESC *addition,
        ID3D12StateObject *state_object_to_grow_from,
        REFIID riid,
        void **new_state_object);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession1)(
        ID3D12Device7 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,
        REFIID riid,
        void **session);

    END_INTERFACE
} ID3D12Device7Vtbl;

interface ID3D12Device7 {
    CONST_VTBL ID3D12Device7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device7_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device7_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device7_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device7_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device7_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device7_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device7_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device7_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device7_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device7_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device7_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 ID3D12Device7_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device7_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device7_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device7_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device7_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device7_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device7_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device7_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device7_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device7_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device7_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 ID3D12Device7_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 ID3D12Device7_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device7_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device7_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device7_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device7_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 ID3D12Device7_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device7_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 ID3D12Device7_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device7_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device7_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device7_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device7_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device7_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device7_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device7_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device7_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 ID3D12Device7_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device7_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device7_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device7_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 ID3D12Device7_GetAdapterLuid(This) ID3D12Device7_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device7_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device7_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device7_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device7_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device7_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device7_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device7_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device7_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device7_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device7_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device7_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device7_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device7_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device7_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device5 methods ***/
#define ID3D12Device7_CreateLifetimeTracker(This,owner,riid,tracker) (This)->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker)
#define ID3D12Device7_RemoveDevice(This) (This)->lpVtbl->RemoveDevice(This)
#define ID3D12Device7_EnumerateMetaCommands(This,meta_commands_count,descs) (This)->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs)
#define ID3D12Device7_EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs) (This)->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs)
#define ID3D12Device7_CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command) (This)->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command)
#define ID3D12Device7_CreateStateObject(This,desc,riid,state_object) (This)->lpVtbl->CreateStateObject(This,desc,riid,state_object)
#define ID3D12Device7_GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info) (This)->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info)
#define ID3D12Device7_CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check) (This)->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check)
/*** ID3D12Device6 methods ***/
#define ID3D12Device7_SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired) (This)->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired)
/*** ID3D12Device7 methods ***/
#define ID3D12Device7_AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object) (This)->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object)
#define ID3D12Device7_CreateProtectedResourceSession1(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_QueryInterface(ID3D12Device7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device7_AddRef(ID3D12Device7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device7_Release(ID3D12Device7* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_GetPrivateData(ID3D12Device7* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device7_SetPrivateData(ID3D12Device7* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device7_SetPrivateDataInterface(ID3D12Device7* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device7_SetName(ID3D12Device7* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device7_GetNodeCount(ID3D12Device7* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommandQueue(ID3D12Device7* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommandAllocator(ID3D12Device7* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateGraphicsPipelineState(ID3D12Device7* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateComputePipelineState(ID3D12Device7* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommandList(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_CheckFeatureSupport(ID3D12Device7* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateDescriptorHeap(ID3D12Device7* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device7_GetDescriptorHandleIncrementSize(ID3D12Device7* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateRootSignature(ID3D12Device7* 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 __WIDL_INLINE void ID3D12Device7_CreateConstantBufferView(ID3D12Device7* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device7_CreateShaderResourceView(ID3D12Device7* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device7_CreateUnorderedAccessView(ID3D12Device7* 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 __WIDL_INLINE void ID3D12Device7_CreateRenderTargetView(ID3D12Device7* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device7_CreateDepthStencilView(ID3D12Device7* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device7_CreateSampler(ID3D12Device7* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device7_CopyDescriptors(ID3D12Device7* 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 __WIDL_INLINE void ID3D12Device7_CopyDescriptorsSimple(ID3D12Device7* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device7_GetResourceAllocationInfo(ID3D12Device7* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device7_GetCustomHeapProperties(ID3D12Device7* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommittedResource(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_CreateHeap(ID3D12Device7* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreatePlacedResource(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_CreateReservedResource(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_CreateSharedHandle(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_OpenSharedHandle(ID3D12Device7* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device7_OpenSharedHandleByName(ID3D12Device7* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device7_MakeResident(ID3D12Device7* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device7_Evict(ID3D12Device7* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateFence(ID3D12Device7* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device7_GetDeviceRemovedReason(ID3D12Device7* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device7_GetCopyableFootprints(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_CreateQueryHeap(ID3D12Device7* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device7_SetStablePowerState(ID3D12Device7* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommandSignature(ID3D12Device7* 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 __WIDL_INLINE void ID3D12Device7_GetResourceTiling(ID3D12Device7* 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 __WIDL_INLINE LUID ID3D12Device7_GetAdapterLuid(ID3D12Device7* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_CreatePipelineLibrary(ID3D12Device7* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device7_SetEventOnMultipleFenceCompletion(ID3D12Device7* 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 __WIDL_INLINE HRESULT ID3D12Device7_SetResidencyPriority(ID3D12Device7* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_CreatePipelineState(ID3D12Device7* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_OpenExistingHeapFromAddress(ID3D12Device7* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device7_OpenExistingHeapFromFileMapping(ID3D12Device7* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device7_EnqueueMakeResident(ID3D12Device7* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommandList1(ID3D12Device7* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateProtectedResourceSession(ID3D12Device7* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateCommittedResource1(ID3D12Device7* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateHeap1(ID3D12Device7* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateReservedResource1(ID3D12Device7* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device7_GetResourceAllocationInfo1(ID3D12Device7* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
/*** ID3D12Device5 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_CreateLifetimeTracker(ID3D12Device7* This,ID3D12LifetimeOwner *owner,REFIID riid,void **tracker) {
    return This->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker);
}
static __WIDL_INLINE void ID3D12Device7_RemoveDevice(ID3D12Device7* This) {
    This->lpVtbl->RemoveDevice(This);
}
static __WIDL_INLINE HRESULT ID3D12Device7_EnumerateMetaCommands(ID3D12Device7* This,UINT *meta_commands_count,D3D12_META_COMMAND_DESC *descs) {
    return This->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs);
}
static __WIDL_INLINE HRESULT ID3D12Device7_EnumerateMetaCommandParameters(ID3D12Device7* This,REFGUID command_id,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT *total_structure_size_in_bytes,UINT *parameter_count,D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) {
    return This->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateMetaCommand(ID3D12Device7* This,REFGUID command_id,UINT node_mask,const void *creation_parameters_data,SIZE_T creation_parameters_data_size_in_bytes,REFIID riid,void **meta_command) {
    return This->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateStateObject(ID3D12Device7* This,const D3D12_STATE_OBJECT_DESC *desc,REFIID riid,void **state_object) {
    return This->lpVtbl->CreateStateObject(This,desc,riid,state_object);
}
static __WIDL_INLINE void ID3D12Device7_GetRaytracingAccelerationStructurePrebuildInfo(ID3D12Device7* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) {
    This->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info);
}
static __WIDL_INLINE D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS ID3D12Device7_CheckDriverMatchingIdentifier(ID3D12Device7* This,D3D12_SERIALIZED_DATA_TYPE serialized_data_type,const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) {
    return This->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check);
}
/*** ID3D12Device6 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_SetBackgroundProcessingMode(ID3D12Device7* This,D3D12_BACKGROUND_PROCESSING_MODE mode,D3D12_MEASUREMENTS_ACTION action,HANDLE event,WINBOOL *further_measurements_desired) {
    return This->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired);
}
/*** ID3D12Device7 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device7_AddToStateObject(ID3D12Device7* This,const D3D12_STATE_OBJECT_DESC *addition,ID3D12StateObject *state_object_to_grow_from,REFIID riid,void **new_state_object) {
    return This->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object);
}
static __WIDL_INLINE HRESULT ID3D12Device7_CreateProtectedResourceSession1(ID3D12Device7* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device7_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Device8 interface
 */
#ifndef __ID3D12Device8_INTERFACE_DEFINED__
#define __ID3D12Device8_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device8, 0x9218e6bb, 0xf944, 0x4f7e, 0xa7,0x5c, 0xb1,0xb2,0xc7,0xb7,0x01,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9218e6bb-f944-4f7e-a75c-b1b2c7b701f3")
ID3D12Device8 : public ID3D12Device7
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_RESOURCE_ALLOCATION_INFO* STDMETHODCALLTYPE GetResourceAllocationInfo2(
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC1 *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) = 0;
    D3D12_RESOURCE_ALLOCATION_INFO STDMETHODCALLTYPE GetResourceAllocationInfo2(
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC1 *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1)
    {
        D3D12_RESOURCE_ALLOCATION_INFO __ret;
        return *GetResourceAllocationInfo2(&__ret, visible_mask, resource_descs_count, resource_descs, resource_allocation_info1);
    }
#else
    virtual D3D12_RESOURCE_ALLOCATION_INFO STDMETHODCALLTYPE GetResourceAllocationInfo2(
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC1 *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) = 0;
#endif

    virtual HRESULT STDMETHODCALLTYPE CreateCommittedResource2(
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource) = 0;

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

    virtual void STDMETHODCALLTYPE CreateSamplerFeedbackUnorderedAccessView(
        ID3D12Resource *targeted_resource,
        ID3D12Resource *feedback_resource,
        D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor) = 0;

    virtual void STDMETHODCALLTYPE GetCopyableFootprints1(
        const D3D12_RESOURCE_DESC1 *resource_desc,
        UINT first_subresource,
        UINT subresources_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *rows_count,
        UINT64 *row_size_in_bytes,
        UINT64 *total_bytes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device8, 0x9218e6bb, 0xf944, 0x4f7e, 0xa7,0x5c, 0xb1,0xb2,0xc7,0xb7,0x01,0xf3)
#endif
#else
typedef struct ID3D12Device8Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device8 *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)(
        ID3D12Device8 *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)(
        ID3D12Device8 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device8 *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)(
        ID3D12Device8 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device8 *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)(
        ID3D12Device8 *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)(
        ID3D12Device8 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device8 *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)(
        ID3D12Device8 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device8 *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)(
        ID3D12Device8 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device8 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device8 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device8 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device8 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device8 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device8 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device8 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device8 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device8 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device8 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    /*** ID3D12Device5 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLifetimeTracker)(
        ID3D12Device8 *This,
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker);

    void (STDMETHODCALLTYPE *RemoveDevice)(
        ID3D12Device8 *This);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommands)(
        ID3D12Device8 *This,
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommandParameters)(
        ID3D12Device8 *This,
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs);

    HRESULT (STDMETHODCALLTYPE *CreateMetaCommand)(
        ID3D12Device8 *This,
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command);

    HRESULT (STDMETHODCALLTYPE *CreateStateObject)(
        ID3D12Device8 *This,
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object);

    void (STDMETHODCALLTYPE *GetRaytracingAccelerationStructurePrebuildInfo)(
        ID3D12Device8 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info);

    D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS (STDMETHODCALLTYPE *CheckDriverMatchingIdentifier)(
        ID3D12Device8 *This,
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check);

    /*** ID3D12Device6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBackgroundProcessingMode)(
        ID3D12Device8 *This,
        D3D12_BACKGROUND_PROCESSING_MODE mode,
        D3D12_MEASUREMENTS_ACTION action,
        HANDLE event,
        WINBOOL *further_measurements_desired);

    /*** ID3D12Device7 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToStateObject)(
        ID3D12Device8 *This,
        const D3D12_STATE_OBJECT_DESC *addition,
        ID3D12StateObject *state_object_to_grow_from,
        REFIID riid,
        void **new_state_object);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession1)(
        ID3D12Device8 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,
        REFIID riid,
        void **session);

    /*** ID3D12Device8 methods ***/
    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo2)(
        ID3D12Device8 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC1 *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource2)(
        ID3D12Device8 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource1)(
        ID3D12Device8 *This,
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    void (STDMETHODCALLTYPE *CreateSamplerFeedbackUnorderedAccessView)(
        ID3D12Device8 *This,
        ID3D12Resource *targeted_resource,
        ID3D12Resource *feedback_resource,
        D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor);

    void (STDMETHODCALLTYPE *GetCopyableFootprints1)(
        ID3D12Device8 *This,
        const D3D12_RESOURCE_DESC1 *resource_desc,
        UINT first_subresource,
        UINT subresources_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *rows_count,
        UINT64 *row_size_in_bytes,
        UINT64 *total_bytes);

    END_INTERFACE
} ID3D12Device8Vtbl;

interface ID3D12Device8 {
    CONST_VTBL ID3D12Device8Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device8_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device8_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device8_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device8_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device8_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device8_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device8_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device8_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device8_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device8_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device8_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device8_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device8_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 ID3D12Device8_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device8_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device8_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device8_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device8_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device8_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device8_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device8_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device8_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device8_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device8_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 ID3D12Device8_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 ID3D12Device8_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device8_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device8_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device8_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device8_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 ID3D12Device8_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device8_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 ID3D12Device8_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device8_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device8_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device8_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device8_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device8_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device8_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device8_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device8_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 ID3D12Device8_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device8_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device8_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device8_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 ID3D12Device8_GetAdapterLuid(This) ID3D12Device8_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device8_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device8_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device8_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device8_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device8_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device8_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device8_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device8_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device8_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device8_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device8_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device8_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device8_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device8_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device5 methods ***/
#define ID3D12Device8_CreateLifetimeTracker(This,owner,riid,tracker) (This)->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker)
#define ID3D12Device8_RemoveDevice(This) (This)->lpVtbl->RemoveDevice(This)
#define ID3D12Device8_EnumerateMetaCommands(This,meta_commands_count,descs) (This)->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs)
#define ID3D12Device8_EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs) (This)->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs)
#define ID3D12Device8_CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command) (This)->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command)
#define ID3D12Device8_CreateStateObject(This,desc,riid,state_object) (This)->lpVtbl->CreateStateObject(This,desc,riid,state_object)
#define ID3D12Device8_GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info) (This)->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info)
#define ID3D12Device8_CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check) (This)->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check)
/*** ID3D12Device6 methods ***/
#define ID3D12Device8_SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired) (This)->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired)
/*** ID3D12Device7 methods ***/
#define ID3D12Device8_AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object) (This)->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object)
#define ID3D12Device8_CreateProtectedResourceSession1(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session)
/*** ID3D12Device8 methods ***/
#define ID3D12Device8_GetResourceAllocationInfo2(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device8_GetResourceAllocationInfo2_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device8_CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device8_CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device8_CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor) (This)->lpVtbl->CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor)
#define ID3D12Device8_GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes) (This)->lpVtbl->GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_QueryInterface(ID3D12Device8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device8_AddRef(ID3D12Device8* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device8_Release(ID3D12Device8* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_GetPrivateData(ID3D12Device8* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device8_SetPrivateData(ID3D12Device8* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device8_SetPrivateDataInterface(ID3D12Device8* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device8_SetName(ID3D12Device8* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device8_GetNodeCount(ID3D12Device8* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommandQueue(ID3D12Device8* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommandAllocator(ID3D12Device8* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateGraphicsPipelineState(ID3D12Device8* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateComputePipelineState(ID3D12Device8* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommandList(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_CheckFeatureSupport(ID3D12Device8* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateDescriptorHeap(ID3D12Device8* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device8_GetDescriptorHandleIncrementSize(ID3D12Device8* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateRootSignature(ID3D12Device8* 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 __WIDL_INLINE void ID3D12Device8_CreateConstantBufferView(ID3D12Device8* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device8_CreateShaderResourceView(ID3D12Device8* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device8_CreateUnorderedAccessView(ID3D12Device8* 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 __WIDL_INLINE void ID3D12Device8_CreateRenderTargetView(ID3D12Device8* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device8_CreateDepthStencilView(ID3D12Device8* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device8_CreateSampler(ID3D12Device8* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device8_CopyDescriptors(ID3D12Device8* 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 __WIDL_INLINE void ID3D12Device8_CopyDescriptorsSimple(ID3D12Device8* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device8_GetResourceAllocationInfo(ID3D12Device8* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device8_GetCustomHeapProperties(ID3D12Device8* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommittedResource(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_CreateHeap(ID3D12Device8* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreatePlacedResource(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_CreateReservedResource(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_CreateSharedHandle(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_OpenSharedHandle(ID3D12Device8* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device8_OpenSharedHandleByName(ID3D12Device8* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device8_MakeResident(ID3D12Device8* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device8_Evict(ID3D12Device8* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateFence(ID3D12Device8* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device8_GetDeviceRemovedReason(ID3D12Device8* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device8_GetCopyableFootprints(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_CreateQueryHeap(ID3D12Device8* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device8_SetStablePowerState(ID3D12Device8* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommandSignature(ID3D12Device8* 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 __WIDL_INLINE void ID3D12Device8_GetResourceTiling(ID3D12Device8* 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 __WIDL_INLINE LUID ID3D12Device8_GetAdapterLuid(ID3D12Device8* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_CreatePipelineLibrary(ID3D12Device8* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device8_SetEventOnMultipleFenceCompletion(ID3D12Device8* 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 __WIDL_INLINE HRESULT ID3D12Device8_SetResidencyPriority(ID3D12Device8* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_CreatePipelineState(ID3D12Device8* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_OpenExistingHeapFromAddress(ID3D12Device8* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device8_OpenExistingHeapFromFileMapping(ID3D12Device8* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device8_EnqueueMakeResident(ID3D12Device8* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommandList1(ID3D12Device8* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateProtectedResourceSession(ID3D12Device8* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommittedResource1(ID3D12Device8* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateHeap1(ID3D12Device8* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateReservedResource1(ID3D12Device8* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device8_GetResourceAllocationInfo1(ID3D12Device8* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
/*** ID3D12Device5 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_CreateLifetimeTracker(ID3D12Device8* This,ID3D12LifetimeOwner *owner,REFIID riid,void **tracker) {
    return This->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker);
}
static __WIDL_INLINE void ID3D12Device8_RemoveDevice(ID3D12Device8* This) {
    This->lpVtbl->RemoveDevice(This);
}
static __WIDL_INLINE HRESULT ID3D12Device8_EnumerateMetaCommands(ID3D12Device8* This,UINT *meta_commands_count,D3D12_META_COMMAND_DESC *descs) {
    return This->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs);
}
static __WIDL_INLINE HRESULT ID3D12Device8_EnumerateMetaCommandParameters(ID3D12Device8* This,REFGUID command_id,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT *total_structure_size_in_bytes,UINT *parameter_count,D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) {
    return This->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateMetaCommand(ID3D12Device8* This,REFGUID command_id,UINT node_mask,const void *creation_parameters_data,SIZE_T creation_parameters_data_size_in_bytes,REFIID riid,void **meta_command) {
    return This->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateStateObject(ID3D12Device8* This,const D3D12_STATE_OBJECT_DESC *desc,REFIID riid,void **state_object) {
    return This->lpVtbl->CreateStateObject(This,desc,riid,state_object);
}
static __WIDL_INLINE void ID3D12Device8_GetRaytracingAccelerationStructurePrebuildInfo(ID3D12Device8* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) {
    This->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info);
}
static __WIDL_INLINE D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS ID3D12Device8_CheckDriverMatchingIdentifier(ID3D12Device8* This,D3D12_SERIALIZED_DATA_TYPE serialized_data_type,const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) {
    return This->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check);
}
/*** ID3D12Device6 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_SetBackgroundProcessingMode(ID3D12Device8* This,D3D12_BACKGROUND_PROCESSING_MODE mode,D3D12_MEASUREMENTS_ACTION action,HANDLE event,WINBOOL *further_measurements_desired) {
    return This->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired);
}
/*** ID3D12Device7 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device8_AddToStateObject(ID3D12Device8* This,const D3D12_STATE_OBJECT_DESC *addition,ID3D12StateObject *state_object_to_grow_from,REFIID riid,void **new_state_object) {
    return This->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateProtectedResourceSession1(ID3D12Device8* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session);
}
/*** ID3D12Device8 methods ***/
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device8_GetResourceAllocationInfo2(ID3D12Device8* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC1 *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo2(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreateCommittedResource2(ID3D12Device8* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC1 *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device8_CreatePlacedResource1(ID3D12Device8* This,ID3D12Heap *heap,UINT64 heap_offset,const D3D12_RESOURCE_DESC1 *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource);
}
static __WIDL_INLINE void ID3D12Device8_CreateSamplerFeedbackUnorderedAccessView(ID3D12Device8* This,ID3D12Resource *targeted_resource,ID3D12Resource *feedback_resource,D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor) {
    This->lpVtbl->CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor);
}
static __WIDL_INLINE void ID3D12Device8_GetCopyableFootprints1(ID3D12Device8* This,const D3D12_RESOURCE_DESC1 *resource_desc,UINT first_subresource,UINT subresources_count,UINT64 base_offset,D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,UINT *rows_count,UINT64 *row_size_in_bytes,UINT64 *total_bytes) {
    This->lpVtbl->GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device8_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Resource1 interface
 */
#ifndef __ID3D12Resource1_INTERFACE_DEFINED__
#define __ID3D12Resource1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Resource1, 0x9d5e227a, 0x4430, 0x4161, 0x88,0xb3, 0x3e,0xca,0x6b,0xb1,0x6e,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9d5e227a-4430-4161-88b3-3eca6bb16e19")
ID3D12Resource1 : public ID3D12Resource
{
    virtual HRESULT STDMETHODCALLTYPE GetProtectedResourceSession(
        REFIID riid,
        void **protected_session) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Resource1, 0x9d5e227a, 0x4430, 0x4161, 0x88,0xb3, 0x3e,0xca,0x6b,0xb1,0x6e,0x19)
#endif
#else
typedef struct ID3D12Resource1Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *WriteToSubresource)(
        ID3D12Resource1 *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)(
        ID3D12Resource1 *This,
        void *dst_data,
        UINT dst_row_pitch,
        UINT dst_slice_pitch,
        UINT src_sub_resource,
        const D3D12_BOX *src_box);

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

    /*** ID3D12Resource1 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProtectedResourceSession)(
        ID3D12Resource1 *This,
        REFIID riid,
        void **protected_session);

    END_INTERFACE
} ID3D12Resource1Vtbl;

interface ID3D12Resource1 {
    CONST_VTBL ID3D12Resource1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Resource1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Resource1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Resource1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Resource1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Resource1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Resource1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Resource1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Resource1_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Resource methods ***/
#define ID3D12Resource1_Map(This,sub_resource,read_range,data) (This)->lpVtbl->Map(This,sub_resource,read_range,data)
#define ID3D12Resource1_Unmap(This,sub_resource,written_range) (This)->lpVtbl->Unmap(This,sub_resource,written_range)
#define ID3D12Resource1_GetDesc(This) ID3D12Resource1_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Resource1_GetGPUVirtualAddress(This) (This)->lpVtbl->GetGPUVirtualAddress(This)
#define ID3D12Resource1_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 ID3D12Resource1_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 ID3D12Resource1_GetHeapProperties(This,heap_properties,flags) (This)->lpVtbl->GetHeapProperties(This,heap_properties,flags)
/*** ID3D12Resource1 methods ***/
#define ID3D12Resource1_GetProtectedResourceSession(This,riid,protected_session) (This)->lpVtbl->GetProtectedResourceSession(This,riid,protected_session)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource1_QueryInterface(ID3D12Resource1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Resource1_AddRef(ID3D12Resource1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Resource1_Release(ID3D12Resource1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource1_GetPrivateData(ID3D12Resource1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource1_SetPrivateData(ID3D12Resource1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource1_SetPrivateDataInterface(ID3D12Resource1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource1_SetName(ID3D12Resource1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource1_GetDevice(ID3D12Resource1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Resource methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource1_Map(ID3D12Resource1* This,UINT sub_resource,const D3D12_RANGE *read_range,void **data) {
    return This->lpVtbl->Map(This,sub_resource,read_range,data);
}
static __WIDL_INLINE void ID3D12Resource1_Unmap(ID3D12Resource1* This,UINT sub_resource,const D3D12_RANGE *written_range) {
    This->lpVtbl->Unmap(This,sub_resource,written_range);
}
static __WIDL_INLINE D3D12_RESOURCE_DESC ID3D12Resource1_GetDesc(ID3D12Resource1* This) {
    D3D12_RESOURCE_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
static __WIDL_INLINE D3D12_GPU_VIRTUAL_ADDRESS ID3D12Resource1_GetGPUVirtualAddress(ID3D12Resource1* This) {
    return This->lpVtbl->GetGPUVirtualAddress(This);
}
static __WIDL_INLINE HRESULT ID3D12Resource1_WriteToSubresource(ID3D12Resource1* 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 __WIDL_INLINE HRESULT ID3D12Resource1_ReadFromSubresource(ID3D12Resource1* 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 __WIDL_INLINE HRESULT ID3D12Resource1_GetHeapProperties(ID3D12Resource1* This,D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS *flags) {
    return This->lpVtbl->GetHeapProperties(This,heap_properties,flags);
}
/*** ID3D12Resource1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource1_GetProtectedResourceSession(ID3D12Resource1* This,REFIID riid,void **protected_session) {
    return This->lpVtbl->GetProtectedResourceSession(This,riid,protected_session);
}
#endif
#endif

#endif


#endif  /* __ID3D12Resource1_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Resource2 interface
 */
#ifndef __ID3D12Resource2_INTERFACE_DEFINED__
#define __ID3D12Resource2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Resource2, 0xbe36ec3b, 0xea85, 0x4aeb, 0xa4,0x5a, 0xe9,0xd7,0x64,0x04,0xa4,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("be36ec3b-ea85-4aeb-a45a-e9d76404a495")
ID3D12Resource2 : public ID3D12Resource1
{
#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual D3D12_RESOURCE_DESC1* STDMETHODCALLTYPE GetDesc1(
        D3D12_RESOURCE_DESC1 *__ret) = 0;
    D3D12_RESOURCE_DESC1 STDMETHODCALLTYPE GetDesc1(
        )
    {
        D3D12_RESOURCE_DESC1 __ret;
        return *GetDesc1(&__ret);
    }
#else
    virtual D3D12_RESOURCE_DESC1 STDMETHODCALLTYPE GetDesc1(
        ) = 0;
#endif

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Resource2, 0xbe36ec3b, 0xea85, 0x4aeb, 0xa4,0x5a, 0xe9,0xd7,0x64,0x04,0xa4,0x95)
#endif
#else
typedef struct ID3D12Resource2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *WriteToSubresource)(
        ID3D12Resource2 *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)(
        ID3D12Resource2 *This,
        void *dst_data,
        UINT dst_row_pitch,
        UINT dst_slice_pitch,
        UINT src_sub_resource,
        const D3D12_BOX *src_box);

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

    /*** ID3D12Resource1 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProtectedResourceSession)(
        ID3D12Resource2 *This,
        REFIID riid,
        void **protected_session);

    /*** ID3D12Resource2 methods ***/
    D3D12_RESOURCE_DESC1 * (STDMETHODCALLTYPE *GetDesc1)(
        ID3D12Resource2 *This,
        D3D12_RESOURCE_DESC1 *__ret);

    END_INTERFACE
} ID3D12Resource2Vtbl;

interface ID3D12Resource2 {
    CONST_VTBL ID3D12Resource2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Resource2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Resource2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Resource2_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Resource2_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Resource2_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Resource2_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Resource2_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Resource2_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Resource methods ***/
#define ID3D12Resource2_Map(This,sub_resource,read_range,data) (This)->lpVtbl->Map(This,sub_resource,read_range,data)
#define ID3D12Resource2_Unmap(This,sub_resource,written_range) (This)->lpVtbl->Unmap(This,sub_resource,written_range)
#define ID3D12Resource2_GetDesc(This) ID3D12Resource2_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Resource2_GetGPUVirtualAddress(This) (This)->lpVtbl->GetGPUVirtualAddress(This)
#define ID3D12Resource2_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 ID3D12Resource2_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 ID3D12Resource2_GetHeapProperties(This,heap_properties,flags) (This)->lpVtbl->GetHeapProperties(This,heap_properties,flags)
/*** ID3D12Resource1 methods ***/
#define ID3D12Resource2_GetProtectedResourceSession(This,riid,protected_session) (This)->lpVtbl->GetProtectedResourceSession(This,riid,protected_session)
/*** ID3D12Resource2 methods ***/
#define ID3D12Resource2_GetDesc1(This) ID3D12Resource2_GetDesc1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource2_QueryInterface(ID3D12Resource2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Resource2_AddRef(ID3D12Resource2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Resource2_Release(ID3D12Resource2* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource2_GetPrivateData(ID3D12Resource2* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource2_SetPrivateData(ID3D12Resource2* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource2_SetPrivateDataInterface(ID3D12Resource2* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Resource2_SetName(ID3D12Resource2* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource2_GetDevice(ID3D12Resource2* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Resource methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource2_Map(ID3D12Resource2* This,UINT sub_resource,const D3D12_RANGE *read_range,void **data) {
    return This->lpVtbl->Map(This,sub_resource,read_range,data);
}
static __WIDL_INLINE void ID3D12Resource2_Unmap(ID3D12Resource2* This,UINT sub_resource,const D3D12_RANGE *written_range) {
    This->lpVtbl->Unmap(This,sub_resource,written_range);
}
static __WIDL_INLINE D3D12_RESOURCE_DESC ID3D12Resource2_GetDesc(ID3D12Resource2* This) {
    D3D12_RESOURCE_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
static __WIDL_INLINE D3D12_GPU_VIRTUAL_ADDRESS ID3D12Resource2_GetGPUVirtualAddress(ID3D12Resource2* This) {
    return This->lpVtbl->GetGPUVirtualAddress(This);
}
static __WIDL_INLINE HRESULT ID3D12Resource2_WriteToSubresource(ID3D12Resource2* 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 __WIDL_INLINE HRESULT ID3D12Resource2_ReadFromSubresource(ID3D12Resource2* 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 __WIDL_INLINE HRESULT ID3D12Resource2_GetHeapProperties(ID3D12Resource2* This,D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS *flags) {
    return This->lpVtbl->GetHeapProperties(This,heap_properties,flags);
}
/*** ID3D12Resource1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Resource2_GetProtectedResourceSession(ID3D12Resource2* This,REFIID riid,void **protected_session) {
    return This->lpVtbl->GetProtectedResourceSession(This,riid,protected_session);
}
/*** ID3D12Resource2 methods ***/
static __WIDL_INLINE D3D12_RESOURCE_DESC1 ID3D12Resource2_GetDesc1(ID3D12Resource2* This) {
    D3D12_RESOURCE_DESC1 __ret;
    return *This->lpVtbl->GetDesc1(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12Resource2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Heap1 interface
 */
#ifndef __ID3D12Heap1_INTERFACE_DEFINED__
#define __ID3D12Heap1_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Heap1, 0x572f7389, 0x2168, 0x49e3, 0x96,0x93, 0xd6,0xdf,0x58,0x71,0xbf,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("572f7389-2168-49e3-9693-d6df5871bf6d")
ID3D12Heap1 : public ID3D12Heap
{
    virtual HRESULT STDMETHODCALLTYPE GetProtectedResourceSession(
        REFIID riid,
        void **protected_session) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Heap1, 0x572f7389, 0x2168, 0x49e3, 0x96,0x93, 0xd6,0xdf,0x58,0x71,0xbf,0x6d)
#endif
#else
typedef struct ID3D12Heap1Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

    /*** ID3D12Heap1 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProtectedResourceSession)(
        ID3D12Heap1 *This,
        REFIID riid,
        void **protected_session);

    END_INTERFACE
} ID3D12Heap1Vtbl;

interface ID3D12Heap1 {
    CONST_VTBL ID3D12Heap1Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Heap1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Heap1_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Heap1_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Heap1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Heap1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Heap1_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Heap1_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12Heap1_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12Heap methods ***/
#define ID3D12Heap1_GetDesc(This) ID3D12Heap1_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Heap1 methods ***/
#define ID3D12Heap1_GetProtectedResourceSession(This,riid,protected_session) (This)->lpVtbl->GetProtectedResourceSession(This,riid,protected_session)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Heap1_QueryInterface(ID3D12Heap1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Heap1_AddRef(ID3D12Heap1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Heap1_Release(ID3D12Heap1* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Heap1_GetPrivateData(ID3D12Heap1* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Heap1_SetPrivateData(ID3D12Heap1* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Heap1_SetPrivateDataInterface(ID3D12Heap1* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Heap1_SetName(ID3D12Heap1* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12Heap1_GetDevice(ID3D12Heap1* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12Heap methods ***/
static __WIDL_INLINE D3D12_HEAP_DESC ID3D12Heap1_GetDesc(ID3D12Heap1* This) {
    D3D12_HEAP_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
/*** ID3D12Heap1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Heap1_GetProtectedResourceSession(ID3D12Heap1* This,REFIID riid,void **protected_session) {
    return This->lpVtbl->GetProtectedResourceSession(This,riid,protected_session);
}
#endif
#endif

#endif


#endif  /* __ID3D12Heap1_INTERFACE_DEFINED__ */

typedef enum D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE {
    D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_DISCARD = 0x0,
    D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE = 0x1,
    D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR = 0x2,
    D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS = 0x3
} D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE;
typedef struct D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS {
    D3D12_CLEAR_VALUE ClearValue;
} D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS;
typedef struct D3D12_RENDER_PASS_BEGINNING_ACCESS {
    D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE Type;
    __C89_NAMELESS union {
        D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS Clear;
    } __C89_NAMELESSUNIONNAME;
} D3D12_RENDER_PASS_BEGINNING_ACCESS;
typedef enum D3D12_RENDER_PASS_ENDING_ACCESS_TYPE {
    D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_DISCARD = 0x0,
    D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE = 0x1,
    D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_RESOLVE = 0x2,
    D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS = 0x3
} D3D12_RENDER_PASS_ENDING_ACCESS_TYPE;
typedef struct D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS {
    UINT SrcSubresource;
    UINT DstSubresource;
    UINT DstX;
    UINT DstY;
    D3D12_RECT SrcRect;
} D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS;
typedef struct D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS {
    ID3D12Resource *pSrcResource;
    ID3D12Resource *pDstResource;
    UINT SubresourceCount;
    const D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS *pSubresourceParameters;
    DXGI_FORMAT Format;
    D3D12_RESOLVE_MODE ResolveMode;
    WINBOOL PreserveResolveSource;
} D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS;
typedef struct D3D12_RENDER_PASS_ENDING_ACCESS {
    D3D12_RENDER_PASS_ENDING_ACCESS_TYPE Type;
    __C89_NAMELESS union {
        D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS Resolve;
    } __C89_NAMELESSUNIONNAME;
} D3D12_RENDER_PASS_ENDING_ACCESS;
typedef struct D3D12_RENDER_PASS_RENDER_TARGET_DESC {
    D3D12_CPU_DESCRIPTOR_HANDLE cpuDescriptor;
    D3D12_RENDER_PASS_BEGINNING_ACCESS BeginningAccess;
    D3D12_RENDER_PASS_ENDING_ACCESS EndingAccess;
} D3D12_RENDER_PASS_RENDER_TARGET_DESC;
typedef struct D3D12_RENDER_PASS_DEPTH_STENCIL_DESC {
    D3D12_CPU_DESCRIPTOR_HANDLE cpuDescriptor;
    D3D12_RENDER_PASS_BEGINNING_ACCESS DepthBeginningAccess;
    D3D12_RENDER_PASS_BEGINNING_ACCESS StencilBeginningAccess;
    D3D12_RENDER_PASS_ENDING_ACCESS DepthEndingAccess;
    D3D12_RENDER_PASS_ENDING_ACCESS StencilEndingAccess;
} D3D12_RENDER_PASS_DEPTH_STENCIL_DESC;
typedef enum D3D12_RENDER_PASS_FLAGS {
    D3D12_RENDER_PASS_FLAG_NONE = 0x0,
    D3D12_RENDER_PASS_FLAG_ALLOW_UAV_WRITES = 0x1,
    D3D12_RENDER_PASS_FLAG_SUSPENDING_PASS = 0x2,
    D3D12_RENDER_PASS_FLAG_RESUMING_PASS = 0x4
} D3D12_RENDER_PASS_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_RENDER_PASS_FLAGS);
/*****************************************************************************
 * ID3D12MetaCommand interface
 */
#ifndef __ID3D12MetaCommand_INTERFACE_DEFINED__
#define __ID3D12MetaCommand_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12MetaCommand, 0xdbb84c27, 0x36ce, 0x4fc9, 0xb8,0x01, 0xf0,0x48,0xc4,0x6a,0xc5,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dbb84c27-36ce-4fc9-b801-f048c46ac570")
ID3D12MetaCommand : public ID3D12Pageable
{
    virtual UINT64 STDMETHODCALLTYPE GetRequiredParameterResourceSize(
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT parameter_index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12MetaCommand, 0xdbb84c27, 0x36ce, 0x4fc9, 0xb8,0x01, 0xf0,0x48,0xc4,0x6a,0xc5,0x70)
#endif
#else
typedef struct ID3D12MetaCommandVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12MetaCommand methods ***/
    UINT64 (STDMETHODCALLTYPE *GetRequiredParameterResourceSize)(
        ID3D12MetaCommand *This,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT parameter_index);

    END_INTERFACE
} ID3D12MetaCommandVtbl;

interface ID3D12MetaCommand {
    CONST_VTBL ID3D12MetaCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12MetaCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12MetaCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12MetaCommand_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12MetaCommand_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12MetaCommand_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12MetaCommand_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12MetaCommand_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12MetaCommand_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12MetaCommand methods ***/
#define ID3D12MetaCommand_GetRequiredParameterResourceSize(This,stage,parameter_index) (This)->lpVtbl->GetRequiredParameterResourceSize(This,stage,parameter_index)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12MetaCommand_QueryInterface(ID3D12MetaCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12MetaCommand_AddRef(ID3D12MetaCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12MetaCommand_Release(ID3D12MetaCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12MetaCommand_GetPrivateData(ID3D12MetaCommand* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12MetaCommand_SetPrivateData(ID3D12MetaCommand* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12MetaCommand_SetPrivateDataInterface(ID3D12MetaCommand* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12MetaCommand_SetName(ID3D12MetaCommand* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12MetaCommand_GetDevice(ID3D12MetaCommand* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12MetaCommand methods ***/
static __WIDL_INLINE UINT64 ID3D12MetaCommand_GetRequiredParameterResourceSize(ID3D12MetaCommand* This,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT parameter_index) {
    return This->lpVtbl->GetRequiredParameterResourceSize(This,stage,parameter_index);
}
#endif
#endif

#endif


#endif  /* __ID3D12MetaCommand_INTERFACE_DEFINED__ */

typedef struct D3D12_DISPATCH_RAYS_DESC {
    D3D12_GPU_VIRTUAL_ADDRESS_RANGE RayGenerationShaderRecord;
    D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE MissShaderTable;
    D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE HitGroupTable;
    D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE CallableShaderTable;
    UINT Width;
    UINT Height;
    UINT Depth;
} D3D12_DISPATCH_RAYS_DESC;
/*****************************************************************************
 * ID3D12GraphicsCommandList4 interface
 */
#ifndef __ID3D12GraphicsCommandList4_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList4_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList4, 0x8754318e, 0xd3a9, 0x4541, 0x98,0xcf, 0x64,0x5b,0x50,0xdc,0x48,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8754318e-d3a9-4541-98cf-645b50dc4874")
ID3D12GraphicsCommandList4 : public ID3D12GraphicsCommandList3
{
    virtual void STDMETHODCALLTYPE BeginRenderPass(
        UINT render_targets_count,
        const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,
        const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,
        D3D12_RENDER_PASS_FLAGS flags) = 0;

    virtual void STDMETHODCALLTYPE EndRenderPass(
        ) = 0;

    virtual void STDMETHODCALLTYPE InitializeMetaCommand(
        ID3D12MetaCommand *meta_command,
        const void *initialization_parameters_data,
        SIZE_T initialization_parameters_data_size_in_bytes) = 0;

    virtual void STDMETHODCALLTYPE ExecuteMetaCommand(
        ID3D12MetaCommand *meta_command,
        const void *execution_parameters_data,
        SIZE_T execution_parameters_data_size_in_bytes) = 0;

    virtual void STDMETHODCALLTYPE BuildRaytracingAccelerationStructure(
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,
        UINT postbuild_info_descs_count,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs) = 0;

    virtual void STDMETHODCALLTYPE EmitRaytracingAccelerationStructurePostbuildInfo(
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,
        UINT src_acceleration_structures_count,
        const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data) = 0;

    virtual void STDMETHODCALLTYPE CopyRaytracingAccelerationStructure(
        D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,
        D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) = 0;

    virtual void STDMETHODCALLTYPE SetPipelineState1(
        ID3D12StateObject *state_object) = 0;

    virtual void STDMETHODCALLTYPE DispatchRays(
        const D3D12_DISPATCH_RAYS_DESC *desc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList4, 0x8754318e, 0xd3a9, 0x4541, 0x98,0xcf, 0x64,0x5b,0x50,0xdc,0x48,0x74)
#endif
#else
typedef struct ID3D12GraphicsCommandList4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12PipelineState *pipeline_state);

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

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

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

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

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

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

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *This,
        FLOAT min,
        FLOAT max);

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

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList4 *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)(
        ID3D12GraphicsCommandList4 *This,
        UINT mask);

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

    /*** ID3D12GraphicsCommandList3 methods ***/
    void (STDMETHODCALLTYPE *SetProtectedResourceSession)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12ProtectedResourceSession *protected_resource_session);

    /*** ID3D12GraphicsCommandList4 methods ***/
    void (STDMETHODCALLTYPE *BeginRenderPass)(
        ID3D12GraphicsCommandList4 *This,
        UINT render_targets_count,
        const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,
        const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,
        D3D12_RENDER_PASS_FLAGS flags);

    void (STDMETHODCALLTYPE *EndRenderPass)(
        ID3D12GraphicsCommandList4 *This);

    void (STDMETHODCALLTYPE *InitializeMetaCommand)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12MetaCommand *meta_command,
        const void *initialization_parameters_data,
        SIZE_T initialization_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *ExecuteMetaCommand)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12MetaCommand *meta_command,
        const void *execution_parameters_data,
        SIZE_T execution_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *BuildRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList4 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,
        UINT postbuild_info_descs_count,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs);

    void (STDMETHODCALLTYPE *EmitRaytracingAccelerationStructurePostbuildInfo)(
        ID3D12GraphicsCommandList4 *This,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,
        UINT src_acceleration_structures_count,
        const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data);

    void (STDMETHODCALLTYPE *CopyRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList4 *This,
        D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,
        D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode);

    void (STDMETHODCALLTYPE *SetPipelineState1)(
        ID3D12GraphicsCommandList4 *This,
        ID3D12StateObject *state_object);

    void (STDMETHODCALLTYPE *DispatchRays)(
        ID3D12GraphicsCommandList4 *This,
        const D3D12_DISPATCH_RAYS_DESC *desc);

    END_INTERFACE
} ID3D12GraphicsCommandList4Vtbl;

interface ID3D12GraphicsCommandList4 {
    CONST_VTBL ID3D12GraphicsCommandList4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList4_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList4_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList4_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList4_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList4_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList4_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList4_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList4_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList4_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList4_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList4_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList4_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList4_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList4_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList4_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList4_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList4_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList4_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList4_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList4_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList4_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList4_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList4_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList4_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList4_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList4_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList4_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList4_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList4_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList4_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList4_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList4_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList4_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList4_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList4_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList4_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList4_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList4_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList4_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList4_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList4_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList4_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList4_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 ID3D12GraphicsCommandList4_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
/*** ID3D12GraphicsCommandList2 methods ***/
#define ID3D12GraphicsCommandList4_WriteBufferImmediate(This,count,parameters,modes) (This)->lpVtbl->WriteBufferImmediate(This,count,parameters,modes)
/*** ID3D12GraphicsCommandList3 methods ***/
#define ID3D12GraphicsCommandList4_SetProtectedResourceSession(This,protected_resource_session) (This)->lpVtbl->SetProtectedResourceSession(This,protected_resource_session)
/*** ID3D12GraphicsCommandList4 methods ***/
#define ID3D12GraphicsCommandList4_BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags) (This)->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags)
#define ID3D12GraphicsCommandList4_EndRenderPass(This) (This)->lpVtbl->EndRenderPass(This)
#define ID3D12GraphicsCommandList4_InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes) (This)->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList4_ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes) (This)->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs) (This)->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs)
#define ID3D12GraphicsCommandList4_EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data) (This)->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data)
#define ID3D12GraphicsCommandList4_CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode) (This)->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode)
#define ID3D12GraphicsCommandList4_SetPipelineState1(This,state_object) (This)->lpVtbl->SetPipelineState1(This,state_object)
#define ID3D12GraphicsCommandList4_DispatchRays(This,desc) (This)->lpVtbl->DispatchRays(This,desc)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_QueryInterface(ID3D12GraphicsCommandList4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList4_AddRef(ID3D12GraphicsCommandList4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList4_Release(ID3D12GraphicsCommandList4* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_GetPrivateData(ID3D12GraphicsCommandList4* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_SetPrivateData(ID3D12GraphicsCommandList4* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_SetPrivateDataInterface(ID3D12GraphicsCommandList4* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_SetName(ID3D12GraphicsCommandList4* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_GetDevice(ID3D12GraphicsCommandList4* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList4_GetType(ID3D12GraphicsCommandList4* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_Close(ID3D12GraphicsCommandList4* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList4_Reset(ID3D12GraphicsCommandList4* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ClearState(ID3D12GraphicsCommandList4* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_DrawInstanced(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_DrawIndexedInstanced(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_Dispatch(ID3D12GraphicsCommandList4* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_CopyBufferRegion(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_CopyTextureRegion(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_CopyResource(ID3D12GraphicsCommandList4* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_CopyTiles(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_ResolveSubresource(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_IASetPrimitiveTopology(ID3D12GraphicsCommandList4* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_RSSetViewports(ID3D12GraphicsCommandList4* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_RSSetScissorRects(ID3D12GraphicsCommandList4* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_OMSetBlendFactor(ID3D12GraphicsCommandList4* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_OMSetStencilRef(ID3D12GraphicsCommandList4* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetPipelineState(ID3D12GraphicsCommandList4* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ResourceBarrier(ID3D12GraphicsCommandList4* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ExecuteBundle(ID3D12GraphicsCommandList4* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetDescriptorHeaps(ID3D12GraphicsCommandList4* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRootSignature(ID3D12GraphicsCommandList4* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRootSignature(ID3D12GraphicsCommandList4* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList4* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_IASetIndexBuffer(ID3D12GraphicsCommandList4* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_IASetVertexBuffers(ID3D12GraphicsCommandList4* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SOSetTargets(ID3D12GraphicsCommandList4* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_OMSetRenderTargets(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_ClearDepthStencilView(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_ClearRenderTargetView(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_DiscardResource(ID3D12GraphicsCommandList4* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_BeginQuery(ID3D12GraphicsCommandList4* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_EndQuery(ID3D12GraphicsCommandList4* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ResolveQueryData(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_SetPredication(ID3D12GraphicsCommandList4* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetMarker(ID3D12GraphicsCommandList4* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_BeginEvent(ID3D12GraphicsCommandList4* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_EndEvent(ID3D12GraphicsCommandList4* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ExecuteIndirect(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_AtomicCopyBufferUINT(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_OMSetDepthBounds(ID3D12GraphicsCommandList4* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetSamplePositions(ID3D12GraphicsCommandList4* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ResolveSubresourceRegion(ID3D12GraphicsCommandList4* 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 __WIDL_INLINE void ID3D12GraphicsCommandList4_SetViewInstanceMask(ID3D12GraphicsCommandList4* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList4_WriteBufferImmediate(ID3D12GraphicsCommandList4* This,UINT count,const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) {
    This->lpVtbl->WriteBufferImmediate(This,count,parameters,modes);
}
/*** ID3D12GraphicsCommandList3 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetProtectedResourceSession(ID3D12GraphicsCommandList4* This,ID3D12ProtectedResourceSession *protected_resource_session) {
    This->lpVtbl->SetProtectedResourceSession(This,protected_resource_session);
}
/*** ID3D12GraphicsCommandList4 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList4_BeginRenderPass(ID3D12GraphicsCommandList4* This,UINT render_targets_count,const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,D3D12_RENDER_PASS_FLAGS flags) {
    This->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_EndRenderPass(ID3D12GraphicsCommandList4* This) {
    This->lpVtbl->EndRenderPass(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_InitializeMetaCommand(ID3D12GraphicsCommandList4* This,ID3D12MetaCommand *meta_command,const void *initialization_parameters_data,SIZE_T initialization_parameters_data_size_in_bytes) {
    This->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_ExecuteMetaCommand(ID3D12GraphicsCommandList4* This,ID3D12MetaCommand *meta_command,const void *execution_parameters_data,SIZE_T execution_parameters_data_size_in_bytes) {
    This->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure(ID3D12GraphicsCommandList4* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,UINT postbuild_info_descs_count,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs) {
    This->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_EmitRaytracingAccelerationStructurePostbuildInfo(ID3D12GraphicsCommandList4* This,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,UINT src_acceleration_structures_count,const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data) {
    This->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_CopyRaytracingAccelerationStructure(ID3D12GraphicsCommandList4* This,D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) {
    This->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_SetPipelineState1(ID3D12GraphicsCommandList4* This,ID3D12StateObject *state_object) {
    This->lpVtbl->SetPipelineState1(This,state_object);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList4_DispatchRays(ID3D12GraphicsCommandList4* This,const D3D12_DISPATCH_RAYS_DESC *desc) {
    This->lpVtbl->DispatchRays(This,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList4_INTERFACE_DEFINED__ */

typedef enum D3D12_SHADER_CACHE_MODE {
    D3D12_SHADER_CACHE_MODE_MEMORY = 0x0,
    D3D12_SHADER_CACHE_MODE_DISK = 0x1
} D3D12_SHADER_CACHE_MODE;
typedef enum D3D12_SHADER_CACHE_FLAGS {
    D3D12_SHADER_CACHE_FLAG_NONE = 0x0,
    D3D12_SHADER_CACHE_FLAG_DRIVER_VERSIONED = 0x1,
    D3D12_SHADER_CACHE_FLAG_USE_WORKING_DIR = 0x2
} D3D12_SHADER_CACHE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_SHADER_CACHE_FLAGS);
typedef struct D3D12_SHADER_CACHE_SESSION_DESC {
    GUID Identifier;
    D3D12_SHADER_CACHE_MODE Mode;
    D3D12_SHADER_CACHE_FLAGS Flags;
    UINT MaximumInMemoryCacheSizeBytes;
    UINT MaximumInMemoryCacheEntries;
    UINT MaximumValueFileSizeBytes;
    UINT64 Version;
} D3D12_SHADER_CACHE_SESSION_DESC;
typedef enum D3D12_BARRIER_LAYOUT {
    D3D12_BARRIER_LAYOUT_UNDEFINED = 0xffffffff,
    D3D12_BARRIER_LAYOUT_COMMON = 0x0,
    D3D12_BARRIER_LAYOUT_PRESENT = 0x0,
    D3D12_BARRIER_LAYOUT_GENERIC_READ = 0x1,
    D3D12_BARRIER_LAYOUT_RENDER_TARGET = 0x2,
    D3D12_BARRIER_LAYOUT_UNORDERED_ACCESS = 0x3,
    D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE = 0x4,
    D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_READ = 0x5,
    D3D12_BARRIER_LAYOUT_SHADER_RESOURCE = 0x6,
    D3D12_BARRIER_LAYOUT_COPY_SOURCE = 0x7,
    D3D12_BARRIER_LAYOUT_COPY_DEST = 0x8,
    D3D12_BARRIER_LAYOUT_RESOLVE_SOURCE = 0x9,
    D3D12_BARRIER_LAYOUT_RESOLVE_DEST = 0xa,
    D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE = 0xb,
    D3D12_BARRIER_LAYOUT_VIDEO_DECODE_READ = 0xc,
    D3D12_BARRIER_LAYOUT_VIDEO_DECODE_WRITE = 0xd,
    D3D12_BARRIER_LAYOUT_VIDEO_PROCESS_READ = 0xe,
    D3D12_BARRIER_LAYOUT_VIDEO_PROCESS_WRITE = 0xf,
    D3D12_BARRIER_LAYOUT_VIDEO_ENCODE_READ = 0x10,
    D3D12_BARRIER_LAYOUT_VIDEO_ENCODE_WRITE = 0x11,
    D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON = 0x12,
    D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ = 0x13,
    D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_UNORDERED_ACCESS = 0x14,
    D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_SHADER_RESOURCE = 0x15,
    D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_SOURCE = 0x16,
    D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_DEST = 0x17,
    D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COMMON = 0x18,
    D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_GENERIC_READ = 0x19,
    D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_UNORDERED_ACCESS = 0x1a,
    D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_SHADER_RESOURCE = 0x1b,
    D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COPY_SOURCE = 0x1c,
    D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COPY_DEST = 0x1d,
    D3D12_BARRIER_LAYOUT_VIDEO_QUEUE_COMMON = 0x1e
} D3D12_BARRIER_LAYOUT;
typedef enum D3D12_BARRIER_SYNC {
    D3D12_BARRIER_SYNC_NONE = 0x0,
    D3D12_BARRIER_SYNC_ALL = 0x1,
    D3D12_BARRIER_SYNC_DRAW = 0x2,
    D3D12_BARRIER_SYNC_INPUT_ASSEMBLER = 0x4,
    D3D12_BARRIER_SYNC_VERTEX_SHADING = 0x8,
    D3D12_BARRIER_SYNC_PIXEL_SHADING = 0x10,
    D3D12_BARRIER_SYNC_DEPTH_STENCIL = 0x20,
    D3D12_BARRIER_SYNC_RENDER_TARGET = 0x40,
    D3D12_BARRIER_SYNC_COMPUTE_SHADING = 0x80,
    D3D12_BARRIER_SYNC_RAYTRACING = 0x100,
    D3D12_BARRIER_SYNC_COPY = 0x200,
    D3D12_BARRIER_SYNC_RESOLVE = 0x400,
    D3D12_BARRIER_SYNC_EXECUTE_INDIRECT = 0x800,
    D3D12_BARRIER_SYNC_PREDICATION = 0x800,
    D3D12_BARRIER_SYNC_ALL_SHADING = 0x1000,
    D3D12_BARRIER_SYNC_NON_PIXEL_SHADING = 0x2000,
    D3D12_BARRIER_SYNC_EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO = 0x4000,
    D3D12_BARRIER_SYNC_VIDEO_DECODE = 0x100000,
    D3D12_BARRIER_SYNC_VIDEO_PROCESS = 0x200000,
    D3D12_BARRIER_SYNC_VIDEO_ENCODE = 0x400000,
    D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE = 0x800000,
    D3D12_BARRIER_SYNC_COPY_RAYTRACING_ACCELERATION_STRUCTURE = 0x1000000,
    D3D12_BARRIER_SYNC_SPLIT = 0x80000000
} D3D12_BARRIER_SYNC;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_BARRIER_SYNC);
typedef enum D3D12_BARRIER_ACCESS {
    D3D12_BARRIER_ACCESS_COMMON = 0,
    D3D12_BARRIER_ACCESS_VERTEX_BUFFER = 0x1,
    D3D12_BARRIER_ACCESS_CONSTANT_BUFFER = 0x2,
    D3D12_BARRIER_ACCESS_INDEX_BUFFER = 0x4,
    D3D12_BARRIER_ACCESS_RENDER_TARGET = 0x8,
    D3D12_BARRIER_ACCESS_UNORDERED_ACCESS = 0x10,
    D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE = 0x20,
    D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ = 0x40,
    D3D12_BARRIER_ACCESS_SHADER_RESOURCE = 0x80,
    D3D12_BARRIER_ACCESS_STREAM_OUTPUT = 0x100,
    D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT = 0x200,
    D3D12_BARRIER_ACCESS_PREDICATION = 0x200,
    D3D12_BARRIER_ACCESS_COPY_DEST = 0x400,
    D3D12_BARRIER_ACCESS_COPY_SOURCE = 0x800,
    D3D12_BARRIER_ACCESS_RESOLVE_DEST = 0x1000,
    D3D12_BARRIER_ACCESS_RESOLVE_SOURCE = 0x2000,
    D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ = 0x4000,
    D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE = 0x8000,
    D3D12_BARRIER_ACCESS_SHADING_RATE_SOURCE = 0x10000,
    D3D12_BARRIER_ACCESS_VIDEO_DECODE_READ = 0x20000,
    D3D12_BARRIER_ACCESS_VIDEO_DECODE_WRITE = 0x40000,
    D3D12_BARRIER_ACCESS_VIDEO_PROCESS_READ = 0x80000,
    D3D12_BARRIER_ACCESS_VIDEO_PROCESS_WRITE = 0x100000,
    D3D12_BARRIER_ACCESS_VIDEO_ENCODE_READ = 0x200000,
    D3D12_BARRIER_ACCESS_VIDEO_ENCODE_WRITE = 0x400000,
    D3D12_BARRIER_ACCESS_NO_ACCESS = 0x80000000
} D3D12_BARRIER_ACCESS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_BARRIER_ACCESS);
typedef enum D3D12_BARRIER_TYPE {
    D3D12_BARRIER_TYPE_GLOBAL = 0x0,
    D3D12_BARRIER_TYPE_TEXTURE = 0x1,
    D3D12_BARRIER_TYPE_BUFFER = 0x2
} D3D12_BARRIER_TYPE;
typedef enum D3D12_TEXTURE_BARRIER_FLAGS {
    D3D12_TEXTURE_BARRIER_FLAG_NONE = 0x0,
    D3D12_TEXTURE_BARRIER_FLAG_DISCARD = 0x1
} D3D12_TEXTURE_BARRIER_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_TEXTURE_BARRIER_FLAGS);
typedef struct D3D12_BARRIER_SUBRESOURCE_RANGE {
    UINT IndexOrFirstMipLevel;
    UINT NumMipLevels;
    UINT FirstArraySlice;
    UINT NumArraySlices;
    UINT FirstPlane;
    UINT NumPlanes;
} D3D12_BARRIER_SUBRESOURCE_RANGE;
typedef struct D3D12_GLOBAL_BARRIER {
    D3D12_BARRIER_SYNC SyncBefore;
    D3D12_BARRIER_SYNC SyncAfter;
    D3D12_BARRIER_ACCESS AccessBefore;
    D3D12_BARRIER_ACCESS AccessAfter;
} D3D12_GLOBAL_BARRIER;
typedef struct D3D12_TEXTURE_BARRIER {
    D3D12_BARRIER_SYNC SyncBefore;
    D3D12_BARRIER_SYNC SyncAfter;
    D3D12_BARRIER_ACCESS AccessBefore;
    D3D12_BARRIER_ACCESS AccessAfter;
    D3D12_BARRIER_LAYOUT LayoutBefore;
    D3D12_BARRIER_LAYOUT LayoutAfter;
    ID3D12Resource *pResource;
    D3D12_BARRIER_SUBRESOURCE_RANGE Subresources;
    D3D12_TEXTURE_BARRIER_FLAGS Flags;
} D3D12_TEXTURE_BARRIER;
typedef struct D3D12_BUFFER_BARRIER {
    D3D12_BARRIER_SYNC SyncBefore;
    D3D12_BARRIER_SYNC SyncAfter;
    D3D12_BARRIER_ACCESS AccessBefore;
    D3D12_BARRIER_ACCESS AccessAfter;
    ID3D12Resource *pResource;
    UINT64 Offset;
    UINT64 Size;
} D3D12_BUFFER_BARRIER;
typedef struct D3D12_BARRIER_GROUP {
    D3D12_BARRIER_TYPE Type;
    UINT32 NumBarriers;
    __C89_NAMELESS union {
        const D3D12_GLOBAL_BARRIER *pGlobalBarriers;
        const D3D12_TEXTURE_BARRIER *pTextureBarriers;
        const D3D12_BUFFER_BARRIER *pBufferBarriers;
    } __C89_NAMELESSUNIONNAME;
} D3D12_BARRIER_GROUP;
/*****************************************************************************
 * ID3D12ShaderCacheSession interface
 */
#ifndef __ID3D12ShaderCacheSession_INTERFACE_DEFINED__
#define __ID3D12ShaderCacheSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ShaderCacheSession, 0x28e2495d, 0x0f64, 0x4ae4, 0xa6,0xec, 0x12,0x92,0x55,0xdc,0x49,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("28e2495d-0f64-4ae4-a6ec-129255dc49a8")
ID3D12ShaderCacheSession : public ID3D12DeviceChild
{
    virtual HRESULT STDMETHODCALLTYPE FindValue(
        const void *key,
        UINT key_size,
        void *value,
        UINT *value_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE StoreValue(
        const void *key,
        UINT key_size,
        const void *value,
        UINT value_size) = 0;

    virtual void STDMETHODCALLTYPE SetDeleteOnDestroy(
        ) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ShaderCacheSession, 0x28e2495d, 0x0f64, 0x4ae4, 0xa6,0xec, 0x12,0x92,0x55,0xdc,0x49,0xa8)
#endif
#else
typedef struct ID3D12ShaderCacheSessionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    /*** ID3D12ShaderCacheSession methods ***/
    HRESULT (STDMETHODCALLTYPE *FindValue)(
        ID3D12ShaderCacheSession *This,
        const void *key,
        UINT key_size,
        void *value,
        UINT *value_size);

    HRESULT (STDMETHODCALLTYPE *StoreValue)(
        ID3D12ShaderCacheSession *This,
        const void *key,
        UINT key_size,
        const void *value,
        UINT value_size);

    void (STDMETHODCALLTYPE *SetDeleteOnDestroy)(
        ID3D12ShaderCacheSession *This);

    D3D12_SHADER_CACHE_SESSION_DESC * (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ShaderCacheSession *This,
        D3D12_SHADER_CACHE_SESSION_DESC *__ret);

    END_INTERFACE
} ID3D12ShaderCacheSessionVtbl;

interface ID3D12ShaderCacheSession {
    CONST_VTBL ID3D12ShaderCacheSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12ShaderCacheSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12ShaderCacheSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12ShaderCacheSession_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12ShaderCacheSession_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12ShaderCacheSession_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12ShaderCacheSession_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12ShaderCacheSession_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12ShaderCacheSession_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12ShaderCacheSession methods ***/
#define ID3D12ShaderCacheSession_FindValue(This,key,key_size,value,value_size) (This)->lpVtbl->FindValue(This,key,key_size,value,value_size)
#define ID3D12ShaderCacheSession_StoreValue(This,key,key_size,value,value_size) (This)->lpVtbl->StoreValue(This,key,key_size,value,value_size)
#define ID3D12ShaderCacheSession_SetDeleteOnDestroy(This) (This)->lpVtbl->SetDeleteOnDestroy(This)
#define ID3D12ShaderCacheSession_GetDesc(This) ID3D12ShaderCacheSession_GetDesc_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_QueryInterface(ID3D12ShaderCacheSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12ShaderCacheSession_AddRef(ID3D12ShaderCacheSession* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12ShaderCacheSession_Release(ID3D12ShaderCacheSession* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_GetPrivateData(ID3D12ShaderCacheSession* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_SetPrivateData(ID3D12ShaderCacheSession* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_SetPrivateDataInterface(ID3D12ShaderCacheSession* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_SetName(ID3D12ShaderCacheSession* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_GetDevice(ID3D12ShaderCacheSession* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12ShaderCacheSession methods ***/
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_FindValue(ID3D12ShaderCacheSession* This,const void *key,UINT key_size,void *value,UINT *value_size) {
    return This->lpVtbl->FindValue(This,key,key_size,value,value_size);
}
static __WIDL_INLINE HRESULT ID3D12ShaderCacheSession_StoreValue(ID3D12ShaderCacheSession* This,const void *key,UINT key_size,const void *value,UINT value_size) {
    return This->lpVtbl->StoreValue(This,key,key_size,value,value_size);
}
static __WIDL_INLINE void ID3D12ShaderCacheSession_SetDeleteOnDestroy(ID3D12ShaderCacheSession* This) {
    This->lpVtbl->SetDeleteOnDestroy(This);
}
static __WIDL_INLINE D3D12_SHADER_CACHE_SESSION_DESC ID3D12ShaderCacheSession_GetDesc(ID3D12ShaderCacheSession* This) {
    D3D12_SHADER_CACHE_SESSION_DESC __ret;
    return *This->lpVtbl->GetDesc(This,&__ret);
}
#endif
#endif

#endif


#endif  /* __ID3D12ShaderCacheSession_INTERFACE_DEFINED__ */

typedef enum D3D12_SHADER_CACHE_KIND_FLAGS {
    D3D12_SHADER_CACHE_KIND_FLAG_IMPLICIT_D3D_CACHE_FOR_DRIVER = 0x1,
    D3D12_SHADER_CACHE_KIND_FLAG_IMPLICIT_D3D_CONVERSIONS = 0x2,
    D3D12_SHADER_CACHE_KIND_FLAG_IMPLICIT_DRIVER_MANAGED = 0x4,
    D3D12_SHADER_CACHE_KIND_FLAG_APPLICATION_MANAGED = 0x8
} D3D12_SHADER_CACHE_KIND_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_SHADER_CACHE_KIND_FLAGS);
typedef enum D3D12_SHADER_CACHE_CONTROL_FLAGS {
    D3D12_SHADER_CACHE_CONTROL_FLAG_DISABLE = 0x1,
    D3D12_SHADER_CACHE_CONTROL_FLAG_ENABLE = 0x2,
    D3D12_SHADER_CACHE_CONTROL_FLAG_CLEAR = 0x4
} D3D12_SHADER_CACHE_CONTROL_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(D3D12_SHADER_CACHE_CONTROL_FLAGS);
/*****************************************************************************
 * ID3D12Device9 interface
 */
#ifndef __ID3D12Device9_INTERFACE_DEFINED__
#define __ID3D12Device9_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device9, 0x4c80e962, 0xf032, 0x4f60, 0xbc,0x9e, 0xeb,0xc2,0xcf,0xa1,0xd8,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4c80e962-f032-4f60-bc9e-ebc2cfa1d83c")
ID3D12Device9 : public ID3D12Device8
{
    virtual HRESULT STDMETHODCALLTYPE CreateShaderCacheSession(
        const D3D12_SHADER_CACHE_SESSION_DESC *desc,
        REFIID riid,
        void **session) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShaderCacheControl(
        D3D12_SHADER_CACHE_KIND_FLAGS kinds,
        D3D12_SHADER_CACHE_CONTROL_FLAGS control) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device9, 0x4c80e962, 0xf032, 0x4f60, 0xbc,0x9e, 0xeb,0xc2,0xcf,0xa1,0xd8,0x3c)
#endif
#else
typedef struct ID3D12Device9Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device9 *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)(
        ID3D12Device9 *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)(
        ID3D12Device9 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device9 *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)(
        ID3D12Device9 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device9 *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)(
        ID3D12Device9 *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)(
        ID3D12Device9 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device9 *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)(
        ID3D12Device9 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device9 *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)(
        ID3D12Device9 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device9 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device9 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device9 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device9 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device9 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device9 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device9 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device9 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device9 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device9 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    /*** ID3D12Device5 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLifetimeTracker)(
        ID3D12Device9 *This,
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker);

    void (STDMETHODCALLTYPE *RemoveDevice)(
        ID3D12Device9 *This);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommands)(
        ID3D12Device9 *This,
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommandParameters)(
        ID3D12Device9 *This,
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs);

    HRESULT (STDMETHODCALLTYPE *CreateMetaCommand)(
        ID3D12Device9 *This,
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command);

    HRESULT (STDMETHODCALLTYPE *CreateStateObject)(
        ID3D12Device9 *This,
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object);

    void (STDMETHODCALLTYPE *GetRaytracingAccelerationStructurePrebuildInfo)(
        ID3D12Device9 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info);

    D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS (STDMETHODCALLTYPE *CheckDriverMatchingIdentifier)(
        ID3D12Device9 *This,
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check);

    /*** ID3D12Device6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBackgroundProcessingMode)(
        ID3D12Device9 *This,
        D3D12_BACKGROUND_PROCESSING_MODE mode,
        D3D12_MEASUREMENTS_ACTION action,
        HANDLE event,
        WINBOOL *further_measurements_desired);

    /*** ID3D12Device7 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToStateObject)(
        ID3D12Device9 *This,
        const D3D12_STATE_OBJECT_DESC *addition,
        ID3D12StateObject *state_object_to_grow_from,
        REFIID riid,
        void **new_state_object);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession1)(
        ID3D12Device9 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,
        REFIID riid,
        void **session);

    /*** ID3D12Device8 methods ***/
    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo2)(
        ID3D12Device9 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC1 *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource2)(
        ID3D12Device9 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource1)(
        ID3D12Device9 *This,
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    void (STDMETHODCALLTYPE *CreateSamplerFeedbackUnorderedAccessView)(
        ID3D12Device9 *This,
        ID3D12Resource *targeted_resource,
        ID3D12Resource *feedback_resource,
        D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor);

    void (STDMETHODCALLTYPE *GetCopyableFootprints1)(
        ID3D12Device9 *This,
        const D3D12_RESOURCE_DESC1 *resource_desc,
        UINT first_subresource,
        UINT subresources_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *rows_count,
        UINT64 *row_size_in_bytes,
        UINT64 *total_bytes);

    /*** ID3D12Device9 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateShaderCacheSession)(
        ID3D12Device9 *This,
        const D3D12_SHADER_CACHE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *ShaderCacheControl)(
        ID3D12Device9 *This,
        D3D12_SHADER_CACHE_KIND_FLAGS kinds,
        D3D12_SHADER_CACHE_CONTROL_FLAGS control);

    HRESULT (STDMETHODCALLTYPE *CreateCommandQueue1)(
        ID3D12Device9 *This,
        const D3D12_COMMAND_QUEUE_DESC *desc,
        REFIID creator_id,
        REFIID riid,
        void **command_queue);

    END_INTERFACE
} ID3D12Device9Vtbl;

interface ID3D12Device9 {
    CONST_VTBL ID3D12Device9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device9_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device9_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device9_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device9_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device9_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device9_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device9_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device9_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device9_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device9_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device9_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 ID3D12Device9_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device9_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device9_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device9_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device9_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device9_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device9_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device9_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device9_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device9_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device9_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 ID3D12Device9_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 ID3D12Device9_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device9_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device9_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device9_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device9_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 ID3D12Device9_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device9_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 ID3D12Device9_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device9_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device9_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device9_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device9_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device9_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device9_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device9_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device9_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 ID3D12Device9_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device9_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device9_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device9_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 ID3D12Device9_GetAdapterLuid(This) ID3D12Device9_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device9_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device9_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device9_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device9_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device9_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device9_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device9_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device9_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device9_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device9_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device9_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device9_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device9_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device9_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device5 methods ***/
#define ID3D12Device9_CreateLifetimeTracker(This,owner,riid,tracker) (This)->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker)
#define ID3D12Device9_RemoveDevice(This) (This)->lpVtbl->RemoveDevice(This)
#define ID3D12Device9_EnumerateMetaCommands(This,meta_commands_count,descs) (This)->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs)
#define ID3D12Device9_EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs) (This)->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs)
#define ID3D12Device9_CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command) (This)->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command)
#define ID3D12Device9_CreateStateObject(This,desc,riid,state_object) (This)->lpVtbl->CreateStateObject(This,desc,riid,state_object)
#define ID3D12Device9_GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info) (This)->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info)
#define ID3D12Device9_CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check) (This)->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check)
/*** ID3D12Device6 methods ***/
#define ID3D12Device9_SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired) (This)->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired)
/*** ID3D12Device7 methods ***/
#define ID3D12Device9_AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object) (This)->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object)
#define ID3D12Device9_CreateProtectedResourceSession1(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session)
/*** ID3D12Device8 methods ***/
#define ID3D12Device9_GetResourceAllocationInfo2(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device9_GetResourceAllocationInfo2_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device9_CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device9_CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device9_CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor) (This)->lpVtbl->CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor)
#define ID3D12Device9_GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes) (This)->lpVtbl->GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes)
/*** ID3D12Device9 methods ***/
#define ID3D12Device9_CreateShaderCacheSession(This,desc,riid,session) (This)->lpVtbl->CreateShaderCacheSession(This,desc,riid,session)
#define ID3D12Device9_ShaderCacheControl(This,kinds,control) (This)->lpVtbl->ShaderCacheControl(This,kinds,control)
#define ID3D12Device9_CreateCommandQueue1(This,desc,creator_id,riid,command_queue) (This)->lpVtbl->CreateCommandQueue1(This,desc,creator_id,riid,command_queue)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_QueryInterface(ID3D12Device9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device9_AddRef(ID3D12Device9* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device9_Release(ID3D12Device9* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_GetPrivateData(ID3D12Device9* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device9_SetPrivateData(ID3D12Device9* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device9_SetPrivateDataInterface(ID3D12Device9* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device9_SetName(ID3D12Device9* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device9_GetNodeCount(ID3D12Device9* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommandQueue(ID3D12Device9* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommandAllocator(ID3D12Device9* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateGraphicsPipelineState(ID3D12Device9* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateComputePipelineState(ID3D12Device9* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommandList(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_CheckFeatureSupport(ID3D12Device9* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateDescriptorHeap(ID3D12Device9* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device9_GetDescriptorHandleIncrementSize(ID3D12Device9* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateRootSignature(ID3D12Device9* 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 __WIDL_INLINE void ID3D12Device9_CreateConstantBufferView(ID3D12Device9* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device9_CreateShaderResourceView(ID3D12Device9* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device9_CreateUnorderedAccessView(ID3D12Device9* 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 __WIDL_INLINE void ID3D12Device9_CreateRenderTargetView(ID3D12Device9* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device9_CreateDepthStencilView(ID3D12Device9* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device9_CreateSampler(ID3D12Device9* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device9_CopyDescriptors(ID3D12Device9* 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 __WIDL_INLINE void ID3D12Device9_CopyDescriptorsSimple(ID3D12Device9* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device9_GetResourceAllocationInfo(ID3D12Device9* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device9_GetCustomHeapProperties(ID3D12Device9* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommittedResource(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_CreateHeap(ID3D12Device9* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreatePlacedResource(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_CreateReservedResource(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_CreateSharedHandle(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_OpenSharedHandle(ID3D12Device9* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device9_OpenSharedHandleByName(ID3D12Device9* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device9_MakeResident(ID3D12Device9* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device9_Evict(ID3D12Device9* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateFence(ID3D12Device9* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device9_GetDeviceRemovedReason(ID3D12Device9* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device9_GetCopyableFootprints(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_CreateQueryHeap(ID3D12Device9* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device9_SetStablePowerState(ID3D12Device9* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommandSignature(ID3D12Device9* 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 __WIDL_INLINE void ID3D12Device9_GetResourceTiling(ID3D12Device9* 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 __WIDL_INLINE LUID ID3D12Device9_GetAdapterLuid(ID3D12Device9* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_CreatePipelineLibrary(ID3D12Device9* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device9_SetEventOnMultipleFenceCompletion(ID3D12Device9* 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 __WIDL_INLINE HRESULT ID3D12Device9_SetResidencyPriority(ID3D12Device9* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_CreatePipelineState(ID3D12Device9* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_OpenExistingHeapFromAddress(ID3D12Device9* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device9_OpenExistingHeapFromFileMapping(ID3D12Device9* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device9_EnqueueMakeResident(ID3D12Device9* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommandList1(ID3D12Device9* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateProtectedResourceSession(ID3D12Device9* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommittedResource1(ID3D12Device9* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateHeap1(ID3D12Device9* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateReservedResource1(ID3D12Device9* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device9_GetResourceAllocationInfo1(ID3D12Device9* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
/*** ID3D12Device5 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_CreateLifetimeTracker(ID3D12Device9* This,ID3D12LifetimeOwner *owner,REFIID riid,void **tracker) {
    return This->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker);
}
static __WIDL_INLINE void ID3D12Device9_RemoveDevice(ID3D12Device9* This) {
    This->lpVtbl->RemoveDevice(This);
}
static __WIDL_INLINE HRESULT ID3D12Device9_EnumerateMetaCommands(ID3D12Device9* This,UINT *meta_commands_count,D3D12_META_COMMAND_DESC *descs) {
    return This->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs);
}
static __WIDL_INLINE HRESULT ID3D12Device9_EnumerateMetaCommandParameters(ID3D12Device9* This,REFGUID command_id,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT *total_structure_size_in_bytes,UINT *parameter_count,D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) {
    return This->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateMetaCommand(ID3D12Device9* This,REFGUID command_id,UINT node_mask,const void *creation_parameters_data,SIZE_T creation_parameters_data_size_in_bytes,REFIID riid,void **meta_command) {
    return This->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateStateObject(ID3D12Device9* This,const D3D12_STATE_OBJECT_DESC *desc,REFIID riid,void **state_object) {
    return This->lpVtbl->CreateStateObject(This,desc,riid,state_object);
}
static __WIDL_INLINE void ID3D12Device9_GetRaytracingAccelerationStructurePrebuildInfo(ID3D12Device9* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) {
    This->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info);
}
static __WIDL_INLINE D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS ID3D12Device9_CheckDriverMatchingIdentifier(ID3D12Device9* This,D3D12_SERIALIZED_DATA_TYPE serialized_data_type,const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) {
    return This->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check);
}
/*** ID3D12Device6 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_SetBackgroundProcessingMode(ID3D12Device9* This,D3D12_BACKGROUND_PROCESSING_MODE mode,D3D12_MEASUREMENTS_ACTION action,HANDLE event,WINBOOL *further_measurements_desired) {
    return This->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired);
}
/*** ID3D12Device7 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_AddToStateObject(ID3D12Device9* This,const D3D12_STATE_OBJECT_DESC *addition,ID3D12StateObject *state_object_to_grow_from,REFIID riid,void **new_state_object) {
    return This->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateProtectedResourceSession1(ID3D12Device9* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session);
}
/*** ID3D12Device8 methods ***/
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device9_GetResourceAllocationInfo2(ID3D12Device9* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC1 *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo2(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommittedResource2(ID3D12Device9* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC1 *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreatePlacedResource1(ID3D12Device9* This,ID3D12Heap *heap,UINT64 heap_offset,const D3D12_RESOURCE_DESC1 *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource);
}
static __WIDL_INLINE void ID3D12Device9_CreateSamplerFeedbackUnorderedAccessView(ID3D12Device9* This,ID3D12Resource *targeted_resource,ID3D12Resource *feedback_resource,D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor) {
    This->lpVtbl->CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor);
}
static __WIDL_INLINE void ID3D12Device9_GetCopyableFootprints1(ID3D12Device9* This,const D3D12_RESOURCE_DESC1 *resource_desc,UINT first_subresource,UINT subresources_count,UINT64 base_offset,D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,UINT *rows_count,UINT64 *row_size_in_bytes,UINT64 *total_bytes) {
    This->lpVtbl->GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes);
}
/*** ID3D12Device9 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device9_CreateShaderCacheSession(ID3D12Device9* This,const D3D12_SHADER_CACHE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateShaderCacheSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device9_ShaderCacheControl(ID3D12Device9* This,D3D12_SHADER_CACHE_KIND_FLAGS kinds,D3D12_SHADER_CACHE_CONTROL_FLAGS control) {
    return This->lpVtbl->ShaderCacheControl(This,kinds,control);
}
static __WIDL_INLINE HRESULT ID3D12Device9_CreateCommandQueue1(ID3D12Device9* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID creator_id,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue1(This,desc,creator_id,riid,command_queue);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Device10 interface
 */
#ifndef __ID3D12Device10_INTERFACE_DEFINED__
#define __ID3D12Device10_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Device10, 0x517f8718, 0xaa66, 0x49f9, 0xb0,0x2b, 0xa7,0xab,0x89,0xc0,0x60,0x31);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("517f8718-aa66-49f9-b02b-a7ab89c06031")
ID3D12Device10 : public ID3D12Device9
{
    virtual HRESULT STDMETHODCALLTYPE CreateCommittedResource3(
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_BARRIER_LAYOUT initial_layout,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        UINT32 castable_formats_count,
        DXGI_FORMAT *castable_formats,
        REFIID riid_resource,
        void **resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePlacedResource2(
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_BARRIER_LAYOUT initial_layout,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        UINT32 castable_formats_count,
        DXGI_FORMAT *castable_formats,
        REFIID riid,
        void **resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReservedResource2(
        const D3D12_RESOURCE_DESC *desc,
        D3D12_BARRIER_LAYOUT initial_layout,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        UINT32 castable_formats_count,
        DXGI_FORMAT *castable_formats,
        REFIID riid,
        void **resource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Device10, 0x517f8718, 0xaa66, 0x49f9, 0xb0,0x2b, 0xa7,0xab,0x89,0xc0,0x60,0x31)
#endif
#else
typedef struct ID3D12Device10Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *CopyDescriptors)(
        ID3D12Device10 *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)(
        ID3D12Device10 *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)(
        ID3D12Device10 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT reource_desc_count,
        const D3D12_RESOURCE_DESC *resource_descs);

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

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource)(
        ID3D12Device10 *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)(
        ID3D12Device10 *This,
        const D3D12_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource)(
        ID3D12Device10 *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)(
        ID3D12Device10 *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)(
        ID3D12Device10 *This,
        ID3D12DeviceChild *object,
        const SECURITY_ATTRIBUTES *attributes,
        DWORD access,
        const WCHAR *name,
        HANDLE *handle);

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *GetCopyableFootprints)(
        ID3D12Device10 *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)(
        ID3D12Device10 *This,
        const D3D12_QUERY_HEAP_DESC *desc,
        REFIID riid,
        void **heap);

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

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

    void (STDMETHODCALLTYPE *GetResourceTiling)(
        ID3D12Device10 *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)(
        ID3D12Device10 *This,
        LUID *__ret);

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

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

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

    /*** ID3D12Device2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePipelineState)(
        ID3D12Device10 *This,
        const D3D12_PIPELINE_STATE_STREAM_DESC *desc,
        REFIID riid,
        void **pipeline_state);

    /*** ID3D12Device3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromAddress)(
        ID3D12Device10 *This,
        const void *address,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *OpenExistingHeapFromFileMapping)(
        ID3D12Device10 *This,
        HANDLE file_mapping,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *EnqueueMakeResident)(
        ID3D12Device10 *This,
        D3D12_RESIDENCY_FLAGS flags,
        UINT num_objects,
        ID3D12Pageable *const *objects,
        ID3D12Fence *fence,
        UINT64 fence_value);

    /*** ID3D12Device4 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommandList1)(
        ID3D12Device10 *This,
        UINT node_mask,
        D3D12_COMMAND_LIST_TYPE type,
        D3D12_COMMAND_LIST_FLAGS flags,
        REFIID riid,
        void **command_list);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession)(
        ID3D12Device10 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource1)(
        ID3D12Device10 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateHeap1)(
        ID3D12Device10 *This,
        const D3D12_HEAP_DESC *desc,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **heap);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource1)(
        ID3D12Device10 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid,
        void **resource);

    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo1)(
        ID3D12Device10 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    /*** ID3D12Device5 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLifetimeTracker)(
        ID3D12Device10 *This,
        ID3D12LifetimeOwner *owner,
        REFIID riid,
        void **tracker);

    void (STDMETHODCALLTYPE *RemoveDevice)(
        ID3D12Device10 *This);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommands)(
        ID3D12Device10 *This,
        UINT *meta_commands_count,
        D3D12_META_COMMAND_DESC *descs);

    HRESULT (STDMETHODCALLTYPE *EnumerateMetaCommandParameters)(
        ID3D12Device10 *This,
        REFGUID command_id,
        D3D12_META_COMMAND_PARAMETER_STAGE stage,
        UINT *total_structure_size_in_bytes,
        UINT *parameter_count,
        D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs);

    HRESULT (STDMETHODCALLTYPE *CreateMetaCommand)(
        ID3D12Device10 *This,
        REFGUID command_id,
        UINT node_mask,
        const void *creation_parameters_data,
        SIZE_T creation_parameters_data_size_in_bytes,
        REFIID riid,
        void **meta_command);

    HRESULT (STDMETHODCALLTYPE *CreateStateObject)(
        ID3D12Device10 *This,
        const D3D12_STATE_OBJECT_DESC *desc,
        REFIID riid,
        void **state_object);

    void (STDMETHODCALLTYPE *GetRaytracingAccelerationStructurePrebuildInfo)(
        ID3D12Device10 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info);

    D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS (STDMETHODCALLTYPE *CheckDriverMatchingIdentifier)(
        ID3D12Device10 *This,
        D3D12_SERIALIZED_DATA_TYPE serialized_data_type,
        const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check);

    /*** ID3D12Device6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBackgroundProcessingMode)(
        ID3D12Device10 *This,
        D3D12_BACKGROUND_PROCESSING_MODE mode,
        D3D12_MEASUREMENTS_ACTION action,
        HANDLE event,
        WINBOOL *further_measurements_desired);

    /*** ID3D12Device7 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToStateObject)(
        ID3D12Device10 *This,
        const D3D12_STATE_OBJECT_DESC *addition,
        ID3D12StateObject *state_object_to_grow_from,
        REFIID riid,
        void **new_state_object);

    HRESULT (STDMETHODCALLTYPE *CreateProtectedResourceSession1)(
        ID3D12Device10 *This,
        const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,
        REFIID riid,
        void **session);

    /*** ID3D12Device8 methods ***/
    D3D12_RESOURCE_ALLOCATION_INFO * (STDMETHODCALLTYPE *GetResourceAllocationInfo2)(
        ID3D12Device10 *This,
        D3D12_RESOURCE_ALLOCATION_INFO *__ret,
        UINT visible_mask,
        UINT resource_descs_count,
        const D3D12_RESOURCE_DESC1 *resource_descs,
        D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1);

    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource2)(
        ID3D12Device10 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_resource_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource1)(
        ID3D12Device10 *This,
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_RESOURCE_STATES initial_state,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        REFIID riid,
        void **resource);

    void (STDMETHODCALLTYPE *CreateSamplerFeedbackUnorderedAccessView)(
        ID3D12Device10 *This,
        ID3D12Resource *targeted_resource,
        ID3D12Resource *feedback_resource,
        D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor);

    void (STDMETHODCALLTYPE *GetCopyableFootprints1)(
        ID3D12Device10 *This,
        const D3D12_RESOURCE_DESC1 *resource_desc,
        UINT first_subresource,
        UINT subresources_count,
        UINT64 base_offset,
        D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
        UINT *rows_count,
        UINT64 *row_size_in_bytes,
        UINT64 *total_bytes);

    /*** ID3D12Device9 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateShaderCacheSession)(
        ID3D12Device10 *This,
        const D3D12_SHADER_CACHE_SESSION_DESC *desc,
        REFIID riid,
        void **session);

    HRESULT (STDMETHODCALLTYPE *ShaderCacheControl)(
        ID3D12Device10 *This,
        D3D12_SHADER_CACHE_KIND_FLAGS kinds,
        D3D12_SHADER_CACHE_CONTROL_FLAGS control);

    HRESULT (STDMETHODCALLTYPE *CreateCommandQueue1)(
        ID3D12Device10 *This,
        const D3D12_COMMAND_QUEUE_DESC *desc,
        REFIID creator_id,
        REFIID riid,
        void **command_queue);

    /*** ID3D12Device10 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateCommittedResource3)(
        ID3D12Device10 *This,
        const D3D12_HEAP_PROPERTIES *heap_properties,
        D3D12_HEAP_FLAGS heap_flags,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_BARRIER_LAYOUT initial_layout,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        UINT32 castable_formats_count,
        DXGI_FORMAT *castable_formats,
        REFIID riid_resource,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreatePlacedResource2)(
        ID3D12Device10 *This,
        ID3D12Heap *heap,
        UINT64 heap_offset,
        const D3D12_RESOURCE_DESC1 *desc,
        D3D12_BARRIER_LAYOUT initial_layout,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        UINT32 castable_formats_count,
        DXGI_FORMAT *castable_formats,
        REFIID riid,
        void **resource);

    HRESULT (STDMETHODCALLTYPE *CreateReservedResource2)(
        ID3D12Device10 *This,
        const D3D12_RESOURCE_DESC *desc,
        D3D12_BARRIER_LAYOUT initial_layout,
        const D3D12_CLEAR_VALUE *optimized_clear_value,
        ID3D12ProtectedResourceSession *protected_session,
        UINT32 castable_formats_count,
        DXGI_FORMAT *castable_formats,
        REFIID riid,
        void **resource);

    END_INTERFACE
} ID3D12Device10Vtbl;

interface ID3D12Device10 {
    CONST_VTBL ID3D12Device10Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Device10_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Device10_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Device10_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12Device10_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12Device10_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12Device10_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12Device10_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12Device methods ***/
#define ID3D12Device10_GetNodeCount(This) (This)->lpVtbl->GetNodeCount(This)
#define ID3D12Device10_CreateCommandQueue(This,desc,riid,command_queue) (This)->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue)
#define ID3D12Device10_CreateCommandAllocator(This,type,riid,command_allocator) (This)->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator)
#define ID3D12Device10_CreateGraphicsPipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device10_CreateComputePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state)
#define ID3D12Device10_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 ID3D12Device10_CheckFeatureSupport(This,feature,feature_data,feature_data_size) (This)->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size)
#define ID3D12Device10_CreateDescriptorHeap(This,desc,riid,descriptor_heap) (This)->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap)
#define ID3D12Device10_GetDescriptorHandleIncrementSize(This,descriptor_heap_type) (This)->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type)
#define ID3D12Device10_CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature) (This)->lpVtbl->CreateRootSignature(This,node_mask,bytecode,bytecode_length,riid,root_signature)
#define ID3D12Device10_CreateConstantBufferView(This,desc,descriptor) (This)->lpVtbl->CreateConstantBufferView(This,desc,descriptor)
#define ID3D12Device10_CreateShaderResourceView(This,resource,desc,descriptor) (This)->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor)
#define ID3D12Device10_CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor) (This)->lpVtbl->CreateUnorderedAccessView(This,resource,counter_resource,desc,descriptor)
#define ID3D12Device10_CreateRenderTargetView(This,resource,desc,descriptor) (This)->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor)
#define ID3D12Device10_CreateDepthStencilView(This,resource,desc,descriptor) (This)->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor)
#define ID3D12Device10_CreateSampler(This,desc,descriptor) (This)->lpVtbl->CreateSampler(This,desc,descriptor)
#define ID3D12Device10_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 ID3D12Device10_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 ID3D12Device10_GetResourceAllocationInfo(This,visible_mask,reource_desc_count,resource_descs) ID3D12Device10_GetResourceAllocationInfo_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device10_GetCustomHeapProperties(This,node_mask,heap_type) ID3D12Device10_GetCustomHeapProperties_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device10_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 ID3D12Device10_CreateHeap(This,desc,riid,heap) (This)->lpVtbl->CreateHeap(This,desc,riid,heap)
#define ID3D12Device10_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 ID3D12Device10_CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreateReservedResource(This,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device10_CreateSharedHandle(This,object,attributes,access,name,handle) (This)->lpVtbl->CreateSharedHandle(This,object,attributes,access,name,handle)
#define ID3D12Device10_OpenSharedHandle(This,handle,riid,object) (This)->lpVtbl->OpenSharedHandle(This,handle,riid,object)
#define ID3D12Device10_OpenSharedHandleByName(This,name,access,handle) (This)->lpVtbl->OpenSharedHandleByName(This,name,access,handle)
#define ID3D12Device10_MakeResident(This,object_count,objects) (This)->lpVtbl->MakeResident(This,object_count,objects)
#define ID3D12Device10_Evict(This,object_count,objects) (This)->lpVtbl->Evict(This,object_count,objects)
#define ID3D12Device10_CreateFence(This,initial_value,flags,riid,fence) (This)->lpVtbl->CreateFence(This,initial_value,flags,riid,fence)
#define ID3D12Device10_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
#define ID3D12Device10_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 ID3D12Device10_CreateQueryHeap(This,desc,riid,heap) (This)->lpVtbl->CreateQueryHeap(This,desc,riid,heap)
#define ID3D12Device10_SetStablePowerState(This,enable) (This)->lpVtbl->SetStablePowerState(This,enable)
#define ID3D12Device10_CreateCommandSignature(This,desc,root_signature,riid,command_signature) (This)->lpVtbl->CreateCommandSignature(This,desc,root_signature,riid,command_signature)
#define ID3D12Device10_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 ID3D12Device10_GetAdapterLuid(This) ID3D12Device10_GetAdapterLuid_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device1 methods ***/
#define ID3D12Device10_CreatePipelineLibrary(This,blob,blob_size,iid,lib) (This)->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib)
#define ID3D12Device10_SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event) (This)->lpVtbl->SetEventOnMultipleFenceCompletion(This,fences,values,fence_count,flags,event)
#define ID3D12Device10_SetResidencyPriority(This,object_count,objects,priorities) (This)->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities)
/*** ID3D12Device2 methods ***/
#define ID3D12Device10_CreatePipelineState(This,desc,riid,pipeline_state) (This)->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state)
/*** ID3D12Device3 methods ***/
#define ID3D12Device10_OpenExistingHeapFromAddress(This,address,riid,heap) (This)->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap)
#define ID3D12Device10_OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap) (This)->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap)
#define ID3D12Device10_EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value) (This)->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value)
/*** ID3D12Device4 methods ***/
#define ID3D12Device10_CreateCommandList1(This,node_mask,type,flags,riid,command_list) (This)->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list)
#define ID3D12Device10_CreateProtectedResourceSession(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session)
#define ID3D12Device10_CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device10_CreateHeap1(This,desc,protected_session,riid,heap) (This)->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap)
#define ID3D12Device10_CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource) (This)->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource)
#define ID3D12Device10_GetResourceAllocationInfo1(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device10_GetResourceAllocationInfo1_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
/*** ID3D12Device5 methods ***/
#define ID3D12Device10_CreateLifetimeTracker(This,owner,riid,tracker) (This)->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker)
#define ID3D12Device10_RemoveDevice(This) (This)->lpVtbl->RemoveDevice(This)
#define ID3D12Device10_EnumerateMetaCommands(This,meta_commands_count,descs) (This)->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs)
#define ID3D12Device10_EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs) (This)->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs)
#define ID3D12Device10_CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command) (This)->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command)
#define ID3D12Device10_CreateStateObject(This,desc,riid,state_object) (This)->lpVtbl->CreateStateObject(This,desc,riid,state_object)
#define ID3D12Device10_GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info) (This)->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info)
#define ID3D12Device10_CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check) (This)->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check)
/*** ID3D12Device6 methods ***/
#define ID3D12Device10_SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired) (This)->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired)
/*** ID3D12Device7 methods ***/
#define ID3D12Device10_AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object) (This)->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object)
#define ID3D12Device10_CreateProtectedResourceSession1(This,desc,riid,session) (This)->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session)
/*** ID3D12Device8 methods ***/
#define ID3D12Device10_GetResourceAllocationInfo2(This,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1) ID3D12Device10_GetResourceAllocationInfo2_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define ID3D12Device10_CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource)
#define ID3D12Device10_CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource) (This)->lpVtbl->CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource)
#define ID3D12Device10_CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor) (This)->lpVtbl->CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor)
#define ID3D12Device10_GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes) (This)->lpVtbl->GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes)
/*** ID3D12Device9 methods ***/
#define ID3D12Device10_CreateShaderCacheSession(This,desc,riid,session) (This)->lpVtbl->CreateShaderCacheSession(This,desc,riid,session)
#define ID3D12Device10_ShaderCacheControl(This,kinds,control) (This)->lpVtbl->ShaderCacheControl(This,kinds,control)
#define ID3D12Device10_CreateCommandQueue1(This,desc,creator_id,riid,command_queue) (This)->lpVtbl->CreateCommandQueue1(This,desc,creator_id,riid,command_queue)
/*** ID3D12Device10 methods ***/
#define ID3D12Device10_CreateCommittedResource3(This,heap_properties,heap_flags,desc,initial_layout,optimized_clear_value,protected_session,castable_formats_count,castable_formats,riid_resource,resource) (This)->lpVtbl->CreateCommittedResource3(This,heap_properties,heap_flags,desc,initial_layout,optimized_clear_value,protected_session,castable_formats_count,castable_formats,riid_resource,resource)
#define ID3D12Device10_CreatePlacedResource2(This,heap,heap_offset,desc,initial_layout,optimized_clear_value,castable_formats_count,castable_formats,riid,resource) (This)->lpVtbl->CreatePlacedResource2(This,heap,heap_offset,desc,initial_layout,optimized_clear_value,castable_formats_count,castable_formats,riid,resource)
#define ID3D12Device10_CreateReservedResource2(This,desc,initial_layout,optimized_clear_value,protected_session,castable_formats_count,castable_formats,riid,resource) (This)->lpVtbl->CreateReservedResource2(This,desc,initial_layout,optimized_clear_value,protected_session,castable_formats_count,castable_formats,riid,resource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_QueryInterface(ID3D12Device10* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Device10_AddRef(ID3D12Device10* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Device10_Release(ID3D12Device10* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_GetPrivateData(ID3D12Device10* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device10_SetPrivateData(ID3D12Device10* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12Device10_SetPrivateDataInterface(ID3D12Device10* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12Device10_SetName(ID3D12Device10* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12Device methods ***/
static __WIDL_INLINE UINT ID3D12Device10_GetNodeCount(ID3D12Device10* This) {
    return This->lpVtbl->GetNodeCount(This);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommandQueue(ID3D12Device10* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue(This,desc,riid,command_queue);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommandAllocator(ID3D12Device10* This,D3D12_COMMAND_LIST_TYPE type,REFIID riid,void **command_allocator) {
    return This->lpVtbl->CreateCommandAllocator(This,type,riid,command_allocator);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateGraphicsPipelineState(ID3D12Device10* This,const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateGraphicsPipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateComputePipelineState(ID3D12Device10* This,const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreateComputePipelineState(This,desc,riid,pipeline_state);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommandList(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_CheckFeatureSupport(ID3D12Device10* This,D3D12_FEATURE feature,void *feature_data,UINT feature_data_size) {
    return This->lpVtbl->CheckFeatureSupport(This,feature,feature_data,feature_data_size);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateDescriptorHeap(ID3D12Device10* This,const D3D12_DESCRIPTOR_HEAP_DESC *desc,REFIID riid,void **descriptor_heap) {
    return This->lpVtbl->CreateDescriptorHeap(This,desc,riid,descriptor_heap);
}
static __WIDL_INLINE UINT ID3D12Device10_GetDescriptorHandleIncrementSize(ID3D12Device10* This,D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type) {
    return This->lpVtbl->GetDescriptorHandleIncrementSize(This,descriptor_heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateRootSignature(ID3D12Device10* 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 __WIDL_INLINE void ID3D12Device10_CreateConstantBufferView(ID3D12Device10* This,const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateConstantBufferView(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device10_CreateShaderResourceView(ID3D12Device10* This,ID3D12Resource *resource,const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateShaderResourceView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device10_CreateUnorderedAccessView(ID3D12Device10* 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 __WIDL_INLINE void ID3D12Device10_CreateRenderTargetView(ID3D12Device10* This,ID3D12Resource *resource,const D3D12_RENDER_TARGET_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateRenderTargetView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device10_CreateDepthStencilView(ID3D12Device10* This,ID3D12Resource *resource,const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateDepthStencilView(This,resource,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device10_CreateSampler(ID3D12Device10* This,const D3D12_SAMPLER_DESC *desc,D3D12_CPU_DESCRIPTOR_HANDLE descriptor) {
    This->lpVtbl->CreateSampler(This,desc,descriptor);
}
static __WIDL_INLINE void ID3D12Device10_CopyDescriptors(ID3D12Device10* 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 __WIDL_INLINE void ID3D12Device10_CopyDescriptorsSimple(ID3D12Device10* 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 __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device10_GetResourceAllocationInfo(ID3D12Device10* 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 __WIDL_INLINE D3D12_HEAP_PROPERTIES ID3D12Device10_GetCustomHeapProperties(ID3D12Device10* This,UINT node_mask,D3D12_HEAP_TYPE heap_type) {
    D3D12_HEAP_PROPERTIES __ret;
    return *This->lpVtbl->GetCustomHeapProperties(This,&__ret,node_mask,heap_type);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommittedResource(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_CreateHeap(ID3D12Device10* This,const D3D12_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreatePlacedResource(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_CreateReservedResource(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_CreateSharedHandle(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_OpenSharedHandle(ID3D12Device10* This,HANDLE handle,REFIID riid,void **object) {
    return This->lpVtbl->OpenSharedHandle(This,handle,riid,object);
}
static __WIDL_INLINE HRESULT ID3D12Device10_OpenSharedHandleByName(ID3D12Device10* This,const WCHAR *name,DWORD access,HANDLE *handle) {
    return This->lpVtbl->OpenSharedHandleByName(This,name,access,handle);
}
static __WIDL_INLINE HRESULT ID3D12Device10_MakeResident(ID3D12Device10* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->MakeResident(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device10_Evict(ID3D12Device10* This,UINT object_count,ID3D12Pageable *const *objects) {
    return This->lpVtbl->Evict(This,object_count,objects);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateFence(ID3D12Device10* This,UINT64 initial_value,D3D12_FENCE_FLAGS flags,REFIID riid,void **fence) {
    return This->lpVtbl->CreateFence(This,initial_value,flags,riid,fence);
}
static __WIDL_INLINE HRESULT ID3D12Device10_GetDeviceRemovedReason(ID3D12Device10* This) {
    return This->lpVtbl->GetDeviceRemovedReason(This);
}
static __WIDL_INLINE void ID3D12Device10_GetCopyableFootprints(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_CreateQueryHeap(ID3D12Device10* This,const D3D12_QUERY_HEAP_DESC *desc,REFIID riid,void **heap) {
    return This->lpVtbl->CreateQueryHeap(This,desc,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device10_SetStablePowerState(ID3D12Device10* This,WINBOOL enable) {
    return This->lpVtbl->SetStablePowerState(This,enable);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommandSignature(ID3D12Device10* 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 __WIDL_INLINE void ID3D12Device10_GetResourceTiling(ID3D12Device10* 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 __WIDL_INLINE LUID ID3D12Device10_GetAdapterLuid(ID3D12Device10* This) {
    LUID __ret;
    return *This->lpVtbl->GetAdapterLuid(This,&__ret);
}
/*** ID3D12Device1 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_CreatePipelineLibrary(ID3D12Device10* This,const void *blob,SIZE_T blob_size,REFIID iid,void **lib) {
    return This->lpVtbl->CreatePipelineLibrary(This,blob,blob_size,iid,lib);
}
static __WIDL_INLINE HRESULT ID3D12Device10_SetEventOnMultipleFenceCompletion(ID3D12Device10* 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 __WIDL_INLINE HRESULT ID3D12Device10_SetResidencyPriority(ID3D12Device10* This,UINT object_count,ID3D12Pageable *const *objects,const D3D12_RESIDENCY_PRIORITY *priorities) {
    return This->lpVtbl->SetResidencyPriority(This,object_count,objects,priorities);
}
/*** ID3D12Device2 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_CreatePipelineState(ID3D12Device10* This,const D3D12_PIPELINE_STATE_STREAM_DESC *desc,REFIID riid,void **pipeline_state) {
    return This->lpVtbl->CreatePipelineState(This,desc,riid,pipeline_state);
}
/*** ID3D12Device3 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_OpenExistingHeapFromAddress(ID3D12Device10* This,const void *address,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromAddress(This,address,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device10_OpenExistingHeapFromFileMapping(ID3D12Device10* This,HANDLE file_mapping,REFIID riid,void **heap) {
    return This->lpVtbl->OpenExistingHeapFromFileMapping(This,file_mapping,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device10_EnqueueMakeResident(ID3D12Device10* This,D3D12_RESIDENCY_FLAGS flags,UINT num_objects,ID3D12Pageable *const *objects,ID3D12Fence *fence,UINT64 fence_value) {
    return This->lpVtbl->EnqueueMakeResident(This,flags,num_objects,objects,fence,fence_value);
}
/*** ID3D12Device4 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommandList1(ID3D12Device10* This,UINT node_mask,D3D12_COMMAND_LIST_TYPE type,D3D12_COMMAND_LIST_FLAGS flags,REFIID riid,void **command_list) {
    return This->lpVtbl->CreateCommandList1(This,node_mask,type,flags,riid,command_list);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateProtectedResourceSession(ID3D12Device10* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommittedResource1(ID3D12Device10* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource1(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateHeap1(ID3D12Device10* This,const D3D12_HEAP_DESC *desc,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **heap) {
    return This->lpVtbl->CreateHeap1(This,desc,protected_session,riid,heap);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateReservedResource1(ID3D12Device10* This,const D3D12_RESOURCE_DESC *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource1(This,desc,initial_state,optimized_clear_value,protected_session,riid,resource);
}
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device10_GetResourceAllocationInfo1(ID3D12Device10* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo1(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
/*** ID3D12Device5 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_CreateLifetimeTracker(ID3D12Device10* This,ID3D12LifetimeOwner *owner,REFIID riid,void **tracker) {
    return This->lpVtbl->CreateLifetimeTracker(This,owner,riid,tracker);
}
static __WIDL_INLINE void ID3D12Device10_RemoveDevice(ID3D12Device10* This) {
    This->lpVtbl->RemoveDevice(This);
}
static __WIDL_INLINE HRESULT ID3D12Device10_EnumerateMetaCommands(ID3D12Device10* This,UINT *meta_commands_count,D3D12_META_COMMAND_DESC *descs) {
    return This->lpVtbl->EnumerateMetaCommands(This,meta_commands_count,descs);
}
static __WIDL_INLINE HRESULT ID3D12Device10_EnumerateMetaCommandParameters(ID3D12Device10* This,REFGUID command_id,D3D12_META_COMMAND_PARAMETER_STAGE stage,UINT *total_structure_size_in_bytes,UINT *parameter_count,D3D12_META_COMMAND_PARAMETER_DESC *parameter_descs) {
    return This->lpVtbl->EnumerateMetaCommandParameters(This,command_id,stage,total_structure_size_in_bytes,parameter_count,parameter_descs);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateMetaCommand(ID3D12Device10* This,REFGUID command_id,UINT node_mask,const void *creation_parameters_data,SIZE_T creation_parameters_data_size_in_bytes,REFIID riid,void **meta_command) {
    return This->lpVtbl->CreateMetaCommand(This,command_id,node_mask,creation_parameters_data,creation_parameters_data_size_in_bytes,riid,meta_command);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateStateObject(ID3D12Device10* This,const D3D12_STATE_OBJECT_DESC *desc,REFIID riid,void **state_object) {
    return This->lpVtbl->CreateStateObject(This,desc,riid,state_object);
}
static __WIDL_INLINE void ID3D12Device10_GetRaytracingAccelerationStructurePrebuildInfo(ID3D12Device10* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *desc,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *info) {
    This->lpVtbl->GetRaytracingAccelerationStructurePrebuildInfo(This,desc,info);
}
static __WIDL_INLINE D3D12_DRIVER_MATCHING_IDENTIFIER_STATUS ID3D12Device10_CheckDriverMatchingIdentifier(ID3D12Device10* This,D3D12_SERIALIZED_DATA_TYPE serialized_data_type,const D3D12_SERIALIZED_DATA_DRIVER_MATCHING_IDENTIFIER *identifier_to_check) {
    return This->lpVtbl->CheckDriverMatchingIdentifier(This,serialized_data_type,identifier_to_check);
}
/*** ID3D12Device6 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_SetBackgroundProcessingMode(ID3D12Device10* This,D3D12_BACKGROUND_PROCESSING_MODE mode,D3D12_MEASUREMENTS_ACTION action,HANDLE event,WINBOOL *further_measurements_desired) {
    return This->lpVtbl->SetBackgroundProcessingMode(This,mode,action,event,further_measurements_desired);
}
/*** ID3D12Device7 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_AddToStateObject(ID3D12Device10* This,const D3D12_STATE_OBJECT_DESC *addition,ID3D12StateObject *state_object_to_grow_from,REFIID riid,void **new_state_object) {
    return This->lpVtbl->AddToStateObject(This,addition,state_object_to_grow_from,riid,new_state_object);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateProtectedResourceSession1(ID3D12Device10* This,const D3D12_PROTECTED_RESOURCE_SESSION_DESC1 *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateProtectedResourceSession1(This,desc,riid,session);
}
/*** ID3D12Device8 methods ***/
static __WIDL_INLINE D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device10_GetResourceAllocationInfo2(ID3D12Device10* This,UINT visible_mask,UINT resource_descs_count,const D3D12_RESOURCE_DESC1 *resource_descs,D3D12_RESOURCE_ALLOCATION_INFO1 *resource_allocation_info1) {
    D3D12_RESOURCE_ALLOCATION_INFO __ret;
    return *This->lpVtbl->GetResourceAllocationInfo2(This,&__ret,visible_mask,resource_descs_count,resource_descs,resource_allocation_info1);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommittedResource2(ID3D12Device10* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC1 *desc,D3D12_RESOURCE_STATES initial_resource_state,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource2(This,heap_properties,heap_flags,desc,initial_resource_state,optimized_clear_value,protected_session,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreatePlacedResource1(ID3D12Device10* This,ID3D12Heap *heap,UINT64 heap_offset,const D3D12_RESOURCE_DESC1 *desc,D3D12_RESOURCE_STATES initial_state,const D3D12_CLEAR_VALUE *optimized_clear_value,REFIID riid,void **resource) {
    return This->lpVtbl->CreatePlacedResource1(This,heap,heap_offset,desc,initial_state,optimized_clear_value,riid,resource);
}
static __WIDL_INLINE void ID3D12Device10_CreateSamplerFeedbackUnorderedAccessView(ID3D12Device10* This,ID3D12Resource *targeted_resource,ID3D12Resource *feedback_resource,D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor) {
    This->lpVtbl->CreateSamplerFeedbackUnorderedAccessView(This,targeted_resource,feedback_resource,dst_descriptor);
}
static __WIDL_INLINE void ID3D12Device10_GetCopyableFootprints1(ID3D12Device10* This,const D3D12_RESOURCE_DESC1 *resource_desc,UINT first_subresource,UINT subresources_count,UINT64 base_offset,D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,UINT *rows_count,UINT64 *row_size_in_bytes,UINT64 *total_bytes) {
    This->lpVtbl->GetCopyableFootprints1(This,resource_desc,first_subresource,subresources_count,base_offset,layouts,rows_count,row_size_in_bytes,total_bytes);
}
/*** ID3D12Device9 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_CreateShaderCacheSession(ID3D12Device10* This,const D3D12_SHADER_CACHE_SESSION_DESC *desc,REFIID riid,void **session) {
    return This->lpVtbl->CreateShaderCacheSession(This,desc,riid,session);
}
static __WIDL_INLINE HRESULT ID3D12Device10_ShaderCacheControl(ID3D12Device10* This,D3D12_SHADER_CACHE_KIND_FLAGS kinds,D3D12_SHADER_CACHE_CONTROL_FLAGS control) {
    return This->lpVtbl->ShaderCacheControl(This,kinds,control);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommandQueue1(ID3D12Device10* This,const D3D12_COMMAND_QUEUE_DESC *desc,REFIID creator_id,REFIID riid,void **command_queue) {
    return This->lpVtbl->CreateCommandQueue1(This,desc,creator_id,riid,command_queue);
}
/*** ID3D12Device10 methods ***/
static __WIDL_INLINE HRESULT ID3D12Device10_CreateCommittedResource3(ID3D12Device10* This,const D3D12_HEAP_PROPERTIES *heap_properties,D3D12_HEAP_FLAGS heap_flags,const D3D12_RESOURCE_DESC1 *desc,D3D12_BARRIER_LAYOUT initial_layout,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,UINT32 castable_formats_count,DXGI_FORMAT *castable_formats,REFIID riid_resource,void **resource) {
    return This->lpVtbl->CreateCommittedResource3(This,heap_properties,heap_flags,desc,initial_layout,optimized_clear_value,protected_session,castable_formats_count,castable_formats,riid_resource,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreatePlacedResource2(ID3D12Device10* This,ID3D12Heap *heap,UINT64 heap_offset,const D3D12_RESOURCE_DESC1 *desc,D3D12_BARRIER_LAYOUT initial_layout,const D3D12_CLEAR_VALUE *optimized_clear_value,UINT32 castable_formats_count,DXGI_FORMAT *castable_formats,REFIID riid,void **resource) {
    return This->lpVtbl->CreatePlacedResource2(This,heap,heap_offset,desc,initial_layout,optimized_clear_value,castable_formats_count,castable_formats,riid,resource);
}
static __WIDL_INLINE HRESULT ID3D12Device10_CreateReservedResource2(ID3D12Device10* This,const D3D12_RESOURCE_DESC *desc,D3D12_BARRIER_LAYOUT initial_layout,const D3D12_CLEAR_VALUE *optimized_clear_value,ID3D12ProtectedResourceSession *protected_session,UINT32 castable_formats_count,DXGI_FORMAT *castable_formats,REFIID riid,void **resource) {
    return This->lpVtbl->CreateReservedResource2(This,desc,initial_layout,optimized_clear_value,protected_session,castable_formats_count,castable_formats,riid,resource);
}
#endif
#endif

#endif


#endif  /* __ID3D12Device10_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12VirtualizationGuestDevice interface
 */
#ifndef __ID3D12VirtualizationGuestDevice_INTERFACE_DEFINED__
#define __ID3D12VirtualizationGuestDevice_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12VirtualizationGuestDevice, 0xbc66d368, 0x7373, 0x4943, 0x87,0x57, 0xfc,0x87,0xdc,0x79,0xe4,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bc66d368-7373-4943-8757-fc87dc79e476")
ID3D12VirtualizationGuestDevice : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ShareWithHost(
        ID3D12DeviceChild *object,
        HANDLE *handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFenceFd(
        ID3D12Fence *fence,
        UINT64 fence_value,
        int *fence_fd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12VirtualizationGuestDevice, 0xbc66d368, 0x7373, 0x4943, 0x87,0x57, 0xfc,0x87,0xdc,0x79,0xe4,0x76)
#endif
#else
typedef struct ID3D12VirtualizationGuestDeviceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12VirtualizationGuestDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *ShareWithHost)(
        ID3D12VirtualizationGuestDevice *This,
        ID3D12DeviceChild *object,
        HANDLE *handle);

    HRESULT (STDMETHODCALLTYPE *CreateFenceFd)(
        ID3D12VirtualizationGuestDevice *This,
        ID3D12Fence *fence,
        UINT64 fence_value,
        int *fence_fd);

    END_INTERFACE
} ID3D12VirtualizationGuestDeviceVtbl;

interface ID3D12VirtualizationGuestDevice {
    CONST_VTBL ID3D12VirtualizationGuestDeviceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12VirtualizationGuestDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12VirtualizationGuestDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12VirtualizationGuestDevice_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12VirtualizationGuestDevice methods ***/
#define ID3D12VirtualizationGuestDevice_ShareWithHost(This,object,handle) (This)->lpVtbl->ShareWithHost(This,object,handle)
#define ID3D12VirtualizationGuestDevice_CreateFenceFd(This,fence,fence_value,fence_fd) (This)->lpVtbl->CreateFenceFd(This,fence,fence_value,fence_fd)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12VirtualizationGuestDevice_QueryInterface(ID3D12VirtualizationGuestDevice* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12VirtualizationGuestDevice_AddRef(ID3D12VirtualizationGuestDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12VirtualizationGuestDevice_Release(ID3D12VirtualizationGuestDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12VirtualizationGuestDevice methods ***/
static __WIDL_INLINE HRESULT ID3D12VirtualizationGuestDevice_ShareWithHost(ID3D12VirtualizationGuestDevice* This,ID3D12DeviceChild *object,HANDLE *handle) {
    return This->lpVtbl->ShareWithHost(This,object,handle);
}
static __WIDL_INLINE HRESULT ID3D12VirtualizationGuestDevice_CreateFenceFd(ID3D12VirtualizationGuestDevice* This,ID3D12Fence *fence,UINT64 fence_value,int *fence_fd) {
    return This->lpVtbl->CreateFenceFd(This,fence,fence_value,fence_fd);
}
#endif
#endif

#endif


#endif  /* __ID3D12VirtualizationGuestDevice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12Tools interface
 */
#ifndef __ID3D12Tools_INTERFACE_DEFINED__
#define __ID3D12Tools_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12Tools, 0x7071e1f0, 0xe84b, 0x4b33, 0x97,0x4f, 0x12,0xfa,0x49,0xde,0x65,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7071e1f0-e84b-4b33-974f-12fa49de65c5")
ID3D12Tools : public IUnknown
{
    virtual void STDMETHODCALLTYPE EnableShaderInstrumentation(
        WINBOOL enable) = 0;

    virtual WINBOOL STDMETHODCALLTYPE ShaderInstrumentationEnabled(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12Tools, 0x7071e1f0, 0xe84b, 0x4b33, 0x97,0x4f, 0x12,0xfa,0x49,0xde,0x65,0xc5)
#endif
#else
typedef struct ID3D12ToolsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12Tools methods ***/
    void (STDMETHODCALLTYPE *EnableShaderInstrumentation)(
        ID3D12Tools *This,
        WINBOOL enable);

    WINBOOL (STDMETHODCALLTYPE *ShaderInstrumentationEnabled)(
        ID3D12Tools *This);

    END_INTERFACE
} ID3D12ToolsVtbl;

interface ID3D12Tools {
    CONST_VTBL ID3D12ToolsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12Tools_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12Tools_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12Tools_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Tools methods ***/
#define ID3D12Tools_EnableShaderInstrumentation(This,enable) (This)->lpVtbl->EnableShaderInstrumentation(This,enable)
#define ID3D12Tools_ShaderInstrumentationEnabled(This) (This)->lpVtbl->ShaderInstrumentationEnabled(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12Tools_QueryInterface(ID3D12Tools* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12Tools_AddRef(ID3D12Tools* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12Tools_Release(ID3D12Tools* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Tools methods ***/
static __WIDL_INLINE void ID3D12Tools_EnableShaderInstrumentation(ID3D12Tools* This,WINBOOL enable) {
    This->lpVtbl->EnableShaderInstrumentation(This,enable);
}
static __WIDL_INLINE WINBOOL ID3D12Tools_ShaderInstrumentationEnabled(ID3D12Tools* This) {
    return This->lpVtbl->ShaderInstrumentationEnabled(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12Tools_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_D3D12Debug,                     0xf2352aeb, 0xdd84, 0x49fe, 0xb9, 0x7b, 0xa9, 0xdc, 0xfd, 0xcc, 0x1b, 0x4f);
DEFINE_GUID(CLSID_D3D12Tools,                     0xe38216b1, 0x3c8c, 0x4833, 0xaa, 0x09, 0x0a, 0x06, 0xb6, 0x5d, 0x96, 0xc8);
DEFINE_GUID(CLSID_D3D12DeviceRemovedExtendedData, 0x4a75bbc4, 0x9ff4, 0x4ad8, 0x9f, 0x18, 0xab, 0xae, 0x84, 0xdc, 0x5f, 0xf2);
DEFINE_GUID(CLSID_D3D12SDKConfiguration,          0x7cda6aca, 0xa03e, 0x49c8, 0x94, 0x58, 0x03, 0x34, 0xd2, 0x0e, 0x07, 0xce);
/*****************************************************************************
 * ID3D12SDKConfiguration interface
 */
#ifndef __ID3D12SDKConfiguration_INTERFACE_DEFINED__
#define __ID3D12SDKConfiguration_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12SDKConfiguration, 0xe9eb5314, 0x33aa, 0x42b2, 0xa7,0x18, 0xd7,0x7f,0x58,0xb1,0xf1,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e9eb5314-33aa-42b2-a718-d77f58b1f1c7")
ID3D12SDKConfiguration : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetSDKVersion(
        UINT version,
        const char *path) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12SDKConfiguration, 0xe9eb5314, 0x33aa, 0x42b2, 0xa7,0x18, 0xd7,0x7f,0x58,0xb1,0xf1,0xc7)
#endif
#else
typedef struct ID3D12SDKConfigurationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ID3D12SDKConfiguration methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSDKVersion)(
        ID3D12SDKConfiguration *This,
        UINT version,
        const char *path);

    END_INTERFACE
} ID3D12SDKConfigurationVtbl;

interface ID3D12SDKConfiguration {
    CONST_VTBL ID3D12SDKConfigurationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12SDKConfiguration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12SDKConfiguration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12SDKConfiguration_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12SDKConfiguration methods ***/
#define ID3D12SDKConfiguration_SetSDKVersion(This,version,path) (This)->lpVtbl->SetSDKVersion(This,version,path)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12SDKConfiguration_QueryInterface(ID3D12SDKConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12SDKConfiguration_AddRef(ID3D12SDKConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12SDKConfiguration_Release(ID3D12SDKConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12SDKConfiguration methods ***/
static __WIDL_INLINE HRESULT ID3D12SDKConfiguration_SetSDKVersion(ID3D12SDKConfiguration* This,UINT version,const char *path) {
    return This->lpVtbl->SetSDKVersion(This,version,path);
}
#endif
#endif

#endif


#endif  /* __ID3D12SDKConfiguration_INTERFACE_DEFINED__ */

typedef enum D3D12_AXIS_SHADING_RATE {
    D3D12_AXIS_SHADING_RATE_1X = 0x0,
    D3D12_AXIS_SHADING_RATE_2X = 0x1,
    D3D12_AXIS_SHADING_RATE_4X = 0x2
} D3D12_AXIS_SHADING_RATE;
typedef enum D3D12_SHADING_RATE {
    D3D12_SHADING_RATE_1X1 = 0x0,
    D3D12_SHADING_RATE_1X2 = 0x1,
    D3D12_SHADING_RATE_2X1 = 0x4,
    D3D12_SHADING_RATE_2X2 = 0x5,
    D3D12_SHADING_RATE_2X4 = 0x6,
    D3D12_SHADING_RATE_4X2 = 0x9,
    D3D12_SHADING_RATE_4X4 = 0xa
} D3D12_SHADING_RATE;
typedef enum D3D12_SHADING_RATE_COMBINER {
    D3D12_SHADING_RATE_COMBINER_PASSTHROUGH = 0x0,
    D3D12_SHADING_RATE_COMBINER_OVERRIDE = 0x1,
    D3D12_SHADING_RATE_COMBINER_MIN = 0x2,
    D3D12_SHADING_RATE_COMBINER_MAX = 0x3,
    D3D12_SHADING_RATE_COMBINER_SUM = 0x4
} D3D12_SHADING_RATE_COMBINER;
/*****************************************************************************
 * ID3D12GraphicsCommandList5 interface
 */
#ifndef __ID3D12GraphicsCommandList5_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList5_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList5, 0x55050859, 0x4024, 0x474c, 0x87,0xf5, 0x64,0x72,0xea,0xee,0x44,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("55050859-4024-474c-87f5-6472eaee44ea")
ID3D12GraphicsCommandList5 : public ID3D12GraphicsCommandList4
{
    virtual void STDMETHODCALLTYPE RSSetShadingRate(
        D3D12_SHADING_RATE base_shading_rate,
        const D3D12_SHADING_RATE_COMBINER *combiners) = 0;

    virtual void STDMETHODCALLTYPE RSSetShadingRateImage(
        ID3D12Resource *shading_rate_image) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList5, 0x55050859, 0x4024, 0x474c, 0x87,0xf5, 0x64,0x72,0xea,0xee,0x44,0xea)
#endif
#else
typedef struct ID3D12GraphicsCommandList5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12PipelineState *pipeline_state);

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

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

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

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

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

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

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *This,
        FLOAT min,
        FLOAT max);

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

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList5 *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)(
        ID3D12GraphicsCommandList5 *This,
        UINT mask);

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

    /*** ID3D12GraphicsCommandList3 methods ***/
    void (STDMETHODCALLTYPE *SetProtectedResourceSession)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12ProtectedResourceSession *protected_resource_session);

    /*** ID3D12GraphicsCommandList4 methods ***/
    void (STDMETHODCALLTYPE *BeginRenderPass)(
        ID3D12GraphicsCommandList5 *This,
        UINT render_targets_count,
        const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,
        const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,
        D3D12_RENDER_PASS_FLAGS flags);

    void (STDMETHODCALLTYPE *EndRenderPass)(
        ID3D12GraphicsCommandList5 *This);

    void (STDMETHODCALLTYPE *InitializeMetaCommand)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12MetaCommand *meta_command,
        const void *initialization_parameters_data,
        SIZE_T initialization_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *ExecuteMetaCommand)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12MetaCommand *meta_command,
        const void *execution_parameters_data,
        SIZE_T execution_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *BuildRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList5 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,
        UINT postbuild_info_descs_count,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs);

    void (STDMETHODCALLTYPE *EmitRaytracingAccelerationStructurePostbuildInfo)(
        ID3D12GraphicsCommandList5 *This,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,
        UINT src_acceleration_structures_count,
        const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data);

    void (STDMETHODCALLTYPE *CopyRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList5 *This,
        D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,
        D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode);

    void (STDMETHODCALLTYPE *SetPipelineState1)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12StateObject *state_object);

    void (STDMETHODCALLTYPE *DispatchRays)(
        ID3D12GraphicsCommandList5 *This,
        const D3D12_DISPATCH_RAYS_DESC *desc);

    /*** ID3D12GraphicsCommandList5 methods ***/
    void (STDMETHODCALLTYPE *RSSetShadingRate)(
        ID3D12GraphicsCommandList5 *This,
        D3D12_SHADING_RATE base_shading_rate,
        const D3D12_SHADING_RATE_COMBINER *combiners);

    void (STDMETHODCALLTYPE *RSSetShadingRateImage)(
        ID3D12GraphicsCommandList5 *This,
        ID3D12Resource *shading_rate_image);

    END_INTERFACE
} ID3D12GraphicsCommandList5Vtbl;

interface ID3D12GraphicsCommandList5 {
    CONST_VTBL ID3D12GraphicsCommandList5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList5_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList5_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList5_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList5_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList5_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList5_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList5_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList5_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList5_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList5_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList5_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList5_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList5_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList5_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList5_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList5_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList5_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList5_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList5_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList5_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList5_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList5_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList5_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList5_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList5_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList5_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList5_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList5_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList5_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList5_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList5_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList5_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList5_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList5_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList5_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList5_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList5_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList5_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList5_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList5_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList5_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList5_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList5_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 ID3D12GraphicsCommandList5_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
/*** ID3D12GraphicsCommandList2 methods ***/
#define ID3D12GraphicsCommandList5_WriteBufferImmediate(This,count,parameters,modes) (This)->lpVtbl->WriteBufferImmediate(This,count,parameters,modes)
/*** ID3D12GraphicsCommandList3 methods ***/
#define ID3D12GraphicsCommandList5_SetProtectedResourceSession(This,protected_resource_session) (This)->lpVtbl->SetProtectedResourceSession(This,protected_resource_session)
/*** ID3D12GraphicsCommandList4 methods ***/
#define ID3D12GraphicsCommandList5_BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags) (This)->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags)
#define ID3D12GraphicsCommandList5_EndRenderPass(This) (This)->lpVtbl->EndRenderPass(This)
#define ID3D12GraphicsCommandList5_InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes) (This)->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList5_ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes) (This)->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList5_BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs) (This)->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs)
#define ID3D12GraphicsCommandList5_EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data) (This)->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data)
#define ID3D12GraphicsCommandList5_CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode) (This)->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode)
#define ID3D12GraphicsCommandList5_SetPipelineState1(This,state_object) (This)->lpVtbl->SetPipelineState1(This,state_object)
#define ID3D12GraphicsCommandList5_DispatchRays(This,desc) (This)->lpVtbl->DispatchRays(This,desc)
/*** ID3D12GraphicsCommandList5 methods ***/
#define ID3D12GraphicsCommandList5_RSSetShadingRate(This,base_shading_rate,combiners) (This)->lpVtbl->RSSetShadingRate(This,base_shading_rate,combiners)
#define ID3D12GraphicsCommandList5_RSSetShadingRateImage(This,shading_rate_image) (This)->lpVtbl->RSSetShadingRateImage(This,shading_rate_image)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_QueryInterface(ID3D12GraphicsCommandList5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList5_AddRef(ID3D12GraphicsCommandList5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList5_Release(ID3D12GraphicsCommandList5* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_GetPrivateData(ID3D12GraphicsCommandList5* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_SetPrivateData(ID3D12GraphicsCommandList5* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_SetPrivateDataInterface(ID3D12GraphicsCommandList5* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_SetName(ID3D12GraphicsCommandList5* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_GetDevice(ID3D12GraphicsCommandList5* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList5_GetType(ID3D12GraphicsCommandList5* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_Close(ID3D12GraphicsCommandList5* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList5_Reset(ID3D12GraphicsCommandList5* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ClearState(ID3D12GraphicsCommandList5* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_DrawInstanced(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_DrawIndexedInstanced(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_Dispatch(ID3D12GraphicsCommandList5* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_CopyBufferRegion(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_CopyTextureRegion(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_CopyResource(ID3D12GraphicsCommandList5* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_CopyTiles(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_ResolveSubresource(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_IASetPrimitiveTopology(ID3D12GraphicsCommandList5* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_RSSetViewports(ID3D12GraphicsCommandList5* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_RSSetScissorRects(ID3D12GraphicsCommandList5* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_OMSetBlendFactor(ID3D12GraphicsCommandList5* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_OMSetStencilRef(ID3D12GraphicsCommandList5* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetPipelineState(ID3D12GraphicsCommandList5* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ResourceBarrier(ID3D12GraphicsCommandList5* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ExecuteBundle(ID3D12GraphicsCommandList5* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetDescriptorHeaps(ID3D12GraphicsCommandList5* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRootSignature(ID3D12GraphicsCommandList5* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRootSignature(ID3D12GraphicsCommandList5* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList5* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_IASetIndexBuffer(ID3D12GraphicsCommandList5* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_IASetVertexBuffers(ID3D12GraphicsCommandList5* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SOSetTargets(ID3D12GraphicsCommandList5* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_OMSetRenderTargets(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_ClearDepthStencilView(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_ClearRenderTargetView(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_DiscardResource(ID3D12GraphicsCommandList5* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_BeginQuery(ID3D12GraphicsCommandList5* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_EndQuery(ID3D12GraphicsCommandList5* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ResolveQueryData(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_SetPredication(ID3D12GraphicsCommandList5* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetMarker(ID3D12GraphicsCommandList5* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_BeginEvent(ID3D12GraphicsCommandList5* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_EndEvent(ID3D12GraphicsCommandList5* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ExecuteIndirect(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_AtomicCopyBufferUINT(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_OMSetDepthBounds(ID3D12GraphicsCommandList5* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetSamplePositions(ID3D12GraphicsCommandList5* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ResolveSubresourceRegion(ID3D12GraphicsCommandList5* 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 __WIDL_INLINE void ID3D12GraphicsCommandList5_SetViewInstanceMask(ID3D12GraphicsCommandList5* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList5_WriteBufferImmediate(ID3D12GraphicsCommandList5* This,UINT count,const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) {
    This->lpVtbl->WriteBufferImmediate(This,count,parameters,modes);
}
/*** ID3D12GraphicsCommandList3 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetProtectedResourceSession(ID3D12GraphicsCommandList5* This,ID3D12ProtectedResourceSession *protected_resource_session) {
    This->lpVtbl->SetProtectedResourceSession(This,protected_resource_session);
}
/*** ID3D12GraphicsCommandList4 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList5_BeginRenderPass(ID3D12GraphicsCommandList5* This,UINT render_targets_count,const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,D3D12_RENDER_PASS_FLAGS flags) {
    This->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_EndRenderPass(ID3D12GraphicsCommandList5* This) {
    This->lpVtbl->EndRenderPass(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_InitializeMetaCommand(ID3D12GraphicsCommandList5* This,ID3D12MetaCommand *meta_command,const void *initialization_parameters_data,SIZE_T initialization_parameters_data_size_in_bytes) {
    This->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_ExecuteMetaCommand(ID3D12GraphicsCommandList5* This,ID3D12MetaCommand *meta_command,const void *execution_parameters_data,SIZE_T execution_parameters_data_size_in_bytes) {
    This->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_BuildRaytracingAccelerationStructure(ID3D12GraphicsCommandList5* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,UINT postbuild_info_descs_count,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs) {
    This->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_EmitRaytracingAccelerationStructurePostbuildInfo(ID3D12GraphicsCommandList5* This,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,UINT src_acceleration_structures_count,const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data) {
    This->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_CopyRaytracingAccelerationStructure(ID3D12GraphicsCommandList5* This,D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) {
    This->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_SetPipelineState1(ID3D12GraphicsCommandList5* This,ID3D12StateObject *state_object) {
    This->lpVtbl->SetPipelineState1(This,state_object);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_DispatchRays(ID3D12GraphicsCommandList5* This,const D3D12_DISPATCH_RAYS_DESC *desc) {
    This->lpVtbl->DispatchRays(This,desc);
}
/*** ID3D12GraphicsCommandList5 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList5_RSSetShadingRate(ID3D12GraphicsCommandList5* This,D3D12_SHADING_RATE base_shading_rate,const D3D12_SHADING_RATE_COMBINER *combiners) {
    This->lpVtbl->RSSetShadingRate(This,base_shading_rate,combiners);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList5_RSSetShadingRateImage(ID3D12GraphicsCommandList5* This,ID3D12Resource *shading_rate_image) {
    This->lpVtbl->RSSetShadingRateImage(This,shading_rate_image);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList5_INTERFACE_DEFINED__ */

#define D3D12_SHADING_RATE_X_AXIS_SHIFT (2)

#define D3D12_SHADING_RATE_VALID_MASK (3)

#define D3D12_MAKE_COARSE_SHADING_RATE(x, y) ((x) << D3D12_SHADING_RATE_X_AXIS_SHIFT | (y))
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(val) (((val) >> D3D12_SHADING_RATE_X_AXIS_SHIFT) & D3D12_SHADING_RATE_VALID_MASK)
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(val) ((val) & D3D12_SHADING_RATE_VALID_MASK)
typedef struct D3D12_DISPATCH_MESH_ARGUMENTS {
    UINT ThreadGroupCountX;
    UINT ThreadGroupCountY;
    UINT ThreadGroupCountZ;
} D3D12_DISPATCH_MESH_ARGUMENTS;
/*****************************************************************************
 * ID3D12GraphicsCommandList6 interface
 */
#ifndef __ID3D12GraphicsCommandList6_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList6_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList6, 0xc3827890, 0xe548, 0x4cfa, 0x96,0xcf, 0x56,0x89,0xa9,0x37,0x0f,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c3827890-e548-4cfa-96cf-5689a9370f80")
ID3D12GraphicsCommandList6 : public ID3D12GraphicsCommandList5
{
    virtual void STDMETHODCALLTYPE DispatchMesh(
        UINT thread_group_count_x,
        UINT thread_group_count_y,
        UINT thread_group_count_z) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList6, 0xc3827890, 0xe548, 0x4cfa, 0x96,0xcf, 0x56,0x89,0xa9,0x37,0x0f,0x80)
#endif
#else
typedef struct ID3D12GraphicsCommandList6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12PipelineState *pipeline_state);

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

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

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

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

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

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

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *This,
        FLOAT min,
        FLOAT max);

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

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList6 *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)(
        ID3D12GraphicsCommandList6 *This,
        UINT mask);

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

    /*** ID3D12GraphicsCommandList3 methods ***/
    void (STDMETHODCALLTYPE *SetProtectedResourceSession)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12ProtectedResourceSession *protected_resource_session);

    /*** ID3D12GraphicsCommandList4 methods ***/
    void (STDMETHODCALLTYPE *BeginRenderPass)(
        ID3D12GraphicsCommandList6 *This,
        UINT render_targets_count,
        const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,
        const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,
        D3D12_RENDER_PASS_FLAGS flags);

    void (STDMETHODCALLTYPE *EndRenderPass)(
        ID3D12GraphicsCommandList6 *This);

    void (STDMETHODCALLTYPE *InitializeMetaCommand)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12MetaCommand *meta_command,
        const void *initialization_parameters_data,
        SIZE_T initialization_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *ExecuteMetaCommand)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12MetaCommand *meta_command,
        const void *execution_parameters_data,
        SIZE_T execution_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *BuildRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList6 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,
        UINT postbuild_info_descs_count,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs);

    void (STDMETHODCALLTYPE *EmitRaytracingAccelerationStructurePostbuildInfo)(
        ID3D12GraphicsCommandList6 *This,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,
        UINT src_acceleration_structures_count,
        const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data);

    void (STDMETHODCALLTYPE *CopyRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList6 *This,
        D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,
        D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode);

    void (STDMETHODCALLTYPE *SetPipelineState1)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12StateObject *state_object);

    void (STDMETHODCALLTYPE *DispatchRays)(
        ID3D12GraphicsCommandList6 *This,
        const D3D12_DISPATCH_RAYS_DESC *desc);

    /*** ID3D12GraphicsCommandList5 methods ***/
    void (STDMETHODCALLTYPE *RSSetShadingRate)(
        ID3D12GraphicsCommandList6 *This,
        D3D12_SHADING_RATE base_shading_rate,
        const D3D12_SHADING_RATE_COMBINER *combiners);

    void (STDMETHODCALLTYPE *RSSetShadingRateImage)(
        ID3D12GraphicsCommandList6 *This,
        ID3D12Resource *shading_rate_image);

    /*** ID3D12GraphicsCommandList6 methods ***/
    void (STDMETHODCALLTYPE *DispatchMesh)(
        ID3D12GraphicsCommandList6 *This,
        UINT thread_group_count_x,
        UINT thread_group_count_y,
        UINT thread_group_count_z);

    END_INTERFACE
} ID3D12GraphicsCommandList6Vtbl;

interface ID3D12GraphicsCommandList6 {
    CONST_VTBL ID3D12GraphicsCommandList6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList6_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList6_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList6_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList6_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList6_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList6_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList6_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList6_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList6_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList6_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList6_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList6_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList6_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList6_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList6_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList6_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList6_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList6_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList6_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList6_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList6_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList6_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList6_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList6_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList6_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList6_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList6_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList6_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList6_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList6_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList6_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList6_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList6_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList6_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList6_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList6_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList6_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList6_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList6_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList6_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList6_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList6_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList6_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 ID3D12GraphicsCommandList6_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
/*** ID3D12GraphicsCommandList2 methods ***/
#define ID3D12GraphicsCommandList6_WriteBufferImmediate(This,count,parameters,modes) (This)->lpVtbl->WriteBufferImmediate(This,count,parameters,modes)
/*** ID3D12GraphicsCommandList3 methods ***/
#define ID3D12GraphicsCommandList6_SetProtectedResourceSession(This,protected_resource_session) (This)->lpVtbl->SetProtectedResourceSession(This,protected_resource_session)
/*** ID3D12GraphicsCommandList4 methods ***/
#define ID3D12GraphicsCommandList6_BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags) (This)->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags)
#define ID3D12GraphicsCommandList6_EndRenderPass(This) (This)->lpVtbl->EndRenderPass(This)
#define ID3D12GraphicsCommandList6_InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes) (This)->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList6_ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes) (This)->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList6_BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs) (This)->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs)
#define ID3D12GraphicsCommandList6_EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data) (This)->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data)
#define ID3D12GraphicsCommandList6_CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode) (This)->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode)
#define ID3D12GraphicsCommandList6_SetPipelineState1(This,state_object) (This)->lpVtbl->SetPipelineState1(This,state_object)
#define ID3D12GraphicsCommandList6_DispatchRays(This,desc) (This)->lpVtbl->DispatchRays(This,desc)
/*** ID3D12GraphicsCommandList5 methods ***/
#define ID3D12GraphicsCommandList6_RSSetShadingRate(This,base_shading_rate,combiners) (This)->lpVtbl->RSSetShadingRate(This,base_shading_rate,combiners)
#define ID3D12GraphicsCommandList6_RSSetShadingRateImage(This,shading_rate_image) (This)->lpVtbl->RSSetShadingRateImage(This,shading_rate_image)
/*** ID3D12GraphicsCommandList6 methods ***/
#define ID3D12GraphicsCommandList6_DispatchMesh(This,thread_group_count_x,thread_group_count_y,thread_group_count_z) (This)->lpVtbl->DispatchMesh(This,thread_group_count_x,thread_group_count_y,thread_group_count_z)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_QueryInterface(ID3D12GraphicsCommandList6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList6_AddRef(ID3D12GraphicsCommandList6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList6_Release(ID3D12GraphicsCommandList6* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_GetPrivateData(ID3D12GraphicsCommandList6* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_SetPrivateData(ID3D12GraphicsCommandList6* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_SetPrivateDataInterface(ID3D12GraphicsCommandList6* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_SetName(ID3D12GraphicsCommandList6* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_GetDevice(ID3D12GraphicsCommandList6* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList6_GetType(ID3D12GraphicsCommandList6* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_Close(ID3D12GraphicsCommandList6* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList6_Reset(ID3D12GraphicsCommandList6* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ClearState(ID3D12GraphicsCommandList6* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_DrawInstanced(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_DrawIndexedInstanced(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_Dispatch(ID3D12GraphicsCommandList6* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_CopyBufferRegion(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_CopyTextureRegion(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_CopyResource(ID3D12GraphicsCommandList6* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_CopyTiles(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_ResolveSubresource(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_IASetPrimitiveTopology(ID3D12GraphicsCommandList6* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_RSSetViewports(ID3D12GraphicsCommandList6* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_RSSetScissorRects(ID3D12GraphicsCommandList6* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_OMSetBlendFactor(ID3D12GraphicsCommandList6* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_OMSetStencilRef(ID3D12GraphicsCommandList6* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetPipelineState(ID3D12GraphicsCommandList6* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ResourceBarrier(ID3D12GraphicsCommandList6* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ExecuteBundle(ID3D12GraphicsCommandList6* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetDescriptorHeaps(ID3D12GraphicsCommandList6* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRootSignature(ID3D12GraphicsCommandList6* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRootSignature(ID3D12GraphicsCommandList6* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList6* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_IASetIndexBuffer(ID3D12GraphicsCommandList6* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_IASetVertexBuffers(ID3D12GraphicsCommandList6* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SOSetTargets(ID3D12GraphicsCommandList6* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_OMSetRenderTargets(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_ClearDepthStencilView(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_ClearRenderTargetView(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_DiscardResource(ID3D12GraphicsCommandList6* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_BeginQuery(ID3D12GraphicsCommandList6* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_EndQuery(ID3D12GraphicsCommandList6* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ResolveQueryData(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_SetPredication(ID3D12GraphicsCommandList6* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetMarker(ID3D12GraphicsCommandList6* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_BeginEvent(ID3D12GraphicsCommandList6* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_EndEvent(ID3D12GraphicsCommandList6* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ExecuteIndirect(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_AtomicCopyBufferUINT(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_OMSetDepthBounds(ID3D12GraphicsCommandList6* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetSamplePositions(ID3D12GraphicsCommandList6* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ResolveSubresourceRegion(ID3D12GraphicsCommandList6* 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 __WIDL_INLINE void ID3D12GraphicsCommandList6_SetViewInstanceMask(ID3D12GraphicsCommandList6* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList6_WriteBufferImmediate(ID3D12GraphicsCommandList6* This,UINT count,const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) {
    This->lpVtbl->WriteBufferImmediate(This,count,parameters,modes);
}
/*** ID3D12GraphicsCommandList3 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetProtectedResourceSession(ID3D12GraphicsCommandList6* This,ID3D12ProtectedResourceSession *protected_resource_session) {
    This->lpVtbl->SetProtectedResourceSession(This,protected_resource_session);
}
/*** ID3D12GraphicsCommandList4 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList6_BeginRenderPass(ID3D12GraphicsCommandList6* This,UINT render_targets_count,const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,D3D12_RENDER_PASS_FLAGS flags) {
    This->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_EndRenderPass(ID3D12GraphicsCommandList6* This) {
    This->lpVtbl->EndRenderPass(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_InitializeMetaCommand(ID3D12GraphicsCommandList6* This,ID3D12MetaCommand *meta_command,const void *initialization_parameters_data,SIZE_T initialization_parameters_data_size_in_bytes) {
    This->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_ExecuteMetaCommand(ID3D12GraphicsCommandList6* This,ID3D12MetaCommand *meta_command,const void *execution_parameters_data,SIZE_T execution_parameters_data_size_in_bytes) {
    This->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_BuildRaytracingAccelerationStructure(ID3D12GraphicsCommandList6* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,UINT postbuild_info_descs_count,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs) {
    This->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_EmitRaytracingAccelerationStructurePostbuildInfo(ID3D12GraphicsCommandList6* This,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,UINT src_acceleration_structures_count,const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data) {
    This->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_CopyRaytracingAccelerationStructure(ID3D12GraphicsCommandList6* This,D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) {
    This->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_SetPipelineState1(ID3D12GraphicsCommandList6* This,ID3D12StateObject *state_object) {
    This->lpVtbl->SetPipelineState1(This,state_object);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_DispatchRays(ID3D12GraphicsCommandList6* This,const D3D12_DISPATCH_RAYS_DESC *desc) {
    This->lpVtbl->DispatchRays(This,desc);
}
/*** ID3D12GraphicsCommandList5 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList6_RSSetShadingRate(ID3D12GraphicsCommandList6* This,D3D12_SHADING_RATE base_shading_rate,const D3D12_SHADING_RATE_COMBINER *combiners) {
    This->lpVtbl->RSSetShadingRate(This,base_shading_rate,combiners);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList6_RSSetShadingRateImage(ID3D12GraphicsCommandList6* This,ID3D12Resource *shading_rate_image) {
    This->lpVtbl->RSSetShadingRateImage(This,shading_rate_image);
}
/*** ID3D12GraphicsCommandList6 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList6_DispatchMesh(ID3D12GraphicsCommandList6* This,UINT thread_group_count_x,UINT thread_group_count_y,UINT thread_group_count_z) {
    This->lpVtbl->DispatchMesh(This,thread_group_count_x,thread_group_count_y,thread_group_count_z);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12GraphicsCommandList7 interface
 */
#ifndef __ID3D12GraphicsCommandList7_INTERFACE_DEFINED__
#define __ID3D12GraphicsCommandList7_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12GraphicsCommandList7, 0xdd171223, 0x8b61, 0x4769, 0x90,0xe3, 0x16,0x0c,0xcd,0xe4,0xe2,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dd171223-8b61-4769-90e3-160ccde4e2c1")
ID3D12GraphicsCommandList7 : public ID3D12GraphicsCommandList6
{
    virtual void STDMETHODCALLTYPE Barrier(
        UINT32 barrier_groups_count,
        const D3D12_BARRIER_GROUP *barrier_groups) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12GraphicsCommandList7, 0xdd171223, 0x8b61, 0x4769, 0x90,0xe3, 0x16,0x0c,0xcd,0xe4,0xe2,0xc1)
#endif
#else
typedef struct ID3D12GraphicsCommandList7Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ClearState)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12PipelineState *pipeline_state);

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

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

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

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

    void (STDMETHODCALLTYPE *CopyTextureRegion)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12Resource *dst_resource,
        ID3D12Resource *src_resource);

    void (STDMETHODCALLTYPE *CopyTiles)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12Resource *dst_resource,
        UINT dst_sub_resource,
        ID3D12Resource *src_resource,
        UINT src_sub_resource,
        DXGI_FORMAT format);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *OMSetRenderTargets)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *This,
        D3D12_CPU_DESCRIPTOR_HANDLE dsv,
        D3D12_CLEAR_FLAGS flags,
        FLOAT depth,
        UINT8 stencil,
        UINT rect_count,
        const D3D12_RECT *rects);

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

    void (STDMETHODCALLTYPE *ClearUnorderedAccessViewUint)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12Resource *resource,
        const D3D12_DISCARD_REGION *region);

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

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

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

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

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

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

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

    void (STDMETHODCALLTYPE *ExecuteIndirect)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *This,
        FLOAT min,
        FLOAT max);

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

    void (STDMETHODCALLTYPE *ResolveSubresourceRegion)(
        ID3D12GraphicsCommandList7 *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)(
        ID3D12GraphicsCommandList7 *This,
        UINT mask);

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

    /*** ID3D12GraphicsCommandList3 methods ***/
    void (STDMETHODCALLTYPE *SetProtectedResourceSession)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12ProtectedResourceSession *protected_resource_session);

    /*** ID3D12GraphicsCommandList4 methods ***/
    void (STDMETHODCALLTYPE *BeginRenderPass)(
        ID3D12GraphicsCommandList7 *This,
        UINT render_targets_count,
        const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,
        const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,
        D3D12_RENDER_PASS_FLAGS flags);

    void (STDMETHODCALLTYPE *EndRenderPass)(
        ID3D12GraphicsCommandList7 *This);

    void (STDMETHODCALLTYPE *InitializeMetaCommand)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12MetaCommand *meta_command,
        const void *initialization_parameters_data,
        SIZE_T initialization_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *ExecuteMetaCommand)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12MetaCommand *meta_command,
        const void *execution_parameters_data,
        SIZE_T execution_parameters_data_size_in_bytes);

    void (STDMETHODCALLTYPE *BuildRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList7 *This,
        const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,
        UINT postbuild_info_descs_count,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs);

    void (STDMETHODCALLTYPE *EmitRaytracingAccelerationStructurePostbuildInfo)(
        ID3D12GraphicsCommandList7 *This,
        const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,
        UINT src_acceleration_structures_count,
        const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data);

    void (STDMETHODCALLTYPE *CopyRaytracingAccelerationStructure)(
        ID3D12GraphicsCommandList7 *This,
        D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,
        D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode);

    void (STDMETHODCALLTYPE *SetPipelineState1)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12StateObject *state_object);

    void (STDMETHODCALLTYPE *DispatchRays)(
        ID3D12GraphicsCommandList7 *This,
        const D3D12_DISPATCH_RAYS_DESC *desc);

    /*** ID3D12GraphicsCommandList5 methods ***/
    void (STDMETHODCALLTYPE *RSSetShadingRate)(
        ID3D12GraphicsCommandList7 *This,
        D3D12_SHADING_RATE base_shading_rate,
        const D3D12_SHADING_RATE_COMBINER *combiners);

    void (STDMETHODCALLTYPE *RSSetShadingRateImage)(
        ID3D12GraphicsCommandList7 *This,
        ID3D12Resource *shading_rate_image);

    /*** ID3D12GraphicsCommandList6 methods ***/
    void (STDMETHODCALLTYPE *DispatchMesh)(
        ID3D12GraphicsCommandList7 *This,
        UINT thread_group_count_x,
        UINT thread_group_count_y,
        UINT thread_group_count_z);

    /*** ID3D12GraphicsCommandList7 methods ***/
    void (STDMETHODCALLTYPE *Barrier)(
        ID3D12GraphicsCommandList7 *This,
        UINT32 barrier_groups_count,
        const D3D12_BARRIER_GROUP *barrier_groups);

    END_INTERFACE
} ID3D12GraphicsCommandList7Vtbl;

interface ID3D12GraphicsCommandList7 {
    CONST_VTBL ID3D12GraphicsCommandList7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12GraphicsCommandList7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12GraphicsCommandList7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12GraphicsCommandList7_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12Object methods ***/
#define ID3D12GraphicsCommandList7_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList7_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
#define ID3D12GraphicsCommandList7_SetPrivateDataInterface(This,guid,data) (This)->lpVtbl->SetPrivateDataInterface(This,guid,data)
#define ID3D12GraphicsCommandList7_SetName(This,name) (This)->lpVtbl->SetName(This,name)
/*** ID3D12DeviceChild methods ***/
#define ID3D12GraphicsCommandList7_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
/*** ID3D12CommandList methods ***/
#define ID3D12GraphicsCommandList7_GetType(This) (This)->lpVtbl->GetType(This)
/*** ID3D12GraphicsCommandList methods ***/
#define ID3D12GraphicsCommandList7_Close(This) (This)->lpVtbl->Close(This)
#define ID3D12GraphicsCommandList7_Reset(This,allocator,initial_state) (This)->lpVtbl->Reset(This,allocator,initial_state)
#define ID3D12GraphicsCommandList7_ClearState(This,pipeline_state) (This)->lpVtbl->ClearState(This,pipeline_state)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_Dispatch(This,x,u,z) (This)->lpVtbl->Dispatch(This,x,u,z)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_CopyResource(This,dst_resource,src_resource) (This)->lpVtbl->CopyResource(This,dst_resource,src_resource)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_IASetPrimitiveTopology(This,primitive_topology) (This)->lpVtbl->IASetPrimitiveTopology(This,primitive_topology)
#define ID3D12GraphicsCommandList7_RSSetViewports(This,viewport_count,viewports) (This)->lpVtbl->RSSetViewports(This,viewport_count,viewports)
#define ID3D12GraphicsCommandList7_RSSetScissorRects(This,rect_count,rects) (This)->lpVtbl->RSSetScissorRects(This,rect_count,rects)
#define ID3D12GraphicsCommandList7_OMSetBlendFactor(This,blend_factor) (This)->lpVtbl->OMSetBlendFactor(This,blend_factor)
#define ID3D12GraphicsCommandList7_OMSetStencilRef(This,stencil_ref) (This)->lpVtbl->OMSetStencilRef(This,stencil_ref)
#define ID3D12GraphicsCommandList7_SetPipelineState(This,pipeline_state) (This)->lpVtbl->SetPipelineState(This,pipeline_state)
#define ID3D12GraphicsCommandList7_ResourceBarrier(This,barrier_count,barriers) (This)->lpVtbl->ResourceBarrier(This,barrier_count,barriers)
#define ID3D12GraphicsCommandList7_ExecuteBundle(This,command_list) (This)->lpVtbl->ExecuteBundle(This,command_list)
#define ID3D12GraphicsCommandList7_SetDescriptorHeaps(This,heap_count,heaps) (This)->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps)
#define ID3D12GraphicsCommandList7_SetComputeRootSignature(This,root_signature) (This)->lpVtbl->SetComputeRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList7_SetGraphicsRootSignature(This,root_signature) (This)->lpVtbl->SetGraphicsRootSignature(This,root_signature)
#define ID3D12GraphicsCommandList7_SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList7_SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor) (This)->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor)
#define ID3D12GraphicsCommandList7_SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList7_SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset)
#define ID3D12GraphicsCommandList7_SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetComputeRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList7_SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset) (This)->lpVtbl->SetGraphicsRoot32BitConstants(This,root_parameter_index,constant_count,data,dst_offset)
#define ID3D12GraphicsCommandList7_SetComputeRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList7_SetGraphicsRootConstantBufferView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList7_SetComputeRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList7_SetGraphicsRootShaderResourceView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList7_SetComputeRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList7_SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address) (This)->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address)
#define ID3D12GraphicsCommandList7_IASetIndexBuffer(This,view) (This)->lpVtbl->IASetIndexBuffer(This,view)
#define ID3D12GraphicsCommandList7_IASetVertexBuffers(This,start_slot,view_count,views) (This)->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList7_SOSetTargets(This,start_slot,view_count,views) (This)->lpVtbl->SOSetTargets(This,start_slot,view_count,views)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects) (This)->lpVtbl->ClearDepthStencilView(This,dsv,flags,depth,stencil,rect_count,rects)
#define ID3D12GraphicsCommandList7_ClearRenderTargetView(This,rtv,color,rect_count,rects) (This)->lpVtbl->ClearRenderTargetView(This,rtv,color,rect_count,rects)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_DiscardResource(This,resource,region) (This)->lpVtbl->DiscardResource(This,resource,region)
#define ID3D12GraphicsCommandList7_BeginQuery(This,heap,type,index) (This)->lpVtbl->BeginQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList7_EndQuery(This,heap,type,index) (This)->lpVtbl->EndQuery(This,heap,type,index)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_SetPredication(This,buffer,aligned_buffer_offset,operation) (This)->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation)
#define ID3D12GraphicsCommandList7_SetMarker(This,metadata,data,size) (This)->lpVtbl->SetMarker(This,metadata,data,size)
#define ID3D12GraphicsCommandList7_BeginEvent(This,metadata,data,size) (This)->lpVtbl->BeginEvent(This,metadata,data,size)
#define ID3D12GraphicsCommandList7_EndEvent(This) (This)->lpVtbl->EndEvent(This)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_OMSetDepthBounds(This,min,max) (This)->lpVtbl->OMSetDepthBounds(This,min,max)
#define ID3D12GraphicsCommandList7_SetSamplePositions(This,sample_count,pixel_count,sample_positions) (This)->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions)
#define ID3D12GraphicsCommandList7_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 ID3D12GraphicsCommandList7_SetViewInstanceMask(This,mask) (This)->lpVtbl->SetViewInstanceMask(This,mask)
/*** ID3D12GraphicsCommandList2 methods ***/
#define ID3D12GraphicsCommandList7_WriteBufferImmediate(This,count,parameters,modes) (This)->lpVtbl->WriteBufferImmediate(This,count,parameters,modes)
/*** ID3D12GraphicsCommandList3 methods ***/
#define ID3D12GraphicsCommandList7_SetProtectedResourceSession(This,protected_resource_session) (This)->lpVtbl->SetProtectedResourceSession(This,protected_resource_session)
/*** ID3D12GraphicsCommandList4 methods ***/
#define ID3D12GraphicsCommandList7_BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags) (This)->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags)
#define ID3D12GraphicsCommandList7_EndRenderPass(This) (This)->lpVtbl->EndRenderPass(This)
#define ID3D12GraphicsCommandList7_InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes) (This)->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList7_ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes) (This)->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes)
#define ID3D12GraphicsCommandList7_BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs) (This)->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs)
#define ID3D12GraphicsCommandList7_EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data) (This)->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data)
#define ID3D12GraphicsCommandList7_CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode) (This)->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode)
#define ID3D12GraphicsCommandList7_SetPipelineState1(This,state_object) (This)->lpVtbl->SetPipelineState1(This,state_object)
#define ID3D12GraphicsCommandList7_DispatchRays(This,desc) (This)->lpVtbl->DispatchRays(This,desc)
/*** ID3D12GraphicsCommandList5 methods ***/
#define ID3D12GraphicsCommandList7_RSSetShadingRate(This,base_shading_rate,combiners) (This)->lpVtbl->RSSetShadingRate(This,base_shading_rate,combiners)
#define ID3D12GraphicsCommandList7_RSSetShadingRateImage(This,shading_rate_image) (This)->lpVtbl->RSSetShadingRateImage(This,shading_rate_image)
/*** ID3D12GraphicsCommandList6 methods ***/
#define ID3D12GraphicsCommandList7_DispatchMesh(This,thread_group_count_x,thread_group_count_y,thread_group_count_z) (This)->lpVtbl->DispatchMesh(This,thread_group_count_x,thread_group_count_y,thread_group_count_z)
/*** ID3D12GraphicsCommandList7 methods ***/
#define ID3D12GraphicsCommandList7_Barrier(This,barrier_groups_count,barrier_groups) (This)->lpVtbl->Barrier(This,barrier_groups_count,barrier_groups)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_QueryInterface(ID3D12GraphicsCommandList7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList7_AddRef(ID3D12GraphicsCommandList7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D12GraphicsCommandList7_Release(ID3D12GraphicsCommandList7* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12Object methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_GetPrivateData(ID3D12GraphicsCommandList7* This,REFGUID guid,UINT *data_size,void *data) {
    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_SetPrivateData(ID3D12GraphicsCommandList7* This,REFGUID guid,UINT data_size,const void *data) {
    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_SetPrivateDataInterface(ID3D12GraphicsCommandList7* This,REFGUID guid,const IUnknown *data) {
    return This->lpVtbl->SetPrivateDataInterface(This,guid,data);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_SetName(ID3D12GraphicsCommandList7* This,const WCHAR *name) {
    return This->lpVtbl->SetName(This,name);
}
/*** ID3D12DeviceChild methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_GetDevice(ID3D12GraphicsCommandList7* This,REFIID riid,void **device) {
    return This->lpVtbl->GetDevice(This,riid,device);
}
/*** ID3D12CommandList methods ***/
static __WIDL_INLINE D3D12_COMMAND_LIST_TYPE ID3D12GraphicsCommandList7_GetType(ID3D12GraphicsCommandList7* This) {
    return This->lpVtbl->GetType(This);
}
/*** ID3D12GraphicsCommandList methods ***/
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_Close(ID3D12GraphicsCommandList7* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT ID3D12GraphicsCommandList7_Reset(ID3D12GraphicsCommandList7* This,ID3D12CommandAllocator *allocator,ID3D12PipelineState *initial_state) {
    return This->lpVtbl->Reset(This,allocator,initial_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ClearState(ID3D12GraphicsCommandList7* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->ClearState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_DrawInstanced(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_DrawIndexedInstanced(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_Dispatch(ID3D12GraphicsCommandList7* This,UINT x,UINT u,UINT z) {
    This->lpVtbl->Dispatch(This,x,u,z);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_CopyBufferRegion(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_CopyTextureRegion(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_CopyResource(ID3D12GraphicsCommandList7* This,ID3D12Resource *dst_resource,ID3D12Resource *src_resource) {
    This->lpVtbl->CopyResource(This,dst_resource,src_resource);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_CopyTiles(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_ResolveSubresource(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_IASetPrimitiveTopology(ID3D12GraphicsCommandList7* This,D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {
    This->lpVtbl->IASetPrimitiveTopology(This,primitive_topology);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_RSSetViewports(ID3D12GraphicsCommandList7* This,UINT viewport_count,const D3D12_VIEWPORT *viewports) {
    This->lpVtbl->RSSetViewports(This,viewport_count,viewports);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_RSSetScissorRects(ID3D12GraphicsCommandList7* This,UINT rect_count,const D3D12_RECT *rects) {
    This->lpVtbl->RSSetScissorRects(This,rect_count,rects);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_OMSetBlendFactor(ID3D12GraphicsCommandList7* This,const FLOAT blend_factor[4]) {
    This->lpVtbl->OMSetBlendFactor(This,blend_factor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_OMSetStencilRef(ID3D12GraphicsCommandList7* This,UINT stencil_ref) {
    This->lpVtbl->OMSetStencilRef(This,stencil_ref);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetPipelineState(ID3D12GraphicsCommandList7* This,ID3D12PipelineState *pipeline_state) {
    This->lpVtbl->SetPipelineState(This,pipeline_state);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ResourceBarrier(ID3D12GraphicsCommandList7* This,UINT barrier_count,const D3D12_RESOURCE_BARRIER *barriers) {
    This->lpVtbl->ResourceBarrier(This,barrier_count,barriers);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ExecuteBundle(ID3D12GraphicsCommandList7* This,ID3D12GraphicsCommandList *command_list) {
    This->lpVtbl->ExecuteBundle(This,command_list);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetDescriptorHeaps(ID3D12GraphicsCommandList7* This,UINT heap_count,ID3D12DescriptorHeap *const *heaps) {
    This->lpVtbl->SetDescriptorHeaps(This,heap_count,heaps);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRootSignature(ID3D12GraphicsCommandList7* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetComputeRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRootSignature(ID3D12GraphicsCommandList7* This,ID3D12RootSignature *root_signature) {
    This->lpVtbl->SetGraphicsRootSignature(This,root_signature);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetComputeRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {
    This->lpVtbl->SetGraphicsRootDescriptorTable(This,root_parameter_index,base_descriptor);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRoot32BitConstant(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetComputeRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRoot32BitConstant(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,UINT data,UINT dst_offset) {
    This->lpVtbl->SetGraphicsRoot32BitConstant(This,root_parameter_index,data,dst_offset);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRoot32BitConstants(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRoot32BitConstants(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRootConstantBufferView(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRootConstantBufferView(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootConstantBufferView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRootShaderResourceView(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRootShaderResourceView(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootShaderResourceView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetComputeRootUnorderedAccessView(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetComputeRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetGraphicsRootUnorderedAccessView(ID3D12GraphicsCommandList7* This,UINT root_parameter_index,D3D12_GPU_VIRTUAL_ADDRESS address) {
    This->lpVtbl->SetGraphicsRootUnorderedAccessView(This,root_parameter_index,address);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_IASetIndexBuffer(ID3D12GraphicsCommandList7* This,const D3D12_INDEX_BUFFER_VIEW *view) {
    This->lpVtbl->IASetIndexBuffer(This,view);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_IASetVertexBuffers(ID3D12GraphicsCommandList7* This,UINT start_slot,UINT view_count,const D3D12_VERTEX_BUFFER_VIEW *views) {
    This->lpVtbl->IASetVertexBuffers(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SOSetTargets(ID3D12GraphicsCommandList7* This,UINT start_slot,UINT view_count,const D3D12_STREAM_OUTPUT_BUFFER_VIEW *views) {
    This->lpVtbl->SOSetTargets(This,start_slot,view_count,views);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_OMSetRenderTargets(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_ClearDepthStencilView(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_ClearRenderTargetView(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_DiscardResource(ID3D12GraphicsCommandList7* This,ID3D12Resource *resource,const D3D12_DISCARD_REGION *region) {
    This->lpVtbl->DiscardResource(This,resource,region);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_BeginQuery(ID3D12GraphicsCommandList7* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->BeginQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_EndQuery(ID3D12GraphicsCommandList7* This,ID3D12QueryHeap *heap,D3D12_QUERY_TYPE type,UINT index) {
    This->lpVtbl->EndQuery(This,heap,type,index);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ResolveQueryData(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_SetPredication(ID3D12GraphicsCommandList7* This,ID3D12Resource *buffer,UINT64 aligned_buffer_offset,D3D12_PREDICATION_OP operation) {
    This->lpVtbl->SetPredication(This,buffer,aligned_buffer_offset,operation);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetMarker(ID3D12GraphicsCommandList7* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->SetMarker(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_BeginEvent(ID3D12GraphicsCommandList7* This,UINT metadata,const void *data,UINT size) {
    This->lpVtbl->BeginEvent(This,metadata,data,size);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_EndEvent(ID3D12GraphicsCommandList7* This) {
    This->lpVtbl->EndEvent(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ExecuteIndirect(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_AtomicCopyBufferUINT(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_AtomicCopyBufferUINT64(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_OMSetDepthBounds(ID3D12GraphicsCommandList7* This,FLOAT min,FLOAT max) {
    This->lpVtbl->OMSetDepthBounds(This,min,max);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetSamplePositions(ID3D12GraphicsCommandList7* This,UINT sample_count,UINT pixel_count,D3D12_SAMPLE_POSITION *sample_positions) {
    This->lpVtbl->SetSamplePositions(This,sample_count,pixel_count,sample_positions);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ResolveSubresourceRegion(ID3D12GraphicsCommandList7* 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 __WIDL_INLINE void ID3D12GraphicsCommandList7_SetViewInstanceMask(ID3D12GraphicsCommandList7* This,UINT mask) {
    This->lpVtbl->SetViewInstanceMask(This,mask);
}
/*** ID3D12GraphicsCommandList2 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList7_WriteBufferImmediate(ID3D12GraphicsCommandList7* This,UINT count,const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *parameters,const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) {
    This->lpVtbl->WriteBufferImmediate(This,count,parameters,modes);
}
/*** ID3D12GraphicsCommandList3 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetProtectedResourceSession(ID3D12GraphicsCommandList7* This,ID3D12ProtectedResourceSession *protected_resource_session) {
    This->lpVtbl->SetProtectedResourceSession(This,protected_resource_session);
}
/*** ID3D12GraphicsCommandList4 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList7_BeginRenderPass(ID3D12GraphicsCommandList7* This,UINT render_targets_count,const D3D12_RENDER_PASS_RENDER_TARGET_DESC *render_targets,const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC *depth_stencil,D3D12_RENDER_PASS_FLAGS flags) {
    This->lpVtbl->BeginRenderPass(This,render_targets_count,render_targets,depth_stencil,flags);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_EndRenderPass(ID3D12GraphicsCommandList7* This) {
    This->lpVtbl->EndRenderPass(This);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_InitializeMetaCommand(ID3D12GraphicsCommandList7* This,ID3D12MetaCommand *meta_command,const void *initialization_parameters_data,SIZE_T initialization_parameters_data_size_in_bytes) {
    This->lpVtbl->InitializeMetaCommand(This,meta_command,initialization_parameters_data,initialization_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_ExecuteMetaCommand(ID3D12GraphicsCommandList7* This,ID3D12MetaCommand *meta_command,const void *execution_parameters_data,SIZE_T execution_parameters_data_size_in_bytes) {
    This->lpVtbl->ExecuteMetaCommand(This,meta_command,execution_parameters_data,execution_parameters_data_size_in_bytes);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_BuildRaytracingAccelerationStructure(ID3D12GraphicsCommandList7* This,const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *desc,UINT postbuild_info_descs_count,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs) {
    This->lpVtbl->BuildRaytracingAccelerationStructure(This,desc,postbuild_info_descs_count,postbuild_info_descs);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_EmitRaytracingAccelerationStructurePostbuildInfo(ID3D12GraphicsCommandList7* This,const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *desc,UINT src_acceleration_structures_count,const D3D12_GPU_VIRTUAL_ADDRESS *src_acceleration_structure_data) {
    This->lpVtbl->EmitRaytracingAccelerationStructurePostbuildInfo(This,desc,src_acceleration_structures_count,src_acceleration_structure_data);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_CopyRaytracingAccelerationStructure(ID3D12GraphicsCommandList7* This,D3D12_GPU_VIRTUAL_ADDRESS dst_acceleration_structure_data,D3D12_GPU_VIRTUAL_ADDRESS src_acceleration_structure_data,D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) {
    This->lpVtbl->CopyRaytracingAccelerationStructure(This,dst_acceleration_structure_data,src_acceleration_structure_data,mode);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_SetPipelineState1(ID3D12GraphicsCommandList7* This,ID3D12StateObject *state_object) {
    This->lpVtbl->SetPipelineState1(This,state_object);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_DispatchRays(ID3D12GraphicsCommandList7* This,const D3D12_DISPATCH_RAYS_DESC *desc) {
    This->lpVtbl->DispatchRays(This,desc);
}
/*** ID3D12GraphicsCommandList5 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList7_RSSetShadingRate(ID3D12GraphicsCommandList7* This,D3D12_SHADING_RATE base_shading_rate,const D3D12_SHADING_RATE_COMBINER *combiners) {
    This->lpVtbl->RSSetShadingRate(This,base_shading_rate,combiners);
}
static __WIDL_INLINE void ID3D12GraphicsCommandList7_RSSetShadingRateImage(ID3D12GraphicsCommandList7* This,ID3D12Resource *shading_rate_image) {
    This->lpVtbl->RSSetShadingRateImage(This,shading_rate_image);
}
/*** ID3D12GraphicsCommandList6 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList7_DispatchMesh(ID3D12GraphicsCommandList7* This,UINT thread_group_count_x,UINT thread_group_count_y,UINT thread_group_count_z) {
    This->lpVtbl->DispatchMesh(This,thread_group_count_x,thread_group_count_y,thread_group_count_z);
}
/*** ID3D12GraphicsCommandList7 methods ***/
static __WIDL_INLINE void ID3D12GraphicsCommandList7_Barrier(ID3D12GraphicsCommandList7* This,UINT32 barrier_groups_count,const D3D12_BARRIER_GROUP *barrier_groups) {
    This->lpVtbl->Barrier(This,barrier_groups_count,barrier_groups);
}
#endif
#endif

#endif


#endif  /* __ID3D12GraphicsCommandList7_INTERFACE_DEFINED__ */

#ifndef D3D12_IGNORE_SDK_LAYERS
#include "d3d12sdklayers.h"
#endif
typedef HRESULT (__stdcall *PFN_D3D12_CREATE_ROOT_SIGNATURE_DESERIALIZER)(const void *data,SIZE_T data_size,REFIID iid,void **deserializer);
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);

typedef HRESULT (__stdcall *PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)(const D3D12_ROOT_SIGNATURE_DESC *root_signature_desc,D3D_ROOT_SIGNATURE_VERSION version,ID3DBlob **blob,ID3DBlob **error_blob);
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);

static const UUID D3D12ExperimentalShaderModels = { 0x76f5573e, 0xf13a, 0x40f5, { 0xb2, 0x97, 0x81, 0xce, 0x9e, 0x18, 0x93, 0x3f } };
static const UUID D3D12TiledResourceTier4 = { 0xc9c4725f, 0xa81a, 0x4f56, { 0x8c, 0x5b, 0xc5, 0x10, 0x39, 0xd6, 0x94, 0xfb } };
static const UUID D3D12MetaCommand = { 0xc734c97e, 0x8077, 0x48c8, { 0x9f, 0xdc, 0xd9, 0xd1, 0xdd, 0x31, 0xdd, 0x77 } };
typedef HRESULT (__stdcall *PFN_D3D12_GET_INTERFACE)(REFCLSID clsid,REFIID iid,void **debug);
HRESULT __stdcall  D3D12GetInterface(REFCLSID clsid,REFIID iid,void **debug);

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __d3d12_h__ */
