diff options
| author | 2021-09-20 22:18:15 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:30 +0100 | |
| commit | ea82bd4b7e4c4f23a40f8a35858d8b74950fc347 (patch) | |
| tree | d1ff5b2aae66e1f95d36bc9393086a5eb10015f1 /src/video_core/texture_cache | |
| parent | TextureCache: Base fixes on rescaling. (diff) | |
| download | yuzu-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.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 17 |
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 | ||