// Copyright 2015 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #include "video_core/engines/maxwell_3d.h" namespace OpenGL { class OpenGLState { public: struct { GLuint read_framebuffer = 0; // GL_READ_FRAMEBUFFER_BINDING GLuint draw_framebuffer = 0; // GL_DRAW_FRAMEBUFFER_BINDING GLuint shader_program = 0; // GL_CURRENT_PROGRAM GLuint program_pipeline = 0; // GL_PROGRAM_PIPELINE_BINDING } draw; GLuint renderbuffer{}; // GL_RENDERBUFFER_BINDING OpenGLState(); /// Get the currently active OpenGL state static OpenGLState GetCurState() { return cur_state; } /// Apply this state as the current OpenGL state void Apply(); void ApplyFramebufferState(); void ApplyShaderProgram(); void ApplyProgramPipeline(); void ApplyRenderBuffer(); /// Resets any references to the given resource OpenGLState& ResetProgram(GLuint handle); OpenGLState& ResetPipeline(GLuint handle); OpenGLState& ResetFramebuffer(GLuint handle); OpenGLState& ResetRenderbuffer(GLuint handle); private: static OpenGLState cur_state; }; static_assert(std::is_trivially_copyable_v); } // namespace OpenGL