d3d12: HEVC Encode workaround for edge case in caps reporting not contemplated by upper layer interface

Workaround for https://github.com/intel/libva/issues/641

Example where VAConfigAttribValEncHEVCBlockSizes.max_transform_hierarchy_depth_intra/inter overflows

MinCbLog2SizeY = log2(8) = 3
CtbLog2SizeY = log2(64) = 6
MinTbLog2SizeY = log2(4) = 2
MaxTbLog2SizeY = log2(32) = 5

max_transform_hierarchy_depth_intra = (CtbLog2SizeY − MinTbLog2SizeY) = 4
max_transform_hierarchy_depth_inter = (CtbLog2SizeY − MinTbLog2SizeY) = 4

Reviewed-by: Giancarlo Devich <gdevich@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19119>
This commit is contained in:
Sil Vilerino 2022-10-14 08:22:52 -04:00 committed by Marge Bot
parent 3eed5931ed
commit be7e2e5525

View file

@ -386,19 +386,46 @@ d3d12_video_encoder_convert_hevc_codec_configuration(struct d3d12_video_encoder
if(FAILED(pD3D12Enc->m_spD3D12VideoDevice->CheckFeatureSupport(D3D12_FEATURE_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT, &capCodecConfigData, sizeof(capCodecConfigData))
|| !capCodecConfigData.IsSupported))
{
debug_printf("D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION arguments are not supported - "
"Call to CheckFeatureCaps (D3D12_FEATURE_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT, ...) returned failure "
"or not supported for Codec HEVC - MinLumaSize %d - MaxLumaSize %d - MinTransformSize %d - "
"MaxTransformSize %d - Depth_inter %d - Depth intra %d\n",
config.MinLumaCodingUnitSize,
config.MaxLumaCodingUnitSize,
config.MinLumaTransformUnitSize,
config.MaxLumaTransformUnitSize,
config.max_transform_hierarchy_depth_inter,
config.max_transform_hierarchy_depth_intra);
is_supported = false;
return config;
// Workaround for https://github.com/intel/libva/issues/641
if ( !capCodecConfigData.IsSupported
&& ((picture->seq.max_transform_hierarchy_depth_inter == 0)
|| (picture->seq.max_transform_hierarchy_depth_intra == 0)) )
{
// Try and see if the values where 4 and overflowed in the 2 bit fields
capCodecConfigData.CodecSupportLimits.pHEVCSupport->max_transform_hierarchy_depth_inter =
(picture->seq.max_transform_hierarchy_depth_inter == 0) ? 4 : picture->seq.max_transform_hierarchy_depth_inter;
capCodecConfigData.CodecSupportLimits.pHEVCSupport->max_transform_hierarchy_depth_intra =
(picture->seq.max_transform_hierarchy_depth_intra == 0) ? 4 : picture->seq.max_transform_hierarchy_depth_intra;
// Call the caps check again
if(SUCCEEDED(pD3D12Enc->m_spD3D12VideoDevice->CheckFeatureSupport(D3D12_FEATURE_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT, &capCodecConfigData, sizeof(capCodecConfigData))
&& capCodecConfigData.IsSupported))
{
// If this was the case, then update the config return variable with the overriden values too
is_supported = true;
config.max_transform_hierarchy_depth_inter =
capCodecConfigData.CodecSupportLimits.pHEVCSupport->max_transform_hierarchy_depth_inter;
config.max_transform_hierarchy_depth_intra =
capCodecConfigData.CodecSupportLimits.pHEVCSupport->max_transform_hierarchy_depth_intra;
}
}
if (!is_supported) {
debug_printf("D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION arguments are not supported - "
"Call to CheckFeatureCaps (D3D12_FEATURE_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT, ...) returned failure "
"or not supported for Codec HEVC - MinLumaSize %d - MaxLumaSize %d - MinTransformSize %d - "
"MaxTransformSize %d - Depth_inter %d - Depth intra %d\n",
config.MinLumaCodingUnitSize,
config.MaxLumaCodingUnitSize,
config.MinLumaTransformUnitSize,
config.MaxLumaTransformUnitSize,
config.max_transform_hierarchy_depth_inter,
config.max_transform_hierarchy_depth_intra);
return config;
}
}
if (picture->seq.amp_enabled_flag)