diff --git a/rpcs3/Emu/RSX/GL/upscalers/fsr_pass.h b/rpcs3/Emu/RSX/GL/upscalers/fsr_pass.h new file mode 100644 index 0000000000..869b2b1493 --- /dev/null +++ b/rpcs3/Emu/RSX/GL/upscalers/fsr_pass.h @@ -0,0 +1,74 @@ +#pragma once + +#include "../glutils/buffer_object.h" +#include "../glutils/state_tracker.hpp" + +#include "../GLCompute.h" +#include "upscaling.h" + +namespace gl +{ + namespace FidelityFX + { + class fsr_pass : public compute_task + { + protected: + gl::texture* m_input_image = nullptr; + gl::texture* m_output_image = nullptr; + gl::buffer m_ubo; + size2u m_input_size; + size2u m_output_size; + std::vector m_constants_buf; + + void bind_resources() override; + virtual void configure(const gl::command_context& cmd) = 0; + + public: + fsr_pass(const std::string& config_definitions, u32 push_constants_size); + virtual ~fsr_pass(); + + void run(gl::command_context& cmd, gl::texture* src, gl::texture* dst, const size2u& input_size, const size2u& output_size); + }; + + class easu_pass : public fsr_pass + { + void configure(const gl::command_context& cmd) override; + + public: + easu_pass(); + }; + + class rcas_pass : public fsr_pass + { + void configure(const gl::command_context& cmd) override; + + public: + rcas_pass(); + }; + } + + class fsr_upscale_pass : public upscaler + { + public: + fsr_upscale_pass() = default; + ~fsr_upscale_pass(); + + gl::texture* scale_output( + gl::command_context& cmd, // State + gl::texture* src, // Source input + const areai& src_region, // Scaling request information + const areai& dst_region, // Ditto + gl::flags32_t mode // Mode + ) override; + + private: + std::unique_ptr m_output_left; + std::unique_ptr m_output_right; + std::unique_ptr m_intermediate_data; + + gl::fbo m_flip_fbo; + + void dispose_images(); + void initialize_image(u32 output_w, u32 output_h, rsx::flags32_t mode); + }; +} diff --git a/rpcs3/Emu/RSX/GL/upscalers/static_pass.hpp b/rpcs3/Emu/RSX/GL/upscalers/static_pass.hpp index 9929460c1e..336b145d80 100644 --- a/rpcs3/Emu/RSX/GL/upscalers/static_pass.hpp +++ b/rpcs3/Emu/RSX/GL/upscalers/static_pass.hpp @@ -19,9 +19,9 @@ namespace gl } } - gl::handle32_t scale_output( + gl::texture* scale_output( gl::command_context& /*cmd*/, // State - gl::handle32_t src, // Source input + gl::texture* src, // Source input const areai& src_region, // Scaling request information const areai& dst_region, // Ditto gl::flags32_t mode // Mode @@ -31,11 +31,11 @@ namespace gl { m_flip_fbo.recreate(); m_flip_fbo.bind(); - m_flip_fbo.color = src; + m_flip_fbo.color = src->id(); m_flip_fbo.read_buffer(m_flip_fbo.color); m_flip_fbo.draw_buffer(m_flip_fbo.color); m_flip_fbo.blit(gl::screen, src_region, dst_region, gl::buffers::color, Filter); - return 0; + return nullptr; } // Upscaling source only is unsupported diff --git a/rpcs3/Emu/RSX/GL/upscalers/upscaling.h b/rpcs3/Emu/RSX/GL/upscalers/upscaling.h index 0202a12a05..4c90536668 100644 --- a/rpcs3/Emu/RSX/GL/upscalers/upscaling.h +++ b/rpcs3/Emu/RSX/GL/upscalers/upscaling.h @@ -25,9 +25,9 @@ namespace gl { virtual ~upscaler() {} - virtual gl::handle32_t scale_output( + virtual gl::texture* scale_output( gl::command_context& cmd, // State - gl::handle32_t src, // Source input + gl::texture* src, // Source input const areai& src_region, // Scaling request information const areai& dst_region, // Ditto gl::flags32_t mode // Mode diff --git a/rpcs3/GLGSRender.vcxproj b/rpcs3/GLGSRender.vcxproj index 2b7a4b02c6..5fe3de17f5 100644 --- a/rpcs3/GLGSRender.vcxproj +++ b/rpcs3/GLGSRender.vcxproj @@ -80,6 +80,7 @@ + diff --git a/rpcs3/GLGSRender.vcxproj.filters b/rpcs3/GLGSRender.vcxproj.filters index d8bc8f13ce..474f50b4a9 100644 --- a/rpcs3/GLGSRender.vcxproj.filters +++ b/rpcs3/GLGSRender.vcxproj.filters @@ -115,6 +115,9 @@ upscalers + + upscalers +