/*** Autogenerated by WIDL 8.5 from include/mfd3d12.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 __mfd3d12_h__
#define __mfd3d12_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 __IMFD3D12SynchronizationObjectCommands_FWD_DEFINED__
#define __IMFD3D12SynchronizationObjectCommands_FWD_DEFINED__
typedef interface IMFD3D12SynchronizationObjectCommands IMFD3D12SynchronizationObjectCommands;
#ifdef __cplusplus
interface IMFD3D12SynchronizationObjectCommands;
#endif /* __cplusplus */
#endif

#ifndef __IMFD3D12SynchronizationObject_FWD_DEFINED__
#define __IMFD3D12SynchronizationObject_FWD_DEFINED__
typedef interface IMFD3D12SynchronizationObject IMFD3D12SynchronizationObject;
#ifdef __cplusplus
interface IMFD3D12SynchronizationObject;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <mfidl.h>
#include <d3d12.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
/*****************************************************************************
 * IMFD3D12SynchronizationObjectCommands interface
 */
#ifndef __IMFD3D12SynchronizationObjectCommands_INTERFACE_DEFINED__
#define __IMFD3D12SynchronizationObjectCommands_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFD3D12SynchronizationObjectCommands, 0x09d0f835, 0x92ff, 0x4e53, 0x8e,0xfa, 0x40,0xfa,0xa5,0x51,0xf2,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("09d0f835-92ff-4e53-8efa-40faa551f233")
IMFD3D12SynchronizationObjectCommands : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnqueueResourceReady(
        ID3D12CommandQueue *pProducerCommandQueue) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnqueueResourceReadyWait(
        ID3D12CommandQueue *pConsumerCommandQueue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SignalEventOnResourceReady(
        HANDLE hEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnqueueResourceRelease(
        ID3D12CommandQueue *pConsumerCommandQueue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFD3D12SynchronizationObjectCommands, 0x09d0f835, 0x92ff, 0x4e53, 0x8e,0xfa, 0x40,0xfa,0xa5,0x51,0xf2,0x33)
#endif
#else
typedef struct IMFD3D12SynchronizationObjectCommandsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFD3D12SynchronizationObjectCommands methods ***/
    HRESULT (STDMETHODCALLTYPE *EnqueueResourceReady)(
        IMFD3D12SynchronizationObjectCommands *This,
        ID3D12CommandQueue *pProducerCommandQueue);

    HRESULT (STDMETHODCALLTYPE *EnqueueResourceReadyWait)(
        IMFD3D12SynchronizationObjectCommands *This,
        ID3D12CommandQueue *pConsumerCommandQueue);

    HRESULT (STDMETHODCALLTYPE *SignalEventOnResourceReady)(
        IMFD3D12SynchronizationObjectCommands *This,
        HANDLE hEvent);

    HRESULT (STDMETHODCALLTYPE *EnqueueResourceRelease)(
        IMFD3D12SynchronizationObjectCommands *This,
        ID3D12CommandQueue *pConsumerCommandQueue);

    END_INTERFACE
} IMFD3D12SynchronizationObjectCommandsVtbl;

interface IMFD3D12SynchronizationObjectCommands {
    CONST_VTBL IMFD3D12SynchronizationObjectCommandsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFD3D12SynchronizationObjectCommands_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFD3D12SynchronizationObjectCommands_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFD3D12SynchronizationObjectCommands_Release(This) (This)->lpVtbl->Release(This)
/*** IMFD3D12SynchronizationObjectCommands methods ***/
#define IMFD3D12SynchronizationObjectCommands_EnqueueResourceReady(This,pProducerCommandQueue) (This)->lpVtbl->EnqueueResourceReady(This,pProducerCommandQueue)
#define IMFD3D12SynchronizationObjectCommands_EnqueueResourceReadyWait(This,pConsumerCommandQueue) (This)->lpVtbl->EnqueueResourceReadyWait(This,pConsumerCommandQueue)
#define IMFD3D12SynchronizationObjectCommands_SignalEventOnResourceReady(This,hEvent) (This)->lpVtbl->SignalEventOnResourceReady(This,hEvent)
#define IMFD3D12SynchronizationObjectCommands_EnqueueResourceRelease(This,pConsumerCommandQueue) (This)->lpVtbl->EnqueueResourceRelease(This,pConsumerCommandQueue)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObjectCommands_QueryInterface(IMFD3D12SynchronizationObjectCommands* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFD3D12SynchronizationObjectCommands_AddRef(IMFD3D12SynchronizationObjectCommands* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFD3D12SynchronizationObjectCommands_Release(IMFD3D12SynchronizationObjectCommands* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFD3D12SynchronizationObjectCommands methods ***/
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObjectCommands_EnqueueResourceReady(IMFD3D12SynchronizationObjectCommands* This,ID3D12CommandQueue *pProducerCommandQueue) {
    return This->lpVtbl->EnqueueResourceReady(This,pProducerCommandQueue);
}
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObjectCommands_EnqueueResourceReadyWait(IMFD3D12SynchronizationObjectCommands* This,ID3D12CommandQueue *pConsumerCommandQueue) {
    return This->lpVtbl->EnqueueResourceReadyWait(This,pConsumerCommandQueue);
}
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObjectCommands_SignalEventOnResourceReady(IMFD3D12SynchronizationObjectCommands* This,HANDLE hEvent) {
    return This->lpVtbl->SignalEventOnResourceReady(This,hEvent);
}
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObjectCommands_EnqueueResourceRelease(IMFD3D12SynchronizationObjectCommands* This,ID3D12CommandQueue *pConsumerCommandQueue) {
    return This->lpVtbl->EnqueueResourceRelease(This,pConsumerCommandQueue);
}
#endif
#endif

#endif


#endif  /* __IMFD3D12SynchronizationObjectCommands_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFD3D12SynchronizationObject interface
 */
#ifndef __IMFD3D12SynchronizationObject_INTERFACE_DEFINED__
#define __IMFD3D12SynchronizationObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFD3D12SynchronizationObject, 0x802302b0, 0x82de, 0x45e1, 0xb4,0x21, 0xf1,0x9e,0xe5,0xbd,0xaf,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("802302b0-82de-45e1-b421-f19ee5bdaf23")
IMFD3D12SynchronizationObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SignalEventOnFinalResourceRelease(
        HANDLE hEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFD3D12SynchronizationObject, 0x802302b0, 0x82de, 0x45e1, 0xb4,0x21, 0xf1,0x9e,0xe5,0xbd,0xaf,0x23)
#endif
#else
typedef struct IMFD3D12SynchronizationObjectVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFD3D12SynchronizationObject methods ***/
    HRESULT (STDMETHODCALLTYPE *SignalEventOnFinalResourceRelease)(
        IMFD3D12SynchronizationObject *This,
        HANDLE hEvent);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IMFD3D12SynchronizationObject *This);

    END_INTERFACE
} IMFD3D12SynchronizationObjectVtbl;

