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:
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user