OSDN Git Service

RenderEngine: support non-RGBA_8888 format
authorChih-Wei Huang <cwhuang@linux.org.tw>
Fri, 28 Jul 2017 11:44:57 +0000 (19:44 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Sun, 10 Dec 2017 15:32:20 +0000 (23:32 +0800)
Some of our GPUs (e.g., radeon) don't support RGBA_8888 well.
To workaround it, just get the EGL config by a simpler query.

This patch should be reverted once all of our GPUs support
RGBA_8888.

services/surfaceflinger/RenderEngine/RenderEngine.cpp

index 56e9ac0..ceba9f7 100644 (file)
@@ -140,7 +140,7 @@ RenderEngine* RenderEngine::create(EGLDisplay display, int hwcFormat, uint32_t f
     }
     engine->setEGLHandles(config, ctxt);
 
-    ALOGI("OpenGL ES informations:");
+    ALOGI("OpenGL ES informations: format=0x%x", hwcFormat);
     ALOGI("vendor    : %s", extensions.getVendor());
     ALOGI("renderer  : %s", extensions.getRenderer());
     ALOGI("version   : %s", extensions.getVersion());
@@ -411,9 +411,14 @@ EGLConfig RenderEngine::chooseEglConfig(EGLDisplay display, int format,
     status_t err;
     EGLConfig config;
 
-    // First try to get an ES2 config
-    err = selectEGLConfig(display, format, EGL_OPENGL_ES2_BIT, &config);
-    if (err != NO_ERROR) {
+    // Only try to get an ES2 config if format is RGBA_8888
+    if (format != HAL_PIXEL_FORMAT_RGBA_8888) {
+        ALOGI("Trying a simpler query for non-RGBA_8888");
+        err = selectEGLConfig(display, format, 0, &config);
+        if (err != NO_ERROR) {
+            LOG_ALWAYS_FATAL("no suitable EGLConfig found, giving up");
+        }
+    } else if ((err = selectEGLConfig(display, format, EGL_OPENGL_ES2_BIT, &config)) != NO_ERROR) {
         // If ES2 fails, try ES1
         err = selectEGLConfig(display, format, EGL_OPENGL_ES_BIT, &config);
         if (err != NO_ERROR) {
@@ -435,7 +440,7 @@ EGLConfig RenderEngine::chooseEglConfig(EGLDisplay display, int format,
         eglGetConfigAttrib(display, config, EGL_GREEN_SIZE, &g);
         eglGetConfigAttrib(display, config, EGL_BLUE_SIZE,  &b);
         eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &a);
-        ALOGI("EGL information:");
+        ALOGI("EGL information: format=0x%x", format);
         ALOGI("vendor    : %s", eglQueryString(display, EGL_VENDOR));
         ALOGI("version   : %s", eglQueryString(display, EGL_VERSION));
         ALOGI("extensions: %s", eglQueryString(display, EGL_EXTENSIONS));