summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar FernandoS272021-10-20 18:27:25 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:31 +0100
commitd37d10e7a7b9037a259b27923716e5ce3084d6c3 (patch)
tree52ee8db37b4eefed3bd24e36bfe7ca7319fc51f5 /src/video_core/renderer_vulkan
parentPresentation: Fix turning FSR on and off in settings (diff)
downloadyuzu-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.cpp19
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
96VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) { 96VkRect2D 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 {