[PATCH 2/2] include/d3d12: add interfaces to support D3D12 video decoding

Steve Lhomme robux4 at ycbcr.xyz
Sat Jul 3 01:10:50 CDT 2021


Signed-off-by: Steve Lhomme <robux4 at ycbcr.xyz>
---
 include/d3d12.idl      |   3 +
 include/d3d12video.idl | 378 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 381 insertions(+)
 create mode 100644 include/d3d12video.idl

diff --git a/include/d3d12.idl b/include/d3d12.idl
index 056e078ab9d..08ec5b9e2d3 100644
--- a/include/d3d12.idl
+++ b/include/d3d12.idl
@@ -1633,6 +1633,9 @@ typedef enum D3D12_COMMAND_LIST_TYPE
     D3D12_COMMAND_LIST_TYPE_BUNDLE = 1,
     D3D12_COMMAND_LIST_TYPE_COMPUTE = 2,
     D3D12_COMMAND_LIST_TYPE_COPY = 3,
+    D3D12_COMMAND_LIST_TYPE_VIDEO_DECODE = 4,
+    D3D12_COMMAND_LIST_TYPE_VIDEO_PROCESS = 5,
+    D3D12_COMMAND_LIST_TYPE_VIDEO_ENCODE = 6
 } D3D12_COMMAND_LIST_TYPE;
 
 typedef enum D3D12_COMMAND_QUEUE_PRIORITY
