diff options
| author | 2010-01-20 15:08:27 -0800 | |
|---|---|---|
| committer | 2010-01-20 15:08:27 -0800 | |
| commit | 6fb0f22b294f5ded0a60e49e0725d38419fe89b2 (patch) | |
| tree | eb669b6d99df1a39059f93f30863a9c075edbfb2 /libs/surfaceflinger/LayerBuffer.cpp | |
| parent | af07b591bbb39df30f6018c5a64791552a06ed00 (diff) | |
| parent | d2832fb4154771e42f7a4fdb8286ac85827ebe9d (diff) | |
Merge "part of fix for [2363362] [Sapphire] Corrupted raw picture displayed during snapshot"
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 dbcb367a93bd..1dbfe34892fd 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, |