|
|
|
@ -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); |
|
|
|
|