diff options
author | John Reck <jreck@google.com> | 2015-07-16 17:01:22 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-07-16 17:01:22 +0000 |
commit | d5612d06c46e0a3e2d1b55cc4288ea6759b96a94 (patch) | |
tree | 8c1cb2e2040d7afae06ccdace0b4e87693b9cdcd /libs | |
parent | 245466b5734546264b0492455fd2f6dc135daf39 (diff) | |
parent | ba4f0757779d6e91e52ebee0fd4c847b673a69e2 (diff) | |
download | frameworks_base-d5612d06c46e0a3e2d1b55cc4288ea6759b96a94.zip frameworks_base-d5612d06c46e0a3e2d1b55cc4288ea6759b96a94.tar.gz frameworks_base-d5612d06c46e0a3e2d1b55cc4288ea6759b96a94.tar.bz2 |
am ba4f0757: Merge "Don\'t crash on makeCurrent fail" into mnc-dev
* commit 'ba4f0757779d6e91e52ebee0fd4c847b673a69e2':
Don't crash on makeCurrent fail
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/renderthread/EglManager.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/renderthread/EglManager.h | 2 |
3 files changed, 15 insertions, 5 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 260fb6f..09f93b8 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -145,7 +145,11 @@ void CanvasContext::setOpaque(bool opaque) { void CanvasContext::makeCurrent() { // TODO: Figure out why this workaround is needed, see b/13913604 // In the meantime this matches the behavior of GLRenderer, so it is not a regression - mHaveNewSurface |= mEglManager.makeCurrent(mEglSurface); + EGLint error = 0; + mHaveNewSurface |= mEglManager.makeCurrent(mEglSurface, &error); + if (error) { + setSurface(nullptr); + } } void CanvasContext::processLayerUpdate(DeferredLayerUpdater* layerUpdater) { diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp index cb34e00..eb332d5 100644 --- a/libs/hwui/renderthread/EglManager.cpp +++ b/libs/hwui/renderthread/EglManager.cpp @@ -217,7 +217,7 @@ void EglManager::destroy() { mCurrentSurface = EGL_NO_SURFACE; } -bool EglManager::makeCurrent(EGLSurface surface) { +bool EglManager::makeCurrent(EGLSurface surface, EGLint* errOut) { if (isCurrent(surface)) return false; if (surface == EGL_NO_SURFACE) { @@ -225,8 +225,14 @@ bool EglManager::makeCurrent(EGLSurface surface) { surface = mPBufferSurface; } if (!eglMakeCurrent(mEglDisplay, surface, surface, mEglContext)) { - LOG_ALWAYS_FATAL("Failed to make current on surface %p, error=%s", - (void*)surface, egl_error_str()); + if (errOut) { + *errOut = eglGetError(); + ALOGW("Failed to make current on surface %p, error=%s", + (void*)surface, egl_error_str(*errOut)); + } else { + LOG_ALWAYS_FATAL("Failed to make current on surface %p, error=%s", + (void*)surface, egl_error_str()); + } } mCurrentSurface = surface; return true; diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h index 8881de6..0a8cfd3 100644 --- a/libs/hwui/renderthread/EglManager.h +++ b/libs/hwui/renderthread/EglManager.h @@ -44,7 +44,7 @@ public: bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; } // Returns true if the current surface changed, false if it was already current - bool makeCurrent(EGLSurface surface); + bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr); void beginFrame(EGLSurface surface, EGLint* width, EGLint* height); bool swapBuffers(EGLSurface surface, const SkRect& dirty, EGLint width, EGLint height); |