// Copyright (c) Microsoft Corporation.  All Rights Reserved
cpp_quote("// Copyright (c) Microsoft Corporation.  All Rights Reserved")

import "dxgi1_5.idl";

cpp_quote("#include <winapifamily.h>")

#pragma region App Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_GAMES)")

cpp_quote( "HRESULT WINAPI DXGIDeclareAdapterRemovalSupport();" )

typedef enum DXGI_ADAPTER_FLAG3
{
    DXGI_ADAPTER_FLAG3_NONE                         = 0,
    DXGI_ADAPTER_FLAG3_REMOTE                       = 1,
    DXGI_ADAPTER_FLAG3_SOFTWARE                     = 2,
    DXGI_ADAPTER_FLAG3_ACG_COMPATIBLE               = 4,
    DXGI_ADAPTER_FLAG3_SUPPORT_MONITORED_FENCES     = 8,
    DXGI_ADAPTER_FLAG3_SUPPORT_NON_MONITORED_FENCES = 0x10,
    DXGI_ADAPTER_FLAG3_KEYED_MUTEX_CONFORMANCE      = 0x20,
    DXGI_ADAPTER_FLAG3_FORCE_DWORD                  = 0xFFFFFFFF,
} DXGI_ADAPTER_FLAG3;
cpp_quote( "DEFINE_ENUM_FLAG_OPERATORS( DXGI_ADAPTER_FLAG3 );" )

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;

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

//--------------------------------------------------------------------------------------------------------
typedef struct DXGI_OUTPUT_DESC1
{
    // Device name for GDI (ex. \\.\DISPLAY1)
    WCHAR DeviceName[32];
    RECT DesktopCoordinates;
    BOOL AttachedToDesktop;
    DXGI_MODE_ROTATION Rotation;
    HMONITOR Monitor;

    // Number of bits per color channel being
    // used for scanout on this output
    UINT BitsPerColor;

    // Represents whether the current OS state can take
    // advantage of color values larger than sRGB and also
    // specifies if there is any headroom
    DXGI_COLOR_SPACE_TYPE ColorSpace;

    // Color primaries of this output in xy coordinates
    FLOAT RedPrimary[2];
    FLOAT GreenPrimary[2];
    FLOAT BluePrimary[2];

    // White point of this output in xy coordinates
    FLOAT WhitePoint[2];

    // Minimum luminance supported on this output in nits
    FLOAT MinLuminance;

    // Maximum peak luminance supported on this output
    // in nits; usually only possible on a small fraction
    // of the display
    FLOAT MaxLuminance;

    // Maximum average luminance supported on this
    // output in nits; valid for the full frame of the
    // display
    FLOAT MaxFullFrameLuminance;
} DXGI_OUTPUT_DESC1;

//--------------------------------------------------------------------------------------------------------
typedef enum DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAGS
{
    DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_FULLSCREEN = 1,
    DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_WINDOWED = 2,
    DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED = 4,
} DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAGS;
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS( DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAGS );")

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

//+-----------------------------------------------------------------------------
//
//  Enum for GPU Preference categories
//
//------------------------------------------------------------------------------
typedef enum DXGI_GPU_PREFERENCE
{
    DXGI_GPU_PREFERENCE_UNSPECIFIED = 0,
    DXGI_GPU_PREFERENCE_MINIMUM_POWER,
    DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,

} DXGI_GPU_PREFERENCE;

//--------------------------------------------------------------------------------------------------------
// IDXGIFactory6 interface
//--------------------------------------------------------------------------------------------------------
[
    object,
    uuid(c1b6694f-ff09-44a9-b03c-77900a0a1d17),
    local,
    pointer_default(unique)
]
interface IDXGIFactory6 :
    IDXGIFactory5
{
    HRESULT EnumAdapterByGpuPreference(
        [annotation("_In_")] UINT Adapter,
        [annotation("_In_")] DXGI_GPU_PREFERENCE GpuPreference,
        [annotation("_In_")] REFIID riid,
        [annotation("_COM_Outptr_")] void** ppvAdapter
    );
};

//--------------------------------------------------------------------------------------------------------
// IDXGIFactory7 interface
//--------------------------------------------------------------------------------------------------------
[
    object,
    uuid(a4966eed-76db-44da-84c1-ee9a7afb20a8),
    local,
    pointer_default(unique)
]
interface IDXGIFactory7 :
    IDXGIFactory6
{
    HRESULT RegisterAdaptersChangedEvent(
        [in, annotation("_In_")] HANDLE hEvent,
        [out, annotation("_Out_")] DWORD *pdwCookie
    );

    HRESULT UnregisterAdaptersChangedEvent([in, annotation("_In_")] DWORD dwCookie);
};

//--------------------------------------------------------------------------------------------------------

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_GAMES) */")
#pragma endregion

cpp_quote( "DEFINE_GUID(IID_IDXGIAdapter4,0x3c8d99d1,0x4fbf,0x4181,0xa8,0x2c,0xaf,0x66,0xbf,0x7b,0xd2,0x4e);" )
cpp_quote( "DEFINE_GUID(IID_IDXGIOutput6,0x068346e8,0xaaec,0x4b84,0xad,0xd7,0x13,0x7f,0x51,0x3f,0x77,0xa1);" )
cpp_quote( "DEFINE_GUID(IID_IDXGIFactory6,0xc1b6694f,0xff09,0x44a9,0xb0,0x3c,0x77,0x90,0x0a,0x0a,0x1d,0x17);" )
cpp_quote( "DEFINE_GUID(IID_IDXGIFactory7,0xa4966eed,0x76db,0x44da,0x84,0xc1,0xee,0x9a,0x7a,0xfb,0x20,0xa8);" )
