summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2015-07-22 16:47:11 -0500
committerRyan Houdek <Sonicadvance1@gmail.com>2015-07-22 16:47:11 -0500
commitc81bd32720bbafe48eb89f68444edec24ceae70a (patch)
tree12cdebe2f1b56dbe4f83c2b07c2b5a8e6fd885f6 /Source
parent6bcdae616be68f2702bb1e5beeb47e90004b6c46 (diff)
parentc4f0515141cd451468b29501b9c1d8925f7a9502 (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.cpp76
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