6030c5ce41
We move the initialization of the renderer to the core class, while keeping the creation of it and any other specifics in video_core. This way we can ensure that the renderer is initialized and doesn't give unfettered access to the renderer. This also makes dependencies on types more explicit. For example, the GPU class doesn't need to depend on the existence of a renderer, it only needs to care about whether or not it has a rasterizer, but since it was accessing the global variable, it was also making the renderer a part of its dependency chain. By adjusting the interface, we can get rid of this dependency.
96 lines
2.9 KiB
C++
96 lines
2.9 KiB
C++
// Copyright 2014 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
|
#include <glad/glad.h>
|
|
#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<float> 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 VideoCore::RendererBase {
|
|
public:
|
|
explicit RendererOpenGL(EmuWindow& window);
|
|
~RendererOpenGL() override;
|
|
|
|
/// Swap buffers (render frame)
|
|
void SwapBuffers(boost::optional<const Tegra::FramebufferConfig&> 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<u8> 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<int> framebuffer_crop_rect;
|
|
};
|