From 7c7ea3c3b6114208804574beeebeede1eaffd0e1 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Thu, 24 Jun 2021 20:36:51 +0200 Subject: [PATCH] nvidia/vfx/superresolution: Round to nearest instead of truncate Slightly improves the accuracy of the scaled size calculations. --- source/nvidia/vfx/nvidia-vfx-superresolution.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/nvidia/vfx/nvidia-vfx-superresolution.cpp b/source/nvidia/vfx/nvidia-vfx-superresolution.cpp index 5733918..ccfcfaa 100644 --- a/source/nvidia/vfx/nvidia-vfx-superresolution.cpp +++ b/source/nvidia/vfx/nvidia-vfx-superresolution.cpp @@ -19,6 +19,7 @@ // SOFTWARE. #include "nvidia-vfx-superresolution.hpp" +#include #include #include "obs/gs/gs-helper.hpp" #include "util/util-logging.hpp" @@ -187,13 +188,13 @@ void streamfx::nvidia::vfx::superresolution::size(std::pair double ar = static_cast(input_size.second) / static_cast(input_size.first); input_size.first = std::clamp(input_size.first, min_width, max_width); input_size.second = std::clamp( - static_cast(round(static_cast(input_size.first) * ar)), min_height, max_height); + static_cast(std::lround(static_cast(input_size.first) * ar)), min_height, max_height); } else { // Dominant Height double ar = static_cast(input_size.first) / static_cast(input_size.second); input_size.second = std::clamp(input_size.second, min_height, max_height); input_size.first = std::clamp( - static_cast(round(static_cast(input_size.second) * ar)), min_width, max_width); + static_cast(std::lround(static_cast(input_size.second) * ar)), min_width, max_width); } // Calculate Output Size. @@ -298,8 +299,8 @@ std::shared_ptr<::streamfx::obs::gs::texture> void streamfx::nvidia::vfx::superresolution::resize(uint32_t width, uint32_t height) { - uint32_t out_width = static_cast(width * _scale); - uint32_t out_height = static_cast(height * _scale); + uint32_t out_width = static_cast(std::lround(width * _scale)); + uint32_t out_height = static_cast(std::lround(height * _scale)); auto gctx = ::streamfx::obs::gs::context(); auto cctx = ::streamfx::nvidia::cuda::obs::get()->get_context()->enter();