Program Listing for File dstorage.h

Return to documentation for file (include\dstorage.h)

/*-------------------------------------------------------------------------------------
 *
 * Copyright (c) Microsoft Corporation
 * Licensed under the MIT license
 *
 *-------------------------------------------------------------------------------------*/

#if !defined(__cplusplus)
    #error C++11 required
#endif

#pragma once

#include <unknwn.h>
#include <d3d12.h>
#include <dstorageerr.h>

#define DSTORAGE_SDK_VERSION 203

interface ID3D12Resource;
interface ID3D12Fence;
interface IDStorageStatusArray;

enum DSTORAGE_PRIORITY : INT8 {
    DSTORAGE_PRIORITY_LOW      = -1,
    DSTORAGE_PRIORITY_NORMAL   = 0,
    DSTORAGE_PRIORITY_HIGH     = 1,
    DSTORAGE_PRIORITY_REALTIME = 2,

    DSTORAGE_PRIORITY_FIRST    = DSTORAGE_PRIORITY_LOW,
    DSTORAGE_PRIORITY_LAST     = DSTORAGE_PRIORITY_REALTIME,

    DSTORAGE_PRIORITY_COUNT    = 4
};

#define DSTORAGE_MIN_QUEUE_CAPACITY             0x80

#define DSTORAGE_MAX_QUEUE_CAPACITY             0x2000

enum DSTORAGE_REQUEST_SOURCE_TYPE : UINT64 {
    DSTORAGE_REQUEST_SOURCE_FILE = 0,

    DSTORAGE_REQUEST_SOURCE_MEMORY = 1,
};

enum DSTORAGE_REQUEST_DESTINATION_TYPE : UINT64 {
    DSTORAGE_REQUEST_DESTINATION_MEMORY = 0,

    DSTORAGE_REQUEST_DESTINATION_BUFFER = 1,

    DSTORAGE_REQUEST_DESTINATION_TEXTURE_REGION = 2,

    DSTORAGE_REQUEST_DESTINATION_MULTIPLE_SUBRESOURCES = 3,

    DSTORAGE_REQUEST_DESTINATION_TILES = 4
};

struct DSTORAGE_QUEUE_DESC {
    DSTORAGE_REQUEST_SOURCE_TYPE SourceType;

    UINT16 Capacity;

    DSTORAGE_PRIORITY Priority;

    _In_opt_z_ const CHAR *Name;

    ID3D12Device* Device;
};

struct DSTORAGE_QUEUE_INFO {
    DSTORAGE_QUEUE_DESC Desc;

    UINT16 EmptySlotCount;

    UINT16 RequestCountUntilAutoSubmit;
};

enum DSTORAGE_COMPRESSION_FORMAT : UINT8 {
    DSTORAGE_COMPRESSION_FORMAT_NONE     = 0,

    DSTORAGE_COMPRESSION_FORMAT_GDEFLATE = 1,

    DSTORAGE_CUSTOM_COMPRESSION_0        = 0x80,
};

struct DSTORAGE_REQUEST_OPTIONS {
    DSTORAGE_COMPRESSION_FORMAT CompressionFormat : 8;

    UINT8 Reserved1[7];

    DSTORAGE_REQUEST_SOURCE_TYPE SourceType : 1;

    DSTORAGE_REQUEST_DESTINATION_TYPE DestinationType : 7;

    UINT64 Reserved : 48;
};

enum DSTORAGE_DEBUG {
    DSTORAGE_DEBUG_NONE                 = 0x00,

    DSTORAGE_DEBUG_SHOW_ERRORS          = 0x01,

    DSTORAGE_DEBUG_BREAK_ON_ERROR       = 0x02,

    DSTORAGE_DEBUG_RECORD_OBJECT_NAMES  = 0x04
};
DEFINE_ENUM_FLAG_OPERATORS(DSTORAGE_DEBUG);

DECLARE_INTERFACE_IID_(IDStorageFile, IUnknown, "5de95e7b-955a-4868-a73c-243b29f4b8da")
{
    virtual void STDMETHODCALLTYPE Close() = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileInformation(_Out_ BY_HANDLE_FILE_INFORMATION* info) = 0;
};

struct DSTORAGE_SOURCE_FILE {
    IDStorageFile* Source;

    UINT64 Offset;

    UINT32 Size;
};

struct DSTORAGE_SOURCE_MEMORY {
    void const* Source;

    UINT32 Size;
};

