diff options
| author | 2021-10-11 23:55:53 -0400 | |
|---|---|---|
| committer | 2021-11-16 22:11:30 +0100 | |
| commit | b14f2c7c826b8bbea02c1f2674ab024a5ae0695e (patch) | |
| tree | 31003de06fb599ba66ff2df462ca949319ede11a /src | |
| parent | yuzu_cmd: Read resolution_setup and scaling_filter from config (diff) | |
| download | yuzu-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.h | 13 |
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); |