diff options
| author | Samuel <lizzie@eden-emu.dev> | 2026-08-23 23:36:24 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-08-23 23:36:24 +0200 |
| commit | 86ba79b1ba79678ea52fd7bb5594c4eb71a607f7 (patch) | |
| tree | 237d21e9c35cb30d26984b9df3acb4adf303e9bb /src/video_core/renderer_vulkan/present | |
| parent | b610b03d29dcb7e03e1a70538bc5e0624f91705d (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.cpp | 32 |
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); |
