From 88fde9c5038cd55df80ef8c21cb99ed8eb91ffe8 Mon Sep 17 00:00:00 2001 From: DH Date: Wed, 9 Oct 2024 14:01:42 +0300 Subject: [PATCH] rpcsx-gpu: cache: do not flush compatible images --- rpcsx-gpu/Cache.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/rpcsx-gpu/Cache.cpp b/rpcsx-gpu/Cache.cpp index cfa9c91f6..aca8be901 100644 --- a/rpcsx-gpu/Cache.cpp +++ b/rpcsx-gpu/Cache.cpp @@ -1492,6 +1492,16 @@ Cache::IndexBuffer Cache::Tag::getIndexBuffer(std::uint64_t address, }; } +static bool isImageCompatible(CachedImage *cached, const ImageKey &key) { + // FIXME: relax it + return cached->image.getFormat() == gnm::toVkFormat(key.dfmt, key.nfmt) && + cached->image.getWidth() == key.extent.width && + cached->image.getHeight() == key.extent.height && + cached->image.getDepth() == key.extent.depth && + cached->pitch == key.pitch && + cached->tileMode.raw == key.tileMode.raw && cached->kind == key.kind; +} + Cache::Image Cache::Tag::getImage(const ImageKey &key, Access access) { auto surfaceInfo = computeSurfaceInfo( key.tileMode, key.type, key.dfmt, key.extent.width, key.extent.height, @@ -1514,10 +1524,25 @@ Cache::Image Cache::Tag::getImage(const ImageKey &key, Access access) { break; } - static_cast(it->get())->flush(*this, getScheduler(), - it.range()); + auto img = static_cast(it->get()); + + if (storeRange == it.range()) { + if (isImageCompatible(img, key)) { + break; + } + + img->flush(*this, getScheduler(), it.range()); + getScheduler().wait(); + it.get() = nullptr; + break; + } + + img->flush(*this, getScheduler(), it.range()); } + getScheduler().submit(); + getScheduler().wait(); + auto it = table.map(storeRange.beginAddress(), storeRange.endAddress(), nullptr, false, true); @@ -1719,6 +1744,8 @@ void Cache::Tag::release() { auto resource = std::move(mStorage->mAcquiredImageResources.back()); mStorage->mAcquiredImageResources.pop_back(); resource->release(this); + mScheduler->submit(); + mScheduler->wait(); tmpResources.push_back(std::move(resource)); } @@ -1726,6 +1753,8 @@ void Cache::Tag::release() { auto resource = std::move(mStorage->mAcquiredMemoryResources.back()); mStorage->mAcquiredMemoryResources.pop_back(); resource->release(this); + mScheduler->submit(); + mScheduler->wait(); tmpResources.push_back(std::move(resource)); }