diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-07-22 16:47:11 -0500 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-07-22 16:47:11 -0500 |
| commit | c81bd32720bbafe48eb89f68444edec24ceae70a (patch) | |
| tree | 12cdebe2f1b56dbe4f83c2b07c2b5a8e6fd885f6 /Source | |
| parent | 6bcdae616be68f2702bb1e5beeb47e90004b6c46 (diff) | |
| parent | c4f0515141cd451468b29501b9c1d8925f7a9502 (diff) | |
Merge pull request #2764 from Sonicadvance1/pvr_workaround3
Work around devices that choose to only return the default EGL_RENDERABLE_TYPE
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/GLInterface/EGL.cpp | 76 |
1 files changed, 44 insertions, 32 deletions
diff --git a/Source/Core/VideoBackends/OGL/GLInterface/EGL.cpp b/Source/Core/VideoBackends/OGL/GLInterface/EGL.cpp index f83b540cbd..43678e1acc 100644 --- a/Source/Core/VideoBackends/OGL/GLInterface/EGL.cpp +++ b/Source/Core/VideoBackends/OGL/GLInterface/EGL.cpp @@ -29,52 +29,64 @@ void cInterfaceEGL::DetectMode() EGLint num_configs; EGLConfig *config = nullptr; bool supportsGL = false, supportsGLES2 = false, supportsGLES3 = false; + std::array<int, 3> renderable_types = { + EGL_OPENGL_BIT, + (1 << 6), /* EGL_OPENGL_ES3_BIT_KHR */ + EGL_OPENGL_ES2_BIT, + }; - // attributes for a visual in RGBA format with at least - // 8 bits per color - int attribs[] = { - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_NONE }; - - // Get how many configs there are - if (!eglChooseConfig( egl_dpy, attribs, nullptr, 0, &num_configs)) + for (auto renderable_type : renderable_types) { - INFO_LOG(VIDEO, "Error: couldn't get an EGL visual config\n"); - goto err_exit; - } + // attributes for a visual in RGBA format with at least + // 8 bits per color + int attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_RENDERABLE_TYPE, renderable_type, + EGL_NONE + }; + + // Get how many configs there are + if (!eglChooseConfig( egl_dpy, attribs, nullptr, 0, &num_configs)) + { + INFO_LOG(VIDEO, "Error: couldn't get an EGL visual config\n"); + goto err_exit; + } - config = new EGLConfig[num_configs]; + config = new EGLConfig[num_configs]; - // Get all the configurations - if (!eglChooseConfig(egl_dpy, attribs, config, num_configs, &num_configs)) - { - INFO_LOG(VIDEO, "Error: couldn't get an EGL visual config\n"); - goto err_exit; - } + // Get all the configurations + if (!eglChooseConfig(egl_dpy, attribs, config, num_configs, &num_configs)) + { + INFO_LOG(VIDEO, "Error: couldn't get an EGL visual config\n"); + goto err_exit; + } - for (int i = 0; i < num_configs; ++i) - { - EGLint attribVal; - bool ret; - ret = eglGetConfigAttrib(egl_dpy, config[i], EGL_RENDERABLE_TYPE, &attribVal); - if (ret) + for (int i = 0; i < num_configs; ++i) { - if (attribVal & EGL_OPENGL_BIT) - supportsGL = true; - if (attribVal & (1 << 6)) /* EGL_OPENGL_ES3_BIT_KHR */ - supportsGLES3 = true; - if (attribVal & EGL_OPENGL_ES2_BIT) - supportsGLES2 = true; + EGLint attribVal; + bool ret; + ret = eglGetConfigAttrib(egl_dpy, config[i], EGL_RENDERABLE_TYPE, &attribVal); + if (ret) + { + if (attribVal & EGL_OPENGL_BIT) + supportsGL = true; + if (attribVal & (1 << 6)) /* EGL_OPENGL_ES3_BIT_KHR */ + supportsGLES3 = true; + if (attribVal & EGL_OPENGL_ES2_BIT) + supportsGLES2 = true; + } } } + if (supportsGL) s_opengl_mode = GLInterfaceMode::MODE_OPENGL; else if (supportsGLES3) s_opengl_mode = GLInterfaceMode::MODE_OPENGLES3; else if (supportsGLES2) s_opengl_mode = GLInterfaceMode::MODE_OPENGLES2; + err_exit: if (s_opengl_mode == GLInterfaceMode::MODE_DETECT) // Errored before we found a mode s_opengl_mode = GLInterfaceMode::MODE_OPENGL; // Fall back to OpenGL |
