From 05cb10530fbd34635b06f75dea488a8896a763ac Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 29 Jun 2018 14:10:16 -0400 Subject: OpenGL: Use MakeCurrent/DoneCurrent for multithreaded rendering. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 6 ++++++ src/video_core/renderer_opengl/renderer_opengl.cpp | 15 ++++++++++++++- src/video_core/renderer_opengl/renderer_opengl.h | 7 +++++++ 3 files changed, 27 insertions(+), 1 deletion(-) (limited to 'src/video_core/renderer_opengl') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 4072a12b4..2e91a43e3 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -15,6 +15,7 @@ #include "common/microprofile.h" #include "common/scope_exit.h" #include "core/core.h" +#include "core/frontend/emu_window.h" #include "core/hle/kernel/process.h" #include "core/settings.h" #include "video_core/engines/maxwell_3d.h" @@ -22,6 +23,7 @@ #include "video_core/renderer_opengl/gl_shader_gen.h" #include "video_core/renderer_opengl/maxwell_to_gl.h" #include "video_core/renderer_opengl/renderer_opengl.h" +#include "video_core/video_core.h" using Maxwell = Tegra::Engines::Maxwell3D::Regs; using PixelFormat = SurfaceParams::PixelFormat; @@ -394,6 +396,8 @@ void RasterizerOpenGL::Clear() { if (clear_mask == 0) return; + ScopeAcquireGLContext acquire_context; + auto [dirty_color_surface, dirty_depth_surface] = ConfigureFramebuffers(use_color_fb, use_depth_fb); @@ -420,6 +424,8 @@ void RasterizerOpenGL::DrawArrays() { MICROPROFILE_SCOPE(OpenGL_Drawing); const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs; + ScopeAcquireGLContext acquire_context; + auto [dirty_color_surface, dirty_depth_surface] = ConfigureFramebuffers(true, regs.zeta.Address() != 0); diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 00841e937..1930fa6ef 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -92,11 +92,24 @@ static std::array MakeOrthographicMatrix(const float width, cons return matrix; } +ScopeAcquireGLContext::ScopeAcquireGLContext() { + if (Settings::values.use_multi_core) { + VideoCore::g_emu_window->MakeCurrent(); + } +} +ScopeAcquireGLContext::~ScopeAcquireGLContext() { + if (Settings::values.use_multi_core) { + VideoCore::g_emu_window->DoneCurrent(); + } +} + RendererOpenGL::RendererOpenGL() = default; RendererOpenGL::~RendererOpenGL() = default; /// Swap buffers (render frame) void RendererOpenGL::SwapBuffers(boost::optional framebuffer) { + ScopeAcquireGLContext acquire_context; + Core::System::GetInstance().perf_stats.EndSystemFrame(); // Maintain the rasterizer's state as a priority @@ -418,7 +431,7 @@ static void APIENTRY DebugHandler(GLenum source, GLenum type, GLuint id, GLenum /// Initialize the renderer bool RendererOpenGL::Init() { - render_window->MakeCurrent(); + ScopeAcquireGLContext acquire_context; if (GLAD_GL_KHR_debug) { glEnable(GL_DEBUG_OUTPUT); diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index 21f0d298c..fd0267cf5 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -31,6 +31,13 @@ struct ScreenInfo { TextureInfo texture; }; +/// Helper class to acquire/release OpenGL context within a given scope +class ScopeAcquireGLContext : NonCopyable { +public: + ScopeAcquireGLContext(); + ~ScopeAcquireGLContext(); +}; + class RendererOpenGL : public RendererBase { public: RendererOpenGL(); -- cgit v1.2.3