interface IMFD3D12SynchronizationObject {
    CONST_VTBL IMFD3D12SynchronizationObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFD3D12SynchronizationObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFD3D12SynchronizationObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFD3D12SynchronizationObject_Release(This) (This)->lpVtbl->Release(This)
/*** IMFD3D12SynchronizationObject methods ***/
#define IMFD3D12SynchronizationObject_SignalEventOnFinalResourceRelease(This,hEvent) (This)->lpVtbl->SignalEventOnFinalResourceRelease(This,hEvent)
#define IMFD3D12SynchronizationObject_Reset(This) (This)->lpVtbl->Reset(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObject_QueryInterface(IMFD3D12SynchronizationObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFD3D12SynchronizationObject_AddRef(IMFD3D12SynchronizationObject* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFD3D12SynchronizationObject_Release(IMFD3D12SynchronizationObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFD3D12SynchronizationObject methods ***/
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObject_SignalEventOnFinalResourceRelease(IMFD3D12SynchronizationObject* This,HANDLE hEvent) {
    return This->lpVtbl->SignalEventOnFinalResourceRelease(This,hEvent);
}
static __WIDL_INLINE HRESULT IMFD3D12SynchronizationObject_Reset(IMFD3D12SynchronizationObject* This) {
    return This->lpVtbl->Reset(This);
}
#endif
#endif

#endif


#endif  /* __IMFD3D12SynchronizationObject_INTERFACE_DEFINED__ */

#if NTDDI_VERSION >= NTDDI_WIN10_CO
HRESULT MFCreateD3D12SynchronizationObject(ID3D12Device *pDevice, REFIID riid, void **ppvSyncObject);
#endif /* NTDDI_WIN10_CO */
typedef enum MF_MT_D3D_RESOURCE_VERSION_ENUM {
    MF_D3D11_RESOURCE = 0,
    MF_D3D12_RESOURCE = 1
} MF_MT_D3D_RESOURCE_VERSION_ENUM;
EXTERN_GUID(MF_D3D12_SYNCHRONIZATION_OBJECT, 0x2a7c8d6a, 0x85a6, 0x494d, 0xa0, 0x46, 0x6, 0xea, 0x1a, 0x13, 0x8f, 0x4b);
EXTERN_GUID(MF_MT_D3D_RESOURCE_VERSION, 0x174f1e85, 0xfe26, 0x453d, 0xb5, 0x2e, 0x5b, 0xdd, 0x4e, 0x55, 0xb9, 0x44);
EXTERN_GUID(MF_MT_D3D12_CPU_READBACK, 0x28ee9fe3, 0xd481, 0x46a6, 0xb9, 0x8a, 0x7f, 0x69, 0xd5, 0x28, 0xe, 0x82);
EXTERN_GUID(MF_MT_D3D12_TEXTURE_LAYOUT, 0x97c85caa, 0xbeb, 0x4ee1, 0x97, 0x15, 0xf2, 0x2f, 0xad, 0x8c, 0x10, 0xf5);
EXTERN_GUID(MF_MT_D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, 0xeeac2585, 0x3430, 0x498c, 0x84, 0xa2, 0x77, 0xb1, 0xbb, 0xa5, 0x70, 0xf6);
EXTERN_GUID(MF_MT_D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL, 0xb1138dc3, 0x1d5, 0x4c14, 0x9b, 0xdc, 0xcd, 0xc9, 0x33, 0x6f, 0x55, 0xb9);
EXTERN_GUID(MF_MT_D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, 0x82c85647, 0x5057, 0x4960, 0x95, 0x59, 0xf4, 0x5b, 0x8e, 0x27, 0x14, 0x27);
EXTERN_GUID(MF_MT_D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE, 0xba06bfac, 0xffe3, 0x474a, 0xab, 0x55, 0x16, 0x1e, 0xe4, 0x41, 0x7a, 0x2e);
EXTERN_GUID(MF_MT_D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER, 0xa6a1e439, 0x2f96, 0x4ab5, 0x98, 0xdc, 0xad, 0xf7, 0x49, 0x73, 0x50, 0x5d);
EXTERN_GUID(MF_MT_D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS, 0xa4940b2, 0xcfd6, 0x4738, 0x9d, 0x2, 0x98, 0x11, 0x37, 0x34, 0x1, 0x5a);
EXTERN_GUID(MF_SA_D3D12_HEAP_FLAGS, 0x496b3266, 0xd28f, 0x4f8c, 0x93, 0xa7, 0x4a, 0x59, 0x6b, 0x1a, 0x31, 0xa1);
EXTERN_GUID(MF_SA_D3D12_HEAP_TYPE, 0x56f26a76, 0xbbc1, 0x4ce0, 0xbb, 0x11, 0xe2, 0x23, 0x68, 0xd8, 0x74, 0xed);
EXTERN_GUID(MF_SA_D3D12_CLEAR_VALUE, 0x86ba9a39, 0x526, 0x495d, 0x9a, 0xb5, 0x54, 0xec, 0x9f, 0xad, 0x6f, 0xc3);
#endif /* WINAPI_PARTITION_APP */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mfd3d12_h__ */
