From ca2a1e470ae95b50c1182270fb160327c4aad386 Mon Sep 17 00:00:00 2001 From: Silvio Vilerino Date: Sat, 18 Oct 2025 10:20:16 -0400 Subject: [PATCH] d3d12: Remove per frame allocation slice_sizes(picture->num_slice_descriptors) Reviewed-by: Pohsiang (John) Hsu Part-of: --- src/gallium/drivers/d3d12/d3d12_video_enc.h | 1 + src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc.h b/src/gallium/drivers/d3d12/d3d12_video_enc.h index e78efd630c4..c1726fbad7c 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc.h +++ b/src/gallium/drivers/d3d12/d3d12_video_enc.h @@ -606,6 +606,7 @@ struct d3d12_video_encoder pipe_resource* m_SliceHeaderRepackBuffer = NULL; std::vector m_BitstreamHeadersBuffer; std::vector m_StagingHeadersBuffer; + std::vector m_TempSliceSizesBuffer; // Temporary buffer to avoid per-frame allocations in slice configuration std::vector m_spEncodedFrameMetadata; struct D3D12EncodeCapabilities m_currentEncodeCapabilities = {}; diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp index ae4723c400e..fcb933162a4 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc_hevc.cpp @@ -644,11 +644,11 @@ d3d12_video_encoder_negotiate_current_hevc_slices_configuration(struct d3d12_vid if ((picture->slice_mode == PIPE_VIDEO_SLICE_MODE_BLOCKS) && (picture->num_slice_descriptors > 1)) { /* Some apps send all same size slices minus 1 slice in any position in the descriptors */ /* Lets validate that there are at most 2 different slice sizes in all the descriptors */ - std::vector slice_sizes(picture->num_slice_descriptors); + pD3D12Enc->m_TempSliceSizesBuffer.resize(picture->num_slice_descriptors); for (uint32_t i = 0; i < picture->num_slice_descriptors; i++) - slice_sizes[i] = picture->slices_descriptors[i].num_ctu_in_slice; - std::sort(slice_sizes.begin(), slice_sizes.end()); - bool bUniformSizeSlices = (std::unique(slice_sizes.begin(), slice_sizes.end()) - slice_sizes.begin()) <= 2; + pD3D12Enc->m_TempSliceSizesBuffer[i] = picture->slices_descriptors[i].num_ctu_in_slice; + std::sort(pD3D12Enc->m_TempSliceSizesBuffer.begin(), pD3D12Enc->m_TempSliceSizesBuffer.end()); + bool bUniformSizeSlices = (std::unique(pD3D12Enc->m_TempSliceSizesBuffer.begin(), pD3D12Enc->m_TempSliceSizesBuffer.end()) - pD3D12Enc->m_TempSliceSizesBuffer.begin()) <= 2; uint32_t subregion_block_pixel_size = pD3D12Enc->m_currentEncodeCapabilities.m_currentResolutionSupportCaps.SubregionBlockPixelsSize; uint32_t num_subregions_per_scanline =