diff options
author | Mathias Agopian <mathias@google.com> | 2012-09-24 19:26:11 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2012-09-24 19:26:11 -0700 |
commit | e96e9e1093b5700e9f403a6e2479da7dc36d3b71 (patch) | |
tree | 491a63497ce36abdfcd940c3770309f819bdb458 | |
parent | 13de3699807f3260cfbabd196a08191d6a80a99a (diff) | |
download | frameworks_native-e96e9e1093b5700e9f403a6e2479da7dc36d3b71.zip frameworks_native-e96e9e1093b5700e9f403a6e2479da7dc36d3b71.tar.gz frameworks_native-e96e9e1093b5700e9f403a6e2479da7dc36d3b71.tar.bz2 |
fix a crasher in SurfaceTexture's setFilteringEnabled
bug: 7211067
Change-Id: Id8658a8df429d76c20ab9112858b38e52343dc9c
-rw-r--r-- | include/gui/SurfaceTexture.h | 5 | ||||
-rw-r--r-- | libs/gui/SurfaceTexture.cpp | 24 |
2 files changed, 22 insertions, 7 deletions
diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h index 37e7eb1..7c519ae 100644 --- a/include/gui/SurfaceTexture.h +++ b/include/gui/SurfaceTexture.h @@ -259,10 +259,11 @@ private: // This method must be called with mMutex locked. virtual void freeBufferLocked(int slotIndex); - // computeCurrentTransformMatrix computes the transform matrix for the + // computeCurrentTransformMatrixLocked computes the transform matrix for the // current texture. It uses mCurrentTransform and the current GraphicBuffer // to compute this matrix and stores it in mCurrentTransformMatrix. - void computeCurrentTransformMatrix(); + // mCurrentTextureBuf must not be NULL. + void computeCurrentTransformMatrixLocked(); // doGLFenceWaitLocked inserts a wait command into the OpenGL ES command // stream to ensure that it is safe for future OpenGL ES commands to diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index cbd8c79..7daa074 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -317,7 +317,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter, bool skipSync) // texturing from this SurfaceTexture. doGLFenceWaitLocked(); } - computeCurrentTransformMatrix(); + computeCurrentTransformMatrixLocked(); } else { if (err < 0) { ST_LOGE("updateTexImage: acquire failed: %s (%d)", @@ -566,15 +566,24 @@ void SurfaceTexture::getTransformMatrix(float mtx[16]) { void SurfaceTexture::setFilteringEnabled(bool enabled) { Mutex::Autolock lock(mMutex); + if (mAbandoned) { + ST_LOGE("setFilteringEnabled: SurfaceTexture is abandoned!"); + return; + } bool needsRecompute = mFilteringEnabled != enabled; mFilteringEnabled = enabled; - if (needsRecompute) { - computeCurrentTransformMatrix(); + + if (needsRecompute && mCurrentTextureBuf==NULL) { + ST_LOGD("setFilteringEnabled called with mCurrentTextureBuf == NULL"); + } + + if (needsRecompute && mCurrentTextureBuf != NULL) { + computeCurrentTransformMatrixLocked(); } } -void SurfaceTexture::computeCurrentTransformMatrix() { - ST_LOGV("computeCurrentTransformMatrix"); +void SurfaceTexture::computeCurrentTransformMatrixLocked() { + ST_LOGV("computeCurrentTransformMatrixLocked"); float xform[16]; for (int i = 0; i < 16; i++) { @@ -603,6 +612,11 @@ void SurfaceTexture::computeCurrentTransformMatrix() { } sp<GraphicBuffer>& buf(mCurrentTextureBuf); + + if (buf == NULL) { + ST_LOGD("computeCurrentTransformMatrixLocked: mCurrentTextureBuf is NULL"); + } + Rect cropRect = mCurrentCrop; float tx = 0.0f, ty = 0.0f, sx = 1.0f, sy = 1.0f; float bufferWidth = buf->getWidth(); |