From 358fea01a6f0e754fa252ad557bbbb538bce5ad5 Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Sat, 15 Apr 2023 15:43:52 -0400 Subject: [PATCH] d3d12: Support QVBR rate control mode Reviewed-by: Jesse Natalie Part-of: --- src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp | 10 +++++++++ src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp | 10 +++++++++ src/gallium/drivers/d3d12/d3d12_video_screen.cpp | 24 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp index 2c70756..1783c37 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp @@ -52,6 +52,16 @@ d3d12_video_encoder_update_current_rate_control_h264(struct d3d12_video_encoder pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_VBR.PeakBitRate = picture->rate_ctrl[0].peak_bitrate; } break; + case PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE: + { + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Mode = D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_QVBR; + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_QVBR.TargetAvgBitRate = + picture->rate_ctrl[0].target_bitrate; + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_QVBR.PeakBitRate = + picture->rate_ctrl[0].peak_bitrate; + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_QVBR.ConstantQualityTarget = + picture->rate_ctrl[0].vbr_quality_factor; + } break; case PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP: case PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT: { diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp index ae0edc3..1949125 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp @@ -52,6 +52,16 @@ d3d12_video_encoder_update_current_rate_control_hevc(struct d3d12_video_encoder pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_VBR.PeakBitRate = picture->rc.peak_bitrate; } break; + case PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE: + { + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Mode = D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_QVBR; + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_QVBR.TargetAvgBitRate = + picture->rc.target_bitrate; + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_QVBR.PeakBitRate = + picture->rc.peak_bitrate; + pD3D12Enc->m_currentEncodeConfig.m_encoderRateControlDesc.m_Config.m_Configuration_QVBR.ConstantQualityTarget = + picture->rc.vbr_quality_factor; + } break; case PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP: case PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT: { diff --git a/src/gallium/drivers/d3d12/d3d12_video_screen.cpp b/src/gallium/drivers/d3d12/d3d12_video_screen.cpp index 068f7bf..eb192e0 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_screen.cpp @@ -1112,6 +1112,30 @@ d3d12_screen_get_video_param_encode(struct pipe_screen *pscreen, return true; case PIPE_VIDEO_CAP_SUPPORTS_CONTIGUOUS_PLANES_MAP: return true; + case PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR: + { + D3D12_FEATURE_DATA_VIDEO_ENCODER_RATE_CONTROL_MODE capRateControlModeData = + { + 0, + d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(profile), + D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_QVBR, + false + }; + + ComPtr spD3D12VideoDevice; + struct d3d12_screen *pD3D12Screen = (struct d3d12_screen *) pscreen; + if (FAILED(pD3D12Screen->dev->QueryInterface(IID_PPV_ARGS(spD3D12VideoDevice.GetAddressOf())))) { + // No video encode support in underlying d3d12 device (needs ID3D12VideoDevice3) + return 0; + } + + if (SUCCEEDED(spD3D12VideoDevice->CheckFeatureSupport(D3D12_FEATURE_VIDEO_ENCODER_RATE_CONTROL_MODE, &capRateControlModeData, sizeof(capRateControlModeData))) + && capRateControlModeData.IsSupported) + return 1; // Driver returns QVBR support OK + + // No QVBR support + return 0; + } break; default: debug_printf("[d3d12_screen_get_video_param] unknown video param: %d\n", param); return 0; -- 2.7.4