Merge "Don't crash on makeCurrent fail" into mnc-dev

This commit is contained in:
John Reck
2015-07-16 16:50:28 +00:00
committed by Android (Google) Code Review
3 changed files with 15 additions and 5 deletions

View File

@ -145,7 +145,11 @@ void CanvasContext::setOpaque(bool opaque) {
void CanvasContext::makeCurrent() { void CanvasContext::makeCurrent() {
// TODO: Figure out why this workaround is needed, see b/13913604 // 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 // 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) { void CanvasContext::processLayerUpdate(DeferredLayerUpdater* layerUpdater) {

View File

@ -217,7 +217,7 @@ void EglManager::destroy() {
mCurrentSurface = EGL_NO_SURFACE; mCurrentSurface = EGL_NO_SURFACE;
} }
bool EglManager::makeCurrent(EGLSurface surface) { bool EglManager::makeCurrent(EGLSurface surface, EGLint* errOut) {
if (isCurrent(surface)) return false; if (isCurrent(surface)) return false;
if (surface == EGL_NO_SURFACE) { if (surface == EGL_NO_SURFACE) {
@ -225,8 +225,14 @@ bool EglManager::makeCurrent(EGLSurface surface) {
surface = mPBufferSurface; surface = mPBufferSurface;
} }
if (!eglMakeCurrent(mEglDisplay, surface, surface, mEglContext)) { if (!eglMakeCurrent(mEglDisplay, surface, surface, mEglContext)) {
LOG_ALWAYS_FATAL("Failed to make current on surface %p, error=%s", if (errOut) {
(void*)surface, egl_error_str()); *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; mCurrentSurface = surface;
return true; return true;

View File

@ -44,7 +44,7 @@ public:
bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; } bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; }
// Returns true if the current surface changed, false if it was already current // 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); void beginFrame(EGLSurface surface, EGLint* width, EGLint* height);
bool swapBuffers(EGLSurface surface, const SkRect& dirty, EGLint width, EGLint height); bool swapBuffers(EGLSurface surface, const SkRect& dirty, EGLint width, EGLint height);