// Copyright © 2015-2017 winapi-rs developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
//! Direct3D include file
use shared::basetsd::UINT32;
use shared::d3d9caps::{D3DCAPS9, D3DCONTENTPROTECTIONCAPS, D3DOVERLAYCAPS};
use shared::d3d9types::{
    D3DADAPTER_IDENTIFIER9, D3DAUTHENTICATEDCHANNELTYPE, D3DAUTHENTICATEDCHANNEL_CONFIGURE_OUTPUT,
    D3DBACKBUFFER_TYPE, D3DBOX, D3DCLIPSTATUS9, D3DCOLOR, D3DCOMPOSERECTSOP, D3DCUBEMAP_FACES,
    D3DDEVICE_CREATION_PARAMETERS, D3DDEVTYPE, D3DDISPLAYMODE, D3DDISPLAYMODEEX,
    D3DDISPLAYMODEFILTER, D3DDISPLAYROTATION, D3DENCRYPTED_BLOCK_INFO, D3DFORMAT, D3DGAMMARAMP,
    D3DINDEXBUFFER_DESC, D3DLIGHT9, D3DLOCKED_BOX, D3DLOCKED_RECT, D3DMATERIAL9, D3DMATRIX,
    D3DMULTISAMPLE_TYPE, D3DPOOL, D3DPRESENTSTATS, D3DPRESENT_PARAMETERS, D3DPRIMITIVETYPE,
    D3DQUERYTYPE, D3DRASTER_STATUS, D3DRECT, D3DRECTPATCH_INFO, D3DRENDERSTATETYPE,
    D3DRESOURCETYPE, D3DSAMPLERSTATETYPE, D3DSTATEBLOCKTYPE, D3DSURFACE_DESC, D3DTEXTUREFILTERTYPE,
    D3DTEXTURESTAGESTATETYPE, D3DTRANSFORMSTATETYPE, D3DTRIPATCH_INFO, D3DVERTEXBUFFER_DESC,
    D3DVERTEXELEMENT9, D3DVIEWPORT9, D3DVOLUME_DESC,
};
use shared::guiddef::{GUID, IID};
use shared::minwindef::{BOOL, BYTE, DWORD, FLOAT, INT, UINT};
use shared::windef::{HDC, HMONITOR, HWND, POINT, RECT};
use um::unknwnbase::{IUnknown, IUnknownVtbl};
use um::wingdi::{PALETTEENTRY, RGNDATA};
use um::winnt::{HANDLE, HRESULT, LPCWSTR, LUID, VOID};
pub const D3D_SDK_VERSION: DWORD = 32;
pub const D3D9b_SDK_VERSION: DWORD = 31;
DEFINE_GUID!{IID_IDirect3D9,
    0x81bdcbca, 0x64d4, 0x426d, 0xae, 0x8d, 0xad, 0x01, 0x47, 0xf4, 0x27, 0x5c}
DEFINE_GUID!{IID_IDirect3DDevice9,
    0xd0223b96, 0xbf7a, 0x43fd, 0x92, 0xbd, 0xa4, 0x3b, 0x0d, 0x82, 0xb9, 0xeb}
DEFINE_GUID!{IID_IDirect3DResource9,
    0x05eec05d, 0x8f7d, 0x4362, 0xb9, 0x99, 0xd1, 0xba, 0xf3, 0x57, 0xc7, 0x04}
DEFINE_GUID!{IID_IDirect3DBaseTexture9,
    0x580ca87e, 0x1d3c, 0x4d54, 0x99, 0x1d, 0xb7, 0xd3, 0xe3, 0xc2, 0x98, 0xce}
DEFINE_GUID!{IID_IDirect3DTexture9,
    0x85c31227, 0x3de5, 0x4f00, 0x9b, 0x3a, 0xf1, 0x1a, 0xc3, 0x8c, 0x18, 0xb5}
DEFINE_GUID!{IID_IDirect3DCubeTexture9,
    0xfff32f81, 0xd953, 0x473a, 0x92, 0x23, 0x93, 0xd6, 0x52, 0xab, 0xa9, 0x3f}
DEFINE_GUID!{IID_IDirect3DVolumeTexture9,
    0x2518526c, 0xe789, 0x4111, 0xa7, 0xb9, 0x47, 0xef, 0x32, 0x8d, 0x13, 0xe6}
DEFINE_GUID!{IID_IDirect3DVertexBuffer9,
    0xb64bb1b5, 0xfd70, 0x4df6, 0xbf, 0x91, 0x19, 0xd0, 0xa1, 0x24, 0x55, 0xe3}
DEFINE_GUID!{IID_IDirect3DIndexBuffer9,
    0x7c9dd65e, 0xd3f7, 0x4529, 0xac, 0xee, 0x78, 0x58, 0x30, 0xac, 0xde, 0x35}
DEFINE_GUID!{IID_IDirect3DSurface9,
    0x0cfbaf3a, 0x9ff6, 0x429a, 0x99, 0xb3, 0xa2, 0x79, 0x6a, 0xf8, 0xb8, 0x9b}
DEFINE_GUID!{IID_IDirect3DVolume9,
    0x24f416e6, 0x1f67, 0x4aa7, 0xb8, 0x8e, 0xd3, 0x3f, 0x6f, 0x31, 0x28, 0xa1}
DEFINE_GUID!{IID_IDirect3DSwapChain9,
    0x794950f2, 0xadfc, 0x458a, 0x90, 0x5e, 0x10, 0xa1, 0x0b, 0x0b, 0x50, 0x3b}
DEFINE_GUID!{IID_IDirect3DVertexDeclaration9,
    0xdd13c59c, 0x36fa, 0x4098, 0xa8, 0xfb, 0xc7, 0xed, 0x39, 0xdc, 0x85, 0x46}
DEFINE_GUID!{IID_IDirect3DVertexShader9,
    0xefc5557e, 0x6265, 0x4613, 0x8a, 0x94, 0x43, 0x85, 0x78, 0x89, 0xeb, 0x36}
DEFINE_GUID!{IID_IDirect3DPixelShader9,
    0x6d3bdbdc, 0x5b02, 0x4415, 0xb8, 0x52, 0xce, 0x5e, 0x8b, 0xcc, 0xb2, 0x89}
DEFINE_GUID!{IID_IDirect3DStateBlock9,
    0xb07c4fe5, 0x310d, 0x4ba8, 0xa2, 0x3c, 0x4f, 0x0f, 0x20, 0x6f, 0x21, 0x8b}
DEFINE_GUID!{IID_IDirect3DQuery9,
    0xd9771460, 0xa695, 0x4f26, 0xbb, 0xd3, 0x27, 0xb8, 0x40, 0xb5, 0x41, 0xcc}
DEFINE_GUID!{IID_HelperName,
    0xe4a36723, 0xfdfe, 0x4b22, 0xb1, 0x46, 0x3c, 0x04, 0xc0, 0x7f, 0x4c, 0xc8}
DEFINE_GUID!{IID_IDirect3D9Ex,
    0x02177241, 0x69fc, 0x400c, 0x8f, 0xf1, 0x93, 0xa4, 0x4d, 0xf6, 0x86, 0x1d}
DEFINE_GUID!{IID_IDirect3DDevice9Ex,
    0xb18b10ce, 0x2649, 0x405a, 0x87, 0x0f, 0x95, 0xf7, 0x77, 0xd4, 0x31, 0x3a}
