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:
@@ -208,7 +208,6 @@ d3d12_video_decoder_references_manager::d3d12_video_decoder_references_manager(
|
|||||||
d3d12_video_decode_profile_type DecodeProfileType,
|
d3d12_video_decode_profile_type DecodeProfileType,
|
||||||
d3d12_video_decode_dpb_descriptor m_dpbDescriptor)
|
d3d12_video_decode_dpb_descriptor m_dpbDescriptor)
|
||||||
: m_DecodeTargetToOriginalIndex7Bits({ }),
|
: m_DecodeTargetToOriginalIndex7Bits({ }),
|
||||||
m_CurrentIndex7BitsAvailable(0),
|
|
||||||
m_pD3D12Screen(pD3D12Screen),
|
m_pD3D12Screen(pD3D12Screen),
|
||||||
m_invalidIndex(GetInvalidReferenceIndex(DecodeProfileType)),
|
m_invalidIndex(GetInvalidReferenceIndex(DecodeProfileType)),
|
||||||
m_dpbDescriptor(m_dpbDescriptor),
|
m_dpbDescriptor(m_dpbDescriptor),
|
||||||
|
@@ -88,35 +88,32 @@ struct d3d12_video_decoder_references_manager
|
|||||||
|
|
||||||
void print_dpb();
|
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
|
/// Get the Index7Bits associated with this decode target
|
||||||
/// If there isn't one assigned yet, gives out a fresh/unused Index7Bits
|
/// If there isn't one assigned yet, gives out a fresh/unused Index7Bits
|
||||||
///
|
///
|
||||||
uint8_t get_index7bits(struct pipe_video_buffer * pDecodeTarget) {
|
uint8_t get_index7bits(struct pipe_video_buffer * pDecodeTarget) {
|
||||||
bool bDecodeTargetAlreadyHasIndex = (m_DecodeTargetToOriginalIndex7Bits.count(pDecodeTarget) > 0);
|
if(m_DecodeTargetToOriginalIndex7Bits.count(pDecodeTarget) == 0)
|
||||||
if(bDecodeTargetAlreadyHasIndex)
|
m_DecodeTargetToOriginalIndex7Bits[pDecodeTarget] = get_unused_index7bits();
|
||||||
{
|
return m_DecodeTargetToOriginalIndex7Bits[pDecodeTarget];
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -147,7 +144,6 @@ struct d3d12_video_decoder_references_manager
|
|||||||
std::vector<ReferenceData> m_referenceDXVAIndices;
|
std::vector<ReferenceData> m_referenceDXVAIndices;
|
||||||
|
|
||||||
std::map<struct pipe_video_buffer *, uint8_t> m_DecodeTargetToOriginalIndex7Bits = { };
|
std::map<struct pipe_video_buffer *, uint8_t> m_DecodeTargetToOriginalIndex7Bits = { };
|
||||||
uint8_t m_CurrentIndex7BitsAvailable = 0;
|
|
||||||
|
|
||||||
ComPtr<ID3D12Resource> m_pClearDecodedOutputTexture;
|
ComPtr<ID3D12Resource> m_pClearDecodedOutputTexture;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user