/*
 * Copyright 2016 Andrey Gusev
 *
 * 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";
import "dxgi.idl";
import "d3dcommon.idl";

[
    object,
    local,
    pointer_default(unique)
]
interface ID3DX11DataLoader
{
    HRESULT Load();
    HRESULT Decompress([out] void **data, [in] SIZE_T *bytes);
    HRESULT Destroy();
};

[
    object,
    local,
    pointer_default(unique)
]
interface ID3DX11DataProcessor
{
    HRESULT Process([in] void *data, [in] SIZE_T bytes);
    HRESULT CreateDeviceObject([out] void **data_object);
    HRESULT Destroy();
};

[
    object,
    local,
    pointer_default(unique),
    uuid(c93fecfa-6967-478a-abbc-402d90621fcb)
]
interface ID3DX11ThreadPump : IUnknown
{
    HRESULT AddWorkItem([in] ID3DX11DataLoader *loader, [in] ID3DX11DataProcessor *processor,
                        [in] HRESULT *hresult, [out] void **device_object);
    UINT GetWorkItemCount();

    HRESULT WaitForAllItems();
    HRESULT ProcessDeviceWorkItems([in] UINT count);

    HRESULT PurgeAllItems();
    HRESULT GetQueueStatus([in] UINT *io_queue, [in] UINT *process_queue, [in] UINT *device_queue);
};