diff --git a/include/d3d12video.idl b/include/d3d12video.idl
new file mode 100644
index 00000000000..49aa8eea8d8
--- /dev/null
+++ b/include/d3d12video.idl
@@ -0,0 +1,378 @@
+import "d3d12.idl";
+
+typedef enum D3D12_FEATURE_VIDEO
+{
+    D3D12_FEATURE_VIDEO_DECODE_SUPPORT = 0,
+    D3D12_FEATURE_VIDEO_DECODE_PROFILES = 1,
+    D3D12_FEATURE_VIDEO_DECODE_FORMATS = 2,
+    D3D12_FEATURE_VIDEO_DECODE_CONVERSION_SUPPORT = 3,
+    D3D12_FEATURE_VIDEO_PROCESS_SUPPORT = 5,
+    D3D12_FEATURE_VIDEO_PROCESS_MAX_INPUT_STREAMS = 6,
+    D3D12_FEATURE_VIDEO_PROCESS_REFERENCE_INFO = 7,
+    D3D12_FEATURE_VIDEO_DECODER_HEAP_SIZE = 8,
+    D3D12_FEATURE_VIDEO_PROCESSOR_SIZE = 9,
+    D3D12_FEATURE_VIDEO_DECODE_PROFILE_COUNT = 10,
+    D3D12_FEATURE_VIDEO_DECODE_FORMAT_COUNT = 11,
+    D3D12_FEATURE_VIDEO_ARCHITECTURE = 17,
+    D3D12_FEATURE_VIDEO_DECODE_HISTOGRAM = 18,
+    D3D12_FEATURE_VIDEO_FEATURE_AREA_SUPPORT = 19,
+    D3D12_FEATURE_VIDEO_MOTION_ESTIMATOR = 20,
+    D3D12_FEATURE_VIDEO_MOTION_ESTIMATOR_SIZE = 21,
+    D3D12_FEATURE_VIDEO_EXTENSION_COMMAND_COUNT = 22,
+    D3D12_FEATURE_VIDEO_EXTENSION_COMMANDS = 23,
+    D3D12_FEATURE_VIDEO_EXTENSION_COMMAND_PARAMETER_COUNT = 24,
+    D3D12_FEATURE_VIDEO_EXTENSION_COMMAND_PARAMETERS = 25,
+    D3D12_FEATURE_VIDEO_EXTENSION_COMMAND_SUPPORT = 26,
+    D3D12_FEATURE_VIDEO_EXTENSION_COMMAND_SIZE = 27,
+    D3D12_FEATURE_VIDEO_DECODE_PROTECTED_RESOURCES = 28,
+    D3D12_FEATURE_VIDEO_PROCESS_PROTECTED_RESOURCES = 29,
+    D3D12_FEATURE_VIDEO_MOTION_ESTIMATOR_PROTECTED_RESOURCES = 30,
+    D3D12_FEATURE_VIDEO_DECODER_HEAP_SIZE1 = 31,
+    D3D12_FEATURE_VIDEO_PROCESSOR_SIZE1 = 32
+} D3D12_FEATURE_VIDEO;
+
+typedef enum D3D12_BITSTREAM_ENCRYPTION_TYPE
+{
+    D3D12_BITSTREAM_ENCRYPTION_TYPE_NONE
+} D3D12_BITSTREAM_ENCRYPTION_TYPE;
+
+typedef enum D3D12_VIDEO_FRAME_CODED_INTERLACE_TYPE
+{
+    D3D12_VIDEO_FRAME_CODED_INTERLACE_TYPE_NONE,
+    D3D12_VIDEO_FRAME_CODED_INTERLACE_TYPE_FIELD_BASED
+} D3D12_VIDEO_FRAME_CODED_INTERLACE_TYPE;
+
+typedef enum D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE
+{
+    D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE_OPAQUE,
+    D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE_BACKGROUND,
+    D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE_DESTINATION,
+    D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE_SOURCE_STREAM
+} D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE;
+
+typedef enum D3D12_VIDEO_PROCESS_FILTER_FLAGS
+{
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_NONE,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_BRIGHTNESS,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_CONTRAST,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_HUE,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_SATURATION,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_NOISE_REDUCTION,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_EDGE_ENHANCEMENT,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_ANAMORPHIC_SCALING,
+    D3D12_VIDEO_PROCESS_FILTER_FLAG_STEREO_ADJUSTMENT
+} D3D12_VIDEO_PROCESS_FILTER_FLAGS;
+
+typedef enum D3D12_VIDEO_FRAME_STEREO_FORMAT
+{
+    D3D12_VIDEO_FRAME_STEREO_FORMAT_NONE,
+    D3D12_VIDEO_FRAME_STEREO_FORMAT_MONO,
+    D3D12_VIDEO_FRAME_STEREO_FORMAT_HORIZONTAL,
+    D3D12_VIDEO_FRAME_STEREO_FORMAT_VERTICAL,
+    D3D12_VIDEO_FRAME_STEREO_FORMAT_SEPARATE
+} D3D12_VIDEO_FRAME_STEREO_FORMAT;
+
+typedef enum D3D12_VIDEO_FIELD_TYPE
+{
+    D3D12_VIDEO_FIELD_TYPE_NONE,
+    D3D12_VIDEO_FIELD_TYPE_INTERLACED_TOP_FIELD_FIRST,
+    D3D12_VIDEO_FIELD_TYPE_INTERLACED_BOTTOM_FIELD_FIRST
+} D3D12_VIDEO_FIELD_TYPE;
+
+typedef enum D3D12_VIDEO_PROCESS_DEINTERLACE_FLAGS
+{
+    D3D12_VIDEO_PROCESS_DEINTERLACE_FLAG_NONE,
+    D3D12_VIDEO_PROCESS_DEINTERLACE_FLAG_BOB,
+    D3D12_VIDEO_PROCESS_DEINTERLACE_FLAG_CUSTOM
+} D3D12_VIDEO_PROCESS_DEINTERLACE_FLAGS;
+
+typedef enum D3D12_VIDEO_DECODE_ARGUMENT_TYPE
+{
+    D3D12_VIDEO_DECODE_ARGUMENT_TYPE_PICTURE_PARAMETERS,
+    D3D12_VIDEO_DECODE_ARGUMENT_TYPE_INVERSE_QUANTIZATION_MATRIX,
+    D3D12_VIDEO_DECODE_ARGUMENT_TYPE_SLICE_CONTROL,
+    D3D12_VIDEO_DECODE_ARGUMENT_TYPE_MAX_VALID
+} D3D12_VIDEO_DECODE_ARGUMENT_TYPE;
+
+typedef enum D3D12_VIDEO_DECODE_SUPPORT_FLAGS
+{
+    D3D12_VIDEO_DECODE_SUPPORT_FLAG_NONE = 0x0,
+    D3D12_VIDEO_DECODE_SUPPORT_FLAG_SUPPORTED = 0x1,
+} D3D12_VIDEO_DECODE_SUPPORT_FLAGS;
+
+typedef enum D3D12_VIDEO_DECODE_CONFIGURATION_FLAGS
+{
+    D3D12_VIDEO_DECODE_CONFIGURATION_FLAG_NONE = 0x0,
+    D3D12_VIDEO_DECODE_CONFIGURATION_FLAG_HEIGHT_ALIGNMENT_MULTIPLE_32_REQUIRED = 0x1,
+    D3D12_VIDEO_DECODE_CONFIGURATION_FLAG_POST_PROCESSING_SUPPORTED = 0x2,
+    D3D12_VIDEO_DECODE_CONFIGURATION_FLAG_REFERENCE_ONLY_ALLOCATIONS_REQUIRED = 0x4,
+    D3D12_VIDEO_DECODE_CONFIGURATION_FLAG_ALLOW_RESOLUTION_CHANGE_ON_NON_KEY_FRAME = 0x8,
+} D3D12_VIDEO_DECODE_CONFIGURATION_FLAGS;
+
+typedef enum D3D12_VIDEO_DECODE_TIER
+{
+    D3D12_VIDEO_DECODE_TIER_NOT_SUPPORTED,
+    D3D12_VIDEO_DECODE_TIER_1,
+    D3D12_VIDEO_DECODE_TIER_2,
+    D3D12_VIDEO_DECODE_TIER_3,
+} D3D12_VIDEO_DECODE_TIER;
+
+
+interface ID3D12VideoDecoderHeap;
+
+
+typedef struct D3D12_VIDEO_DECODE_CONFIGURATION
+{
+    GUID DecodeProfile;
+    D3D12_BITSTREAM_ENCRYPTION_TYPE BitstreamEncryption;
+    D3D12_VIDEO_FRAME_CODED_INTERLACE_TYPE InterlaceType;
+} D3D12_VIDEO_DECODE_CONFIGURATION;
+
+typedef struct D3D12_VIDEO_DECODER_DESC
+{
+    UINT NodeMask;
+    D3D12_VIDEO_DECODE_CONFIGURATION Configuration;
+} D3D12_VIDEO_DECODER_DESC;
+
+typedef struct D3D12_VIDEO_DECODER_HEAP_DESC
+{
+    UINT NodeMask;
+    D3D12_VIDEO_DECODE_CONFIGURATION Configuration;
+    UINT DecodeWidth;
+    UINT DecodeHeight;
+    DXGI_FORMAT Format;
+    DXGI_RATIONAL FrameRate;
+    UINT BitRate;
+    UINT MaxDecodePictureBufferCount;
+} D3D12_VIDEO_DECODER_HEAP_DESC;
+
+typedef struct D3D12_VIDEO_PROCESS_OUTPUT_STREAM_DESC
+{
+    DXGI_FORMAT Format;
+    DXGI_COLOR_SPACE_TYPE ColorSpace;
+    D3D12_VIDEO_PROCESS_ALPHA_FILL_MODE AlphaFillMode;
+    UINT AlphaFillModeSourceStreamIndex;
+    FLOAT BackgroundColor[4];
+    DXGI_RATIONAL FrameRate;
+    BOOL EnableStereo;
+} D3D12_VIDEO_PROCESS_OUTPUT_STREAM_DESC;
+
+typedef struct D3D12_VIDEO_SIZE_RANGE
+{
+    UINT MaxWidth;
+    UINT MaxHeight;
+    UINT MinWidth;
+    UINT MinHeight;
+} D3D12_VIDEO_SIZE_RANGE;
+
+typedef struct D3D12_VIDEO_PROCESS_LUMA_KEY
+{
+    BOOL Enable;
+    FLOAT Lower;
+    FLOAT Upper;
+} D3D12_VIDEO_PROCESS_LUMA_KEY;
+
+typedef struct D3D12_VIDEO_PROCESS_INPUT_STREAM_DESC
+{
+    DXGI_FORMAT Format;
+    DXGI_COLOR_SPACE_TYPE ColorSpace;
+    DXGI_RATIONAL SourceAspectRatio;
+    DXGI_RATIONAL DestinationAspectRatio;
+    DXGI_RATIONAL FrameRate;
+    D3D12_VIDEO_SIZE_RANGE SourceSizeRange;
+    D3D12_VIDEO_SIZE_RANGE DestinationSizeRange;
+    BOOL EnableOrientation;
+    D3D12_VIDEO_PROCESS_FILTER_FLAGS FilterFlags;
+    D3D12_VIDEO_FRAME_STEREO_FORMAT StereoFormat;
+    D3D12_VIDEO_FIELD_TYPE FieldType;
+    D3D12_VIDEO_PROCESS_DEINTERLACE_FLAGS DeinterlaceMode;
+    BOOL EnableAlphaBlending;
+    D3D12_VIDEO_PROCESS_LUMA_KEY LumaKey;
+    UINT NumPastFrames;
+    UINT NumFutureFrames;
+    BOOL EnableAutoProcessing;
+} D3D12_VIDEO_PROCESS_INPUT_STREAM_DESC;
+
+typedef struct D3D12_FEATURE_DATA_VIDEO_DECODE_PROFILE_COUNT
+{
+    UINT NodeIndex;
+    UINT ProfileCount;
+} D3D12_FEATURE_DATA_VIDEO_DECODE_PROFILE_COUNT;
+
+typedef struct D3D12_FEATURE_DATA_VIDEO_DECODE_PROFILES
+{
+    UINT NodeIndex;
+    UINT ProfileCount;
+    GUID *pProfiles;
+} D3D12_FEATURE_DATA_VIDEO_DECODE_PROFILES;
+
+typedef struct D3D12_FEATURE_DATA_VIDEO_DECODE_FORMAT_COUNT
+{
+    UINT NodeIndex;
+    D3D12_VIDEO_DECODE_CONFIGURATION Configuration;
+    UINT FormatCount;
+} D3D12_FEATURE_DATA_VIDEO_DECODE_FORMAT_COUNT;
+
+typedef struct D3D12_FEATURE_DATA_VIDEO_DECODE_FORMATS
+{
+    UINT NodeIndex;
+    D3D12_VIDEO_DECODE_CONFIGURATION Configuration;
+    UINT FormatCount;
+    DXGI_FORMAT *pOutputFormats;
+} D3D12_FEATURE_DATA_VIDEO_DECODE_FORMATS;
+
+typedef struct D3D12_FEATURE_DATA_VIDEO_DECODE_SUPPORT
+{
+    UINT NodeIndex;
+    D3D12_VIDEO_DECODE_CONFIGURATION Configuration;
+    UINT Width;
+    UINT Height;
+    DXGI_FORMAT DecodeFormat;
+    DXGI_RATIONAL FrameRate;
+    UINT BitRate;
+    D3D12_VIDEO_DECODE_SUPPORT_FLAGS SupportFlags;
+    D3D12_VIDEO_DECODE_CONFIGURATION_FLAGS ConfigurationFlags;
+    D3D12_VIDEO_DECODE_TIER DecodeTier;
+} D3D12_FEATURE_DATA_VIDEO_DECODE_SUPPORT;
+
+typedef struct D3D12_VIDEO_DECODE_CONVERSION_ARGUMENTS
+{
+    BOOL Enable;
+    ID3D12Resource *pReferenceTexture2D;
+    UINT ReferenceSubresource;
+    DXGI_COLOR_SPACE_TYPE OutputColorSpace;
+    DXGI_COLOR_SPACE_TYPE DecodeColorSpace;
+} D3D12_VIDEO_DECODE_CONVERSION_ARGUMENTS;
+
+typedef struct D3D12_VIDEO_DECODE_OUTPUT_STREAM_ARGUMENTS
+{
+    ID3D12Resource *pOutputTexture2D;
+    UINT OutputSubresource;
+    D3D12_VIDEO_DECODE_CONVERSION_ARGUMENTS ConversionArguments;
+} D3D12_VIDEO_DECODE_OUTPUT_STREAM_ARGUMENTS;
+
+typedef struct D3D12_VIDEO_DECODE_FRAME_ARGUMENT
+{
+    D3D12_VIDEO_DECODE_ARGUMENT_TYPE Type;
+    UINT Size;
+    void *pData;
+} D3D12_VIDEO_DECODE_FRAME_ARGUMENT;
+
+typedef struct D3D12_VIDEO_DECODE_REFERENCE_FRAMES
+{
+    UINT NumTexture2Ds;
+    ID3D12Resource **ppTexture2Ds;
+    UINT *pSubresources;
+    ID3D12VideoDecoderHeap **ppHeaps;
+} D3D12_VIDEO_DECODE_REFERENCE_FRAMES;
+
+typedef struct D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
+{
+    ID3D12Resource *pBuffer;
+    UINT64         Offset;
+    UINT64         Size;
+} D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM;
+
+typedef struct D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS
+{
+    UINT NumFrameArguments;
+    D3D12_VIDEO_DECODE_FRAME_ARGUMENT FrameArguments[10];
+    D3D12_VIDEO_DECODE_REFERENCE_FRAMES ReferenceFrames;
+    D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM CompressedBitstream;
+    ID3D12VideoDecoderHeap *pHeap;
+} D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS;
+
+
+[
+    uuid(1F052807-0B46-4ACC-8A89-364F793718A4),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D12VideoDevice : IUnknown
+{
+    HRESULT CheckFeatureSupport(D3D12_FEATURE_VIDEO FeatureVideo,
+            void *pFeatureSupportData,
+            UINT FeatureSupportDataSize);
+
+    HRESULT CreateVideoDecoder(const D3D12_VIDEO_DECODER_DESC *pDesc,
+            REFIID riid,
+            void **ppVideoDecoder);
+
+    HRESULT CreateVideoDecoderHeap(const D3D12_VIDEO_DECODER_HEAP_DESC *pVideoDecoderHeapDesc,
+            REFIID riid,
+            void **ppVideoDecoderHeap);
+
+    HRESULT CreateVideoProcessor(UINT NodeMask,
+            const D3D12_VIDEO_PROCESS_OUTPUT_STREAM_DESC *pOutputStreamDesc,
+            UINT NumInputStreamDescs,
+            const D3D12_VIDEO_PROCESS_INPUT_STREAM_DESC *pInputStreamDescs,
+            REFIID riid,
+            void **ppVideoProcessor);
+}
+
+[
+    uuid(C59B6BDC-7720-4074-A136-17A156037470),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D12VideoDecoder : ID3D12Pageable
+{
+    D3D12_VIDEO_DECODER_DESC GetDesc();
+}
+
+[
+    uuid(0946B7C9-EBF6-4047-BB73-8683E27DBB1F),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D12VideoDecoderHeap : ID3D12Pageable
+{
+    D3D12_VIDEO_DECODER_HEAP_DESC GetDesc();
+}
+
+[
+    uuid(3B60536E-AD29-4E64-A269-F853837E5E53),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D12VideoDecodeCommandList : ID3D12CommandList
+{
+    HRESULT Close();
+
+    HRESULT Reset(ID3D12CommandAllocator *pAllocator);
+
+    void ClearState();
+
+    void ResourceBarrier(UINT NumBarriers, const D3D12_RESOURCE_BARRIER *pBarriers);
+
+    void DiscardResource(ID3D12Resource *pResource, const D3D12_DISCARD_REGION *pRegion);
+
+    void BeginQuery(ID3D12QueryHeap *pQueryHeap, D3D12_QUERY_TYPE Type, UINT Index);
+
+    void EndQuery(ID3D12QueryHeap *pQueryHeap, D3D12_QUERY_TYPE Type, UINT Index);
+
+    void ResolveQueryData(ID3D12QueryHeap *pQueryHeap, D3D12_QUERY_TYPE Type, UINT StartIndex,
+            UINT NumQueries, ID3D12Resource *pDestinationBuffer,
+            UINT64 AlignedDestinationBufferOffset);
+
+    void SetPredication(ID3D12Resource *pBuffer, UINT64 AlignedBufferOffset,
+            D3D12_PREDICATION_OP Operation);
+
+    void SetMarker(UINT Metadata, const void *pData, UINT Size);
+
+    void BeginEvent(UINT Metadata, const void *pData, UINT Size);
+
+    void EndEvent();
+
+    void DecodeFrame(ID3D12VideoDecoder *pDecoder,
+            const D3D12_VIDEO_DECODE_OUTPUT_STREAM_ARGUMENTS *pOutputArguments,
+            const D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS *pInputArguments);
+
+    void WriteBufferImmediate(UINT Count,
+            const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *pParams,
+            const D3D12_WRITEBUFFERIMMEDIATE_MODE *pModes);
+}
-- 
2.29.2




More information about the wine-devel mailing list