// Copyright © 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.
use ctypes::c_void;
use shared::basetsd::{UINT64, UINT8};
use shared::dxgiformat::DXGI_FORMAT;
use shared::dxgitype::{DXGI_COLOR_SPACE_TYPE, DXGI_RATIONAL};
use shared::guiddef::{GUID, REFIID};
use shared::minwindef::{BOOL, BYTE, DWORD, FLOAT, INT, UINT};
use um::d3d11::{
    D3D11_BLEND, D3D11_BLEND_OP, D3D11_BOX, D3D11_CULL_MODE, D3D11_FILL_MODE, D3D11_RECT,
    D3D11_VIDEO_DECODER_BUFFER_TYPE, D3D11_VIDEO_DECODER_CONFIG, D3D11_VIDEO_DECODER_DESC,
    ID3D11BlendState, ID3D11BlendStateVtbl, ID3D11Buffer, ID3D11CryptoSession, ID3D11Device,
    ID3D11DeviceChild, ID3D11DeviceChildVtbl, ID3D11DeviceContext, ID3D11DeviceContextVtbl,
    ID3D11DeviceVtbl, ID3D11RasterizerState, ID3D11RasterizerStateVtbl, ID3D11Resource,
    ID3D11VideoContext, ID3D11VideoContextVtbl, ID3D11VideoDecoder, ID3D11VideoDevice,
    ID3D11VideoDeviceVtbl, ID3D11VideoProcessor, ID3D11VideoProcessorEnumerator,
    ID3D11VideoProcessorEnumeratorVtbl, ID3D11View
};
use um::d3dcommon::D3D_FEATURE_LEVEL;
use um::unknwnbase::{IUnknown, IUnknownVtbl};
use um::winnt::{HANDLE, HRESULT, LPCWSTR};
DEFINE_GUID!{IID_ID3D11BlendState1,
    0xcc86fabe, 0xda55, 0x401d, 0x85, 0xe7, 0xe3, 0xc9, 0xde, 0x28, 0x77, 0xe9}
DEFINE_GUID!{IID_ID3D11RasterizerState1,
    0x1217d7a6, 0x5039, 0x418c, 0xb0, 0x42, 0x9c, 0xbe, 0x25, 0x6a, 0xfd, 0x6e}
DEFINE_GUID!{IID_ID3DDeviceContextState,
    0x5c1e0d8a, 0x7c23, 0x48f9, 0x8c, 0x59, 0xa9, 0x29, 0x58, 0xce, 0xff, 0x11}
DEFINE_GUID!{IID_ID3D11DeviceContext1,
    0xbb2c6faa, 0xb5fb, 0x4082, 0x8e, 0x6b, 0x38, 0x8b, 0x8c, 0xfa, 0x90, 0xe1}
DEFINE_GUID!{IID_ID3D11VideoContext1,
    0xa7f026da, 0xa5f8, 0x4487, 0xa5, 0x64, 0x15, 0xe3, 0x43, 0x57, 0x65, 0x1e}
DEFINE_GUID!{IID_ID3D11VideoDevice1,
    0x29da1d51, 0x1321, 0x4454, 0x80, 0x4b, 0xf5, 0xfc, 0x9f, 0x86, 0x1f, 0x0f}
DEFINE_GUID!{IID_ID3D11VideoProcessorEnumerator1,
    0x465217f2, 0x5568, 0x43cf, 0xb5, 0xb9, 0xf6, 0x1d, 0x54, 0x53, 0x1c, 0xa1}
DEFINE_GUID!{IID_ID3D11Device1,
    0xa04bfb29, 0x08ef, 0x43d6, 0xa4, 0x9c, 0xa9, 0xbd, 0xbd, 0xcb, 0xe6, 0x86}
DEFINE_GUID!{IID_ID3DUserDefinedAnnotation,
    0xb2daad8b, 0x03d4, 0x4dbf, 0x95, 0xeb, 0x32, 0xab, 0x4b, 0x63, 0xd0, 0xab}
