d3d12: Remove per frame allocation slice_sizes(picture->num_slice_descriptors)

Reviewed-by: Pohsiang (John) Hsu <pohhsu@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37982>
This commit is contained in:
Silvio Vilerino 2025-10-18 10:20:16 -04:00 committed by Pohsiang (John) Hsu
parent 53e07e78c7
commit ca2a1e470a
2 changed files with 5 additions and 4 deletions

View file

@ -606,6 +606,7 @@ struct d3d12_video_encoder
pipe_resource* m_SliceHeaderRepackBuffer = NULL;
std::vector<uint8_t> m_BitstreamHeadersBuffer;
std::vector<uint8_t> m_StagingHeadersBuffer;
std::vector<int> m_TempSliceSizesBuffer; // Temporary buffer to avoid per-frame allocations in slice configuration
std::vector<EncodedBitstreamResolvedMetadata> m_spEncodedFrameMetadata;
struct D3D12EncodeCapabilities m_currentEncodeCapabilities = {};

View file

@ -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<int> 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 =