/*
 * 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 "oaidl.idl";
import "ocidl.idl";
import "dxgi1_3.idl";
import "d3dcommon.idl";
import "d3d11_1.idl";

const UINT D3D11_PACKED_TILE = 0xffffffff;

typedef enum D3D11_TILE_MAPPING_FLAG
{
    D3D11_TILE_MAPPING_NO_OVERWRITE = 0x1,
} D3D11_TILE_MAPPING_FLAG;

typedef enum D3D11_TILE_RANGE_FLAG
{
    D3D11_TILE_RANGE_NULL = 0x1,
    D3D11_TILE_RANGE_SKIP = 0x2,
    D3D11_TILE_RANGE_REUSE_SINGLE_TILE = 0x4,
} D3D11_TILE_RANGE_FLAG;

typedef enum D3D11_CHECK_MULTISAMPLE_QUALITY_LEVELS_FLAG
{
    D3D11_CHECK_MULTISAMPLE_QUALITY_LEVELS_TILED_RESOURCE = 0x1,
} D3D11_CHECK_MULTISAMPLE_QUALITY_LEVELS_FLAG;

typedef enum D3D11_TILE_COPY_FLAG
{
    D3D11_TILE_COPY_NO_OVERWRITE = 0x1,
    D3D11_TILE_COPY_LINEAR_BUFFER_TO_SWIZZLED_TILED_RESOURCE = 0x2,
    D3D11_TILE_COPY_SWIZZLED_TILED_RESOURCE_TO_LINEAR_BUFFER = 0x4,
} D3D11_TILE_COPY_FLAG;

typedef struct D3D11_TILED_RESOURCE_COORDINATE
{
    UINT X;
    UINT Y;
    UINT Z;
    UINT Subresource;
} D3D11_TILED_RESOURCE_COORDINATE;

typedef struct D3D11_TILE_REGION_SIZE
{
    UINT NumTiles;
    BOOL bUseBox;
    UINT Width;
    UINT16 Height;
    UINT16 Depth;
} D3D11_TILE_REGION_SIZE;

typedef struct D3D11_SUBRESOURCE_TILING
{
    UINT WidthInTiles;
    UINT16 HeightInTiles;
    UINT16 DepthInTiles;
    UINT StartTileIndexInOverallResource;
} D3D11_SUBRESOURCE_TILING;

typedef struct D3D11_TILE_SHAPE
{
    UINT WidthInTexels;
    UINT HeightInTexels;
    UINT DepthInTexels;
} D3D11_TILE_SHAPE;

typedef struct D3D11_PACKED_MIP_DESC
{
    UINT8 NumStandardMips;
    UINT8 NumPackedMips;
    UINT NumTilesForPackedMips;
    UINT StartTileIndexInOverallResource;
} D3D11_PACKED_MIP_DESC;

[
    uuid(420d5b32-b90c-4da4-bef0-359f6a24a83a),
    object,
    local,
    pointer_default(unique)
]
interface ID3D11DeviceContext2 : ID3D11DeviceContext1
{
    HRESULT UpdateTileMappings(
        ID3D11Resource *resource,
        UINT region_count,
        const D3D11_TILED_RESOURCE_COORDINATE *region_start_coordinates,
        const D3D11_TILE_REGION_SIZE *region_sizes,
        ID3D11Buffer *pool,
        UINT range_count,
        const UINT *range_flags,
        const UINT *pool_start_offsets,
        const UINT *range_tile_counts,
        UINT flags
    );
    HRESULT CopyTileMappings(
        ID3D11Resource *dst_resource,
        const D3D11_TILED_RESOURCE_COORDINATE *dst_start_coordinate,
        ID3D11Resource *src_resource,
        const D3D11_TILED_RESOURCE_COORDINATE *src_start_coordinate,
        const D3D11_TILE_REGION_SIZE *region_size,
        UINT flags
    );
    void CopyTiles(
        ID3D11Resource *resource,
        const D3D11_TILED_RESOURCE_COORDINATE *start_coordinate,
        const D3D11_TILE_REGION_SIZE *size,
        ID3D11Buffer *buffer,
        UINT64 start_offset,
        UINT flags
    );
    void UpdateTiles(
        ID3D11Resource *dst_resource,
        const D3D11_TILED_RESOURCE_COORDINATE *dst_start_coordinate,
        const D3D11_TILE_REGION_SIZE *dst_region_size,
        const void *src_data,
        UINT flags
    );
    HRESULT ResizeTilePool(
        ID3D11Buffer *pool,
        UINT64 size
    );
    void TiledResourceBarrier(
        ID3D11DeviceChild *before_barrier,
        ID3D11DeviceChild *after_barrier
    );
    BOOL IsAnnotationEnabled();
    void SetMarkerInt(const WCHAR *label, int data);
    void BeginEventInt(const WCHAR *label, int data);
    void EndEvent();
}

[
    uuid(9d06dffa-d1e5-4d07-83a8-1bb123f2f841),
    object,
    local,
    pointer_default(unique)
]
interface ID3D11Device2 : ID3D11Device1
{
    void GetImmediateContext2(ID3D11DeviceContext2 **context);
    HRESULT CreateDeferredContext2(UINT flags, ID3D11DeviceContext2 **context);
    void GetResourceTiling(
        ID3D11Resource *resource,
        UINT *tile_count,
        D3D11_PACKED_MIP_DESC *mip_desc,
        D3D11_TILE_SHAPE *tile_shape,
        UINT *subresource_tiling_count,
        UINT first_subresource_tiling,
        D3D11_SUBRESOURCE_TILING *subresource_tiling
    );
    HRESULT CheckMultisampleQualityLevels1(
        DXGI_FORMAT format,
        UINT sample_count,
        UINT flags,
        UINT *quality_level_count
    );
}
