summaryrefslogtreecommitdiffstats
path: root/libs/surfaceflinger
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-01-20 13:56:07 -0800
committerMathias Agopian <mathias@google.com>2010-01-20 14:07:44 -0800
commitecc99c003b4aca7d7d2f268f927558db4cbddfe1 (patch)
treece0d4257ccfca6dad1867d7e7e83ca85475cd51e /libs/surfaceflinger
parent42d095aaa54a762ef74d219854aca8e1a7c6f5f6 (diff)
downloadframeworks_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.cpp28
-rw-r--r--libs/surfaceflinger/LayerBuffer.h1
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;