From ecc99c003b4aca7d7d2f268f927558db4cbddfe1 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Wed, 20 Jan 2010 13:56:07 -0800 Subject: [PATCH] part of fix for [2363362] [Sapphire] Corrupted raw picture displayed during snapshot make sure to fallback properly to software when copybit operation fails. with this change, the preview image will at least be displayed in b&w (since GL doesn't support the yuv format). This would also fix 2363506, but that one is now handled more cleanly. --- libs/surfaceflinger/LayerBuffer.cpp | 28 +++++++++++++++++----------- libs/surfaceflinger/LayerBuffer.h | 1 + 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp index dbcb367a9..1dbfe3489 100644 --- a/libs/surfaceflinger/LayerBuffer.cpp +++ b/libs/surfaceflinger/LayerBuffer.cpp @@ -444,10 +444,6 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const NativeBuffer src(ourBuffer->getBuffer()); const Rect transformedBounds(mLayer.getTransformedBounds()); - if (UNLIKELY(mTexture.name == -1LU)) { - mTexture.name = mLayer.createTexture(); - } - #if defined(EGL_ANDROID_image_native_buffer) if (mLayer.mFlags & DisplayHardware::DIRECT_TEXTURE) { copybit_device_t* copybit = mLayer.mBlitEngine; @@ -463,7 +459,9 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE); err = copybit->stretch(copybit, &dst.img, &src.img, &dst.crop, &src.crop, &clip); - + if (err != NO_ERROR) { + clearTempBufferImage(); + } } } else { err = INVALID_OPERATION; @@ -485,6 +483,9 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const t.format = src.img.format; t.data = (GGLubyte*)src.img.base; const Region dirty(Rect(t.width, t.height)); + if (UNLIKELY(mTexture.name == -1LU)) { + mTexture.name = mLayer.createTexture(); + } mLayer.loadTexture(&mTexture, dirty, t); } @@ -506,12 +507,7 @@ status_t LayerBuffer::BufferSource::initTempBuffer() const // we have an EGLImage, make sure the needed size didn't change if (w!=mTexture.width || h!= mTexture.height) { // delete the EGLImage and texture - EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay()); - glDeleteTextures(1, &mTexture.name); - eglDestroyImageKHR(dpy, mTexture.image); - Texture defaultTexture; - mTexture = defaultTexture; - mTempGraphicBuffer.clear(); + clearTempBufferImage(); } else { // we're good, we have an EGLImageKHR and it's (still) the // right size @@ -558,6 +554,16 @@ status_t LayerBuffer::BufferSource::initTempBuffer() const return err; } +void LayerBuffer::BufferSource::clearTempBufferImage() const +{ + EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay()); + glDeleteTextures(1, &mTexture.name); + eglDestroyImageKHR(dpy, mTexture.image); + Texture defaultTexture; + mTexture = defaultTexture; + mTempGraphicBuffer.clear(); +} + // --------------------------------------------------------------------------- LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, diff --git a/libs/surfaceflinger/LayerBuffer.h b/libs/surfaceflinger/LayerBuffer.h index 90f83c4c1..1b3143555 100644 --- a/libs/surfaceflinger/LayerBuffer.h +++ b/libs/surfaceflinger/LayerBuffer.h @@ -135,6 +135,7 @@ private: virtual void destroy() { } private: status_t initTempBuffer() const; + void clearTempBufferImage() const; mutable Mutex mBufferSourceLock; sp mBuffer; status_t mStatus;