// Copyright 2014 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include "common/common_types.h" #include "common/math_util.h" #include "video_core/renderer_base.h" #include "video_core/renderer_opengl/gl_resource_manager.h" #include "video_core/renderer_opengl/gl_state.h" class EmuWindow; /// Structure used for storing information about the textures for the Switch screen struct TextureInfo { OGLTexture resource; GLsizei width; GLsizei height; GLenum gl_format; GLenum gl_type; Tegra::FramebufferConfig::PixelFormat pixel_format; }; /// Structure used for storing information about the display target for the Switch screen struct ScreenInfo { GLuint display_texture; const MathUtil::Rectangle display_texcoords{0.0f, 0.0f, 1.0f, 1.0f}; TextureInfo texture; }; /// Helper class to acquire/release OpenGL context within a given scope class ScopeAcquireGLContext : NonCopyable { public: explicit ScopeAcquireGLContext(EmuWindow& window); ~ScopeAcquireGLContext(); private: EmuWindow& emu_window; }; class RendererOpenGL : public RendererBase { public: explicit RendererOpenGL(EmuWindow& window); ~RendererOpenGL() override; /// Swap buffers (render frame) void SwapBuffers(boost::optional framebuffer) override; /// Initialize the renderer bool Init() override; /// Shutdown the renderer void ShutDown() override; private: void InitOpenGLObjects(); void ConfigureFramebufferTexture(TextureInfo& texture, const Tegra::FramebufferConfig& framebuffer); void DrawScreen(); void DrawScreenTriangles(const ScreenInfo& screen_info, float x, float y, float w, float h); void UpdateFramerate(); // Loads framebuffer from emulated memory into the display information structure void LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuffer, ScreenInfo& screen_info); // Fills active OpenGL texture with the given RGBA color. void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a, const TextureInfo& texture); OpenGLState state; // OpenGL object IDs OGLVertexArray vertex_array; OGLBuffer vertex_buffer; OGLProgram shader; /// Display information for Switch screen ScreenInfo screen_info; /// OpenGL framebuffer data std::vector gl_framebuffer_data; // Shader uniform location indices GLuint uniform_modelview_matrix; GLuint uniform_color_texture; // Shader attribute input indices GLuint attrib_position; GLuint attrib_tex_coord; /// Used for transforming the framebuffer orientation Tegra::FramebufferConfig::TransformFlags framebuffer_transform_flags; MathUtil::Rectangle framebuffer_crop_rect; };