diff options
| author | 2021-10-20 18:27:25 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | d37d10e7a7b9037a259b27923716e5ce3084d6c3 (patch) | |
| tree | 52ee8db37b4eefed3bd24e36bfe7ca7319fc51f5 /src/video_core/renderer_vulkan | |
| parent | Presentation: Fix turning FSR on and off in settings (diff) | |
| download | yuzu-d37d10e7a7b9037a259b27923716e5ce3084d6c3.tar.gz yuzu-d37d10e7a7b9037a259b27923716e5ce3084d6c3.tar.xz yuzu-d37d10e7a7b9037a259b27923716e5ce3084d6c3.zip | |
TextureCache: fix rescaling in aliases and overlap joins.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 5ca67c413..fd334a146 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -63,7 +63,7 @@ VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t in | |||
| 63 | const auto conv = [scale](float value) { | 63 | const auto conv = [scale](float value) { |
| 64 | float new_value = value * scale; | 64 | float new_value = value * scale; |
| 65 | if (scale < 1.0f) { | 65 | if (scale < 1.0f) { |
| 66 | bool sign = std::signbit(new_value); | 66 | const bool sign = std::signbit(value); |
| 67 | new_value = std::round(std::abs(new_value)); | 67 | new_value = std::round(std::abs(new_value)); |
| 68 | new_value = sign ? -new_value : new_value; | 68 | new_value = sign ? -new_value : new_value; |
| 69 | } | 69 | } |
| @@ -96,21 +96,22 @@ VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t in | |||
| 96 | VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) { | 96 | VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) { |
| 97 | const auto& src = regs.scissor_test[index]; | 97 | const auto& src = regs.scissor_test[index]; |
| 98 | VkRect2D scissor; | 98 | VkRect2D scissor; |
| 99 | const auto scale_up = [&](u32 value) -> u32 { | 99 | const auto scale_up = [&](s32 value) -> s32 { |
| 100 | if (value == 0) { | 100 | if (value == 0) { |
| 101 | return 0U; | 101 | return 0U; |
| 102 | } | 102 | } |
| 103 | const u32 upset = value * up_scale; | 103 | const s32 upset = value * up_scale; |
| 104 | u32 acumm = 0; | 104 | s32 acumm = 0; |
| 105 | if ((up_scale >> down_shift) == 0) { | 105 | if ((up_scale >> down_shift) == 0) { |
| 106 | acumm = upset & 0x1; | 106 | acumm = upset % 2; |
| 107 | } | 107 | } |
| 108 | const u32 converted_value = (value * up_scale) >> down_shift; | 108 | const s32 converted_value = (value * up_scale) >> down_shift; |
| 109 | return std::max<u32>(converted_value + acumm, 1U); | 109 | return value < 0 ? std::min<s32>(converted_value - acumm, -1) |
| 110 | : std::max<s32>(converted_value + acumm, 1); | ||
| 110 | }; | 111 | }; |
| 111 | if (src.enable) { | 112 | if (src.enable) { |
| 112 | scissor.offset.x = static_cast<s32>(scale_up(src.min_x)); | 113 | scissor.offset.x = scale_up(static_cast<s32>(src.min_x)); |
| 113 | scissor.offset.y = static_cast<s32>(scale_up(src.min_y)); | 114 | scissor.offset.y = scale_up(static_cast<s32>(src.min_y)); |
| 114 | scissor.extent.width = scale_up(src.max_x - src.min_x); | 115 | scissor.extent.width = scale_up(src.max_x - src.min_x); |
| 115 | scissor.extent.height = scale_up(src.max_y - src.min_y); | 116 | scissor.extent.height = scale_up(src.max_y - src.min_y); |
| 116 | } else { | 117 | } else { |