diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index d0f133ebd..1d842bcf7 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -269,6 +269,7 @@ std::pair BufferCache::ObtainTempBuffer(VAddr gpu_addr, u32 size) if (buffer_id) { Buffer& buffer = slot_buffers[buffer_id]; if (buffer.IsInBounds(gpu_addr, size)) { + SynchronizeBuffer(buffer, gpu_addr, size, false); return {&buffer, buffer.Offset(gpu_addr)}; } } @@ -552,8 +553,8 @@ void BufferCache::SynchronizeBuffer(Buffer& buffer, VAddr device_addr, u32 size, } bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, u32 size) { - static constexpr FindFlags find_flags = FindFlags::NoCreate | FindFlags::RelaxDim | - FindFlags::RelaxFmt | FindFlags::RelaxSize; + static constexpr FindFlags find_flags = + FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize; ImageInfo info{}; info.guest_address = device_addr; info.guest_size_bytes = size; @@ -562,6 +563,9 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, return false; } Image& image = texture_cache.GetImage(image_id); + if (image.info.guest_size_bytes > size) { + return false; + } boost::container::small_vector copies; u32 offset = buffer.Offset(image.cpu_addr); const u32 num_layers = image.info.resources.layers; diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index fa5e2dc16..9355308f9 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -40,20 +40,16 @@ TextureCache::~TextureCache() = default; void TextureCache::InvalidateMemory(VAddr address, size_t size) { std::scoped_lock lock{mutex}; ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) { - const size_t image_dist = - image.cpu_addr > address ? image.cpu_addr - address : address - image.cpu_addr; - if (image_dist < MaxInvalidateDist) { - // Ensure image is reuploaded when accessed again. - image.flags |= ImageFlagBits::CpuModified; - } + // Ensure image is reuploaded when accessed again. + image.flags |= ImageFlagBits::CpuModified; // Untrack image, so the range is unprotected and the guest can write freely. UntrackImage(image_id); }); } void TextureCache::MarkWritten(VAddr address, size_t max_size) { - static constexpr FindFlags find_flags = FindFlags::NoCreate | FindFlags::RelaxDim | - FindFlags::RelaxFmt | FindFlags::RelaxSize; + static constexpr FindFlags find_flags = + FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize; ImageInfo info{}; info.guest_address = address; info.guest_size_bytes = max_size; @@ -265,9 +261,6 @@ ImageView& TextureCache::RegisterImageView(ImageId image_id, const ImageViewInfo ImageView& TextureCache::FindTexture(const ImageInfo& info, const ImageViewInfo& view_info) { const ImageId image_id = FindImage(info); Image& image = slot_images[image_id]; - if (view_info.is_storage) { - image.flags |= ImageFlagBits::GpuModified; - } UpdateImage(image_id); auto& usage = image.info.usage; @@ -365,7 +358,6 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule if (False(image.flags & ImageFlagBits::CpuModified)) { return; } - // Mark image as validated. image.flags &= ~ImageFlagBits::CpuModified;