struct DSTORAGE_DESTINATION_MEMORY {
    void* Buffer;

    UINT32 Size;
};

struct DSTORAGE_DESTINATION_BUFFER {
    ID3D12Resource* Resource;

    UINT64 Offset;

    UINT32 Size;
};

struct DSTORAGE_DESTINATION_TEXTURE_REGION {
    ID3D12Resource* Resource;

    UINT SubresourceIndex;

    D3D12_BOX Region;
};

struct DSTORAGE_DESTINATION_MULTIPLE_SUBRESOURCES {
    ID3D12Resource* Resource;

    UINT FirstSubresource;
};

struct DSTORAGE_DESTINATION_TILES {
    ID3D12Resource* Resource;

    D3D12_TILED_RESOURCE_COORDINATE TiledRegionStartCoordinate;

    D3D12_TILE_REGION_SIZE TileRegionSize;
};

union DSTORAGE_SOURCE {
    DSTORAGE_SOURCE_MEMORY Memory;
    DSTORAGE_SOURCE_FILE File;
};

union DSTORAGE_DESTINATION {
    DSTORAGE_DESTINATION_MEMORY Memory;
    DSTORAGE_DESTINATION_BUFFER Buffer;
    DSTORAGE_DESTINATION_TEXTURE_REGION Texture;
    DSTORAGE_DESTINATION_MULTIPLE_SUBRESOURCES MultipleSubresources;
    DSTORAGE_DESTINATION_TILES Tiles;
};

struct DSTORAGE_REQUEST {
    DSTORAGE_REQUEST_OPTIONS Options;

    DSTORAGE_SOURCE Source;

    DSTORAGE_DESTINATION Destination;

    UINT32 UncompressedSize;

    UINT64 CancellationTag;

    _In_opt_z_ const CHAR *Name;
};

#define DSTORAGE_REQUEST_MAX_NAME       64

enum DSTORAGE_COMMAND_TYPE {
    DSTORAGE_COMMAND_TYPE_NONE = -1,
    DSTORAGE_COMMAND_TYPE_REQUEST = 0,
    DSTORAGE_COMMAND_TYPE_STATUS = 1,
    DSTORAGE_COMMAND_TYPE_SIGNAL = 2,
    DSTORAGE_COMMAND_TYPE_EVENT = 3,
};

struct DSTORAGE_ERROR_PARAMETERS_REQUEST {
    WCHAR Filename[MAX_PATH];

    CHAR RequestName[DSTORAGE_REQUEST_MAX_NAME];

    DSTORAGE_REQUEST Request;
};

struct DSTORAGE_ERROR_PARAMETERS_STATUS {
    IDStorageStatusArray* StatusArray;
    UINT32 Index;
};

struct DSTORAGE_ERROR_PARAMETERS_SIGNAL {
    ID3D12Fence* Fence;
    UINT64 Value;
};

struct DSTORAGE_ERROR_PARAMETERS_EVENT
{
    HANDLE Handle;
};

struct DSTORAGE_ERROR_FIRST_FAILURE {

    HRESULT HResult;

    DSTORAGE_COMMAND_TYPE CommandType;

    union
    {
        DSTORAGE_ERROR_PARAMETERS_REQUEST Request;
        DSTORAGE_ERROR_PARAMETERS_STATUS Status;
        DSTORAGE_ERROR_PARAMETERS_SIGNAL Signal;
        DSTORAGE_ERROR_PARAMETERS_EVENT Event;
    };
};

struct DSTORAGE_ERROR_RECORD {
    UINT32 FailureCount;

    DSTORAGE_ERROR_FIRST_FAILURE FirstFailure;
};


enum DSTORAGE_STAGING_BUFFER_SIZE : UINT32 {
    DSTORAGE_STAGING_BUFFER_SIZE_0 = 0,

    DSTORAGE_STAGING_BUFFER_SIZE_32MB = 32 * 1048576,
};


enum DSTORAGE_GET_REQUEST_FLAGS : UINT32
{
    DSTORAGE_GET_REQUEST_FLAG_SELECT_CUSTOM = 0x01,

    DSTORAGE_GET_REQUEST_FLAG_SELECT_BUILTIN = 0x02,

    DSTORAGE_GET_REQUEST_FLAG_SELECT_ALL = (DSTORAGE_GET_REQUEST_FLAG_SELECT_CUSTOM | DSTORAGE_GET_REQUEST_FLAG_SELECT_BUILTIN)
};
DEFINE_ENUM_FLAG_OPERATORS(DSTORAGE_GET_REQUEST_FLAGS);

