From 134d967be2dd4ba9531abb8ba8494c3ac423ca72 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 3 Oct 2018 23:02:45 +1000 Subject: Refactoring and cleanup of GLInterface (now GLContext) --- Source/Core/VideoBackends/Software/SWOGLWindow.cpp | 31 +++++++++------------- 1 file changed, 12 insertions(+), 19 deletions(-) (limited to 'Source/Core/VideoBackends/Software/SWOGLWindow.cpp') diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp index 695f58cc1d..dd390bc6dc 100644 --- a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp +++ b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp @@ -4,7 +4,7 @@ #include -#include "Common/GL/GLInterfaceBase.h" +#include "Common/GL/GLContext.h" #include "Common/GL/GLUtil.h" #include "Common/Logging/Log.h" @@ -15,9 +15,8 @@ std::unique_ptr SWOGLWindow::s_instance; void SWOGLWindow::Init(void* window_handle) { - GLUtil::InitInterface(); - GLInterface->SetMode(GLInterfaceMode::MODE_DETECT); - if (!GLInterface->Create(window_handle)) + g_main_gl_context = GLContext::Create(window_handle); + if (!g_main_gl_context) { ERROR_LOG(VIDEO, "GLInterface::Create failed."); } @@ -27,8 +26,8 @@ void SWOGLWindow::Init(void* window_handle) void SWOGLWindow::Shutdown() { - GLInterface->Shutdown(); - GLInterface.reset(); + g_main_gl_context->Shutdown(); + g_main_gl_context.reset(); s_instance.reset(); } @@ -66,10 +65,9 @@ void SWOGLWindow::Prepare() " TexCoord = vec2(rawpos.x, -rawpos.y);\n" "}\n"; - std::string header = GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL ? - "#version 140\n" : - "#version 300 es\n" - "precision highp float;\n"; + std::string header = g_main_gl_context->IsGLES() ? "#version 300 es\n" + "precision highp float;\n" : + "#version 140\n"; m_image_program = GLUtil::CompileProgram(header + vertex_shader, header + frag_shader); @@ -93,10 +91,10 @@ void SWOGLWindow::PrintText(const std::string& text, int x, int y, u32 color) void SWOGLWindow::ShowImage(AbstractTexture* image, const EFBRectangle& xfb_region) { SW::SWTexture* sw_image = static_cast(image); - GLInterface->Update(); // just updates the render window position and the backbuffer size + g_main_gl_context->Update(); // just updates the render window position and the backbuffer size - GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth(); - GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight(); + GLsizei glWidth = (GLsizei)g_main_gl_context->GetBackBufferWidth(); + GLsizei glHeight = (GLsizei)g_main_gl_context->GetBackBufferHeight(); glViewport(0, 0, glWidth, glHeight); @@ -123,10 +121,5 @@ void SWOGLWindow::ShowImage(AbstractTexture* image, const EFBRectangle& xfb_regi // } m_text.clear(); - GLInterface->Swap(); -} - -int SWOGLWindow::PeekMessages() -{ - return GLInterface->PeekMessages(); + g_main_gl_context->Swap(); } -- cgit v1.2.3 From 9c57a98723997736adea94383668fbdf8a993fd8 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 3 Oct 2018 23:03:19 +1000 Subject: GLContext: Use host connection This also removes the need for a sleeping event thread. --- Source/Core/VideoBackends/Software/SWOGLWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Software/SWOGLWindow.cpp') diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp index dd390bc6dc..fb6731b4b7 100644 --- a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp +++ b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp @@ -13,9 +13,9 @@ std::unique_ptr SWOGLWindow::s_instance; -void SWOGLWindow::Init(void* window_handle) +void SWOGLWindow::Init(void* display_handle, void* window_handle) { - g_main_gl_context = GLContext::Create(window_handle); + g_main_gl_context = GLContext::Create(display_handle, window_handle); if (!g_main_gl_context) { ERROR_LOG(VIDEO, "GLInterface::Create failed."); -- cgit v1.2.3 From eb284b5d661cab6aed770e0e51b790917249ef21 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 3 Oct 2018 23:03:22 +1000 Subject: VideoBackends: Pass window system info from host on creation --- Source/Core/VideoBackends/Software/SWOGLWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Software/SWOGLWindow.cpp') diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp index fb6731b4b7..d9694c17aa 100644 --- a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp +++ b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp @@ -13,9 +13,9 @@ std::unique_ptr SWOGLWindow::s_instance; -void SWOGLWindow::Init(void* display_handle, void* window_handle) +void SWOGLWindow::Init(const WindowSystemInfo& wsi) { - g_main_gl_context = GLContext::Create(display_handle, window_handle); + g_main_gl_context = GLContext::Create(wsi); if (!g_main_gl_context) { ERROR_LOG(VIDEO, "GLInterface::Create failed."); -- cgit v1.2.3 From dcdd02d646230e7903520a41dc9f86e57ae16dbe Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 3 Oct 2018 23:03:26 +1000 Subject: GLContext: Remove global context pointer --- Source/Core/VideoBackends/Software/SWOGLWindow.cpp | 61 +++++++++++++--------- 1 file changed, 36 insertions(+), 25 deletions(-) (limited to 'Source/Core/VideoBackends/Software/SWOGLWindow.cpp') diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp index d9694c17aa..4936d1a13c 100644 --- a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp +++ b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp @@ -7,48 +7,58 @@ #include "Common/GL/GLContext.h" #include "Common/GL/GLUtil.h" #include "Common/Logging/Log.h" +#include "Common/MsgHandler.h" #include "VideoBackends/Software/SWOGLWindow.h" #include "VideoBackends/Software/SWTexture.h" -std::unique_ptr SWOGLWindow::s_instance; +SWOGLWindow::SWOGLWindow() = default; -void SWOGLWindow::Init(const WindowSystemInfo& wsi) +SWOGLWindow::~SWOGLWindow() { - g_main_gl_context = GLContext::Create(wsi); - if (!g_main_gl_context) + if (m_gl_context) { - ERROR_LOG(VIDEO, "GLInterface::Create failed."); + m_gl_context->ClearCurrent(); + m_gl_context->Shutdown(); } - - s_instance.reset(new SWOGLWindow()); } -void SWOGLWindow::Shutdown() +std::unique_ptr SWOGLWindow::Create(const WindowSystemInfo& wsi) { - g_main_gl_context->Shutdown(); - g_main_gl_context.reset(); + std::unique_ptr window = std::unique_ptr(new SWOGLWindow()); + if (!window->Initialize(wsi)) + { + PanicAlert("Failed to create OpenGL window"); + return nullptr; + } - s_instance.reset(); + return window; } -void SWOGLWindow::Prepare() +bool SWOGLWindow::IsHeadless() const { - if (m_init) - return; - m_init = true; + return m_gl_context->IsHeadless(); +} + +bool SWOGLWindow::Initialize(const WindowSystemInfo& wsi) +{ + m_gl_context = GLContext::Create(wsi); + if (!m_gl_context) + return false; + + m_gl_context->MakeCurrent(); // Init extension support. - if (!GLExtensions::Init()) + if (!GLExtensions::Init(m_gl_context.get())) { ERROR_LOG(VIDEO, "GLExtensions::Init failed!Does your video card support OpenGL 2.0?"); - return; + return false; } else if (GLExtensions::Version() < 310) { ERROR_LOG(VIDEO, "OpenGL Version %d detected, but at least 3.1 is required.", GLExtensions::Version()); - return; + return false; } std::string frag_shader = "in vec2 TexCoord;\n" @@ -65,9 +75,9 @@ void SWOGLWindow::Prepare() " TexCoord = vec2(rawpos.x, -rawpos.y);\n" "}\n"; - std::string header = g_main_gl_context->IsGLES() ? "#version 300 es\n" - "precision highp float;\n" : - "#version 140\n"; + std::string header = m_gl_context->IsGLES() ? "#version 300 es\n" + "precision highp float;\n" : + "#version 140\n"; m_image_program = GLUtil::CompileProgram(header + vertex_shader, header + frag_shader); @@ -81,6 +91,7 @@ void SWOGLWindow::Prepare() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glGenVertexArrays(1, &m_image_vao); + return true; } void SWOGLWindow::PrintText(const std::string& text, int x, int y, u32 color) @@ -91,10 +102,10 @@ void SWOGLWindow::PrintText(const std::string& text, int x, int y, u32 color) void SWOGLWindow::ShowImage(AbstractTexture* image, const EFBRectangle& xfb_region) { SW::SWTexture* sw_image = static_cast(image); - g_main_gl_context->Update(); // just updates the render window position and the backbuffer size + m_gl_context->Update(); // just updates the render window position and the backbuffer size - GLsizei glWidth = (GLsizei)g_main_gl_context->GetBackBufferWidth(); - GLsizei glHeight = (GLsizei)g_main_gl_context->GetBackBufferHeight(); + GLsizei glWidth = (GLsizei)m_gl_context->GetBackBufferWidth(); + GLsizei glHeight = (GLsizei)m_gl_context->GetBackBufferHeight(); glViewport(0, 0, glWidth, glHeight); @@ -121,5 +132,5 @@ void SWOGLWindow::ShowImage(AbstractTexture* image, const EFBRectangle& xfb_regi // } m_text.clear(); - g_main_gl_context->Swap(); + m_gl_context->Swap(); } -- cgit v1.2.3 From 025e909773a2761cad8a3954498fe800f6f94963 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 3 Oct 2018 23:03:33 +1000 Subject: GLContext: Use destructor instead of Shutdown() to cleanup Also uses the Initialize() method to make the context current. --- Source/Core/VideoBackends/Software/SWOGLWindow.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) (limited to 'Source/Core/VideoBackends/Software/SWOGLWindow.cpp') diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp index 4936d1a13c..81216ff7ef 100644 --- a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp +++ b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp @@ -13,15 +13,7 @@ #include "VideoBackends/Software/SWTexture.h" SWOGLWindow::SWOGLWindow() = default; - -SWOGLWindow::~SWOGLWindow() -{ - if (m_gl_context) - { - m_gl_context->ClearCurrent(); - m_gl_context->Shutdown(); - } -} +SWOGLWindow::~SWOGLWindow() = default; std::unique_ptr SWOGLWindow::Create(const WindowSystemInfo& wsi) { @@ -46,8 +38,6 @@ bool SWOGLWindow::Initialize(const WindowSystemInfo& wsi) if (!m_gl_context) return false; - m_gl_context->MakeCurrent(); - // Init extension support. if (!GLExtensions::Init(m_gl_context.get())) { -- cgit v1.2.3