/*** Partially copied from autogenerated header by WIDL 6.4 from ../src-vkd3d-proton/include/vkd3d_device_vkd3d_ext.idl ***/

#pragma once

#include <d3d12.h>
#include <vulkan/vulkan.h>

#ifndef __ID3D12DXVKInteropDevice_FWD_DEFINED__
#define __ID3D12DXVKInteropDevice_FWD_DEFINED__
typedef interface ID3D12DXVKInteropDevice ID3D12DXVKInteropDevice;
#endif

#ifndef __ID3D12DXVKInteropDevice_INTERFACE_DEFINED__
#define __ID3D12DXVKInteropDevice_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12DXVKInteropDevice, 0x39da4e09, 0xbd1c, 0x4198, 0x9f,0xae, 0x86,0xbb,0xe3,0xbe,0x41,0xfd);
typedef struct ID3D12DXVKInteropDeviceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12DXVKInteropDevice *This,
        REFIID riid,
        void **object);

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

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

    /*** ID3D12DXVKInteropDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDXGIAdapter)(
        ID3D12DXVKInteropDevice *This,
        REFIID iid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *GetInstanceExtensions)(
        ID3D12DXVKInteropDevice *This,
        UINT *extension_count,
        const char **extensions);

    HRESULT (STDMETHODCALLTYPE *GetDeviceExtensions)(
        ID3D12DXVKInteropDevice *This,
        UINT *extension_count,
        const char **extensions);

    HRESULT (STDMETHODCALLTYPE *GetDeviceFeatures)(
        ID3D12DXVKInteropDevice *This,
        const VkPhysicalDeviceFeatures2 **features);

    HRESULT (STDMETHODCALLTYPE *GetVulkanHandles)(
        ID3D12DXVKInteropDevice *This,
        VkInstance *vk_instance,
        VkPhysicalDevice *vk_physical_device,
        VkDevice *vk_device);

    HRESULT (STDMETHODCALLTYPE *GetVulkanQueueInfo)(
        ID3D12DXVKInteropDevice *This,
        ID3D12CommandQueue *queue,
        VkQueue *vk_queue,
        UINT32 *vk_queue_family);

    void (STDMETHODCALLTYPE *GetVulkanImageLayout)(
        ID3D12DXVKInteropDevice *This,
        ID3D12Resource *resource,
        D3D12_RESOURCE_STATES state,
        VkImageLayout *vk_layout);

    HRESULT (STDMETHODCALLTYPE *GetVulkanResourceInfo)(
        ID3D12DXVKInteropDevice *This,
        ID3D12Resource *resource,
        UINT64 *vk_handle,
        UINT64 *buffer_offset);

    HRESULT (STDMETHODCALLTYPE *LockCommandQueue)(
        ID3D12DXVKInteropDevice *This,
        ID3D12CommandQueue *queue);

    HRESULT (STDMETHODCALLTYPE *UnlockCommandQueue)(
        ID3D12DXVKInteropDevice *This,
        ID3D12CommandQueue *queue);

    END_INTERFACE
} ID3D12DXVKInteropDeviceVtbl;

interface ID3D12DXVKInteropDevice {
    CONST_VTBL ID3D12DXVKInteropDeviceVtbl* lpVtbl;
};
#endif
