summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ameerj2021-10-11 23:55:53 -0400
committerGravatar Fernando Sahmkow2021-11-16 22:11:30 +0100
commitb14f2c7c826b8bbea02c1f2674ab024a5ae0695e (patch)
tree31003de06fb599ba66ff2df462ca949319ede11a /src
parentyuzu_cmd: Read resolution_setup and scaling_filter from config (diff)
downloadyuzu-b14f2c7c826b8bbea02c1f2674ab024a5ae0695e.tar.gz
yuzu-b14f2c7c826b8bbea02c1f2674ab024a5ae0695e.tar.xz
yuzu-b14f2c7c826b8bbea02c1f2674ab024a5ae0695e.zip
texture_cache: Fix image resolves when src/dst are not both scaled
Diffstat (limited to 'src')
-rw-r--r--src/video_core/texture_cache/texture_cache.h13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index de522cc43..38895c2e9 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -475,12 +475,10 @@ void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
475 475
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
479 bool is_resolve = src_image.info.num_samples != 1 && dst_image.info.num_samples == 1;
480
481 bool is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled); 478 bool is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled);
482 bool is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled); 479 bool is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
483 480
481 const bool is_resolve = src_image.info.num_samples != 1 && dst_image.info.num_samples == 1;
484 if (is_src_rescaled != is_dst_rescaled) { 482 if (is_src_rescaled != is_dst_rescaled) {
485 if (ImageCanRescale(src_image)) { 483 if (ImageCanRescale(src_image)) {
486 ScaleUp(src_image); 484 ScaleUp(src_image);
@@ -498,7 +496,13 @@ void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
498 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled); 496 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
499 } 497 }
500 } 498 }
501 499 if (is_resolve && (is_src_rescaled != is_dst_rescaled)) {
500 // A resolve requires both images to be the same dimensions. Resize down if needed.
501 ScaleDown(src_image);
502 ScaleDown(dst_image);
503 is_src_rescaled = True(src_image.flags & ImageFlagBits::Rescaled);
504 is_dst_rescaled = True(dst_image.flags & ImageFlagBits::Rescaled);
505 }
502 const auto& resolution = Settings::values.resolution_info; 506 const auto& resolution = Settings::values.resolution_info;
503 const auto scale_up = [&](u32 value) -> u32 { 507 const auto scale_up = [&](u32 value) -> u32 {
504 if (value == 0) { 508 if (value == 0) {
@@ -506,7 +510,6 @@ void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
506 } 510 }
507 return std::max<u32>((value * resolution.up_scale) >> resolution.down_shift, 1U); 511 return std::max<u32>((value * resolution.up_scale) >> resolution.down_shift, 1U);
508 }; 512 };
509
510 const auto scale_region = [&](Region2D& region) { 513 const auto scale_region = [&](Region2D& region) {
511 region.start.x = scale_up(region.start.x); 514 region.start.x = scale_up(region.start.x);
512 region.start.y = scale_up(region.start.y); 515 region.start.y = scale_up(region.start.y);