enum DSTORAGE_CUSTOM_DECOMPRESSION_FLAGS : UINT32
{
    DSTORAGE_CUSTOM_DECOMPRESSION_FLAG_NONE = 0x00,

    DSTORAGE_CUSTOM_DECOMPRESSION_FLAG_DEST_IN_UPLOAD_HEAP = 0x01,
};
DEFINE_ENUM_FLAG_OPERATORS(DSTORAGE_CUSTOM_DECOMPRESSION_FLAGS);

struct DSTORAGE_CUSTOM_DECOMPRESSION_REQUEST {
    UINT64 Id;

    DSTORAGE_COMPRESSION_FORMAT CompressionFormat;

    UINT8 Reserved[3];

    DSTORAGE_CUSTOM_DECOMPRESSION_FLAGS Flags;

    UINT64 SrcSize;

    void const* SrcBuffer;

    UINT64 DstSize;

    void* DstBuffer;
};

struct DSTORAGE_CUSTOM_DECOMPRESSION_RESULT {
    UINT64 Id;

    HRESULT Result;
};

DECLARE_INTERFACE_IID_(IDStorageCustomDecompressionQueue, IUnknown, "97179b2f-2c21-49ca-8291-4e1bf4a160df")
{
    virtual HANDLE STDMETHODCALLTYPE GetEvent() = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRequests(
        _In_ UINT32 maxRequests,
        _Out_writes_to_(maxRequests, *numRequests) DSTORAGE_CUSTOM_DECOMPRESSION_REQUEST* requests,
        _Out_ UINT32* numRequests) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRequestResults(
        _In_ UINT32 numResults,
        _In_reads_(numResults) DSTORAGE_CUSTOM_DECOMPRESSION_RESULT* results) = 0;
};


DECLARE_INTERFACE_IID_(
    IDStorageCustomDecompressionQueue1,
    IDStorageCustomDecompressionQueue,
    "0D47C6C9-E61A-4706-93B4-68BFE3F4AA4A")
{
    virtual HRESULT STDMETHODCALLTYPE GetRequests1(
        _In_ DSTORAGE_GET_REQUEST_FLAGS flags,
        _In_ UINT32 maxRequests,
        _Out_writes_to_(maxRequests, *numRequests) DSTORAGE_CUSTOM_DECOMPRESSION_REQUEST* requests,
        _Out_ UINT32 * numRequests) = 0;
};