ENUM!{enum D3D11_COPY_FLAGS {
    D3D11_COPY_NO_OVERWRITE = 0x00000001,
    D3D11_COPY_DISCARD = 0x00000002,
}}
ENUM!{enum D3D11_LOGIC_OP {
    D3D11_LOGIC_OP_CLEAR = 0,
    D3D11_LOGIC_OP_SET = 1,
    D3D11_LOGIC_OP_COPY = 2,
    D3D11_LOGIC_OP_COPY_INVERTED = 3,
    D3D11_LOGIC_OP_NOOP = 4,
    D3D11_LOGIC_OP_INVERT = 5,
    D3D11_LOGIC_OP_AND = 6,
    D3D11_LOGIC_OP_NAND = 7,
    D3D11_LOGIC_OP_OR = 8,
    D3D11_LOGIC_OP_NOR = 9,
    D3D11_LOGIC_OP_XOR = 10,
    D3D11_LOGIC_OP_EQUIV = 11,
    D3D11_LOGIC_OP_AND_REVERSE = 12,
    D3D11_LOGIC_OP_AND_INVERTED = 13,
    D3D11_LOGIC_OP_OR_REVERSE = 14,
    D3D11_LOGIC_OP_OR_INVERTED = 15,
}}
STRUCT!{struct D3D11_RENDER_TARGET_BLEND_DESC1 {
    BlendEnable: BOOL,
    LogicOpEnable: BOOL,
    SrcBlend: D3D11_BLEND,
    DestBlend: D3D11_BLEND,
    BlendOp: D3D11_BLEND_OP,
    SrcBlendAlpha: D3D11_BLEND,
    DestBlendAlpha: D3D11_BLEND,
    BlendOpAlpha: D3D11_BLEND_OP,
    LogicOp: D3D11_LOGIC_OP,
    RenderTargetWriteMask: UINT8,
}}
STRUCT!{struct D3D11_BLEND_DESC1 {
    AlphaToCoverageEnable: BOOL,
    IndependentBlendEnable: BOOL,
    RenderTarget: [D3D11_RENDER_TARGET_BLEND_DESC1; 8],
}}
RIDL!{#[uuid(0xcc86fabe, 0xda55, 0x401d, 0x85, 0xe7, 0xe3, 0xc9, 0xde, 0x28, 0x77, 0xe9)]
interface ID3D11BlendState1(ID3D11BlendState1Vtbl): ID3D11BlendState(ID3D11BlendStateVtbl) {
    fn GetDesc1(
        pDesc: *mut D3D11_BLEND_DESC1,
    ) -> (),
}}
STRUCT!{struct D3D11_RASTERIZER_DESC1 {
    FillMode: D3D11_FILL_MODE,
    CullMode: D3D11_CULL_MODE,
    FrontCounterClockwise: BOOL,
    DepthBias: INT,
    DepthBiasClamp: FLOAT,
    SlopeScaledDepthBias: FLOAT,
    DepthClipEnable: BOOL,
    ScissorEnable: BOOL,
    MultisampleEnable: BOOL,
    AntialiasedLineEnable: BOOL,
    ForcedSampleCount: UINT,
}}
RIDL!{#[uuid(0x1217d7a6, 0x5039, 0x418c, 0xb0, 0x42, 0x9c, 0xbe, 0x25, 0x6a, 0xfd, 0x6e)]
interface ID3D11RasterizerState1(ID3D11RasterizerState1Vtbl):
    ID3D11RasterizerState(ID3D11RasterizerStateVtbl) {
    fn GetDesc1(
        pDesc: *mut D3D11_RASTERIZER_DESC1,
    ) -> (),
}}
ENUM!{enum D3D11_1_CREATE_DEVICE_CONTEXT_STATE_FLAG {
    D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED = 0x1,
}}
RIDL!{#[uuid(0x5c1e0d8a, 0x7c23, 0x48f9, 0x8c, 0x59, 0xa9, 0x29, 0x58, 0xce, 0xff, 0x11)]
interface ID3DDeviceContextState(ID3DDeviceContextStateVtbl):
    ID3D11DeviceChild(ID3D11DeviceChildVtbl) {
}}
RIDL!{#[uuid(0xbb2c6faa, 0xb5fb, 0x4082, 0x8e, 0x6b, 0x38, 0x8b, 0x8c, 0xfa, 0x90, 0xe1)]
interface ID3D11DeviceContext1(ID3D11DeviceContext1Vtbl):
    ID3D11DeviceContext(ID3D11DeviceContextVtbl) {
    fn CopySubresourceRegion1(
        pDstResource: *mut ID3D11Resource,
        DstSubresource: UINT,
        DstX: UINT,
        DstY: UINT,
        DstZ: UINT,
        pSrcResource: *mut ID3D11Resource,
        SrcSubresource: UINT,
        pSrcBox: *const D3D11_BOX,
        CopyFlags: UINT,
    ) -> (),
    fn UpdateSubresource1(
        pDstResource: *mut ID3D11Resource,
        DstSubresource: UINT,
        pDstBox: *const D3D11_BOX,
        pSrcData: *mut c_void,
        SrcRowPitch: UINT,
        SrcDepthPitch: UINT,
        CopyFlags: UINT,
    ) -> (),
    fn DiscardResource(
        pResource: *mut ID3D11Resource,
    ) -> (),
    fn DiscardView(
        pResource: *mut ID3D11Resource,
    ) -> (),
    fn VSSetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *const *mut ID3D11Buffer,
        pFirstConstant: *const UINT,
        pNumConstants: *const UINT,
    ) -> (),
    fn HSSetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *const *mut ID3D11Buffer,
        pFirstConstant: *const UINT,
        pNumConstants: *const UINT,
    ) -> (),
    fn DSSetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *const *mut ID3D11Buffer,
        pFirstConstant: *const UINT,
        pNumConstants: *const UINT,
    ) -> (),
    fn GSSetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *const *mut ID3D11Buffer,
        pFirstConstant: *const UINT,
        pNumConstants: *const UINT,
    ) -> (),
    fn PSSetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *const *mut ID3D11Buffer,
        pFirstConstant: *const UINT,
        pNumConstants: *const UINT,
    ) -> (),
    fn CSSetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *const *mut ID3D11Buffer,
        pFirstConstant: *const UINT,
        pNumConstants: *const UINT,
    ) -> (),
    fn VSGetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *mut *mut ID3D11Buffer,
        pFirstConstant: *mut UINT,
        pNumConstants: *mut UINT,
    ) -> (),
    fn HSGetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *mut *mut ID3D11Buffer,
        pFirstConstant: *mut UINT,
        pNumConstants: *mut UINT,
    ) -> (),
    fn DSGetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *mut *mut ID3D11Buffer,
        pFirstConstant: *mut UINT,
        pNumConstants: *mut UINT,
    ) -> (),
    fn GSGetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *mut *mut ID3D11Buffer,
        pFirstConstant: *mut UINT,
        pNumConstants: *mut UINT,
    ) -> (),
    fn PSGetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *mut *mut ID3D11Buffer,
        pFirstConstant: *mut UINT,
        pNumConstants: *mut UINT,
    ) -> (),
    fn CSGetConstantBuffers1(
        StartSlot: UINT,
        NumBuffers: UINT,
        ppConstantBuffers: *mut *mut ID3D11Buffer,
        pFirstConstant: *mut UINT,
        pNumConstants: *mut UINT,
    ) -> (),
    fn SwapDeviceContextState(
        pState: *mut ID3DDeviceContextState,
        ppPreviousState: *mut *mut ID3DDeviceContextState,
    ) -> (),
    fn ClearView(
        pView: *mut ID3D11View,
        Color: [FLOAT; 4],
        pRect: *const D3D11_RECT,
        NumRects: UINT,
    ) -> (),
    fn DiscardView1(
        pResourceView: *mut ID3D11View,
        pRects: *const D3D11_RECT,
        NumRects: UINT,
    ) -> (),
}}
STRUCT!{struct D3D11_VIDEO_DECODER_SUB_SAMPLE_MAPPING_BLOCK {
    ClearSize: UINT,
    EncryptedSize: UINT,
}}
STRUCT!{struct D3D11_VIDEO_DECODER_BUFFER_DESC1 {
    BufferType: D3D11_VIDEO_DECODER_BUFFER_TYPE,
    DataOffset: UINT,
    DataSize: UINT,
    pIV: *mut c_void,
    IVSize: UINT,
    pSubSampleMappingBlock: *mut D3D11_VIDEO_DECODER_SUB_SAMPLE_MAPPING_BLOCK,
    SubSampleMappingCount: UINT,
}}
STRUCT!{struct D3D11_VIDEO_DECODER_BEGIN_FRAME_CRYPTO_SESSION {
    pCryptoSession: *mut ID3D11CryptoSession,
    BlobSize: UINT,
    pBlob: *mut c_void,
    pKeyInfoId: *mut GUID,
    PrivateDataSize: UINT,
    pPrivateData: *mut c_void,
}}
ENUM!{enum D3D11_VIDEO_DECODER_CAPS {
    D3D11_VIDEO_DECODER_CAPS_DOWNSAMPLE = 0x1,
    D3D11_VIDEO_DECODER_CAPS_NON_REAL_TIME = 0x02,
    D3D11_VIDEO_DECODER_CAPS_DOWNSAMPLE_DYNAMIC = 0x04,
    D3D11_VIDEO_DECODER_CAPS_DOWNSAMPLE_REQUIRED = 0x08,
    D3D11_VIDEO_DECODER_CAPS_UNSUPPORTED = 0x10,
}}
ENUM!{enum D3D11_VIDEO_PROCESSOR_BEHAVIOR_HINTS {
    D3D11_VIDEO_PROCESSOR_BEHAVIOR_HINT_MULTIPLANE_OVERLAY_ROTATION = 0x01,
    D3D11_VIDEO_PROCESSOR_BEHAVIOR_HINT_MULTIPLANE_OVERLAY_RESIZE = 0x02,
    D3D11_VIDEO_PROCESSOR_BEHAVIOR_HINT_MULTIPLANE_OVERLAY_COLOR_SPACE_CONVERSION = 0x04,
    D3D11_VIDEO_PROCESSOR_BEHAVIOR_HINT_TRIPLE_BUFFER_OUTPUT = 0x08,
}}
STRUCT!{struct D3D11_VIDEO_PROCESSOR_STREAM_BEHAVIOR_HINT {
    Enable: BOOL,
    Width: UINT,
    Height: UINT,
    Format: DXGI_FORMAT,
}}
ENUM!{enum D3D11_CRYPTO_SESSION_STATUS {
    D3D11_CRYPTO_SESSION_STATUS_OK = 0,
    D3D11_CRYPTO_SESSION_STATUS_KEY_LOST = 1,
    D3D11_CRYPTO_SESSION_STATUS_KEY_AND_CONTENT_LOST = 2,
}}
STRUCT!{struct D3D11_KEY_EXCHANGE_HW_PROTECTION_INPUT_DATA {
    PrivateDataSize: UINT,
    HWProtectionDataSize: UINT,
    pbInput: [BYTE; 4],
}}
STRUCT!{struct D3D11_KEY_EXCHANGE_HW_PROTECTION_OUTPUT_DATA {
    PrivateDataSize: UINT,
    MaxHWProtectionDataSize: UINT,
    HWProtectionDataSize: UINT,
    TransportTime: UINT64,
    ExecutionTime: UINT64,
    pbOutput: [BYTE; 4],
}}
STRUCT!{struct D3D11_KEY_EXCHANGE_HW_PROTECTION_DATA {
    HWProtectionFunctionID: UINT,
    pInputData: *mut D3D11_KEY_EXCHANGE_HW_PROTECTION_INPUT_DATA,
    pOutputData: *mut D3D11_KEY_EXCHANGE_HW_PROTECTION_OUTPUT_DATA,
    Status: HRESULT,
}}
STRUCT!{struct D3D11_VIDEO_SAMPLE_DESC {
    Width: UINT,
    Height: UINT,
    Format: DXGI_FORMAT,
    ColorSpace: DXGI_COLOR_SPACE_TYPE,
}}
RIDL!{#[uuid(0xa7f026da, 0xa5f8, 0x4487, 0xa5, 0x64, 0x15, 0xe3, 0x43, 0x57, 0x65, 0x1e)]
interface ID3D11VideoContext1(ID3D11VideoContext1Vtbl):
    ID3D11VideoContext(ID3D11VideoContextVtbl) {
    fn SubmitDecoderBuffers1(
        pDecoder: *mut ID3D11VideoDecoder,
        NumBuffers: UINT,
        pBufferDesc: *const D3D11_VIDEO_DECODER_BUFFER_DESC1,
    ) -> HRESULT,
    fn GetDataForNewHardwareKey(
        pCryptoSession: *mut ID3D11CryptoSession,
        PrivateInputSize: UINT,
        pPrivateInputData: *const c_void,
        pPrivateOutputData: *mut UINT64,
    ) -> HRESULT,
    fn CheckCryptoSessionStatus(
        pCryptoSession: *mut ID3D11CryptoSession,
        pStatus: *mut D3D11_CRYPTO_SESSION_STATUS,
    ) -> HRESULT,
    fn DecoderEnableDownsampling(
        pDecoder: *mut ID3D11VideoDecoder,
        InputColorSpace: DXGI_COLOR_SPACE_TYPE,
        pOutputDesc: *const D3D11_VIDEO_SAMPLE_DESC,
        ReferenceFrameCount: UINT,
    ) -> HRESULT,
    fn DecoderUpdateDownsampling(
        pDecoder: *mut ID3D11VideoDecoder,
        pOutputDesc: *const D3D11_VIDEO_SAMPLE_DESC,
    ) -> HRESULT,
    fn VideoProcessorSetOutputColorSpace1(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        ColorSpace: DXGI_COLOR_SPACE_TYPE,
    ) -> (),
    fn VideoProcessorSetOutputShaderUsage(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        ShaderUsage: BOOL,
    ) -> (),
    fn VideoProcessorGetOutputColorSpace1(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        pColorSpace: *mut DXGI_COLOR_SPACE_TYPE,
    ) -> (),
    fn VideoProcessorGetOutputShaderUsage(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        pShaderUsage: *mut BOOL,
    ) -> (),
    fn VideoProcessorSetStreamColorSpace1(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        StreamIndex: UINT,
        ColorSpace: DXGI_COLOR_SPACE_TYPE,
    ) -> (),
    fn VideoProcessorSetStreamMirror(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        StreamIndex: UINT,
        Enable: BOOL,
        FlipHorizontal: BOOL,
        FlipVertical: BOOL,
    ) -> (),
    fn VideoProcessorGetStreamColorSpace1(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        StreamIndex: UINT,
        pColorSpace: *mut DXGI_COLOR_SPACE_TYPE,
    ) -> (),
    fn VideoProcessorGetStreamMirror(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        StreamIndex: UINT,
        pEnable: *mut BOOL,
        pFlipHorizontal: *mut BOOL,
        pFlipVertical: *mut BOOL,
    ) -> (),
    fn VideoProcessorGetBehaviorHints(
        pVideoProcessor: *mut ID3D11VideoProcessor,
        OutputWidth: UINT,
        OutputHeight: UINT,
        OutputFormat: DXGI_FORMAT,
        StreamCount: UINT,
        pStreams: *const D3D11_VIDEO_PROCESSOR_STREAM_BEHAVIOR_HINT,
        pBehaviorHints: *mut UINT,
    ) -> (),
}}
RIDL!{#[uuid(0x29da1d51, 0x1321, 0x4454, 0x80, 0x4b, 0xf5, 0xfc, 0x9f, 0x86, 0x1f, 0x0f)]
interface ID3D11VideoDevice1(ID3D11VideoDevice1Vtbl): ID3D11VideoDevice(ID3D11VideoDeviceVtbl) {
    fn GetCryptoSessionPrivateDataSize(
        pCryptoType: *const GUID,
        pDecoderProfile: *const GUID,
        pKeyExchangeType: *const GUID,
        pPrivateInputSize: *mut UINT,
        pPrivateOutputSize: *mut UINT,
    ) -> HRESULT,
    fn GetVideoDecoderCaps(
        pDecoderProfile: *const GUID,
        SampleWidth: UINT,
        SampleHeight: UINT,
        pFrameRate: *const DXGI_RATIONAL,
        BitRate: UINT,
        pCryptoType: *const GUID,
        pDecoderCaps: *mut UINT,
    ) -> HRESULT,
    fn CheckVideoDecoderDownsampling(
        pInputDesc: *const D3D11_VIDEO_DECODER_DESC,
        InputColorSpace: DXGI_COLOR_SPACE_TYPE,
        pInputConfig: *const D3D11_VIDEO_DECODER_CONFIG,
        pFrameRate: *const DXGI_RATIONAL,
        pOutputDesc: *const D3D11_VIDEO_SAMPLE_DESC,
        pSupported: *mut BOOL,
        pRealTimeHint: *mut BOOL,
    ) -> HRESULT,
    fn RecommendVideoDecoderDownsampleParameters(
        pInputDesc: *const D3D11_VIDEO_DECODER_DESC,
        InputColorSpace: DXGI_COLOR_SPACE_TYPE,
        pInputConfig: *const D3D11_VIDEO_DECODER_CONFIG,
        pRecommendedOutputDesc: *mut D3D11_VIDEO_SAMPLE_DESC,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x465217f2, 0x5568, 0x43cf, 0xb5, 0xb9, 0xf6, 0x1d, 0x54, 0x53, 0x1c, 0xa1)]
interface ID3D11VideoProcessorEnumerator1(ID3D11VideoProcessorEnumerator1Vtbl):
    ID3D11VideoProcessorEnumerator(ID3D11VideoProcessorEnumeratorVtbl) {
    fn CheckVideoProcessorFormatConversion(
        InputFormat: DXGI_FORMAT,
        InputCOlorSpace: DXGI_COLOR_SPACE_TYPE,
        OutputFormat: DXGI_FORMAT,
        OutputColorSpace: DXGI_COLOR_SPACE_TYPE,
        pSupported: *mut BOOL,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xa04bfb29, 0x08ef, 0x43d6, 0xa4, 0x9c, 0xa9, 0xbd, 0xbd, 0xcb, 0xe6, 0x86)]
interface ID3D11Device1(ID3D11Device1Vtbl): ID3D11Device(ID3D11DeviceVtbl) {
    fn GetImmediateContext1(
        ppImmediateContext: *mut *mut ID3D11DeviceContext1,
    ) -> (),
    fn CreateDeferredContext1(
        ContextFlags: UINT,
        ppDeferredContext: *mut *mut ID3D11DeviceContext1,
    ) -> HRESULT,
    fn CreateBlendState(
        pBlendStateDesc: *const D3D11_BLEND_DESC1,
        ppBlendState: *mut *mut ID3D11BlendState1,
    ) -> HRESULT,
    fn CreateRasterizerState(
        pRasterizerDesc: *const D3D11_RASTERIZER_DESC1,
        ppRasterizerState: *mut *mut ID3D11RasterizerState1,
    ) -> HRESULT,
    fn CreateDeviceContextState(
        Flags: UINT,
        pFeatureLevels: *const D3D_FEATURE_LEVEL,
        FeatureLevels: UINT,
        SDKVersion: UINT,
        EmulatedInterface: REFIID,
        pChosenFeatureLevel: *mut D3D_FEATURE_LEVEL,
        ppContextState: *mut *mut ID3DDeviceContextState,
    ) -> HRESULT,
    fn OpenSharedResource1(
        hResource: HANDLE,
        returnedInterface: REFIID,
        ppResource: *mut *mut c_void,
    ) -> HRESULT,
    fn OpenSharedResourceByName(
        Name: LPCWSTR,
        dwDesiredAccess: DWORD,
        returnedInterface: REFIID,
        ppResource: *mut *mut c_void,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xb2daad8b, 0x03d4, 0x4dbf, 0x95, 0xeb, 0x32, 0xab, 0x4b, 0x63, 0xd0, 0xab)]
interface ID3DUserDefinedAnnotation(ID3DUserDefinedAnnotationVtbl): IUnknown(IUnknownVtbl) {
    fn BeginEvent(
        Name: LPCWSTR,
    ) -> INT,
    fn EndEvent() -> INT,
    fn SetMarker(
        Name: LPCWSTR,
    ) -> (),
    fn GetStatus() -> BOOL,
}}