DEFINE_GUID!{IID_IDirect3DSwapChain9Ex,
    0x91886caf, 0x1c3d, 0x4d2e, 0xa0, 0xab, 0x3e, 0x4c, 0x7d, 0x8d, 0x33, 0x03}
DEFINE_GUID!{IID_IDirect3D9ExOverlayExtension,
    0x187aeb13, 0xaaf5, 0x4c59, 0x87, 0x6d, 0xe0, 0x59, 0x08, 0x8c, 0x0d, 0xf8}
DEFINE_GUID!{IID_IDirect3DDevice9Video,
    0x26dc4561, 0xa1ee, 0x4ae7, 0x96, 0xda, 0x11, 0x8a, 0x36, 0xc0, 0xec, 0x95}
DEFINE_GUID!{IID_IDirect3DAuthenticatedChannel9,
    0xff24beee, 0xda21, 0x4beb, 0x98, 0xb5, 0xd2, 0xf8, 0x99, 0xf9, 0x8a, 0xf9}
DEFINE_GUID!{IID_IDirect3DCryptoSession9,
    0xfa0ab799, 0x7a9c, 0x48ca, 0x8c, 0x5b, 0x23, 0x7e, 0x71, 0xa5, 0x44, 0x34}
extern "system" {
    pub fn Direct3DCreate9(
        SDKVersion: UINT,
    ) -> *mut IDirect3D9;
    pub fn D3DPERF_BeginEvent(
        col: D3DCOLOR,
        wszName: LPCWSTR,
    ) -> INT;
    pub fn D3DPERF_EndEvent() -> INT;
    pub fn D3DPERF_SetMarker(
        col: D3DCOLOR,
        wszName: LPCWSTR,
    ) -> ();
    pub fn D3DPERF_SetRegion(
        col: D3DCOLOR,
        wszName: LPCWSTR,
    ) -> ();
    pub fn D3DPERF_QueryRepeatFrame() -> BOOL;
    pub fn D3DPERF_SetOptions(
        dwOptions: DWORD,
    ) -> ();
    pub fn D3DPERF_GetStatus() -> DWORD;
}
RIDL!(#[uuid(0x81bdcbca, 0x64d4, 0x426d, 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c)]
interface IDirect3D9(IDirect3D9Vtbl): IUnknown(IUnknownVtbl) {
    fn RegisterSoftwareDevice(
        pInitializeFunction: *mut VOID,
    ) -> HRESULT,
    fn GetAdapterCount() -> UINT,
    fn GetAdapterIdentifier(
        Adapter: UINT,
        Flags: DWORD,
        pIdentifier: *mut D3DADAPTER_IDENTIFIER9,
    ) -> HRESULT,
    fn GetAdapterModeCount(
        Adapter: UINT,
        Format: D3DFORMAT,
    ) -> UINT,
    fn EnumAdapterModes(
        Adapter: UINT,
        Format: D3DFORMAT,
        Mode: UINT,
        pMode: *mut D3DDISPLAYMODE,
    ) -> HRESULT,
    fn GetAdapterDisplayMode(
        Adapter: UINT,
        pMode: *mut D3DDISPLAYMODE,
    ) -> HRESULT,
    fn CheckDeviceType(
        Adapter: UINT,
        DevType: D3DDEVTYPE,
        AdapterFormat: D3DFORMAT,
        BackBufferFormat: D3DFORMAT,
        bWindowed: BOOL,
    ) -> HRESULT,
    fn CheckDeviceFormat(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        AdapterFormat: D3DFORMAT,
        Usage: DWORD,
        RType: D3DRESOURCETYPE,
        CheckFormat: D3DFORMAT,
    ) -> HRESULT,
    fn CheckDeviceMultiSampleType(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        SurfaceFormat: D3DFORMAT,
        Windowed: BOOL,
        MultiSampleType: D3DMULTISAMPLE_TYPE,
        pQualityLevels: *mut DWORD,
    ) -> HRESULT,
    fn CheckDepthStencilMatch(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        AdapterFormat: D3DFORMAT,
        RenderTargetFormat: D3DFORMAT,
        DepthStencilFormat: D3DFORMAT,
    ) -> HRESULT,
    fn CheckDeviceFormatConversion(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        SourceFormat: D3DFORMAT,
        TargetFormat: D3DFORMAT,
    ) -> HRESULT,
    fn GetDeviceCaps(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        pCaps: *mut D3DCAPS9,
    ) -> HRESULT,
    fn GetAdapterMonitor(
        Adapter: UINT,
    ) -> HMONITOR,
    fn CreateDevice(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        hFocusWindow: HWND,
        BehaviorFlags: DWORD,
        pPresentationParameters: *mut D3DPRESENT_PARAMETERS,
        ppReturnedDeviceInterface: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
}
);
pub type LPDIRECT3D9 = *mut IDirect3D9;
pub type PDIRECT3D9 = *mut IDirect3D9;
RIDL!(#[uuid(0xd0223b96, 0xbf7a, 0x43fd, 0x92, 0xbd, 0xa4, 0x3b, 0xd, 0x82, 0xb9, 0xeb)]
interface IDirect3DDevice9(IDirect3DDevice9Vtbl): IUnknown(IUnknownVtbl) {
    fn TestCooperativeLevel() -> HRESULT,
    fn GetAvailableTextureMem() -> UINT,
    fn EvictManagedResources() -> HRESULT,
    fn GetDirect3D(
        ppD3D9: *mut *mut IDirect3D9,
    ) -> HRESULT,
    fn GetDeviceCaps(
        pCaps: *mut D3DCAPS9,
    ) -> HRESULT,
    fn GetDisplayMode(
        iSwapChain: UINT,
        pMode: *mut D3DDISPLAYMODE,
    ) -> HRESULT,
    fn GetCreationParameters(
        pParameters: *mut D3DDEVICE_CREATION_PARAMETERS,
    ) -> HRESULT,
    fn SetCursorProperties(
        XHotSpot: UINT,
        YHotSpot: UINT,
        pCursorBitmap: *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn SetCursorPosition(
        X: INT,
        Y: INT,
        Flags: DWORD,
    ) -> (),
    fn ShowCursor(
        bShow: BOOL,
    ) -> BOOL,
    fn CreateAdditionalSwapChain(
        pPresentationParameters: *mut D3DPRESENT_PARAMETERS,
        pSwapChain: *mut *mut IDirect3DSwapChain9,
    ) -> HRESULT,
    fn GetSwapChain(
        iSwapChain: UINT,
        pSwapChain: *mut *mut IDirect3DSwapChain9,
    ) -> HRESULT,
    fn GetNumberOfSwapChains() -> UINT,
    fn Reset(
        pPresentationParameters: *mut D3DPRESENT_PARAMETERS,
    ) -> HRESULT,
    fn Present(
        pSourceRect: *const RECT,
        pDestRect: *const RECT,
        hDestWindowOverride: HWND,
        pDirtyRegion: *const RGNDATA,
    ) -> HRESULT,
    fn GetBackBuffer(
        iSwapChain: UINT,
        iBackBuffer: UINT,
        Type: D3DBACKBUFFER_TYPE,
        ppBackBuffer: *mut *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn GetRasterStatus(
        iSwapChain: UINT,
        pRasterStatus: *mut D3DRASTER_STATUS,
    ) -> HRESULT,
    fn SetDialogBoxMode(
        bEnableDialogs: BOOL,
    ) -> HRESULT,
    fn SetGammaRamp(
        iSwapChain: UINT,
        Flags: DWORD,
        pRamp: *const D3DGAMMARAMP,
    ) -> (),
    fn GetGammaRamp(
        iSwapChain: UINT,
        pRamp: *mut D3DGAMMARAMP,
    ) -> (),
    fn CreateTexture(
        Width: UINT,
        Height: UINT,
        Levels: UINT,
        Usage: DWORD,
        Format: D3DFORMAT,
        Pool: D3DPOOL,
        ppTexture: *mut *mut IDirect3DTexture9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateVolumeTexture(
        Width: UINT,
        Height: UINT,
        Depth: UINT,
        Levels: UINT,
        Usage: DWORD,
        Format: D3DFORMAT,
        Pool: D3DPOOL,
        ppVolumeTexture: *mut *mut IDirect3DVolumeTexture9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateCubeTexture(
        EdgeLength: UINT,
        Levels: UINT,
        Usage: DWORD,
        Format: D3DFORMAT,
        Pool: D3DPOOL,
        ppCubeTexture: *mut *mut IDirect3DCubeTexture9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateVertexBuffer(
        Length: UINT,
        Usage: DWORD,
        FVF: DWORD,
        Pool: D3DPOOL,
        ppVertexBuffer: *mut *mut IDirect3DVertexBuffer9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateIndexBuffer(
        Length: UINT,
        Usage: DWORD,
        Format: D3DFORMAT,
        Pool: D3DPOOL,
        ppIndexBuffer: *mut *mut IDirect3DIndexBuffer9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateRenderTarget(
        Width: UINT,
        Height: UINT,
        Format: D3DFORMAT,
        MultiSample: D3DMULTISAMPLE_TYPE,
        MultisampleQuality: DWORD,
        Lockable: BOOL,
        ppSurface: *mut *mut IDirect3DSurface9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateDepthStencilSurface(
        Width: UINT,
        Height: UINT,
        Format: D3DFORMAT,
        MultiSample: D3DMULTISAMPLE_TYPE,
        MultisampleQuality: DWORD,
        Discard: BOOL,
        ppSurface: *mut *mut IDirect3DSurface9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn UpdateSurface(
        pSourceSurface: *mut IDirect3DSurface9,
        pSourceRect: *const RECT,
        pDestinationSurface: *mut IDirect3DSurface9,
        pDestPoint: *const POINT,
    ) -> HRESULT,
    fn UpdateTexture(
        pSourceTexture: *mut IDirect3DBaseTexture9,
        pDestinationTexture: *mut IDirect3DBaseTexture9,
    ) -> HRESULT,
    fn GetRenderTargetData(
        pRenderTarget: *mut IDirect3DSurface9,
        pDestSurface: *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn GetFrontBufferData(
        iSwapChain: UINT,
        pDestSurface: *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn StretchRect(
        pSourceSurface: *mut IDirect3DSurface9,
        pSourceRect: *const RECT,
        pDestSurface: *mut IDirect3DSurface9,
        pDestRect: *const RECT,
        Filter: D3DTEXTUREFILTERTYPE,
    ) -> HRESULT,
    fn ColorFill(
        pSurface: *mut IDirect3DSurface9,
        pRect: *const RECT,
        color: D3DCOLOR,
    ) -> HRESULT,
    fn CreateOffscreenPlainSurface(
        Width: UINT,
        Height: UINT,
        Format: D3DFORMAT,
        Pool: D3DPOOL,
        ppSurface: *mut *mut IDirect3DSurface9,
        pSharedHandle: *mut HANDLE,
    ) -> HRESULT,
    fn SetRenderTarget(
        RenderTargetIndex: DWORD,
        pRenderTarget: *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn GetRenderTarget(
        RenderTargetIndex: DWORD,
        ppRenderTarget: *mut *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn SetDepthStencilSurface(
        pNewZStencil: *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn GetDepthStencilSurface(
        ppZStencilSurface: *mut *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn BeginScene() -> HRESULT,
    fn EndScene() -> HRESULT,
    fn Clear(
        Count: DWORD,
        pRects: *const D3DRECT,
        Flags: DWORD,
        Color: D3DCOLOR,
        Z: FLOAT,
        Stencil: DWORD,
    ) -> HRESULT,
    fn SetTransform(
        State: D3DTRANSFORMSTATETYPE,
        pMatrix: *const D3DMATRIX,
    ) -> HRESULT,
    fn GetTransform(
        State: D3DTRANSFORMSTATETYPE,
        pMatrix: *mut D3DMATRIX,
    ) -> HRESULT,
    fn MultiplyTransform(
        arg1: D3DTRANSFORMSTATETYPE,
        arg2: *const D3DMATRIX,
    ) -> HRESULT,
    fn SetViewport(
        pViewport: *const D3DVIEWPORT9,
    ) -> HRESULT,
    fn GetViewport(
        pViewport: *mut D3DVIEWPORT9,
    ) -> HRESULT,
    fn SetMaterial(
        pMaterial: *const D3DMATERIAL9,
    ) -> HRESULT,
    fn GetMaterial(
        pMaterial: *mut D3DMATERIAL9,
    ) -> HRESULT,
    fn SetLight(
        Index: DWORD,
        arg1: *const D3DLIGHT9,
    ) -> HRESULT,
    fn GetLight(
        Index: DWORD,
        arg1: *mut D3DLIGHT9,
    ) -> HRESULT,
    fn LightEnable(
        Index: DWORD,
        Enable: BOOL,
    ) -> HRESULT,
    fn GetLightEnable(
        Index: DWORD,
        pEnable: *mut BOOL,
    ) -> HRESULT,
    fn SetClipPlane(
        Index: DWORD,
        pPlane: *const FLOAT,
    ) -> HRESULT,
    fn GetClipPlane(
        Index: DWORD,
        pPlane: *mut FLOAT,
    ) -> HRESULT,
    fn SetRenderState(
        State: D3DRENDERSTATETYPE,
        Value: DWORD,
    ) -> HRESULT,
    fn GetRenderState(
        State: D3DRENDERSTATETYPE,
        pValue: *mut DWORD,
    ) -> HRESULT,
    fn CreateStateBlock(
        Type: D3DSTATEBLOCKTYPE,
        ppSB: *mut *mut IDirect3DStateBlock9,
    ) -> HRESULT,
    fn BeginStateBlock() -> HRESULT,
    fn EndStateBlock(
        ppSB: *mut *mut IDirect3DStateBlock9,
    ) -> HRESULT,
    fn SetClipStatus(
        pClipStatus: *const D3DCLIPSTATUS9,
    ) -> HRESULT,
    fn GetClipStatus(
        pClipStatus: *mut D3DCLIPSTATUS9,
    ) -> HRESULT,
    fn GetTexture(
        Stage: DWORD,
        ppTexture: *mut *mut IDirect3DBaseTexture9,
    ) -> HRESULT,
    fn SetTexture(
        Stage: DWORD,
        pTexture: *mut IDirect3DBaseTexture9,
    ) -> HRESULT,
    fn GetTextureStageState(
        Stage: DWORD,
        Type: D3DTEXTURESTAGESTATETYPE,
        pValue: *mut DWORD,
    ) -> HRESULT,
    fn SetTextureStageState(
        Stage: DWORD,
        Type: D3DTEXTURESTAGESTATETYPE,
        Value: DWORD,
    ) -> HRESULT,
    fn GetSamplerState(
        Sampler: DWORD,
        Type: D3DSAMPLERSTATETYPE,
        pValue: *mut DWORD,
    ) -> HRESULT,
    fn SetSamplerState(
        Sampler: DWORD,
        Type: D3DSAMPLERSTATETYPE,
        Value: DWORD,
    ) -> HRESULT,
    fn ValidateDevice(
        pNumPasses: *mut DWORD,
    ) -> HRESULT,
    fn SetPaletteEntries(
        PaletteNumber: UINT,
        pEntries: *const PALETTEENTRY,
    ) -> HRESULT,
    fn GetPaletteEntries(
        PaletteNumber: UINT,
        pEntries: *mut PALETTEENTRY,
    ) -> HRESULT,
    fn SetCurrentTexturePalette(
        PaletteNumber: UINT,
    ) -> HRESULT,
    fn GetCurrentTexturePalette(
        PaletteNumber: *mut UINT,
    ) -> HRESULT,
    fn SetScissorRect(
        pRect: *const RECT,
    ) -> HRESULT,
    fn GetScissorRect(
        pRect: *mut RECT,
    ) -> HRESULT,
    fn SetSoftwareVertexProcessing(
        bSoftware: BOOL,
    ) -> HRESULT,
    fn GetSoftwareVertexProcessing() -> BOOL,
    fn SetNPatchMode(
        nSegments: FLOAT,
    ) -> HRESULT,
    fn GetNPatchMode() -> FLOAT,
    fn DrawPrimitive(
        PrimitiveType: D3DPRIMITIVETYPE,
        StartVertex: UINT,
        PrimitiveCount: UINT,
    ) -> HRESULT,
    fn DrawIndexedPrimitive(
        arg1: D3DPRIMITIVETYPE,
        BaseVertexIndex: INT,
        MinVertexIndex: UINT,
        NumVertices: UINT,
        startIndex: UINT,
        primCount: UINT,
    ) -> HRESULT,
    fn DrawPrimitiveUP(
        PrimitiveType: D3DPRIMITIVETYPE,
        PrimitiveCount: UINT,
        pVertexStreamZeroData: *const VOID,
        VertexStreamZeroStride: UINT,
    ) -> HRESULT,
    fn DrawIndexedPrimitiveUP(
        PrimitiveType: D3DPRIMITIVETYPE,
        MinVertexIndex: UINT,
        NumVertices: UINT,
        PrimitiveCount: UINT,
        pIndexData: *const VOID,
        IndexDataFormat: D3DFORMAT,
        pVertexStreamZeroData: *const VOID,
        VertexStreamZeroStride: UINT,
    ) -> HRESULT,
    fn ProcessVertices(
        SrcStartIndex: UINT,
        DestIndex: UINT,
        VertexCount: UINT,
        pDestBuffer: *mut IDirect3DVertexBuffer9,
        pVertexDecl: *mut IDirect3DVertexDeclaration9,
        Flags: DWORD,
    ) -> HRESULT,
    fn CreateVertexDeclaration(
        pVertexElements: *const D3DVERTEXELEMENT9,
        ppDecl: *mut *mut IDirect3DVertexDeclaration9,
    ) -> HRESULT,
    fn SetVertexDeclaration(
        pDecl: *mut IDirect3DVertexDeclaration9,
    ) -> HRESULT,
    fn GetVertexDeclaration(
        ppDecl: *mut *mut IDirect3DVertexDeclaration9,
    ) -> HRESULT,
    fn SetFVF(
        FVF: DWORD,
    ) -> HRESULT,
    fn GetFVF(
        pFVF: *mut DWORD,
    ) -> HRESULT,
    fn CreateVertexShader(
        pFunction: *const DWORD,
        ppShader: *mut *mut IDirect3DVertexShader9,
    ) -> HRESULT,
    fn SetVertexShader(
        pShader: *mut IDirect3DVertexShader9,
    ) -> HRESULT,
    fn GetVertexShader(
        ppShader: *mut *mut IDirect3DVertexShader9,
    ) -> HRESULT,
    fn SetVertexShaderConstantF(
        StartRegister: UINT,
        pConstantData: *const FLOAT,
        Vector4fCount: UINT,
    ) -> HRESULT,
    fn GetVertexShaderConstantF(
        StartRegister: UINT,
        pConstantData: *mut FLOAT,
        Vector4fCount: UINT,
    ) -> HRESULT,
    fn SetVertexShaderConstantI(
        StartRegister: UINT,
        pConstantData: *const INT,
        Vector4iCount: UINT,
    ) -> HRESULT,
    fn GetVertexShaderConstantI(
        StartRegister: UINT,
        pConstantData: *mut INT,
        Vector4iCount: UINT,
    ) -> HRESULT,
    fn SetVertexShaderConstantB(
        StartRegister: UINT,
        pConstantData: *const BOOL,
        BoolCount: UINT,
    ) -> HRESULT,
    fn GetVertexShaderConstantB(
        StartRegister: UINT,
        pConstantData: *mut BOOL,
        BoolCount: UINT,
    ) -> HRESULT,
    fn SetStreamSource(
        StreamNumber: UINT,
        pStreamData: *mut IDirect3DVertexBuffer9,
        OffsetInBytes: UINT,
        Stride: UINT,
    ) -> HRESULT,
    fn GetStreamSource(
        StreamNumber: UINT,
        ppStreamData: *mut *mut IDirect3DVertexBuffer9,
        pOffsetInBytes: *mut UINT,
        pStride: *mut UINT,
    ) -> HRESULT,
    fn SetStreamSourceFreq(
        StreamNumber: UINT,
        Setting: UINT,
    ) -> HRESULT,
    fn GetStreamSourceFreq(
        StreamNumber: UINT,
        pSetting: *mut UINT,
    ) -> HRESULT,
    fn SetIndices(
        pIndexData: *mut IDirect3DIndexBuffer9,
    ) -> HRESULT,
    fn GetIndices(
        ppIndexData: *mut *mut IDirect3DIndexBuffer9,
    ) -> HRESULT,
    fn CreatePixelShader(
        pFunction: *const DWORD,
        ppShader: *mut *mut IDirect3DPixelShader9,
    ) -> HRESULT,
    fn SetPixelShader(
        pShader: *mut IDirect3DPixelShader9,
    ) -> HRESULT,
    fn GetPixelShader(
        ppShader: *mut *mut IDirect3DPixelShader9,
    ) -> HRESULT,
    fn SetPixelShaderConstantF(
        StartRegister: UINT,
        pConstantData: *const FLOAT,
        Vector4fCount: UINT,
    ) -> HRESULT,
    fn GetPixelShaderConstantF(
        StartRegister: UINT,
        pConstantData: *mut FLOAT,
        Vector4fCount: UINT,
    ) -> HRESULT,
    fn SetPixelShaderConstantI(
        StartRegister: UINT,
        pConstantData: *const INT,
        Vector4iCount: UINT,
    ) -> HRESULT,
    fn GetPixelShaderConstantI(
        StartRegister: UINT,
        pConstantData: *mut INT,
        Vector4iCount: UINT,
    ) -> HRESULT,
    fn SetPixelShaderConstantB(
        StartRegister: UINT,
        pConstantData: *const BOOL,
        BoolCount: UINT,
    ) -> HRESULT,
    fn GetPixelShaderConstantB(
        StartRegister: UINT,
        pConstantData: *mut BOOL,
        BoolCount: UINT,
    ) -> HRESULT,
    fn DrawRectPatch(
        Handle: UINT,
        pNumSegs: *const FLOAT,
        pRectPatchInfo: *const D3DRECTPATCH_INFO,
    ) -> HRESULT,
    fn DrawTriPatch(
        Handle: UINT,
        pNumSegs: *const FLOAT,
        pTriPatchInfo: *const D3DTRIPATCH_INFO,
    ) -> HRESULT,
    fn DeletePatch(
        Handle: UINT,
    ) -> HRESULT,
    fn CreateQuery(
        Type: D3DQUERYTYPE,
        ppQuery: *mut *mut IDirect3DQuery9,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DDEVICE9 = *mut IDirect3DDevice9;
pub type PDIRECT3DDEVICE9 = *mut IDirect3DDevice9;
RIDL!(#[uuid(0xb07c4fe5, 0x310d, 0x4ba8, 0xa2, 0x3c, 0x4f, 0xf, 0x20, 0x6f, 0x21, 0x8b)]
interface IDirect3DStateBlock9(IDirect3DStateBlock9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn Capture() -> HRESULT,
    fn Apply() -> HRESULT,
}
);
pub type LPDIRECT3DSTATEBLOCK9 = *mut IDirect3DStateBlock9;
pub type PDIRECT3DSTATEBLOCK9 = *mut IDirect3DStateBlock9;
RIDL!(#[uuid(0x794950f2, 0xadfc, 0x458a, 0x90, 0x5e, 0x10, 0xa1, 0xb, 0xb, 0x50, 0x3b)]
interface IDirect3DSwapChain9(IDirect3DSwapChain9Vtbl): IUnknown(IUnknownVtbl) {
    fn Present(
        pSourceRect: *const RECT,
        pDestRect: *const RECT,
        hDestWindowOverride: HWND,
        pDirtyRegion: *const RGNDATA,
        dwFlags: DWORD,
    ) -> HRESULT,
    fn GetFrontBufferData(
        pDestSurface: *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn GetBackBuffer(
        iBackBuffer: UINT,
        Type: D3DBACKBUFFER_TYPE,
        ppBackBuffer: *mut *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn GetRasterStatus(
        pRasterStatus: *mut D3DRASTER_STATUS,
    ) -> HRESULT,
    fn GetDisplayMode(
        pMode: *mut D3DDISPLAYMODE,
    ) -> HRESULT,
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn GetPresentParameters(
        pPresentationParameters: *mut D3DPRESENT_PARAMETERS,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DSWAPCHAIN9 = *mut IDirect3DSwapChain9;
pub type PDIRECT3DSWAPCHAIN9 = *mut IDirect3DSwapChain9;
RIDL!(#[uuid(0x5eec05d, 0x8f7d, 0x4362, 0xb9, 0x99, 0xd1, 0xba, 0xf3, 0x57, 0xc7, 0x4)]
interface IDirect3DResource9(IDirect3DResource9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn SetPrivateData(
        refguid: *const GUID,
        pData: *const VOID,
        SizeOfData: DWORD,
        Flags: DWORD,
    ) -> HRESULT,
    fn GetPrivateData(
        refguid: *const GUID,
        pData: *mut VOID,
        pSizeOfData: *mut DWORD,
    ) -> HRESULT,
    fn FreePrivateData(
        refguid: *const GUID,
    ) -> HRESULT,
    fn SetPriority(
        PriorityNew: DWORD,
    ) -> DWORD,
    fn GetPriority() -> DWORD,
    fn PreLoad() -> (),
    fn GetType() -> D3DRESOURCETYPE,
}
);
pub type LPDIRECT3DRESOURCE9 = *mut IDirect3DResource9;
pub type PDIRECT3DRESOURCE9 = *mut IDirect3DResource9;
RIDL!(#[uuid(0xdd13c59c, 0x36fa, 0x4098, 0xa8, 0xfb, 0xc7, 0xed, 0x39, 0xdc, 0x85, 0x46)]
interface IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn GetDeclaration(
        pElement: *mut D3DVERTEXELEMENT9,
        pNumElements: *mut UINT,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DVERTEXDECLARATION9 = *mut IDirect3DVertexDeclaration9;
pub type PDIRECT3DVERTEXDECLARATION9 = *mut IDirect3DVertexDeclaration9;
RIDL!(#[uuid(0xefc5557e, 0x6265, 0x4613, 0x8a, 0x94, 0x43, 0x85, 0x78, 0x89, 0xeb, 0x36)]
interface IDirect3DVertexShader9(IDirect3DVertexShader9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn GetFunction(
        arg1: *mut VOID,
        pSizeOfData: *mut UINT,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DVERTEXSHADER9 = *mut IDirect3DVertexShader9;
pub type PDIRECT3DVERTEXSHADER9 = *mut IDirect3DVertexShader9;
RIDL!(#[uuid(0x6d3bdbdc, 0x5b02, 0x4415, 0xb8, 0x52, 0xce, 0x5e, 0x8b, 0xcc, 0xb2, 0x89)]
interface IDirect3DPixelShader9(IDirect3DPixelShader9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn GetFunction(
        arg1: *mut VOID,
        pSizeOfData: *mut UINT,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DPIXELSHADER9 = *mut IDirect3DPixelShader9;
pub type PDIRECT3DPIXELSHADER9 = *mut IDirect3DPixelShader9;
RIDL!{#[uuid(0x580ca87e, 0x1d3c, 0x4d54, 0x99, 0x1d, 0xb7, 0xd3, 0xe3, 0xc2, 0x98, 0xce)]
interface IDirect3DBaseTexture9(IDirect3DBaseTexture9Vtbl):
    IDirect3DResource9(IDirect3DResource9Vtbl) {
    fn SetLOD(
        LODNew: DWORD,
    ) -> DWORD,
    fn GetLOD() -> DWORD,
    fn GetLevelCount() -> DWORD,
    fn SetAutoGenFilterType(
        FilterType: D3DTEXTUREFILTERTYPE,
    ) -> HRESULT,
    fn GetAutoGenFilterType() -> D3DTEXTUREFILTERTYPE,
    fn GenerateMipSubLevels() -> (),
}}
pub type LPDIRECT3DBASETEXTURE9 = *mut IDirect3DBaseTexture9;
pub type PDIRECT3DBASETEXTURE9 = *mut IDirect3DBaseTexture9;
RIDL!{#[uuid(0x85c31227, 0x3de5, 0x4f00, 0x9b, 0x3a, 0xf1, 0x1a, 0xc3, 0x8c, 0x18, 0xb5)]
interface IDirect3DTexture9(IDirect3DTexture9Vtbl):
    IDirect3DBaseTexture9(IDirect3DBaseTexture9Vtbl) {
    fn GetLevelDesc(
        Level: UINT,
        pDesc: *mut D3DSURFACE_DESC,
    ) -> HRESULT,
    fn GetSurfaceLevel(
        Level: UINT,
        ppSurfaceLevel: *mut *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn LockRect(
        Level: UINT,
        pLockedRect: *mut D3DLOCKED_RECT,
        pRect: *const RECT,
        Flags: DWORD,
    ) -> HRESULT,
    fn UnlockRect(
        Level: UINT,
    ) -> HRESULT,
    fn AddDirtyRect(
        pDirtyRect: *const RECT,
    ) -> HRESULT,
}}
pub type LPDIRECT3DTEXTURE9 = *mut IDirect3DTexture9;
pub type PDIRECT3DTEXTURE9 = *mut IDirect3DTexture9;
RIDL!{#[uuid(0x2518526c, 0xe789, 0x4111, 0xa7, 0xb9, 0x47, 0xef, 0x32, 0x8d, 0x13, 0xe6)]
interface IDirect3DVolumeTexture9(IDirect3DVolumeTexture9Vtbl):
    IDirect3DBaseTexture9(IDirect3DBaseTexture9Vtbl) {
    fn GetLevelDesc(
        Level: UINT,
        pDesc: *mut D3DVOLUME_DESC,
    ) -> HRESULT,
    fn GetVolumeLevel(
        Level: UINT,
        ppVolumeLevel: *mut *mut IDirect3DVolume9,
    ) -> HRESULT,
    fn LockBox(
        Level: UINT,
        pLockedVolume: *mut D3DLOCKED_BOX,
        pBox: *const D3DBOX,
        Flags: DWORD,
    ) -> HRESULT,
    fn UnlockBox(
        Level: UINT,
    ) -> HRESULT,
    fn AddDirtyBox(
        pDirtyBox: *const D3DBOX,
    ) -> HRESULT,
}}
pub type LPDIRECT3DVOLUMETEXTURE9 = *mut IDirect3DVolumeTexture9;
pub type PDIRECT3DVOLUMETEXTURE9 = *mut IDirect3DVolumeTexture9;
RIDL!{#[uuid(0xfff32f81, 0xd953, 0x473a, 0x92, 0x23, 0x93, 0xd6, 0x52, 0xab, 0xa9, 0x3f)]
interface IDirect3DCubeTexture9(IDirect3DCubeTexture9Vtbl):
    IDirect3DBaseTexture9(IDirect3DBaseTexture9Vtbl) {
    fn GetLevelDesc(
        Level: UINT,
        pDesc: *mut D3DSURFACE_DESC,
    ) -> HRESULT,
    fn GetCubeMapSurface(
        FaceType: D3DCUBEMAP_FACES,
        Level: UINT,
        ppCubeMapSurface: *mut *mut IDirect3DSurface9,
    ) -> HRESULT,
    fn LockRect(
        FaceType: D3DCUBEMAP_FACES,
        Level: UINT,
        pLockedRect: *mut D3DLOCKED_RECT,
        pRect: *const RECT,
        Flags: DWORD,
    ) -> HRESULT,
    fn UnlockRect(
        FaceType: D3DCUBEMAP_FACES,
        Level: UINT,
    ) -> HRESULT,
    fn AddDirtyRect(
        FaceType: D3DCUBEMAP_FACES,
        pDirtyRect: *const RECT,
    ) -> HRESULT,
}}
pub type LPDIRECT3DCUBETEXTURE9 = *mut IDirect3DCubeTexture9;
pub type PDIRECT3DCUBETEXTURE9 = *mut IDirect3DCubeTexture9;
RIDL!{#[uuid(0xb64bb1b5, 0xfd70, 0x4df6, 0xbf, 0x91, 0x19, 0xd0, 0xa1, 0x24, 0x55, 0xe3)]
interface IDirect3DVertexBuffer9(IDirect3DVertexBuffer9Vtbl):
    IDirect3DResource9(IDirect3DResource9Vtbl) {
    fn Lock(
        OffsetToLock: UINT,
        SizeToLock: UINT,
        ppbData: *mut *mut VOID,
        Flags: DWORD,
    ) -> HRESULT,
    fn Unlock() -> HRESULT,
    fn GetDesc(
        pDesc: *mut D3DVERTEXBUFFER_DESC,
    ) -> HRESULT,
}}
pub type LPDIRECT3DVERTEXBUFFER9 = *mut IDirect3DVertexBuffer9;
pub type PDIRECT3DVERTEXBUFFER9 = *mut IDirect3DVertexBuffer9;
RIDL!{#[uuid(0x7c9dd65e, 0xd3f7, 0x4529, 0xac, 0xee, 0x78, 0x58, 0x30, 0xac, 0xde, 0x35)]
interface IDirect3DIndexBuffer9(IDirect3DIndexBuffer9Vtbl):
    IDirect3DResource9(IDirect3DResource9Vtbl) {
    fn Lock(
        OffsetToLock: UINT,
        SizeToLock: UINT,
        ppbData: *mut *mut VOID,
        Flags: DWORD,
    ) -> HRESULT,
    fn Unlock() -> HRESULT,
    fn GetDesc(
        pDesc: *mut D3DINDEXBUFFER_DESC,
    ) -> HRESULT,
}}
pub type LPDIRECT3DINDEXBUFFER9 = *mut IDirect3DIndexBuffer9;
pub type PDIRECT3DINDEXBUFFER9 = *mut IDirect3DIndexBuffer9;
RIDL!{#[uuid(0xcfbaf3a, 0x9ff6, 0x429a, 0x99, 0xb3, 0xa2, 0x79, 0x6a, 0xf8, 0xb8, 0x9b)]
interface IDirect3DSurface9(IDirect3DSurface9Vtbl): IDirect3DResource9(IDirect3DResource9Vtbl) {
    fn GetContainer(
        riid: *const IID,
        ppContainer: *mut *mut VOID,
    ) -> HRESULT,
    fn GetDesc(
        pDesc: *mut D3DSURFACE_DESC,
    ) -> HRESULT,
    fn LockRect(
        pLockedRect: *mut D3DLOCKED_RECT,
        pRect: *const RECT,
        Flags: DWORD,
    ) -> HRESULT,
    fn UnlockRect() -> HRESULT,
    fn GetDC(
        phdc: *mut HDC,
    ) -> HRESULT,
    fn ReleaseDC(
        hdc: HDC,
    ) -> HRESULT,
}}
pub type LPDIRECT3DSURFACE9 = *mut IDirect3DSurface9;
pub type PDIRECT3DSURFACE9 = *mut IDirect3DSurface9;
RIDL!{#[uuid(0x24f416e6, 0x1f67, 0x4aa7, 0xb8, 0x8e, 0xd3, 0x3f, 0x6f, 0x31, 0x28, 0xa1)]
interface IDirect3DVolume9(IDirect3DVolume9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn SetPrivateData(
        refguid: *const GUID,
        pData: *const VOID,
        SizeOfData: DWORD,
        Flags: DWORD,
    ) -> HRESULT,
    fn GetPrivateData(
        refguid: *const GUID,
        pData: *mut VOID,
        pSizeOfData: *mut DWORD,
    ) -> HRESULT,
    fn FreePrivateData(
        refguid: *const GUID,
    ) -> HRESULT,
    fn GetContainer(
        riid: *const IID,
        ppContainer: *mut *mut VOID,
    ) -> HRESULT,
    fn GetDesc(
        pDesc: *mut D3DVOLUME_DESC,
    ) -> HRESULT,
    fn LockBox(
        pLockedVolume: *mut D3DLOCKED_BOX,
        pBox: *const D3DBOX,
        Flags: DWORD,
    ) -> HRESULT,
    fn UnlockBox() -> HRESULT,
}}
pub type LPDIRECT3DVOLUME9 = *mut IDirect3DVolume9;
pub type PDIRECT3DVOLUME9 = *mut IDirect3DVolume9;
RIDL!{#[uuid(0xd9771460, 0xa695, 0x4f26, 0xbb, 0xd3, 0x27, 0xb8, 0x40, 0xb5, 0x41, 0xcc)]
interface IDirect3DQuery9(IDirect3DQuery9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetDevice(
        ppDevice: *mut *mut IDirect3DDevice9,
    ) -> HRESULT,
    fn GetType() -> D3DRESOURCETYPE,
    fn GetDataSize() -> DWORD,
    fn Issue(
        dwIssueFlags: DWORD,
    ) -> HRESULT,
    fn GetData(
        pData: *mut VOID,
        dwSize: DWORD,
        dwGetDataFlags: DWORD,
    ) -> HRESULT,
}}
pub type LPDIRECT3DQUERY9 = *mut IDirect3DQuery9;
pub type PDIRECT3DQUERY9 = *mut IDirect3DQuery9;
pub const D3DCREATE_FPU_PRESERVE: DWORD = 0x2;
pub const D3DCREATE_MULTITHREADED: DWORD = 0x4;
pub const D3DCREATE_PUREDEVICE: DWORD = 0x10;
pub const D3DCREATE_SOFTWARE_VERTEXPROCESSING: DWORD = 0x20;
pub const D3DCREATE_HARDWARE_VERTEXPROCESSING: DWORD = 0x40;
pub const D3DCREATE_MIXED_VERTEXPROCESSING: DWORD = 0x80;
pub const D3DCREATE_DISABLE_DRIVER_MANAGEMENT: DWORD = 0x100;
pub const D3DCREATE_ADAPTERGROUP_DEVICE: DWORD = 0x200;
pub const D3DCREATE_DISABLE_DRIVER_MANAGEMENT_EX: DWORD = 0x400;
pub const D3DCREATE_NOWINDOWCHANGES: DWORD = 0x800;
pub const D3DCREATE_DISABLE_PSGP_THREADING: DWORD = 0x2000;
pub const D3DCREATE_ENABLE_PRESENTSTATS: DWORD = 0x4000;
pub const D3DCREATE_DISABLE_PRESENTSTATS: DWORD = 0x8000;
pub const D3DCREATE_SCREENSAVER: DWORD = 0x10000000;
pub const D3DADAPTER_DEFAULT: DWORD = 0;
extern "system" {
    pub fn Direct3DCreate9Ex(
        SDKVersion: UINT,
        arg1: *mut *mut IDirect3D9Ex,
    ) -> HRESULT;
}
RIDL!{#[uuid(0x02177241, 0x69fc, 0x400c, 0x8f, 0xf1, 0x93, 0xa4, 0x4d, 0xf6, 0x86, 0x1d)]
interface IDirect3D9Ex(IDirect3D9ExVtbl): IDirect3D9(IDirect3D9Vtbl) {
    fn GetAdapterModeCountEx(
        Adapter: UINT,
        pFilter: *const D3DDISPLAYMODEFILTER,
    ) -> UINT,
    fn EnumAdapterModesEx(
        Adapter: UINT,
        pFilter: *const D3DDISPLAYMODEFILTER,
        Mode: UINT,
        pMode: *mut D3DDISPLAYMODEEX,
    ) -> HRESULT,
    fn GetAdapterDisplayModeEx(
        Adapter: UINT,
        pMode: *mut D3DDISPLAYMODEEX,
        pRotation: *mut D3DDISPLAYROTATION,
    ) -> HRESULT,
    fn CreateDeviceEx(
        Adapter: UINT,
        DeviceType: D3DDEVTYPE,
        hFocusWindow: HWND,
        BehaviorFlags: DWORD,
        pPresentationParameters: *mut D3DPRESENT_PARAMETERS,
        pFullscreenDisplayMode: *mut D3DDISPLAYMODEEX,
        ppReturnedDeviceInterface: *mut *mut IDirect3DDevice9Ex,
    ) -> HRESULT,
    fn GetAdapterLUID(
        Adapter: UINT,
        pLUID: *mut LUID,
    ) -> HRESULT,
}}
pub type LPDIRECT3D9EX = *mut IDirect3D9Ex;
pub type PDIRECT3D9EX = *mut IDirect3D9Ex;
RIDL!{#[uuid(0xb18b10ce, 0x2649, 0x405a, 0x87, 0xf, 0x95, 0xf7, 0x77, 0xd4, 0x31, 0x3a)]
interface IDirect3DDevice9Ex(IDirect3DDevice9ExVtbl): IDirect3DDevice9(IDirect3DDevice9Vtbl) {
    fn SetConvolutionMonoKernel(
        width: UINT,
        height: UINT,
        rows: *mut FLOAT,
        columns: *mut FLOAT,
    ) -> HRESULT,
    fn ComposeRects(
        pSrc: *mut IDirect3DSurface9,
        pDst: *mut IDirect3DSurface9,
        pSrcRectDescs: *mut IDirect3DVertexBuffer9,
        NumRects: UINT,
        pDstRectDescs: *mut IDirect3DVertexBuffer9,
        Operation: D3DCOMPOSERECTSOP,
        Xoffset: INT,
        Yoffset: INT,
    ) -> HRESULT,
    fn PresentEx(
        pSourceRect: *const RECT,
        pDestRect: *const RECT,
        hDestWindowOverride: HWND,
        pDirtyRegion: *const RGNDATA,
        dwFlags: DWORD,
    ) -> HRESULT,
    fn GetGPUThreadPriority(
        pPriority: *mut INT,
    ) -> HRESULT,
    fn SetGPUThreadPriority(
        Priority: INT,
    ) -> HRESULT,
    fn WaitForVBlank(
        iSwapChain: UINT,
    ) -> HRESULT,
    fn CheckResourceResidency(
        pResourceArray: *mut *mut IDirect3DResource9,
        NumResources: UINT32,
    ) -> HRESULT,
    fn SetMaximumFrameLatency(
        MaxLatency: UINT,
    ) -> HRESULT,
    fn GetMaximumFrameLatency(
        pMaxLatency: *mut UINT,
    ) -> HRESULT,
    fn CheckDeviceState(
        hDestinationWindow: HWND,
    ) -> HRESULT,
    fn CreateRenderTargetEx(
        Width: UINT,
        Height: UINT,
        Format: D3DFORMAT,
        MultiSample: D3DMULTISAMPLE_TYPE,
        MultisampleQuality: DWORD,
        Lockable: BOOL,
        ppSurface: *mut *mut IDirect3DSurface9,
        pSharedHandle: *mut HANDLE,
        Usage: DWORD,
    ) -> HRESULT,
    fn CreateOffscreenPlainSurfaceEx(
        Width: UINT,
        Height: UINT,
        Format: D3DFORMAT,
        Pool: D3DPOOL,
        ppSurface: *mut *mut IDirect3DSurface9,
        pSharedHandle: *mut HANDLE,
        Usage: DWORD,
    ) -> HRESULT,
    fn CreateDepthStencilSurfaceEx(
        Width: UINT,
        Height: UINT,
        Format: D3DFORMAT,
        MultiSample: D3DMULTISAMPLE_TYPE,
        MultisampleQuality: DWORD,
        Discard: BOOL,
        ppSurface: *mut *mut IDirect3DSurface9,
        pSharedHandle: *mut HANDLE,
        Usage: DWORD,
    ) -> HRESULT,
    fn ResetEx(
        pPresentationParameters: *mut D3DPRESENT_PARAMETERS,
        pFullscreenDisplayMode: *mut D3DDISPLAYMODEEX,
    ) -> HRESULT,
    fn GetDisplayModeEx(
        iSwapChain: UINT,
        pMode: *mut D3DDISPLAYMODEEX,
        pRotation: *mut D3DDISPLAYROTATION,
    ) -> HRESULT,
}}
pub type LPDIRECT3DDEVICE9EX = *mut IDirect3DDevice9Ex;
pub type PDIRECT3DDEVICE9EX = *mut IDirect3DDevice9Ex;
RIDL!{#[uuid(0x91886caf, 0x1c3d, 0x4d2e, 0xa0, 0xab, 0x3e, 0x4c, 0x7d, 0x8d, 0x33, 0x3)]
interface IDirect3DSwapChain9Ex(IDirect3DSwapChain9ExVtbl):
    IDirect3DSwapChain9(IDirect3DSwapChain9Vtbl) {
    fn GetLastPresentCount(
        pLastPresentCount: *mut UINT,
    ) -> HRESULT,
    fn GetPresentStats(
        pPresentationStatistics: *mut D3DPRESENTSTATS,
    ) -> HRESULT,
    fn GetDisplayModeEx(
        pMode: *mut D3DDISPLAYMODEEX,
        pRotation: *mut D3DDISPLAYROTATION,
    ) -> HRESULT,
}}
pub type LPDIRECT3DSWAPCHAIN9EX = *mut IDirect3DSwapChain9Ex;
pub type PDIRECT3DSWAPCHAIN9EX = *mut IDirect3DSwapChain9Ex;
RIDL!{#[uuid(0x187aeb13, 0xaaf5, 0x4c59, 0x87, 0x6d, 0xe0, 0x59, 0x8, 0x8c, 0xd, 0xf8)]
interface IDirect3D9ExOverlayExtension(IDirect3D9ExOverlayExtensionVtbl): IUnknown(IUnknownVtbl) {
    fn CheckDeviceOverlayType(
        Adapter: UINT,
        DevType: D3DDEVTYPE,
        OverlayWidth: UINT,
        OverlayHeight: UINT,
        OverlayFormat: D3DFORMAT,
        pDisplayMode: *mut D3DDISPLAYMODEEX,
        DisplayRotation: D3DDISPLAYROTATION,
        pOverlayCaps: *mut D3DOVERLAYCAPS,
    ) -> HRESULT,
}}
pub type LPDIRECT3D9EXOVERLAYEXTENSION = *mut IDirect3D9ExOverlayExtension;
pub type PDIRECT3D9EXOVERLAYEXTENSION = *mut IDirect3D9ExOverlayExtension;
RIDL!{#[uuid(0x26dc4561, 0xa1ee, 0x4ae7, 0x96, 0xda, 0x11, 0x8a, 0x36, 0xc0, 0xec, 0x95)]
interface IDirect3DDevice9Video(IDirect3DDevice9VideoVtbl): IUnknown(IUnknownVtbl) {
    fn GetContentProtectionCaps(
        pCryptoType: *const GUID,
        pDecodeProfile: *const GUID,
        pCaps: *mut D3DCONTENTPROTECTIONCAPS,
    ) -> HRESULT,
    fn CreateAuthenticatedChannel(
        ChannelType: D3DAUTHENTICATEDCHANNELTYPE,
        ppAuthenticatedChannel: *mut *mut IDirect3DAuthenticatedChannel9,
        pChannelHandle: *mut HANDLE,
    ) -> HRESULT,
    fn CreateCryptoSession(
        pCryptoType: *const GUID,
        pDecodeProfile: *const GUID,
        ppCryptoSession: *mut *mut IDirect3DCryptoSession9,
        pCryptoHandle: *mut HANDLE,
    ) -> HRESULT,
}}
pub type LPDIRECT3DDEVICE9VIDEO = *mut IDirect3DDevice9Video;
pub type PDIRECT3DDEVICE9VIDEO = *mut IDirect3DDevice9Video;
RIDL!(#[uuid(0xff24beee, 0xda21, 0x4beb, 0x98, 0xb5, 0xd2, 0xf8, 0x99, 0xf9, 0x8a, 0xf9)]
interface IDirect3DAuthenticatedChannel9(IDirect3DAuthenticatedChannel9Vtbl):
    IUnknown(IUnknownVtbl) {
    fn GetCertificateSize(
        pCertificateSize: *mut UINT,
    ) -> HRESULT,
    fn GetCertificate(
        CertifacteSize: UINT,
        ppCertificate: *mut BYTE,
    ) -> HRESULT,
    fn NegotiateKeyExchange(
        DataSize: UINT,
        pData: *mut VOID,
    ) -> HRESULT,
    fn Query(
        InputSize: UINT,
        pInput: *const VOID,
        OutputSize: UINT,
        pOutput: *mut VOID,
    ) -> HRESULT,
    fn Configure(
        InputSize: UINT,
        pInput: *const VOID,
        pOutput: *mut D3DAUTHENTICATEDCHANNEL_CONFIGURE_OUTPUT,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DAUTHENTICATEDCHANNEL9 = *mut IDirect3DAuthenticatedChannel9;
pub type PDIRECT3DAUTHENTICATEDCHANNEL9 = *mut IDirect3DAuthenticatedChannel9;
RIDL!(#[uuid(0xfa0ab799, 0x7a9c, 0x48ca, 0x8c, 0x5b, 0x23, 0x7e, 0x71, 0xa5, 0x44, 0x34)]
interface IDirect3DCryptoSession9(IDirect3DCryptoSession9Vtbl): IUnknown(IUnknownVtbl) {
    fn GetCertificateSize(
        pCertificateSize: *mut UINT,
    ) -> HRESULT,
    fn GetCertificate(
        CertifacteSize: UINT,
        ppCertificate: *mut BYTE,
    ) -> HRESULT,
    fn NegotiateKeyExchange(
        DataSize: UINT,
        pData: *mut VOID,
    ) -> HRESULT,
    fn EncryptionBlt(
        pSrcSurface: *mut IDirect3DSurface9,
        pDstSurface: *mut IDirect3DSurface9,
        DstSurfaceSize: UINT,
        pIV: *mut VOID,
    ) -> HRESULT,
    fn DecryptionBlt(
        pSrcSurface: *mut IDirect3DSurface9,
        pDstSurface: *mut IDirect3DSurface9,
        SrcSurfaceSize: UINT,
        pEncryptedBlockInfo: *mut D3DENCRYPTED_BLOCK_INFO,
        pContentKey: *mut VOID,
        pIV: *mut VOID,
    ) -> HRESULT,
    fn GetSurfacePitch(
        pSrcSurface: *mut IDirect3DSurface9,
        pSurfacePitch: *mut UINT,
    ) -> HRESULT,
    fn StartSessionKeyRefresh(
        pRandomNumber: *mut VOID,
        RandomNumberSize: UINT,
    ) -> HRESULT,
    fn FinishSessionKeyRefresh() -> HRESULT,
    fn GetEncryptionBltKey(
        pReadbackKey: *mut VOID,
        KeySize: UINT,
    ) -> HRESULT,
}
);
pub type LPDIRECT3DCRYPTOSESSION9 = *mut IDirect3DCryptoSession9;
pub type PDIRECT3DCRYPTOSESSION9 = *mut IDirect3DCryptoSession9;