DECLARE_INTERFACE_IID_(IDStorageFactory, IUnknown, "6924ea0c-c3cd-4826-b10a-f64f4ed927c1")
{
    virtual HRESULT STDMETHODCALLTYPE CreateQueue(const DSTORAGE_QUEUE_DESC *desc, REFIID riid, _COM_Outptr_ void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenFile(_In_z_ const WCHAR *path, REFIID riid, _COM_Outptr_ void **ppv) = 0;

    //  the ETW events if enabled through the debug layer. This is an optional
    //  parameter.</param>
    virtual HRESULT STDMETHODCALLTYPE CreateStatusArray(UINT32 capacity, _In_opt_ PCSTR name, REFIID riid, _COM_Outptr_ void **ppv) = 0;

    virtual void STDMETHODCALLTYPE SetDebugFlags(UINT32 flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStagingBufferSize(UINT32 size) = 0;
};

DECLARE_INTERFACE_IID_(IDStorageStatusArray, IUnknown, "82397587-7cd5-453b-a02e-31379bd64656")
{
    virtual bool STDMETHODCALLTYPE IsComplete(UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHResult(UINT32 index) = 0;
};

DECLARE_INTERFACE_IID_(IDStorageQueue, IUnknown, "cfdbd83f-9e06-4fda-8ea5-69042137f49b")
{
    virtual void STDMETHODCALLTYPE EnqueueRequest(const DSTORAGE_REQUEST *request) = 0;

    virtual void STDMETHODCALLTYPE EnqueueStatus(IDStorageStatusArray *statusArray, UINT32 index) = 0;

    virtual void STDMETHODCALLTYPE EnqueueSignal(ID3D12Fence *fence, UINT64 value) = 0;

    virtual void STDMETHODCALLTYPE Submit() = 0;

    virtual void STDMETHODCALLTYPE CancelRequestsWithTag(UINT64 mask, UINT64 value) = 0;

    virtual void STDMETHODCALLTYPE Close() = 0;

    virtual HANDLE STDMETHODCALLTYPE GetErrorEvent() = 0;

    virtual void STDMETHODCALLTYPE RetrieveErrorRecord(_Out_ DSTORAGE_ERROR_RECORD *record) = 0;

    virtual void STDMETHODCALLTYPE Query(_Out_ DSTORAGE_QUEUE_INFO *info) = 0;
};

DECLARE_INTERFACE_IID_(IDStorageQueue1, IDStorageQueue, "dd2f482c-5eff-41e8-9c9e-d2374b278128")
{
    virtual void STDMETHODCALLTYPE EnqueueSetEvent(HANDLE handle) = 0;
};

enum DSTORAGE_COMPRESSION_SUPPORT : UINT32
{
    DSTORAGE_COMPRESSION_SUPPORT_NONE = 0x0,

    DSTORAGE_COMPRESSION_SUPPORT_GPU_OPTIMIZED = 0x01,

    DSTORAGE_COMPRESSION_SUPPORT_GPU_FALLBACK = 0x02,

    DSTORAGE_COMPRESSION_SUPPORT_CPU_FALLBACK = 0x04,

    DSTORAGE_COMPRESSION_SUPPORT_USES_COMPUTE_QUEUE = 0x08,

    DSTORAGE_COMPRESSION_SUPPORT_USES_COPY_QUEUE = 0x010,
};
DEFINE_ENUM_FLAG_OPERATORS(DSTORAGE_COMPRESSION_SUPPORT);

DECLARE_INTERFACE_IID_(IDStorageQueue2, IDStorageQueue1, "b1c9d643-3a49-44a2-b46f-653649470d18")
{
    virtual DSTORAGE_COMPRESSION_SUPPORT STDMETHODCALLTYPE GetCompressionSupport(DSTORAGE_COMPRESSION_FORMAT format) = 0;
};

#define DSTORAGE_DISABLE_BUILTIN_CPU_DECOMPRESSION -1

struct DSTORAGE_CONFIGURATION {
    UINT32 NumSubmitThreads;

    INT32 NumBuiltInCpuDecompressionThreads;

    BOOL ForceMappingLayer;

    BOOL DisableBypassIO;

    BOOL DisableTelemetry;

    BOOL DisableGpuDecompressionMetacommand;

    BOOL DisableGpuDecompression;
};

struct DSTORAGE_CONFIGURATION1
{
    UINT32 NumSubmitThreads;

    INT32 NumBuiltInCpuDecompressionThreads;

    BOOL ForceMappingLayer;

    BOOL DisableBypassIO;

    BOOL DisableTelemetry;

    BOOL DisableGpuDecompressionMetacommand;

    BOOL DisableGpuDecompression;

    BOOL ForceFileBuffering;
};

enum DSTORAGE_COMPRESSION : INT32 {

    DSTORAGE_COMPRESSION_FASTEST = -1,

    DSTORAGE_COMPRESSION_DEFAULT = 0,

    DSTORAGE_COMPRESSION_BEST_RATIO = 1
};

DECLARE_INTERFACE_IID_(IDStorageCompressionCodec, IUnknown, "84ef5121-9b43-4d03-b5c1-cc34606b262d")
{
    virtual HRESULT STDMETHODCALLTYPE CompressBuffer(
        const void* uncompressedData,
        size_t uncompressedDataSize,
        DSTORAGE_COMPRESSION compressionSetting,
        void* compressedBuffer,
        size_t compressedBufferSize,
        size_t* compressedDataSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE DecompressBuffer(
        const void* compressedData,
        size_t compressedDataSize,
        void* uncompressedBuffer,
        size_t uncompressedBufferSize,
        size_t* uncompressedDataSize) = 0;

    virtual size_t STDMETHODCALLTYPE CompressBufferBound(size_t uncompressedDataSize) = 0;
};

extern "C" {

HRESULT WINAPI DStorageSetConfiguration(DSTORAGE_CONFIGURATION const* configuration);

HRESULT WINAPI DStorageSetConfiguration1(DSTORAGE_CONFIGURATION1 const* configuration);

HRESULT WINAPI DStorageGetFactory(REFIID riid, _COM_Outptr_ void** ppv);

HRESULT WINAPI DStorageCreateCompressionCodec(DSTORAGE_COMPRESSION_FORMAT format, UINT32 numThreads, REFIID riid, _COM_Outptr_ void** ppv);

}