/*
 * Copyright 2017 Ihsan Akmal
 *
 * 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 "dxgi1_5.idl";

typedef enum DXGI_ADAPTER_FLAG3
{
    DXGI_ADAPTER_FLAG3_NONE = 0x0,
    DXGI_ADAPTER_FLAG3_REMOTE = 0x1,
    DXGI_ADAPTER_FLAG3_SOFTWARE = 0x2,
    DXGI_ADAPTER_FLAG3_ACG_COMPATIBLE = 0x4,
    DXGI_ADAPTER_FLAG3_FORCE_DWORD = 0xffffffff,
} DXGI_ADAPTER_FLAG3;

typedef enum DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAGS
{
    DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_FULLSCREEN = 0x1,
    DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_WINDOWED = 0x2,
    DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED = 0x4,
} DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAGS;

typedef enum DXGI_GPU_PREFERENCE
{
    DXGI_GPU_PREFERENCE_UNSPECIFIED = 0x0,
    DXGI_GPU_PREFERENCE_MINIMUM_POWER = 0x1,
    DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE = 0x2,
} DXGI_GPU_PREFERENCE;

typedef struct DXGI_ADAPTER_DESC3
{
    WCHAR Description[128];
    UINT VendorId;
    UINT DeviceId;
    UINT SubSysId;
    UINT Revision;
    SIZE_T DedicatedVideoMemory;
    SIZE_T DedicatedSystemMemory;
    SIZE_T SharedSystemMemory;
    LUID AdapterLuid;
    DXGI_ADAPTER_FLAG3 Flags;
    DXGI_GRAPHICS_PREEMPTION_GRANULARITY GraphicsPreemptionGranularity;
    DXGI_COMPUTE_PREEMPTION_GRANULARITY ComputePreemptionGranularity;
} DXGI_ADAPTER_DESC3;

typedef struct DXGI_OUTPUT_DESC1
{
    WCHAR DeviceName[32];
    RECT DesktopCoordinates;
    BOOL AttachedToDesktop;
    DXGI_MODE_ROTATION Rotation;
    HMONITOR Monitor;
    UINT BitsPerColor;
    DXGI_COLOR_SPACE_TYPE ColorSpace;
    FLOAT RedPrimary[2];
    FLOAT GreenPrimary[2];
    FLOAT BluePrimary[2];
    FLOAT WhitePoint[2];
    FLOAT MinLuminance;
    FLOAT MaxLuminance;
    FLOAT MaxFullFrameLuminance;
} DXGI_OUTPUT_DESC1;

[
    object,
    uuid(3c8d99d1-4fbf-4181-a82c-af66bf7bd24e),
    local,
    pointer_default(unique)
]
interface IDXGIAdapter4 : IDXGIAdapter3
{
    HRESULT GetDesc3(
        [out] DXGI_ADAPTER_DESC3 *desc
    );
}

[
    object,
    uuid(068346e8-aaec-4b84-add7-137f513f77a1),
    local,
    pointer_default(unique)
]
interface IDXGIOutput6 : IDXGIOutput5
{
    HRESULT GetDesc1(
        [out] DXGI_OUTPUT_DESC1 *desc
    );
    HRESULT CheckHardwareCompositionSupport(
        [out] UINT *flags
    );
}

[
    object,
    uuid(c1b6694f-ff09-44a9-b03c-77900a0a1d17),
    local,
    pointer_default(unique)
]
interface IDXGIFactory6 : IDXGIFactory5
{
    HRESULT EnumAdapterByGpuPreference(
        [in] UINT adapter_idx,
        [in] DXGI_GPU_PREFERENCE gpu_preference,
        [in] REFIID iid,
        [out] void **adapter
    );
}

[
    object,
    uuid(a4966eed-76db-44da-84c1-ee9a7afb20a8),
    local,
    pointer_default(unique)
]
interface IDXGIFactory7 : IDXGIFactory6
{
    HRESULT RegisterAdaptersChangedEvent(
        [in] HANDLE event,
        [out] DWORD *cookie
    );
    HRESULT UnregisterAdaptersChangedEvent(
        [in] DWORD cookie
    );
}
