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 | d2832fb4154771e42f7a4fdb8286ac85827ebe9d (patch) | |
| tree | 2f3fa8a8835a53a2fa2f054f6c14673440baa88e /libs/surfaceflinger/LayerBuffer.cpp | |
| parent | 3bc0346b3da584fcb529807b697ff6a22af18bb4 (diff) | |
| download | frameworks_base-d2832fb4154771e42f7a4fdb8286ac85827ebe9d.zip frameworks_base-d2832fb4154771e42f7a4fdb8286ac85827ebe9d.tar.gz frameworks_base-d2832fb4154771e42f7a4fdb8286ac85827ebe9d.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/LayerBuffer.cpp')
| -rw-r--r-- | libs/surfaceflinger/LayerBuffer.cpp | 28 |
1 files changed, 17 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, |
