summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-09-24 19:26:11 -0700
committerMathias Agopian <mathias@google.com>2012-09-24 19:26:11 -0700
commite96e9e1093b5700e9f403a6e2479da7dc36d3b71 (patch)
tree491a63497ce36abdfcd940c3770309f819bdb458
parent13de3699807f3260cfbabd196a08191d6a80a99a (diff)
downloadframeworks_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.h5
-rw-r--r--libs/gui/SurfaceTexture.cpp24
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();