From 31c9874891dbbd01856df208169ceebc9a4c9aa1 Mon Sep 17 00:00:00 2001 From: Silvio Vilerino Date: Wed, 22 Oct 2025 00:51:45 -0400 Subject: [PATCH] d3d12: d3d12_video_encoder_references_manager_hevc remove double resize() and add reserve() to cached vectors Reviewed-by: Pohsiang (John) Hsu Part-of: --- ...d12_video_encoder_references_manager_hevc.cpp | 7 ++++++- ...d3d12_video_encoder_references_manager_hevc.h | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp index a7fcbbc2499..0fb849d4fd1 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp @@ -94,6 +94,7 @@ d3d12_video_encoder_friendly_frame_type_hevc(D3D12_VIDEO_ENCODER_FRAME_TYPE_HEVC } } +#ifdef MESA_DEBUG void d3d12_video_encoder_references_manager_hevc::print_l0_l1_lists() { @@ -169,7 +170,9 @@ d3d12_video_encoder_references_manager_hevc::print_l0_l1_lists() modificationOrderList1ContentsString.c_str()); } } +#endif // MESA_DEBUG +#ifdef MESA_DEBUG void d3d12_video_encoder_references_manager_hevc::print_dpb() { @@ -218,6 +221,7 @@ d3d12_video_encoder_references_manager_hevc::print_dpb() dpbContents.c_str()); } } +#endif // MESA_DEBUG static D3D12_VIDEO_ENCODER_FRAME_TYPE_HEVC d3d12_video_encoder_convert_frame_type_hevc(enum pipe_h2645_enc_picture_type picType) @@ -271,7 +275,6 @@ d3d12_video_encoder_references_manager_hevc::begin_frame(const D3D12_VIDEO_ENCOD m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.resize(hevcPic->dpb_size); m_CurrentFrameReferencesData.ReferenceTextures.pResources.resize(hevcPic->dpb_size); m_CurrentFrameReferencesData.ReferenceTextures.pSubresources.resize(hevcPic->dpb_size); - m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.resize(hevcPic->dpb_size); m_CurrentFrameReferencesData.ReconstructedPicTexture = { NULL, 0u }; for (uint8_t i = 0; i < hevcPic->dpb_size; i++) { // @@ -384,6 +387,8 @@ d3d12_video_encoder_references_manager_hevc::begin_frame(const D3D12_VIDEO_ENCOD } } +#ifdef MESA_DEBUG print_dpb(); print_l0_l1_lists(); +#endif } diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h index 04124c2bead..73fb4f6cfac 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h @@ -26,6 +26,7 @@ #include "d3d12_video_types.h" #include "d3d12_video_encoder_references_manager.h" +#include "pipe/p_video_state.h" class d3d12_video_encoder_references_manager_hevc : public d3d12_video_encoder_references_manager_interface { @@ -48,7 +49,16 @@ class d3d12_video_encoder_references_manager_hevc : public d3d12_video_encoder_r { } d3d12_video_encoder_references_manager_hevc(bool fArrayOfTextures) : m_fArrayOfTextures(fArrayOfTextures) - { } + { + // Reserve memory for typical HEVC encoder usage to avoid per-frame allocations + m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.reserve(PIPE_H265_MAX_DPB_SIZE); + m_CurrentFrameReferencesData.ReferenceTextures.pResources.reserve(PIPE_H265_MAX_DPB_SIZE); + m_CurrentFrameReferencesData.ReferenceTextures.pSubresources.reserve(PIPE_H265_MAX_DPB_SIZE); + m_CurrentFrameReferencesData.pList0ReferenceFrames.reserve(PIPE_H265_MAX_NUM_LIST_REF); + m_CurrentFrameReferencesData.pList1ReferenceFrames.reserve(PIPE_H265_MAX_NUM_LIST_REF); + m_CurrentFrameReferencesData.pList0RefPicModifications.reserve(PIPE_H265_MAX_NUM_LIST_REF); + m_CurrentFrameReferencesData.pList1RefPicModifications.reserve(PIPE_H265_MAX_NUM_LIST_REF); + } ~d3d12_video_encoder_references_manager_hevc() { } @@ -56,8 +66,10 @@ class d3d12_video_encoder_references_manager_hevc : public d3d12_video_encoder_r private: // Class helpers void update_fifo_dpb_push_front_cur_recon_pic(); +#ifdef MESA_DEBUG void print_dpb(); void print_l0_l1_lists(); +#endif // Class members struct d3d12_video_dpb @@ -80,7 +92,7 @@ class d3d12_video_encoder_references_manager_hevc : public d3d12_video_encoder_r current_frame_references_data m_CurrentFrameReferencesData; bool m_isCurrentFrameUsedAsReference = false; - D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_HEVC2 m_curFrameState = {}; + D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_HEVC2 m_curFrameState = {}; bool m_fArrayOfTextures = false; };