summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-09-20 22:18:15 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:30 +0100
commitea82bd4b7e4c4f23a40f8a35858d8b74950fc347 (patch)
treed1ff5b2aae66e1f95d36bc9393086a5eb10015f1 /src/video_core/texture_cache
parentTextureCache: Base fixes on rescaling. (diff)
downloadyuzu-ea82bd4b7e4c4f23a40f8a35858d8b74950fc347.tar.gz
yuzu-ea82bd4b7e4c4f23a40f8a35858d8b74950fc347.tar.xz
yuzu-ea82bd4b7e4c4f23a40f8a35858d8b74950fc347.zip
Texture Cache: Fix Rescaling on Multisample
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/image_info.cpp4
-rw-r--r--src/video_core/texture_cache/texture_cache.h17
2 files changed, 15 insertions, 6 deletions
diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp
index bdf306bf9..7fa8fd4fe 100644
--- a/src/video_core/texture_cache/image_info.cpp
+++ b/src/video_core/texture_cache/image_info.cpp
@@ -101,7 +101,7 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept {
101 // FIXME: Call this without passing *this 101 // FIXME: Call this without passing *this
102 layer_stride = CalculateLayerStride(*this); 102 layer_stride = CalculateLayerStride(*this);
103 maybe_unaligned_layer_stride = CalculateLayerSize(*this); 103 maybe_unaligned_layer_stride = CalculateLayerSize(*this);
104 rescaleable &= (block.depth == 0) && resources.levels == 1 && num_samples == 1; 104 rescaleable &= (block.depth == 0) && resources.levels == 1;
105 } 105 }
106} 106}
107 107
@@ -134,7 +134,7 @@ ImageInfo::ImageInfo(const Tegra::Engines::Maxwell3D::Regs& regs, size_t index)
134 type = ImageType::e3D; 134 type = ImageType::e3D;
135 size.depth = rt.depth; 135 size.depth = rt.depth;
136 } else { 136 } else {
137 rescaleable = block.depth == 0 && size.height > 256 && num_samples == 1; 137 rescaleable = block.depth == 0 && size.height > 256;
138 type = ImageType::e2D; 138 type = ImageType::e2D;
139 resources.layers = rt.depth; 139 resources.layers = rt.depth;
140 } 140 }
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index a543776fd..b60f840c1 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -476,17 +476,26 @@ void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
476 Image& dst_image = slot_images[dst_id]; 476 Image& dst_image = slot_images[dst_id];
477 Image& src_image = slot_images[src_id]; 477 Image& src_image = slot_images[src_id];
478 478
479 bool is_resolve = src_image.info.num_samples != 1 && dst_image.info.num_samples == 1;
480
479 bool is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled); 481 bool is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled);
480 bool is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled); 482 bool is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
481 483
482 if (is_src_rescaled != is_dst_rescaled) { 484 if (is_src_rescaled != is_dst_rescaled) {
483 if (ImageCanRescale(dst_image)) {
484 ScaleUp(dst_image);
485 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
486 }
487 if (ImageCanRescale(src_image)) { 485 if (ImageCanRescale(src_image)) {
488 ScaleUp(src_image); 486 ScaleUp(src_image);
489 is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled); 487 is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled);
488 if (is_resolve) {
489 dst_image.info.rescaleable = true;
490 for (const auto& alias : dst_image.aliased_images) {
491 Image& other_image = slot_images[alias.id];
492 other_image.info.rescaleable = true;
493 }
494 }
495 }
496 if (ImageCanRescale(dst_image)) {
497 ScaleUp(dst_image);
498 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
490 } 499 }
491 } 500 }
492 501