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