From: Steve Lhomme Subject: [PATCH 2/2] include/d3d12: add interfaces to support D3D12 video decoding Message-Id: <20210226075033.3299-2-robux4@ycbcr.xyz> Date: Fri, 26 Feb 2021 08:50:33 +0100 In-Reply-To: <20210226075033.3299-1-robux4@ycbcr.xyz> References: <20210226075033.3299-1-robux4@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..14febdb6702 --- /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