From 4bc5469f52157cd18e697120df40e40e32365e89 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sun, 23 Apr 2023 21:37:13 +0200 Subject: Texture Cache: Release stagging buffers on tick frame --- src/video_core/texture_cache/texture_cache.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'src/video_core/texture_cache/texture_cache.h') diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 543ceb5aa..e601f8446 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -139,6 +139,13 @@ void TextureCache

::TickFrame() { runtime.TickFrame(); critical_gc = 0; ++frame_tick; + + if constexpr (IMPLEMENTS_ASYNC_DOWNLOADS) { + for (auto& buffer : async_buffers_death_ring) { + runtime.FreeDeferredStagingBuffer(buffer); + } + async_buffers_death_ring.clear(); + } } template @@ -688,10 +695,10 @@ void TextureCache

::CommitAsyncFlushes() { } uncommitted_async_buffers.emplace_back(download_map); } + async_buffers.emplace_back(std::move(uncommitted_async_buffers)); + uncommitted_async_buffers.clear(); } committed_downloads.emplace_back(std::move(uncommitted_downloads)); - async_buffers.emplace_back(std::move(uncommitted_async_buffers)); - uncommitted_async_buffers.clear(); uncommitted_downloads.clear(); } @@ -729,7 +736,7 @@ void TextureCache

::PopAsyncFlushes() { } } for (auto& download_buffer : download_map) { - runtime.FreeDeferredStagingBuffer(download_buffer); + async_buffers_death_ring.emplace_back(download_buffer); } committed_downloads.pop_front(); async_buffers.pop_front(); @@ -748,7 +755,7 @@ void TextureCache

::PopAsyncFlushes() { auto download_map = runtime.DownloadStagingBuffer(total_size_bytes); const size_t original_offset = download_map.offset; for (const PendingDownload& download_info : download_ids) { - if (download_info.is_swizzle) { + if (!download_info.is_swizzle) { continue; } Image& image = slot_images[download_info.object_id]; @@ -761,7 +768,7 @@ void TextureCache

::PopAsyncFlushes() { download_map.offset = original_offset; std::span download_span = download_map.mapped_span; for (const PendingDownload& download_info : download_ids) { - if (download_info.is_swizzle) { + if (!download_info.is_swizzle) { continue; } const ImageBase& image = slot_images[download_info.object_id]; @@ -887,10 +894,7 @@ void TextureCache

::DownloadImageIntoBuffer(typename TextureCache

::Image* i }; image->DownloadMemory(buffers, buffer_offsets, copies); } else { - std::array buffers{ - buffer, - }; - image->DownloadMemory(buffers, buffer_offset, copies); + image->DownloadMemory(buffer, buffer_offset, copies); } } -- cgit v1.2.3