aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/present
diff options
context:
space:
mode:
authorSamuel <lizzie@eden-emu.dev>2026-08-23 23:36:24 +0200
committercrueter <crueter@eden-emu.dev>2026-08-23 23:36:24 +0200
commit86ba79b1ba79678ea52fd7bb5594c4eb71a607f7 (patch)
tree237d21e9c35cb30d26984b9df3acb4adf303e9bb /src/video_core/renderer_vulkan/present
parentb610b03d29dcb7e03e1a70538bc5e0624f91705d (diff)
[vulkan, sgsr] Adjustments to SGSR implementation (#4293)
PR/ Commit Owner: CamiileLaVey This change has specified fixes on the SGSR initial implementation, it brought a wider sharpening level limits and better image quality. Co-authored-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4293 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev>
Diffstat (limited to 'src/video_core/renderer_vulkan/present')
-rw-r--r--src/video_core/renderer_vulkan/present/sgsr.cpp32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp
index 5fc746458d..fa37225e43 100644
--- a/src/video_core/renderer_vulkan/present/sgsr.cpp
+++ b/src/video_core/renderer_vulkan/present/sgsr.cpp
@@ -1,6 +1,8 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
+#include <algorithm>
+
#include "common/common_types.h"
#include "common/div_ceil.h"
#include "common/settings.h"
@@ -17,7 +19,7 @@
namespace Vulkan {
-using PushConstants = std::array<u32, 4 + 2 + 1>;
+using PushConstants = std::array<u32, 4 + 2 + 2 + 1>;
SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir)
: m_memory_allocator{memory_allocator}
@@ -100,26 +102,28 @@ VkImageView SGSR::Draw(const Device& device, Scheduler& scheduler, size_t image_
const f32 input_image_width = f32(input_image_extent.width);
const f32 input_image_height = f32(input_image_extent.height);
- const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width;
- const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height;
- // expected [0, 2]
- const f32 sharpening = f32(Settings::values.fsr_sharpening_slider.GetValue()) / 100.0f;
+ const f32 crop_width = (crop_rect.right - crop_rect.left) * input_image_width;
+ const f32 crop_height = (crop_rect.bottom - crop_rect.top) * input_image_height;
+ static constexpr f32 EDGE_SHARPNESS_MAX = 2.0f;
+ const f32 edge_sharpness =
+ EDGE_SHARPNESS_MAX - f32(Settings::values.fsr_sharpening_slider.GetValue()) / 200.0f;
- // p = (tex * viewport) / input = [0,n] (normalized texcoords)
- // p * input = [0,1024], [0,768]
// layout( push_constant ) uniform constants {
// highp vec4 ViewportInfo[1];
// highp vec2 ResizeFactor;
+ // highp vec2 CropOffset;
// highp float EdgeSharpness;
// };
PushConstants viewport_con{};
- viewport_con[0] = std::bit_cast<u32>(std::abs(1.f / viewport_width));
- viewport_con[1] = std::bit_cast<u32>(std::abs(1.f / viewport_height));
- viewport_con[2] = std::bit_cast<u32>(std::abs(viewport_width));
- viewport_con[3] = std::bit_cast<u32>(std::abs(viewport_height));
- viewport_con[4] = std::bit_cast<u32>(viewport_width / input_image_width);
- viewport_con[5] = std::bit_cast<u32>(viewport_height / input_image_height);
- viewport_con[6] = std::bit_cast<u32>(sharpening);
+ viewport_con[0] = std::bit_cast<u32>(1.f / input_image_width);
+ viewport_con[1] = std::bit_cast<u32>(1.f / input_image_height);
+ viewport_con[2] = std::bit_cast<u32>(input_image_width);
+ viewport_con[3] = std::bit_cast<u32>(input_image_height);
+ viewport_con[4] = std::bit_cast<u32>(crop_width / input_image_width);
+ viewport_con[5] = std::bit_cast<u32>(crop_height / input_image_height);
+ viewport_con[6] = std::bit_cast<u32>((std::min)(crop_rect.left, crop_rect.right));
+ viewport_con[7] = std::bit_cast<u32>((std::min)(crop_rect.top, crop_rect.bottom));
+ viewport_con[8] = std::bit_cast<u32>(edge_sharpness);
UploadImages(device, scheduler);
UpdateDescriptorSets(device, source_image_view, image_index);