| Index: platform_tools/android/apps/visualbench/src/main/jni/SkOSWindow_AndroidNative.cpp
|
| diff --git a/platform_tools/android/apps/visualbench/src/main/jni/SkOSWindow_AndroidNative.cpp b/platform_tools/android/apps/visualbench/src/main/jni/SkOSWindow_AndroidNative.cpp
|
| index a35742b2d084530ba3a2604f5cc07a91f3fac98a..df1ca96374a19f933ce7cea18b299bf87ceea2a7 100644
|
| --- a/platform_tools/android/apps/visualbench/src/main/jni/SkOSWindow_AndroidNative.cpp
|
| +++ b/platform_tools/android/apps/visualbench/src/main/jni/SkOSWindow_AndroidNative.cpp
|
| @@ -50,15 +50,21 @@ bool SkOSWindow::attach(SkBackEndTypes attachType,
|
| },
|
| };
|
|
|
| - size_t apiLimit = SK_ARRAY_COUNT(kAPIs);
|
| -
|
| - for (size_t api = 0; api < apiLimit; ++api) {
|
| - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
| + EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
| + if (EGL_NO_DISPLAY == display) {
|
| + return false;
|
| + }
|
|
|
| - EGLint majorVersion;
|
| - EGLint minorVersion;
|
| - eglInitialize(display, &majorVersion, &minorVersion);
|
| + EGLint majorVersion;
|
| + EGLint minorVersion;
|
| + if (!eglInitialize(display, &majorVersion, &minorVersion)) {
|
| + return false;
|
| + }
|
|
|
| + for (size_t api = 0; api < SK_ARRAY_COUNT(kAPIs); ++api) {
|
| + if (!eglBindAPI(kAPIs[api].fAPI)) {
|
| + continue;
|
| + }
|
| #if 0
|
| SkDebugf("VENDOR: %s\n", eglQueryString(fDisplay, EGL_VENDOR));
|
| SkDebugf("APIS: %s\n", eglQueryString(fDisplay, EGL_CLIENT_APIS));
|
| @@ -66,10 +72,6 @@ bool SkOSWindow::attach(SkBackEndTypes attachType,
|
| SkDebugf("EXTENSIONS %s\n", eglQueryString(fDisplay, EGL_EXTENSIONS));
|
| #endif
|
|
|
| - if (!eglBindAPI(kAPIs[api].fAPI)) {
|
| - continue;
|
| - }
|
| -
|
| const EGLint configAttribs[] = {
|
| EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
|
| EGL_RENDERABLE_TYPE, kAPIs[api].fRenderableTypeBit,
|
| @@ -89,31 +91,44 @@ bool SkOSWindow::attach(SkBackEndTypes attachType,
|
| /* Here, the application chooses the configuration it desires. In this
|
| * sample, we have a very simplified selection process, where we pick
|
| * the first EGLConfig that matches our criteria */
|
| - eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
|
| + if (!eglChooseConfig(display, configAttribs, &config, 1, &numConfigs) ||
|
| + numConfigs != 1) {
|
| + continue;
|
| + }
|
|
|
| /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
|
| * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
|
| * As soon as we picked a EGLConfig, we can safely reconfigure the
|
| * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
|
| - eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
|
| + if (!eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format)) {
|
| + continue;
|
| + }
|
|
|
| ANativeWindow_setBuffersGeometry(fNativeWindow, 0, 0, format);
|
|
|
| surface = eglCreateWindowSurface(display, config, fNativeWindow, nullptr);
|
| + if (EGL_NO_SURFACE == surface) {
|
| + SkDebugf("eglCreateWindowSurface failed. EGL Error: 0x%08x\n", eglGetError());
|
| + continue;
|
| + }
|
| context = eglCreateContext(display, config, nullptr, kAPIs[api].fContextAttribs);
|
| if (EGL_NO_CONTEXT == context) {
|
| SkDebugf("eglCreateContext failed. EGL Error: 0x%08x\n", eglGetError());
|
| + eglDestroySurface(display, surface);
|
| continue;
|
| }
|
|
|
| if (!eglMakeCurrent(display, surface, surface, context)) {
|
| SkDebugf("eglMakeCurrent failed. EGL Error: 0x%08x\n", eglGetError());
|
| + eglDestroyContext(display, context);
|
| + eglDestroySurface(display, surface);
|
| continue;
|
| }
|
|
|
| fWindow.fDisplay = display;
|
| fWindow.fContext = context;
|
| fWindow.fSurface = surface;
|
| + break;
|
| }
|
|
|
| if (fWindow.fDisplay && fWindow.fContext && fWindow.fSurface) {
|
|
|