/*
 * Copyright 2010 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";
import "ocidl.idl";

cpp_quote("#ifndef _D3D10_1_CONSTANTS")
cpp_quote("#define _D3D10_1_CONSTANTS")
const UINT D3D10_1_DEFAULT_SAMPLE_MASK                     = 0xffffffff;
const UINT D3D10_1_GS_INPUT_REGISTER_COUNT                 = 32;
const UINT D3D10_1_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT     = 32;
const UINT D3D10_1_IA_VERTEX_INPUT_STRUCTURE_ELEMENTS_COMPONENTS = 128;
const UINT D3D10_1_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT = 32;
const UINT D3D10_1_PS_OUTPUT_MASK_REGISTER_COMPONENTS      = 1;
const UINT D3D10_1_PS_OUTPUT_MASK_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D10_1_PS_OUTPUT_MASK_REGISTER_COUNT           = 1;
const UINT D3D10_1_SHADER_MAJOR_VERSION                    = 4;
const UINT D3D10_1_SHADER_MINOR_VERSION                    = 1;
const UINT D3D10_1_SO_BUFFER_MAX_STRIDE_IN_BYTES           = 2048;
const UINT D3D10_1_SO_BUFFER_MAX_WRITE_WINDOW_IN_BYTES     = 256;
const UINT D3D10_1_SO_BUFFER_SLOT_COUNT                    = 4;
const UINT D3D10_1_SO_MULTIPLE_BUFFER_ELEMENTS_PER_BUFFER  = 1;
const UINT D3D10_1_SO_SINGLE_BUFFER_COMPONENT_LIMIT        = 64;
const UINT D3D10_1_STANDARD_VERTEX_ELEMENT_COUNT           = 32;
const UINT D3D10_1_SUBPIXEL_FRACTIONAL_BIT_COUNT           = 8;
const UINT D3D10_1_VS_INPUT_REGISTER_COUNT                 = 32;
const UINT D3D10_1_VS_OUTPUT_REGISTER_COUNT                = 32;
cpp_quote("#endif")

cpp_quote("#define D3D10_1_FLOAT16_FUSED_TOLERANCE_IN_ULP      (0.6)")
cpp_quote("#define D3D10_1_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP (0.6f)")

import "d3d10.idl";
cpp_quote("#include <d3d10_1shader.h>")


typedef enum D3D10_FEATURE_LEVEL1
{
    D3D10_FEATURE_LEVEL_10_0  = 0xa000,
    D3D10_FEATURE_LEVEL_10_1  = 0xa100,
    D3D10_FEATURE_LEVEL_9_1   = 0x9100,
    D3D10_FEATURE_LEVEL_9_2   = 0x9200,
    D3D10_FEATURE_LEVEL_9_3   = 0x9300
} D3D10_FEATURE_LEVEL1;

typedef struct D3D10_RENDER_TARGET_BLEND_DESC1
{
    BOOL BlendEnable;
    D3D10_BLEND SrcBlend;
    D3D10_BLEND DestBlend;
    D3D10_BLEND_OP BlendOp;
    D3D10_BLEND SrcBlendAlpha;
    D3D10_BLEND DestBlendAlpha;
    D3D10_BLEND_OP BlendOpAlpha;
    UINT8 RenderTargetWriteMask;
} D3D10_RENDER_TARGET_BLEND_DESC1;

typedef struct D3D10_BLEND_DESC1
{
    BOOL AlphaToCoverageEnable;
    BOOL IndependentBlendEnable;
    D3D10_RENDER_TARGET_BLEND_DESC1 RenderTarget[D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT];
} D3D10_BLEND_DESC1;

[
    uuid(edad8d99-8a35-4d6d-8566-2ea276cde161),
    object,
    local,
    pointer_default(unique)
]
interface ID3D10BlendState1 : ID3D10BlendState
{
    void GetDesc1([out] D3D10_BLEND_DESC1 *pDesc);
}

typedef struct D3D10_TEXCUBE_ARRAY_SRV1
{
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT First2DArrayFace;
    UINT NumCubes;
} D3D10_TEXCUBE_ARRAY_SRV1;

typedef D3D_SRV_DIMENSION D3D10_SRV_DIMENSION1;

typedef struct D3D10_SHADER_RESOURCE_VIEW_DESC1
{
    DXGI_FORMAT Format;
    D3D10_SRV_DIMENSION1  ViewDimension;
    union {
        D3D10_BUFFER_SRV Buffer;
        D3D10_TEX1D_SRV Texture1D;
        D3D10_TEX1D_ARRAY_SRV Texture1DArray;
        D3D10_TEX2D_SRV Texture2D;
        D3D10_TEX2D_ARRAY_SRV Texture2DArray;
        D3D10_TEX2DMS_SRV Texture2DMS;
        D3D10_TEX2DMS_ARRAY_SRV Texture2DMSArray;
        D3D10_TEX3D_SRV Texture3D;
        D3D10_TEXCUBE_SRV TextureCube;
        D3D10_TEXCUBE_ARRAY_SRV1 TextureCubeArray;
    };
} D3D10_SHADER_RESOURCE_VIEW_DESC1;

[
    uuid(9b7e4c87-342c-4106-a19f-4f2704f689f0),
    object,
    local,
    pointer_default(unique)
]
interface ID3D10ShaderResourceView1 : ID3D10ShaderResourceView
{
    void GetDesc1([out] D3D10_SHADER_RESOURCE_VIEW_DESC1 *pDesc);
}

[
    uuid(9b7e4c8f-342c-4106-a19f-4f2704f689f0),
    object,
    local,
    pointer_default(unique)
]
interface ID3D10Device1 : ID3D10Device
{
    HRESULT CreateShaderResourceView1(
            [in] ID3D10Resource *pResource,
            [in, out] const D3D10_SHADER_RESOURCE_VIEW_DESC1 *pDesc,
            [out] ID3D10ShaderResourceView1 **ppSRView);

    HRESULT CreateBlendState1(
            [in] const D3D10_BLEND_DESC1 *pBlendStateDesc,
            [out] ID3D10BlendState1 **ppBlendState);

    D3D10_FEATURE_LEVEL1 GetFeatureLevel();
}

const UINT D3D10_1_SDK_VERSION = 0x20;

cpp_quote("HRESULT WINAPI D3D10CreateDevice1(IDXGIAdapter*,D3D10_DRIVER_TYPE,")
cpp_quote("    HMODULE,UINT,D3D10_FEATURE_LEVEL1,UINT,ID3D10Device1**);")

[local] HRESULT __stdcall D3D10CreateDeviceAndSwapChain1(IDXGIAdapter *adapter, enum D3D10_DRIVER_TYPE driver_type,
        HMODULE swrast, UINT flags, D3D10_FEATURE_LEVEL1 feature_level, UINT sdk_version,
        DXGI_SWAP_CHAIN_DESC *swapchain_desc, IDXGISwapChain **swapchain, ID3D10Device1 **device);
