From 66ca68a52efee3ee3259b643da05d66cb0816bc5 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Tue, 10 Feb 2026 17:19:50 +1000 Subject: [PATCH] perf(vulkan): use double viewport math only when scale < 1 Signed-off-by: Zephyron --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index d3ca9c51f..ddc935503 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -67,13 +67,14 @@ struct DrawParams { VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t index, float scale) { const auto& src = regs.viewport_transform[index]; const auto conv = [scale](float value) { - const double new_value = static_cast(value) * static_cast(scale); - if (scale < 1.0f) { - const bool sign = std::signbit(value); - double rounded = std::round(std::abs(new_value)); - return static_cast(sign ? -rounded : rounded); + if (scale >= 1.0f) { + return value * scale; } - return static_cast(new_value); + // Use double only when scaling down to avoid sub-pixel jitter (MP4 fix) + const double new_value = static_cast(value) * static_cast(scale); + const bool sign = std::signbit(value); + const double rounded = std::round(std::abs(new_value)); + return static_cast(sign ? -rounded : rounded); }; const float x = conv(src.translate_x - src.scale_x); const float width = conv(src.scale_x * 2.0f);