From fa68e6620714e33b4a1d2f38d01c3c140494dccd Mon Sep 17 00:00:00 2001 From: "Jorge E. Moreira" <jemoreira@google.com> Date: Thu, 26 Sep 2019 14:11:12 -0700 Subject: [PATCH] Check GL extension is supported before using it in glwallpaper glwallpaper requests a GL context with low priority, however this feature is a GL extension that may not be available in the GL implementation (swiftshader, for example). Bug: 138834844 Test: run cuttlefish locally Change-Id: I72edeb0f4dc03e51bda22209415604e752c18e52 --- .../systemui/glwallpaper/EglHelper.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java index 6b5a780d6647b..c6812a75b3bfa 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java @@ -22,6 +22,7 @@ import static android.opengl.EGL14.EGL_CONFIG_CAVEAT; import static android.opengl.EGL14.EGL_CONTEXT_CLIENT_VERSION; import static android.opengl.EGL14.EGL_DEFAULT_DISPLAY; import static android.opengl.EGL14.EGL_DEPTH_SIZE; +import static android.opengl.EGL14.EGL_EXTENSIONS; import static android.opengl.EGL14.EGL_GREEN_SIZE; import static android.opengl.EGL14.EGL_NONE; import static android.opengl.EGL14.EGL_NO_CONTEXT; @@ -41,6 +42,7 @@ import static android.opengl.EGL14.eglGetDisplay; import static android.opengl.EGL14.eglGetError; import static android.opengl.EGL14.eglInitialize; import static android.opengl.EGL14.eglMakeCurrent; +import static android.opengl.EGL14.eglQueryString; import static android.opengl.EGL14.eglSwapBuffers; import static android.opengl.EGL14.eglTerminate; @@ -64,6 +66,7 @@ public class EglHelper { private static final int EGL_CONTEXT_PRIORITY_LEVEL_IMG = 0x3100; private static final int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103; private static final boolean DEBUG = true; + private static final String EGL_IMG_CONTEXT_PRIORITY = "EGL_IMG_context_priority"; private EGLDisplay mEglDisplay; private EGLConfig mEglConfig; @@ -71,6 +74,7 @@ public class EglHelper { private EGLSurface mEglSurface; private final int[] mEglVersion = new int[2]; private boolean mEglReady; + private boolean mContextPrioritySupported; /** * Initialize EGL and prepare EglSurface. @@ -106,10 +110,22 @@ public class EglHelper { return false; } + mContextPrioritySupported = isContextPrioritySuppported(); + mEglReady = true; return true; } + private boolean isContextPrioritySuppported() { + String[] extensions = eglQueryString(mEglDisplay, EGL_EXTENSIONS).split(" "); + for (String extension : extensions) { + if (extension.equals(EGL_IMG_CONTEXT_PRIORITY)) { + return true; + } + } + return false; + } + private EGLConfig chooseEglConfig() { int[] configsCount = new int[1]; EGLConfig[] configs = new EGLConfig[1]; @@ -202,8 +218,15 @@ public class EglHelper { Log.d(TAG, "createEglContext start"); } - int[] attrib_list = new int[] {EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_LOW_IMG, EGL_NONE}; + int[] attrib_list = new int[5]; + int idx = 0; + attrib_list[idx++] = EGL_CONTEXT_CLIENT_VERSION; + attrib_list[idx++] = 2; + if (mContextPrioritySupported) { + attrib_list[idx++] = EGL_CONTEXT_PRIORITY_LEVEL_IMG; + attrib_list[idx++] = EGL_CONTEXT_PRIORITY_LOW_IMG; + } + attrib_list[idx++] = EGL_NONE; if (hasEglDisplay()) { mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT, attrib_list, 0); } else { -- GitLab