From f9ff0bc55dda398ffdb790d22b6eb7fb7287968a Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 12 Dec 2013 12:43:49 -0600 Subject: [PATCH] Have our OpenGL/ES context creation be less stupid. --- Source/Core/DolphinWX/Src/GLInterface.h | 5 +++ Source/Core/DolphinWX/Src/GLInterface/EGL.cpp | 36 +++++++++++-------- .../DolphinWX/Src/GLInterface/InterfaceBase.h | 3 ++ .../Core/DolphinWX/Src/GLInterface/Platform.h | 6 ++++ Source/Core/VideoBackends/OGL/Src/main.cpp | 4 +++ .../VideoBackends/Software/Src/SWmain.cpp | 6 +++- 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/Source/Core/DolphinWX/Src/GLInterface.h b/Source/Core/DolphinWX/Src/GLInterface.h index 9ef6c9f0e2..1209267bdb 100644 --- a/Source/Core/DolphinWX/Src/GLInterface.h +++ b/Source/Core/DolphinWX/Src/GLInterface.h @@ -54,6 +54,11 @@ typedef struct { #endif } GLWindow; +enum GLInterfaceMode { + MODE_OPENGL = 0, + MODE_OPENGLES2, + MODE_OPENGLES3, +}; extern cInterfaceBase *GLInterface; extern GLWindow GLWin; diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index 741492e0a4..9ca95a5886 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -47,31 +47,37 @@ bool cInterfaceEGL::Create(void *&window_handle) // attributes for a visual in RGBA format with at least // 8 bits per color int attribs[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, -#ifdef USE_GLES -#ifdef USE_GLES3 - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - - // OpenGL ES 3 bit is disabled for now, until we have a way to select it from runtime - // Qualcomm drivers don't even care if it is ES2 or ES3 bit set. - // Intel drivers /might/ not care, but that code path is untested // EGL_RENDERABLE_TYPE, (1 << 6) /* EGL_OPENGL_ES3_BIT */, -#else - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, -#endif -#else EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, -#endif EGL_NONE }; - static const EGLint ctx_attribs[] = { -#ifdef USE_GLES + EGLint ctx_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, -#endif EGL_NONE }; + switch(s_opengl_mode) + { + case MODE_OPENGL: + attribs[1] = EGL_OPENGL_BIT; + ctx_attribs[0] = EGL_NONE; + break; + case MODE_OPENGLES2: + attribs[1] = EGL_OPENGL_ES2_BIT; + ctx_attribs[1] = 2; + break; + case MODE_OPENGLES3: + attribs[1] = (1 << 6); /* EGL_OPENGL_ES3_BIT_KHR */ + ctx_attribs[1] = 3; + break; + default: + ERROR_LOG(VIDEO, "Unknown opengl mode set\n"); + return false; + break; + } if(!Platform.SelectDisplay()) return false; diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index b69d9fea9c..8e2fa4e36b 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -10,9 +10,12 @@ protected: // Window dimensions. u32 s_backbuffer_width; u32 s_backbuffer_height; + + u32 s_opengl_mode; public: virtual void Swap() {} virtual void UpdateFPSDisplay(const char *Text) {} + virtual void SetMode(u32 mode) { s_opengl_mode = mode; } virtual bool Create(void *&window_handle) { return true; } virtual bool MakeCurrent() { return true; } virtual bool ClearCurrent() { return true; } diff --git a/Source/Core/DolphinWX/Src/GLInterface/Platform.h b/Source/Core/DolphinWX/Src/GLInterface/Platform.h index a6b9d59cff..556244374e 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/Platform.h +++ b/Source/Core/DolphinWX/Src/GLInterface/Platform.h @@ -155,6 +155,12 @@ typedef struct { #endif } GLWindow; +enum GLInterfaceMode { + MODE_OPENGL = 0, + MODE_OPENGLES2, + MODE_OPENGLES3, +}; + extern cInterfaceBase *GLInterface; extern GLWindow GLWin; diff --git a/Source/Core/VideoBackends/OGL/Src/main.cpp b/Source/Core/VideoBackends/OGL/Src/main.cpp index 7ad18bca25..60b7fe6017 100644 --- a/Source/Core/VideoBackends/OGL/Src/main.cpp +++ b/Source/Core/VideoBackends/OGL/Src/main.cpp @@ -179,6 +179,10 @@ bool VideoBackend::Initialize(void *&window_handle) UpdateActiveConfig(); InitInterface(); + GLInterface->SetMode(GLInterfaceMode::MODE_OPENGL); +#ifdef USE_GLES3 + GLInterface->SetMode(GLInterfaceMode::MODE_OPENGLES3); +#endif if (!GLInterface->Create(window_handle)) return false; diff --git a/Source/Core/VideoBackends/Software/Src/SWmain.cpp b/Source/Core/VideoBackends/Software/Src/SWmain.cpp index 074b6bc38b..582325d5f4 100644 --- a/Source/Core/VideoBackends/Software/Src/SWmain.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWmain.cpp @@ -61,8 +61,12 @@ void VideoSoftware::ShowConfig(void *_hParent) bool VideoSoftware::Initialize(void *&window_handle) { g_SWVideoConfig.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_software.ini").c_str()); - InitInterface(); + InitInterface(); + GLInterface->SetMode(GLInterfaceMode::MODE_OPENGL); +#ifdef USE_GLES + GLInterface->SetMode(GLInterfaceMode::MODE_OPENGLES2); +#endif if (!GLInterface->Create(window_handle)) { INFO_LOG(VIDEO, "%s", "SWRenderer::Create failed\n");