d3d12: Relax slice caps requirements for video encode

The check in d3d12_has_video_encode_support was returning no encode support unless
the driver supported D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME
when it should also return support when the driver reports only full frame support
(ie. D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_FULL_FRAME)

Reviewed-by: Giancarlo Devich <gdevich@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18763>
This commit is contained in:
Sil Vilerino 2022-09-22 07:58:48 -04:00 committed by Marge Bot
parent f8b4d40a1e
commit dc523fabef
2 changed files with 17 additions and 14 deletions

View file

@ -265,6 +265,9 @@ d3d12_video_encoder_negotiate_current_h264_slices_configuration(struct d3d12_vid
"enable the OS environment variable D3D12_VIDEO_ENC_FALLBACK_SLICE_CONFIG");
return false;
}
} else {
debug_printf("[d3d12_video_encoder_h264] Requested slice control mode is full frame. m_SlicesPartition_H264.NumberOfSlicesPerFrame = %d - m_encoderSliceConfigMode = %d \n",
requestedSlicesConfig.NumberOfSlicesPerFrame, requestedSlicesMode);
}
if (!d3d12_video_encoder_compare_slice_config_h264_hevc(

View file

@ -586,7 +586,6 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
{
supportsProfile = true;
D3D12_VIDEO_ENCODER_PROFILE_DESC profDesc = {};
D3D12_VIDEO_ENCODER_PROFILE_H264 profH264 =
d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_h264(profile);
@ -609,18 +608,10 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
uint32_t constraintset3flag = false;
d3d12_video_encoder_convert_from_d3d12_level_h264(maxLvlSettingH264, maxLvlSpec, constraintset3flag);
supportsProfile = true;
}
if (supportsProfile) {
DXGI_FORMAT encodeFormat = d3d12_convert_pipe_video_profile_to_dxgi_format(profile);
supportsProfile = supportsProfile &&
d3d12_video_encode_max_supported_resolution(codecDesc, maxRes, spD3D12VideoDevice.Get());
supportsProfile = supportsProfile && d3d12_video_encode_max_supported_slices(codecDesc,
maxRes,
encodeFormat,
maxSlices,
spD3D12VideoDevice.Get(),
d3d12_codec_support);
D3D12_VIDEO_ENCODER_PROFILE_DESC profile;
profile.pH264Profile = &profH264;
@ -632,6 +623,15 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
profile,
level,
spD3D12VideoDevice.Get());
if (supportedSliceStructures == PIPE_VIDEO_CAP_SLICE_STRUCTURE_NONE)
maxSlices = 0;
else
supportsProfile = supportsProfile && d3d12_video_encode_max_supported_slices(codecDesc,
maxRes,
encodeFormat,
maxSlices,
spD3D12VideoDevice.Get(),
d3d12_codec_support);
maxReferencesPerFrame =
d3d12_video_encode_supported_references_per_frame_structures(codecDesc,
profile,
@ -641,7 +641,6 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
case PIPE_VIDEO_PROFILE_HEVC_MAIN:
case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
{
supportsProfile = true;
D3D12_VIDEO_ENCODER_PROFILE_DESC profDesc = {};
D3D12_VIDEO_ENCODER_PROFILE_HEVC profHEVC =
d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_hevc(profile);
@ -663,9 +662,6 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
spD3D12VideoDevice.Get())) {
d3d12_video_encoder_convert_from_d3d12_level_hevc(maxLvlSettingHEVC.Level, maxLvlSpec);
supportsProfile = true;
}
if (supportsProfile) {
D3D12_VIDEO_ENCODER_PROFILE_DESC d3d12_profile;
d3d12_profile.pHEVCProfile = &profHEVC;
@ -779,7 +775,11 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen,
DXGI_FORMAT encodeFormat = d3d12_convert_pipe_video_profile_to_dxgi_format(profile);
supportsProfile = supportsProfile &&
d3d12_video_encode_max_supported_resolution(codecDesc, maxRes, spD3D12VideoDevice.Get());
supportsProfile = supportsProfile && d3d12_video_encode_max_supported_slices(codecDesc,
if (supportedSliceStructures == PIPE_VIDEO_CAP_SLICE_STRUCTURE_NONE)
maxSlices = 0;
else
supportsProfile = supportsProfile && d3d12_video_encode_max_supported_slices(codecDesc,
maxRes,
encodeFormat,
maxSlices,