diff options
author | Mathias Agopian <mathias@google.com> | 2010-01-20 13:56:07 -0800 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2010-01-20 14:07:44 -0800 |
commit | ecc99c003b4aca7d7d2f268f927558db4cbddfe1 (patch) | |
tree | ce0d4257ccfca6dad1867d7e7e83ca85475cd51e /libs/surfaceflinger | |
parent | 42d095aaa54a762ef74d219854aca8e1a7c6f5f6 (diff) | |
download | frameworks_native-ecc99c003b4aca7d7d2f268f927558db4cbddfe1.zip frameworks_native-ecc99c003b4aca7d7d2f268f927558db4cbddfe1.tar.gz frameworks_native-ecc99c003b4aca7d7d2f268f927558db4cbddfe1.tar.bz2 |
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.
Diffstat (limited to 'libs/surfaceflinger')
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.cpp | 28 | ||||
-rw-r--r-- | 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 dbcb367..1dbfe34 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 90f83c4..1b31435 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<Buffer> mBuffer; status_t mStatus; |