d3d12: Disable codecs according to meson video-codecs option

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26223>
This commit is contained in:
Sil Vilerino
2023-10-28 11:42:56 -04:00
committed by Marge Bot
parent 84c0448b36
commit cf8cbf0647
5 changed files with 304 additions and 92 deletions
+89 -27
View File
@@ -27,10 +27,18 @@
#include "d3d12_screen.h"
#include "d3d12_surface.h"
#include "d3d12_video_dec.h"
#if VIDEO_CODEC_H264DEC
#include "d3d12_video_dec_h264.h"
#endif
#if VIDEO_CODEC_H265DEC
#include "d3d12_video_dec_hevc.h"
#endif
#if VIDEO_CODEC_AV1DEC
#include "d3d12_video_dec_av1.h"
#endif
#if VIDEO_CODEC_VP9DEC
#include "d3d12_video_dec_vp9.h"
#endif
#include "d3d12_video_buffer.h"
#include "d3d12_residency.h"
@@ -348,30 +356,34 @@ d3d12_video_decoder_store_upper_layer_references(struct d3d12_video_decoder *pD3
{
pD3D12Dec->m_pCurrentDecodeTarget = target;
switch (pD3D12Dec->m_d3d12DecProfileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
{
pipe_h264_picture_desc *pPicControlH264 = (pipe_h264_picture_desc *) picture;
pD3D12Dec->m_pCurrentReferenceTargets = pPicControlH264->ref;
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
pipe_h265_picture_desc *pPicControlHevc = (pipe_h265_picture_desc *) picture;
pD3D12Dec->m_pCurrentReferenceTargets = pPicControlHevc->ref;
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
pipe_av1_picture_desc *pPicControlAV1 = (pipe_av1_picture_desc *) picture;
pD3D12Dec->m_pCurrentReferenceTargets = pPicControlAV1->ref;
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
pipe_vp9_picture_desc *pPicControlVP9 = (pipe_vp9_picture_desc *) picture;
pD3D12Dec->m_pCurrentReferenceTargets = pPicControlVP9->ref;
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
@@ -1061,38 +1073,41 @@ d3d12_video_decoder_prepare_for_decode_frame(struct d3d12_video_decoder *pD3D12D
// If decoded needs reference_only entries in the dpb, use the reference_only allocation for current frame
// otherwise, use the standard output resource
ID3D12Resource *pCurrentFrameDPBEntry = fReferenceOnly ? *ppRefOnlyOutTexture2D : *ppOutTexture2D;
uint32_t currentFrameDPBEntrySubresource = fReferenceOnly ? *pRefOnlyOutSubresourceIndex : *pOutSubresourceIndex;
[[maybe_unused]] ID3D12Resource *pCurrentFrameDPBEntry = fReferenceOnly ? *ppRefOnlyOutTexture2D : *ppOutTexture2D;
[[maybe_unused]] uint32_t currentFrameDPBEntrySubresource = fReferenceOnly ? *pRefOnlyOutSubresourceIndex : *pOutSubresourceIndex;
switch (pD3D12Dec->m_d3d12DecProfileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
{
d3d12_video_decoder_prepare_current_frame_references_h264(pD3D12Dec,
pCurrentFrameDPBEntry,
currentFrameDPBEntrySubresource);
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
d3d12_video_decoder_prepare_current_frame_references_hevc(pD3D12Dec,
pCurrentFrameDPBEntry,
currentFrameDPBEntrySubresource);
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
d3d12_video_decoder_prepare_current_frame_references_av1(pD3D12Dec,
pCurrentFrameDPBEntry,
currentFrameDPBEntrySubresource);
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
d3d12_video_decoder_prepare_current_frame_references_vp9(pD3D12Dec,
pCurrentFrameDPBEntry,
currentFrameDPBEntrySubresource);
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
@@ -1201,26 +1216,30 @@ void
d3d12_video_decoder_refresh_dpb_active_references(struct d3d12_video_decoder *pD3D12Dec)
{
switch (pD3D12Dec->m_d3d12DecProfileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
{
d3d12_video_decoder_refresh_dpb_active_references_h264(pD3D12Dec);
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
d3d12_video_decoder_refresh_dpb_active_references_hevc(pD3D12Dec);
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
d3d12_video_decoder_refresh_dpb_active_references_av1(pD3D12Dec);
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
d3d12_video_decoder_refresh_dpb_active_references_vp9(pD3D12Dec);
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
@@ -1238,26 +1257,30 @@ d3d12_video_decoder_get_frame_info(
isInterlaced = false;
switch (pD3D12Dec->m_d3d12DecProfileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
{
d3d12_video_decoder_get_frame_info_h264(pD3D12Dec, pWidth, pHeight, pMaxDPB, isInterlaced);
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
d3d12_video_decoder_get_frame_info_hevc(pD3D12Dec, pWidth, pHeight, pMaxDPB, isInterlaced);
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
d3d12_video_decoder_get_frame_info_av1(pD3D12Dec, pWidth, pHeight, pMaxDPB, isInterlaced);
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
d3d12_video_decoder_get_frame_info_vp9(pD3D12Dec, pWidth, pHeight, pMaxDPB, &isInterlaced);
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
@@ -1289,6 +1312,7 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input(
auto &inFlightResources = pD3D12Dec->m_inflightResourcesPool[d3d12_video_decoder_pool_current_index(pD3D12Dec)];
inFlightResources.qp_matrix_frame_argument_enabled = false;
switch (profileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
{
size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_H264);
@@ -1311,7 +1335,8 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input(
true; // We don't have a way of knowing from the pipe params so send always
d3d12_video_decoder_store_dxva_qmatrix_in_qmatrix_buffer(codec, &dxvaQmatrixH264, dxvaQMatrixBufferSize);
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_HEVC);
@@ -1331,6 +1356,8 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input(
inFlightResources.qp_matrix_frame_argument_enabled);
d3d12_video_decoder_store_dxva_qmatrix_in_qmatrix_buffer(codec, &dxvaQmatrixHEVC, dxvaQMatrixBufferSize);
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_AV1);
@@ -1343,6 +1370,8 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input(
d3d12_video_decoder_store_dxva_picparams_in_picparams_buffer(codec, &dxvaPicParamsAV1, dxvaPicParamsBufferSize);
inFlightResources.qp_matrix_frame_argument_enabled = false;
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_VP9);
@@ -1353,6 +1382,7 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input(
d3d12_video_decoder_store_dxva_picparams_in_picparams_buffer(codec, &dxvaPicParamsVP9, dxvaPicParamsBufferSize);
inFlightResources.qp_matrix_frame_argument_enabled = false;
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
@@ -1365,36 +1395,42 @@ d3d12_video_decoder_prepare_dxva_slices_control(
struct d3d12_video_decoder *pD3D12Dec, // input argument, current decoder
struct pipe_picture_desc *picture)
{
auto &inFlightResources = pD3D12Dec->m_inflightResourcesPool[d3d12_video_decoder_pool_current_index(pD3D12Dec)];
[[maybe_unused]] auto &inFlightResources = pD3D12Dec->m_inflightResourcesPool[d3d12_video_decoder_pool_current_index(pD3D12Dec)];
d3d12_video_decode_profile_type profileType =
d3d12_video_decoder_convert_pipe_video_profile_to_profile_type(pD3D12Dec->base.profile);
switch (profileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
{
d3d12_video_decoder_prepare_dxva_slices_control_h264(pD3D12Dec,
inFlightResources.m_SliceControlBuffer,
(struct pipe_h264_picture_desc *) picture);
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
d3d12_video_decoder_prepare_dxva_slices_control_hevc(pD3D12Dec,
inFlightResources.m_SliceControlBuffer,
(struct pipe_h265_picture_desc *) picture);
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
d3d12_video_decoder_prepare_dxva_slices_control_av1(pD3D12Dec,
inFlightResources.m_SliceControlBuffer,
(struct pipe_av1_picture_desc *) picture);
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
d3d12_video_decoder_prepare_dxva_slices_control_vp9(pD3D12Dec,
inFlightResources.m_SliceControlBuffer,
(struct pipe_vp9_picture_desc *) picture);
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
@@ -1436,12 +1472,30 @@ d3d12_video_decoder_supports_aot_dpb(D3D12_FEATURE_DATA_VIDEO_DECODE_SUPPORT dec
{
bool supportedProfile = false;
switch (profileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
case d3d12_video_decode_profile_type_hevc:
case d3d12_video_decode_profile_type_av1:
case d3d12_video_decode_profile_type_vp9:
{
supportedProfile = true;
break;
} break;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
supportedProfile = true;
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
{
supportedProfile = true;
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
supportedProfile = true;
} break;
#endif
default:
supportedProfile = false;
break;
@@ -1506,8 +1560,11 @@ GUID
d3d12_video_decoder_resolve_profile(d3d12_video_decode_profile_type profileType, DXGI_FORMAT decode_format)
{
switch (profileType) {
#if VIDEO_CODEC_H264DEC
case d3d12_video_decode_profile_type_h264:
return D3D12_VIDEO_DECODE_PROFILE_H264;
#endif
#if VIDEO_CODEC_H265DEC
case d3d12_video_decode_profile_type_hevc:
{
switch (decode_format) {
@@ -1521,9 +1578,13 @@ d3d12_video_decoder_resolve_profile(d3d12_video_decode_profile_type profileType,
} break;
}
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case d3d12_video_decode_profile_type_av1:
return D3D12_VIDEO_DECODE_PROFILE_AV1_PROFILE0;
break;
#endif
#if VIDEO_CODEC_VP9DEC
case d3d12_video_decode_profile_type_vp9:
{
switch (decode_format) {
@@ -1537,6 +1598,7 @@ d3d12_video_decoder_resolve_profile(d3d12_video_decode_profile_type profileType,
} break;
}
} break;
#endif
default:
{
unreachable("Unsupported d3d12_video_decode_profile_type");
+131 -17
View File
@@ -30,11 +30,17 @@
#include "d3d12_screen.h"
#include "d3d12_surface.h"
#include "d3d12_video_enc.h"
#if VIDEO_CODEC_H264ENC
#include "d3d12_video_enc_h264.h"
#endif
#if VIDEO_CODEC_H265ENC
#include "d3d12_video_enc_hevc.h"
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
#include "d3d12_video_enc_av1.h"
#endif
#endif
#include "d3d12_video_buffer.h"
#include "d3d12_video_texture_array_dpb_manager.h"
#include "d3d12_video_array_of_textures_dpb_manager.h"
@@ -53,6 +59,37 @@
#include <cmath>
D3D12_VIDEO_ENCODER_CODEC
d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(enum pipe_video_profile profile)
{
switch (u_reduce_video_profile(profile)) {
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
return D3D12_VIDEO_ENCODER_CODEC_H264;
} break;
case PIPE_VIDEO_FORMAT_HEVC:
{
return D3D12_VIDEO_ENCODER_CODEC_HEVC;
} break;
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
return D3D12_VIDEO_ENCODER_CODEC_AV1;
} break;
#endif
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_MPEG4:
case PIPE_VIDEO_FORMAT_VC1:
case PIPE_VIDEO_FORMAT_JPEG:
case PIPE_VIDEO_FORMAT_VP9:
case PIPE_VIDEO_FORMAT_UNKNOWN:
default:
{
unreachable("Unsupported pipe_video_profile");
} break;
}
}
uint64_t
d3d12_video_encoder_pool_current_index(struct d3d12_video_encoder *pD3D12Enc)
{
@@ -262,20 +299,25 @@ d3d12_video_encoder_update_picparams_tracking(struct d3d12_video_encoder *pD3D12
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
bool bUsedAsReference = false;
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
d3d12_video_encoder_update_current_frame_pic_params_info_h264(pD3D12Enc, srcTexture, picture, currentPicParams, bUsedAsReference);
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
d3d12_video_encoder_update_current_frame_pic_params_info_hevc(pD3D12Enc, srcTexture, picture, currentPicParams, bUsedAsReference);
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
d3d12_video_encoder_update_current_frame_pic_params_info_av1(pD3D12Enc, srcTexture, picture, currentPicParams, bUsedAsReference);
} break;
#endif
#endif
default:
{
@@ -496,6 +538,7 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder
pD3D12Enc->m_upBitstreamBuilder.reset();
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
bool gopHasPFrames =
@@ -513,7 +556,8 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder
pD3D12Enc->m_upBitstreamBuilder = std::make_unique<d3d12_video_bitstream_builder_h264>();
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
bool gopHasPFrames =
@@ -531,6 +575,8 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder
pD3D12Enc->m_upBitstreamBuilder = std::make_unique<d3d12_video_bitstream_builder_hevc>();
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -548,6 +594,7 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder
// We use packed headers and pist encode execution syntax for AV1
pD3D12Enc->m_upBitstreamBuilder = std::make_unique<d3d12_video_bitstream_builder_av1>();
} break;
#endif
#endif
default:
{
@@ -561,6 +608,7 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA subregionData = {};
@@ -572,7 +620,8 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder
}
return subregionData;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA subregionData = {};
@@ -584,6 +633,8 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder
}
return subregionData;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -596,6 +647,7 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder
}
return subregionData;
} break;
#endif
#endif
default:
{
@@ -609,6 +661,7 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA curPicParamsData = {};
@@ -616,7 +669,8 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode
curPicParamsData.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderPicParamsDesc.m_H264PicData);
return curPicParamsData;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA curPicParamsData = {};
@@ -624,6 +678,8 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode
curPicParamsData.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderPicParamsDesc.m_HEVCPicData);
return curPicParamsData;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -632,6 +688,7 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode
curPicParamsData.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderPicParamsDesc.m_AV1PicData);
return curPicParamsData;
} break;
#endif
#endif
default:
{
@@ -743,6 +800,7 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
D3D12_VIDEO_ENCODER_LEVEL_SETTING curLevelDesc = {};
@@ -750,7 +808,8 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc
curLevelDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderLevelDesc.m_H264LevelSetting);
return curLevelDesc;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
D3D12_VIDEO_ENCODER_LEVEL_SETTING curLevelDesc = {};
@@ -758,6 +817,8 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc
curLevelDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderLevelDesc.m_HEVCLevelSetting);
return curLevelDesc;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -766,6 +827,7 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc
curLevelDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderLevelDesc.m_AV1LevelSetting);
return curLevelDesc;
} break;
#endif
#endif
default:
{
@@ -781,25 +843,28 @@ d3d12_video_encoder_build_pre_encode_codec_headers(struct d3d12_video_encoder *p
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
postEncodeHeadersNeeded = false;
preEncodeGeneratedHeadersByteSize = d3d12_video_encoder_build_codec_headers_h264(pD3D12Enc);
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
postEncodeHeadersNeeded = false;
preEncodeGeneratedHeadersByteSize = d3d12_video_encoder_build_codec_headers_hevc(pD3D12Enc);
} break;
#endif
#if VIDEO_CODEC_AV1ENC
case PIPE_VIDEO_FORMAT_AV1:
{
pD3D12Enc->m_BitstreamHeadersBuffer.resize(0);
postEncodeHeadersNeeded = true;
preEncodeGeneratedHeadersByteSize = 0;
} break;
#endif
default:
{
unreachable("Unsupported pipe_video_format");
@@ -812,6 +877,7 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc)
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE curGOPDesc = {};
@@ -820,7 +886,8 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc)
curGOPDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_H264GroupOfPictures);
return curGOPDesc;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE curGOPDesc = {};
@@ -829,7 +896,8 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc)
curGOPDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_HEVCGroupOfPictures);
return curGOPDesc;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -839,6 +907,7 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc)
curGOPDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_AV1SequenceStructure);
return curGOPDesc;
} break;
#endif
#endif
default:
{
@@ -852,6 +921,7 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codecConfigDesc = {};
@@ -860,7 +930,8 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD
sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificConfigDesc.m_H264Config);
return codecConfigDesc;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codecConfigDesc = {};
@@ -869,7 +940,8 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD
sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificConfigDesc.m_HEVCConfig);
return codecConfigDesc;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -879,6 +951,7 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD
sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificConfigDesc.m_AV1Config);
return codecConfigDesc;
} break;
#endif
#endif
default:
{
@@ -892,19 +965,25 @@ d3d12_video_encoder_get_current_codec(struct d3d12_video_encoder *pD3D12Enc)
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
return D3D12_VIDEO_ENCODER_CODEC_H264;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
return D3D12_VIDEO_ENCODER_CODEC_HEVC;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
return D3D12_VIDEO_ENCODER_CODEC_AV1;
} break;
#endif
#endif
default:
{
@@ -1203,6 +1282,7 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
capEncoderSupportData1.SuggestedProfile.pH264Profile =
@@ -1214,7 +1294,8 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3
capEncoderSupportData1.SuggestedLevel.DataSize =
sizeof(pD3D12Enc->m_currentEncodeCapabilities.m_encoderLevelSuggestedDesc.m_H264LevelSetting);
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
capEncoderSupportData1.SuggestedProfile.pHEVCProfile =
@@ -1226,7 +1307,8 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3
capEncoderSupportData1.SuggestedLevel.DataSize =
sizeof(pD3D12Enc->m_currentEncodeCapabilities.m_encoderLevelSuggestedDesc.m_HEVCLevelSetting);
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -1239,6 +1321,7 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3
capEncoderSupportData1.SuggestedLevel.DataSize =
sizeof(pD3D12Enc->m_currentEncodeCapabilities.m_encoderLevelSuggestedDesc.m_AV1LevelSetting);
} break;
#endif
#endif
default:
{
@@ -1299,6 +1382,7 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
D3D12_VIDEO_ENCODER_PROFILE_DESC curProfDesc = {};
@@ -1306,7 +1390,8 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E
curProfDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderProfileDesc.m_H264Profile);
return curProfDesc;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
D3D12_VIDEO_ENCODER_PROFILE_DESC curProfDesc = {};
@@ -1314,6 +1399,8 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E
curProfDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderProfileDesc.m_HEVCProfile);
return curProfDesc;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -1322,6 +1409,7 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E
curProfDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderProfileDesc.m_AV1Profile);
return curProfDesc;
} break;
#endif
#endif
default:
{
@@ -1343,20 +1431,25 @@ d3d12_video_encoder_update_current_encoder_config_state(struct d3d12_video_encod
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
return d3d12_video_encoder_update_current_encoder_config_state_h264(pD3D12Enc, srcTexture, picture);
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
return d3d12_video_encoder_update_current_encoder_config_state_hevc(pD3D12Enc, srcTexture, picture);
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
return d3d12_video_encoder_update_current_encoder_config_state_av1(pD3D12Enc, srcTexture, picture);
} break;
#endif
#endif
default:
{
@@ -1648,15 +1741,22 @@ d3d12_video_encoder_calculate_metadata_resolved_buffer_size(enum pipe_video_form
(maxSliceNumber * sizeof(D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA));
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
size_t extra_av1_size = d3d12_video_encoder_calculate_metadata_resolved_buffer_size_av1(maxSliceNumber);
bufferSize += extra_av1_size;
} break;
#endif
#endif
default:
{
@@ -2191,11 +2291,19 @@ d3d12_video_encoder_build_post_encode_codec_bitstream(struct d3d12_video_encoder
{
enum pipe_video_format codec_format = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec_format) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
return 0;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
return 0;
} break; // Do not need post encode values in headers
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -2208,6 +2316,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream(struct d3d12_video_encoder
associatedMetadata
);
} break;
#endif
#endif
default:
unreachable("Unsupported pipe_video_format");
@@ -2316,20 +2425,25 @@ d3d12_video_encoder_store_current_picture_references(d3d12_video_encoder *pD3D12
{
enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile);
switch (codec) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
// Not needed (not post encode headers)
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
// Not needed (not post encode headers)
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
d3d12_video_encoder_store_current_picture_references_av1(pD3D12Enc, current_metadata_slot);
} break;
#endif
#endif
default:
{
@@ -994,37 +994,6 @@ d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_h264(enum pipe_video_pr
}
}
D3D12_VIDEO_ENCODER_CODEC
d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(enum pipe_video_profile profile)
{
switch (u_reduce_video_profile(profile)) {
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
return D3D12_VIDEO_ENCODER_CODEC_H264;
} break;
case PIPE_VIDEO_FORMAT_HEVC:
{
return D3D12_VIDEO_ENCODER_CODEC_HEVC;
} break;
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
return D3D12_VIDEO_ENCODER_CODEC_AV1;
} break;
#endif
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_MPEG4:
case PIPE_VIDEO_FORMAT_VC1:
case PIPE_VIDEO_FORMAT_JPEG:
case PIPE_VIDEO_FORMAT_VP9:
case PIPE_VIDEO_FORMAT_UNKNOWN:
default:
{
unreachable("Unsupported pipe_video_profile");
} break;
}
}
bool
d3d12_video_encoder_compare_slice_config_h264_hevc(
D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE targetMode,
@@ -149,20 +149,37 @@ d3d12_has_video_decode_support(struct pipe_screen *pscreen, enum pipe_video_prof
// Supported profiles below
bool supportsProfile = false;
switch (profile) {
#if VIDEO_CODEC_H264DEC
case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
{
supportsProfile = true;
} break;
#endif
#if VIDEO_CODEC_H265DEC
case PIPE_VIDEO_PROFILE_HEVC_MAIN:
case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
{
supportsProfile = true;
} break;
#endif
#if VIDEO_CODEC_AV1DEC
case PIPE_VIDEO_PROFILE_AV1_MAIN:
{
supportsProfile = true;
} break;
#endif
#if VIDEO_CODEC_VP9DEC
case PIPE_VIDEO_PROFILE_VP9_PROFILE0:
case PIPE_VIDEO_PROFILE_VP9_PROFILE2:
{
supportsProfile = true;
} break;
#endif
default:
supportsProfile = false;
}
@@ -804,6 +821,7 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT d3d12_codec_support = { };
bool supportsProfile = false;
switch (profile) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
@@ -877,6 +895,8 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
codecSupport);
}
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_PROFILE_HEVC_MAIN:
case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
{
@@ -1043,6 +1063,8 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
}
}
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_PROFILE_AV1_MAIN:
{
@@ -1300,7 +1322,8 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
}
}
} break;
#endif
#endif // #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
#endif // #if VIDEO_CODEC_AV1ENC
default:
supportsProfile = false;
}
@@ -1767,28 +1790,39 @@ is_d3d12_video_encode_format_supported(struct pipe_screen *screen,
pipe_format format,
enum pipe_video_profile profile)
{
#if VIDEO_CODEC_H264ENC
D3D12_VIDEO_ENCODER_PROFILE_H264 profH264 = {};
#endif
#if VIDEO_CODEC_H265ENC
D3D12_VIDEO_ENCODER_PROFILE_HEVC profHEVC = {};
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
D3D12_VIDEO_ENCODER_AV1_PROFILE profAV1 = {};
#endif
#endif
D3D12_FEATURE_DATA_VIDEO_ENCODER_INPUT_FORMAT capDataFmt = {};
capDataFmt.NodeIndex = 0;
capDataFmt.Codec = d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(profile);
capDataFmt.Format = d3d12_get_format(format);
switch (u_reduce_video_profile(profile)) {
#if VIDEO_CODEC_H264ENC
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
{
profH264 = d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_h264(profile);
capDataFmt.Profile.DataSize = sizeof(profH264);
capDataFmt.Profile.pH264Profile = &profH264;
} break;
#endif
#if VIDEO_CODEC_H265ENC
case PIPE_VIDEO_FORMAT_HEVC:
{
profHEVC = d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_hevc(profile);
capDataFmt.Profile.DataSize = sizeof(profHEVC);
capDataFmt.Profile.pHEVCProfile = &profHEVC;
} break;
#endif
#if VIDEO_CODEC_AV1ENC
#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712))
case PIPE_VIDEO_FORMAT_AV1:
{
@@ -1797,6 +1831,7 @@ is_d3d12_video_encode_format_supported(struct pipe_screen *screen,
capDataFmt.Profile.pAV1Profile = &profAV1;
} break;
#endif
#endif
default:
{
unreachable("Unsupported pipe_video_format");
+48 -16
View File
@@ -50,37 +50,69 @@ if with_gallium_d3d12_video
files_libd3d12 += [
'd3d12_video_dec.cpp',
'd3d12_video_dec_references_mgr.cpp',
'd3d12_video_dec_h264.cpp',
'd3d12_video_buffer.cpp',
'd3d12_video_enc.cpp',
'd3d12_video_enc_h264.cpp',
'd3d12_video_encoder_references_manager_h264.cpp',
'd3d12_video_encoder_nalu_writer_h264.cpp',
'd3d12_video_encoder_bitstream_builder_h264.cpp',
'd3d12_video_encoder_bitstream.cpp',
'd3d12_video_texture_array_dpb_manager.cpp',
'd3d12_video_array_of_textures_dpb_manager.cpp',
'd3d12_video_screen.cpp',
'd3d12_video_proc.cpp',
]
if _codecs.contains('h264dec')
files_libd3d12 += [
'd3d12_video_dec_h264.cpp',
]
endif
if _codecs.contains('h265dec')
files_libd3d12 += [
'd3d12_video_dec_hevc.cpp',
]
endif
if _codecs.contains('av1dec')
files_libd3d12 += [
'd3d12_video_dec_av1.cpp',
]
endif
if _codecs.contains('vp9dec')
files_libd3d12 += [
'd3d12_video_dec_vp9.cpp',
]
endif
if _codecs.contains('h264enc')
files_libd3d12 += [
'd3d12_video_enc_h264.cpp',
'd3d12_video_encoder_references_manager_h264.cpp',
'd3d12_video_encoder_nalu_writer_h264.cpp',
'd3d12_video_encoder_bitstream_builder_h264.cpp',
]
endif
if _codecs.contains('h265enc')
files_libd3d12 += [
'd3d12_video_enc_hevc.cpp',
'd3d12_video_encoder_bitstream_builder_hevc.cpp',
'd3d12_video_encoder_nalu_writer_hevc.cpp',
'd3d12_video_encoder_references_manager_hevc.cpp',
'd3d12_video_dec_av1.cpp',
'd3d12_video_dec_vp9.cpp',
]
if (dep_dxheaders.version().version_compare('>= 1.611.0') and dep_dxheaders.version().version_compare('< 1.700.0')) or dep_dxheaders.version().version_compare('>= 1.712.0')
files_libd3d12 += [
'd3d12_video_enc_av1.cpp',
'd3d12_video_encoder_references_manager_av1.cpp',
'd3d12_video_encoder_bitstream_builder_av1.cpp',
]
endif
endif
if _codecs.contains('av1enc')
if (dep_dxheaders.version().version_compare('>= 1.611.0') and dep_dxheaders.version().version_compare('< 1.700.0')) or dep_dxheaders.version().version_compare('>= 1.712.0')
files_libd3d12 += [
'd3d12_video_enc_av1.cpp',
'd3d12_video_encoder_references_manager_av1.cpp',
'd3d12_video_encoder_bitstream_builder_av1.cpp',
]
endif
endif
endif # with_gallium_d3d12_video
is_xbox = target_machine.system().startswith('Gaming.Xbox')
if host_machine.system() == 'windows'
if is_xbox