From be7e2e5525b89fbd532b5fa7ef36bbd72b72956e Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Fri, 14 Oct 2022 08:22:52 -0400 Subject: [PATCH] d3d12: HEVC Encode workaround for edge case in caps reporting not contemplated by upper layer interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Part-of: --- .../drivers/d3d12/d3d12_video_enc_hevc.cpp | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp index fb713fc40ed..50f21a72623 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp @@ -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)