From b7a6b96301c00c630610df4cb55a45d666200817 Mon Sep 17 00:00:00 2001 From: Jamie Gennis Date: Sun, 13 May 2012 19:41:35 -0700 Subject: [PATCH 1/2] libgui: remove setPostTransformCrop This change removes the setPostTransformCrop function from SurfaceTextureClient. It also includes a small logging fix in BufferQueue. Bug: 6299171 Change-Id: Ifd0ed05b95dad6085e7a8267fda4d69b76ea3bad --- include/gui/SurfaceTextureClient.h | 8 --- libs/gui/BufferQueue.cpp | 4 +- libs/gui/SurfaceTextureClient.cpp | 51 +------------------- libs/gui/tests/SurfaceTextureClient_test.cpp | 44 ----------------- 4 files changed, 4 insertions(+), 103 deletions(-) diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h index b11d57271..8fa85b67e 100644 --- a/include/gui/SurfaceTextureClient.h +++ b/include/gui/SurfaceTextureClient.h @@ -104,7 +104,6 @@ protected: virtual int setBuffersTransform(int transform); virtual int setBuffersTimestamp(int64_t timestamp); virtual int setCrop(Rect const* rect); - virtual int setPostTransformCrop(Rect const* rect); virtual int setUsage(uint32_t reqUsage); virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); virtual int unlockAndPost(); @@ -159,13 +158,6 @@ private: // that gets queued. It is set by calling setCrop. Rect mCrop; - // mCropNeedsTransform indicates whether mCrop is in post-transform - // coordinates and must be transformed using the inverse of mTransform - // before being queued with a buffer. Otherwise the crop is passed - // untransformed. It is initialized to false, is set to true by - // setPostTransformCrop, and set to false by setCrop. - bool mCropNeedsTransform; - // mScalingMode is the scaling mode that will be used for the next // buffers that get queued. It is set by calling setScalingMode. int mScalingMode; diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index 2d7c89b84..9b6bc38ec 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -495,9 +495,9 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, // synchronizing access to it. It's too late at this point to abort the // dequeue operation. if (result == EGL_FALSE) { - ALOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError()); + ST_LOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError()); } else if (result == EGL_TIMEOUT_EXPIRED_KHR) { - ALOGE("dequeueBuffer: timeout waiting for fence"); + ST_LOGE("dequeueBuffer: timeout waiting for fence"); } eglDestroySyncKHR(dpy, fence); } diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 5d3bd1a1c..36a81a666 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -76,7 +76,6 @@ void SurfaceTextureClient::init() { mReqUsage = 0; mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO; mCrop.clear(); - mCropNeedsTransform = false; mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; mTransform = 0; mDefaultWidth = 0; @@ -238,25 +237,9 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) { return i; } - Rect crop(mCrop); - if (mCropNeedsTransform) { - // The crop rect was specified in the post-transform coordinate space, - // so we need to transform that rect by the inverse of mTransform to - // put it into the buffer pixel space before queuing it. - uint32_t invTransform = mTransform; - int32_t width = buffer->width; - int32_t height = buffer->height; - if (mTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { - invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | - NATIVE_WINDOW_TRANSFORM_FLIP_H; - width = buffer->height; - height = buffer->width; - } - crop = mCrop.transform(invTransform, width, height); - } - // Make sure the crop rectangle is entirely inside the buffer. - crop.intersect(Rect(buffer->width, buffer->height), &crop); + Rect crop; + mCrop.intersect(Rect(buffer->width, buffer->height), &crop); ISurfaceTexture::QueueBufferOutput output; ISurfaceTexture::QueueBufferInput input(timestamp, crop, mScalingMode, @@ -341,9 +324,6 @@ int SurfaceTextureClient::perform(int operation, va_list args) case NATIVE_WINDOW_SET_CROP: res = dispatchSetCrop(args); break; - case NATIVE_WINDOW_SET_POST_TRANSFORM_CROP: - res = dispatchSetPostTransformCrop(args); - break; case NATIVE_WINDOW_SET_BUFFER_COUNT: res = dispatchSetBufferCount(args); break; @@ -407,11 +387,6 @@ int SurfaceTextureClient::dispatchSetCrop(va_list args) { return setCrop(reinterpret_cast(rect)); } -int SurfaceTextureClient::dispatchSetPostTransformCrop(va_list args) { - android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); - return setPostTransformCrop(reinterpret_cast(rect)); -} - int SurfaceTextureClient::dispatchSetBufferCount(va_list args) { size_t bufferCount = va_arg(args, size_t); return setBufferCount(bufferCount); @@ -501,7 +476,6 @@ int SurfaceTextureClient::disconnect(int api) { mReqHeight = 0; mReqUsage = 0; mCrop.clear(); - mCropNeedsTransform = false; mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; mTransform = 0; if (api == NATIVE_WINDOW_API_CPU) { @@ -535,27 +509,6 @@ int SurfaceTextureClient::setCrop(Rect const* rect) Mutex::Autolock lock(mMutex); mCrop = realRect; - mCropNeedsTransform = false; - return NO_ERROR; -} - -int SurfaceTextureClient::setPostTransformCrop(Rect const* rect) -{ - ATRACE_CALL(); - - Rect realRect; - if (rect == NULL || rect->isEmpty()) { - realRect.clear(); - } else { - realRect = *rect; - } - - ALOGV("SurfaceTextureClient::setPostTransformCrop rect=[%d %d %d %d]", - realRect.left, realRect.top, realRect.right, realRect.bottom); - - Mutex::Autolock lock(mMutex); - mCrop = realRect; - mCropNeedsTransform = true; return NO_ERROR; } diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp index 8546fb94b..7d8dd3344 100644 --- a/libs/gui/tests/SurfaceTextureClient_test.cpp +++ b/libs/gui/tests/SurfaceTextureClient_test.cpp @@ -442,50 +442,6 @@ TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) { ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2])); } -TEST_F(SurfaceTextureClientTest, SetPostTransformCropUntransforms) { - android_native_rect_t rect = {1, 5, 4, 14}; - native_window_set_post_transform_crop(mANW.get(), &rect); - - uint32_t xforms[] = { - HAL_TRANSFORM_FLIP_H, - HAL_TRANSFORM_FLIP_V, - HAL_TRANSFORM_ROT_90, - HAL_TRANSFORM_ROT_180, - HAL_TRANSFORM_ROT_270, - }; - - Rect expectedRects[] = { - Rect(4, 5, 7, 14), // HAL_TRANSFORM_FLIP_H - Rect(1, 2, 4, 11), // HAL_TRANSFORM_FLIP_V - Rect(5, 4, 14, 7), // HAL_TRANSFORM_ROT_90 - Rect(4, 2, 7, 11), // HAL_TRANSFORM_ROT_180 - Rect(2, 1, 11, 4), // HAL_TRANSFORM_ROT_270 - }; - - for (size_t i = 0; i < sizeof(xforms)/sizeof(xforms[0]); i++) { - SCOPED_TRACE(String8::format("xform=%#x", xforms[i]).string()); - - int w = 8, h = 16; - if (xforms[i] & HAL_TRANSFORM_ROT_90) { - w = 16; - h = 8; - } - ASSERT_EQ(OK, native_window_set_buffers_transform(mANW.get(), xforms[i])); - ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), w, h)); - - android_native_buffer_t* buf; - ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf)); - ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf)); - ASSERT_EQ(OK, mST->updateTexImage()); - - Rect crop = mST->getCurrentCrop(); - EXPECT_EQ(expectedRects[i].left, crop.left); - EXPECT_EQ(expectedRects[i].top, crop.top); - EXPECT_EQ(expectedRects[i].right, crop.right); - EXPECT_EQ(expectedRects[i].bottom, crop.bottom); - } -} - TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) { android_native_rect_t rect = {-2, -13, 40, 18}; native_window_set_crop(mANW.get(), &rect); From cbad735d8cc4ff360341bf12d8c388edcbc78ce3 Mon Sep 17 00:00:00 2001 From: Jamie Gennis Date: Mon, 14 May 2012 15:30:16 -0700 Subject: [PATCH 2/2] SurfaceFlinger: recompute visible regions less This change removes some visible region recomputation that was needed to handle the SCALING_MODE_FREEZE cropping. We've changed things to use a window crop from the WindowManager instead, so this is no longer needed. Bug: 6299171 Change-Id: I32fbc2b689c985837126d8ba3d9a91e79613ffbf --- services/surfaceflinger/Layer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 2899db742..7eba89b7b 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -528,7 +528,6 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) mCurrentTransform = transform; mCurrentScalingMode = scalingMode; mFlinger->invalidateHwcGeometry(); - recomputeVisibleRegions = true; } uint32_t bufWidth = mActiveBuffer->getWidth(); @@ -537,7 +536,6 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) if (bufWidth != uint32_t(oldActiveBuffer->width) || bufHeight != uint32_t(oldActiveBuffer->height)) { mFlinger->invalidateHwcGeometry(); - recomputeVisibleRegions = true; } }