summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-06-29 20:10:16 +0200
committerbunnei <bunneidev@gmail.com>2018-07-14 08:50:35 +0200
commit05cb10530fbd34635b06f75dea488a8896a763ac (patch)
tree990f0a010352eb3f72db4e80d6894954941a4e75 /src/video_core/renderer_opengl
parentMerge pull request #657 from bunnei/dual-vs (diff)
downloadyuzu-05cb10530fbd34635b06f75dea488a8896a763ac.tar
yuzu-05cb10530fbd34635b06f75dea488a8896a763ac.tar.gz
yuzu-05cb10530fbd34635b06f75dea488a8896a763ac.tar.bz2
yuzu-05cb10530fbd34635b06f75dea488a8896a763ac.tar.lz
yuzu-05cb10530fbd34635b06f75dea488a8896a763ac.tar.xz
yuzu-05cb10530fbd34635b06f75dea488a8896a763ac.tar.zst
yuzu-05cb10530fbd34635b06f75dea488a8896a763ac.zip
Diffstat (limited to 'src/video_core/renderer_opengl')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp6
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp15
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.h7
3 files changed, 27 insertions, 1 deletions
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<GLfloat, 3 * 2> 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<const Tegra::FramebufferConfig&> 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();