/*
 * Copyright 2008-2009 Henri Verbeet 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 "dxgi.idl";

[
    object,
    local,
    uuid(a07ad9ab-fb01-4574-8bfb-0a70a7373f04)
]
interface IWineDXGIFactory : IDXGIFactory
{
    struct wined3d *get_wined3d();
}

[
    object,
    local,
    uuid(ab1de34c-2963-4ffd-8493-40f580e510e5)
]
interface IWineDXGIAdapter : IDXGIAdapter
{
    UINT get_ordinal();
}

[
    object,
    local,
    uuid(3e1ff30b-c951-48c3-b010-0fb49f3dca71)
]
interface IWineDXGIDevice : IDXGIDevice
{
    struct wined3d_device *get_wined3d_device();
    HRESULT create_surface(
        [in] const DXGI_SURFACE_DESC *desc,
        [in] DXGI_USAGE usage,
        [in] const DXGI_SHARED_RESOURCE *shared_resource,
        [in] IUnknown *outer,
        [out] void **surface
    );
    HRESULT create_swapchain(
        [in] struct wined3d_swapchain_desc *desc,
        [out] struct wined3d_swapchain **wined3d_swapchain
    );
}

[
    object,
    local,
    uuid(f2b918f3-603f-430a-9ccd-55872b6e85df)
]
interface IWineDXGIDeviceParent : IUnknown
{
    struct wined3d_device_parent *get_wined3d_device_parent();
}
