diff --git a/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.cpp b/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.cpp index 97597261a28..38c331e5ecc 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.cpp @@ -208,7 +208,6 @@ d3d12_video_decoder_references_manager::d3d12_video_decoder_references_manager( d3d12_video_decode_profile_type DecodeProfileType, d3d12_video_decode_dpb_descriptor m_dpbDescriptor) : m_DecodeTargetToOriginalIndex7Bits({ }), - m_CurrentIndex7BitsAvailable(0), m_pD3D12Screen(pD3D12Screen), m_invalidIndex(GetInvalidReferenceIndex(DecodeProfileType)), m_dpbDescriptor(m_dpbDescriptor), diff --git a/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.h b/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.h index 491e37f8b09..8976c6ad0cd 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.h +++ b/src/gallium/drivers/d3d12/d3d12_video_dec_references_mgr.h @@ -88,35 +88,32 @@ struct d3d12_video_decoder_references_manager void print_dpb(); + uint8_t get_unused_index7bits() + { + for (uint32_t testIdx = 0; testIdx < 127; testIdx++) { + auto it = std::find_if(m_DecodeTargetToOriginalIndex7Bits.begin(), m_DecodeTargetToOriginalIndex7Bits.end(), + [&testIdx](const std::pair< struct pipe_video_buffer*, uint8_t > &p) { + return p.second == testIdx; + }); + + if (it == m_DecodeTargetToOriginalIndex7Bits.end()) + return testIdx; + } + debug_printf( + "[d3d12_video_decoder_references_manager] d3d12_video_decoder_references_manager - Decode - No available " + "fresh indices left.\n"); + assert(false); + return 0; + } + /// /// Get the Index7Bits associated with this decode target /// If there isn't one assigned yet, gives out a fresh/unused Index7Bits /// uint8_t get_index7bits(struct pipe_video_buffer * pDecodeTarget) { - bool bDecodeTargetAlreadyHasIndex = (m_DecodeTargetToOriginalIndex7Bits.count(pDecodeTarget) > 0); - if(bDecodeTargetAlreadyHasIndex) - { - return m_DecodeTargetToOriginalIndex7Bits[pDecodeTarget]; - } else { - uint8_t freshIdx = m_CurrentIndex7BitsAvailable; - - // Make sure next "available" index is not already used. Should be cleaned up and there shouldn't be never 127 in flight used indices - #if DEBUG - auto it = std::find_if(m_DecodeTargetToOriginalIndex7Bits.begin(), m_DecodeTargetToOriginalIndex7Bits.end(), - [&freshIdx](const std::pair< struct pipe_video_buffer*, uint8_t > &p) { - return p.second == freshIdx; - }); - - assert(it == m_DecodeTargetToOriginalIndex7Bits.end()); - #endif - - // Point to next circular index for next call - m_CurrentIndex7BitsAvailable = ((m_CurrentIndex7BitsAvailable + 1) % 127); - - // Assign freshIdx to pDecodeTarget - m_DecodeTargetToOriginalIndex7Bits[pDecodeTarget] = freshIdx; - return freshIdx; - } + if(m_DecodeTargetToOriginalIndex7Bits.count(pDecodeTarget) == 0) + m_DecodeTargetToOriginalIndex7Bits[pDecodeTarget] = get_unused_index7bits(); + return m_DecodeTargetToOriginalIndex7Bits[pDecodeTarget]; } private: @@ -147,7 +144,6 @@ struct d3d12_video_decoder_references_manager std::vector m_referenceDXVAIndices; std::map m_DecodeTargetToOriginalIndex7Bits = { }; - uint8_t m_CurrentIndex7BitsAvailable = 0; ComPtr m_pClearDecodedOutputTexture;