diff options
Diffstat (limited to 'src/video_core/renderer_vulkan/present/sgsr.cpp')
| -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); |
