aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache/texture_cache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/texture_cache/texture_cache.h')
-rw-r--r--src/video_core/texture_cache/texture_cache.h34
1 files changed, 27 insertions, 7 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 98a5e053a7..bcc40afde0 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -134,7 +134,7 @@ void TextureCache<P>::RunGarbageCollector() {
if (True(image.flags & ImageFlagBits::IsDecoding)) {
return false;
}
- const bool must_download = image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap);
+ const bool must_download = IsDownloadable(image) && False(image.flags & ImageFlagBits::BadOverlap);
if ((!aggressive_mode && True(image.flags & ImageFlagBits::CostlyLoad)) || (!high_priority_mode && must_download)) {
return false;
}
@@ -577,6 +577,7 @@ FramebufferId TextureCache<P>::GetFramebufferId(const RenderTargets& key) {
return id ? &slot_image_views[id] : nullptr;
});
ImageView* const depth_buffer = key.depth_buffer_id ? &slot_image_views[key.depth_buffer_id] : nullptr;
+ runtime.FlushDeferredClear();
framebuffer_id = slot_framebuffers.insert(runtime, color_buffers, depth_buffer, key);
return framebuffer_id;
}
@@ -595,10 +596,25 @@ void TextureCache<P>::WriteMemory(DAddr cpu_addr, size_t size) {
}
template <class P>
+bool TextureCache<P>::IsDownloadable(const ImageBase& image) const noexcept {
+ if (!image.IsSafeGpuCopy()) {
+ return false;
+ }
+ if (image.info.num_samples == 1) {
+ return true;
+ }
+ if constexpr (P::HAS_MSAA_DOWNLOADS) {
+ return runtime.CanDownloadMsaa(image.info);
+ } else {
+ return false;
+ }
+}
+
+template <class P>
void TextureCache<P>::DownloadMemory(DAddr cpu_addr, size_t size) {
boost::container::small_vector<ImageId, 16> images;
- ForEachImageInRegion(cpu_addr, size, [&images](ImageId image_id, ImageBase& image) {
- if (!image.IsSafeDownload()) {
+ ForEachImageInRegion(cpu_addr, size, [this, &images](ImageId image_id, ImageBase& image) {
+ if (!IsDownloadable(image)) {
return;
}
image.flags &= ~ImageFlagBits::GpuModified;
@@ -1476,12 +1492,12 @@ template <class P>
bool TextureCache<P>::ScaleUp(Image& image) {
const bool has_copy = image.HasScaled();
const bool rescaled = image.ScaleUp();
+ if (!has_copy && image.HasScaled()) {
+ total_used_memory += GetScaledImageSizeBytes(image);
+ }
if (!rescaled) {
return false;
}
- if (!has_copy) {
- total_used_memory += GetScaledImageSizeBytes(image);
- }
InvalidateScale(image);
return true;
}
@@ -1691,7 +1707,10 @@ ImageId TextureCache<P>::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, DA
for (const auto& copy_object : join_copies_to_do) {
Image& overlap = slot_images[copy_object.id];
if (copy_object.is_alias) {
- if (!overlap.IsSafeDownload()) {
+ if (!overlap.IsSafeGpuCopy()) {
+ continue;
+ }
+ if (overlap.info.num_samples != new_image.info.num_samples) {
continue;
}
const auto alias_pointer = join_alias_indices.find(copy_object.id);
@@ -2461,6 +2480,7 @@ void TextureCache<P>::RemoveImageViewReferences(std::span<const ImageViewId> rem
template <class P>
void TextureCache<P>::RemoveFramebuffers(std::span<const ImageViewId> removed_views) {
+ runtime.FlushDeferredClear();
auto it = framebuffers.begin();
while (it != framebuffers.end()) {
if (it->first.Contains(removed_views)) {