/* Copyright 2016-2023 melonDS team This file is part of melonDS. melonDS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. melonDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with melonDS. If not, see http://www.gnu.org/licenses/. */ #pragma once #include "OpenGLSupport.h" #include #include namespace melonDS { class GPU; struct RenderSettings; class GLRenderer; class GLCompositor { public: static std::optional New() noexcept; GLCompositor(const GLCompositor&) = delete; GLCompositor& operator=(const GLCompositor&) = delete; GLCompositor(GLCompositor&&) noexcept; GLCompositor& operator=(GLCompositor&&) noexcept; ~GLCompositor(); void SetScaleFactor(int scale) noexcept; [[nodiscard]] int GetScaleFactor() const noexcept { return Scale; } void Stop(const GPU& gpu) noexcept; void RenderFrame(const GPU& gpu, GLRenderer& renderer) noexcept; void BindOutputTexture(int buf); private: GLCompositor(std::array CompShader) noexcept; int Scale = 0; int ScreenH = 0, ScreenW = 0; std::array CompShader {}; GLuint CompScaleLoc = 0; GLuint Comp3DXPosLoc = 0; GLuint CompVertexBufferID = 0; GLuint CompVertexArrayID = 0; struct CompVertex { std::array Position {}; std::array Texcoord {}; }; std::array CompVertices {}; GLuint CompScreenInputTex = 0; std::array CompScreenOutputTex {}; std::array CompScreenOutputFB {}; }; }