d3d12: Fix get_index7bits - Reuse previously freed indices

Some apps do not always reuse resources contiguously and we need to search for a previous free index/slot

Reviewed-by: Giancarlo Devich <gdevich@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18944>
This commit is contained in:
Sil Vilerino
2022-10-03 11:42:54 -04:00
committed by Marge Bot
parent c8e8ce8359
commit ea6e69bb2b
2 changed files with 21 additions and 26 deletions

View File

@@ -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),

View File

@@ -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<ReferenceData> m_referenceDXVAIndices;
std::map<struct pipe_video_buffer *, uint8_t> m_DecodeTargetToOriginalIndex7Bits = { };
uint8_t m_CurrentIndex7BitsAvailable = 0;
ComPtr<ID3D12Resource> m_pClearDecodedOutputTexture;