diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h
index b11d572..8fa85b6 100644
--- a/include/gui/SurfaceTextureClient.h
+++ b/include/gui/SurfaceTextureClient.h
@@ -104,7 +104,6 @@
     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 @@
     // 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 2d7c89b..9b6bc38 100644
--- a/libs/gui/BufferQueue.cpp
+++ b/libs/gui/BufferQueue.cpp
@@ -495,9 +495,9 @@
         // 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 5d3bd1a..36a81a6 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -76,7 +76,6 @@
     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 @@
         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 @@
     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 @@
     return setCrop(reinterpret_cast<Rect const*>(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 const*>(rect));
-}
-
 int SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
     size_t bufferCount = va_arg(args, size_t);
     return setBufferCount(bufferCount);
@@ -501,7 +476,6 @@
         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 @@
 
     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 8546fb9..7d8dd33 100644
--- a/libs/gui/tests/SurfaceTextureClient_test.cpp
+++ b/libs/gui/tests/SurfaceTextureClient_test.cpp
@@ -442,50 +442,6 @@
     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);
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 2899db7..7eba89b 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -528,7 +528,6 @@
             mCurrentTransform = transform;
             mCurrentScalingMode = scalingMode;
             mFlinger->invalidateHwcGeometry();
-            recomputeVisibleRegions = true;
         }
 
         uint32_t bufWidth  = mActiveBuffer->getWidth();
@@ -537,7 +536,6 @@
             if (bufWidth != uint32_t(oldActiveBuffer->width) ||
                 bufHeight != uint32_t(oldActiveBuffer->height)) {
                 mFlinger->invalidateHwcGeometry();
-                recomputeVisibleRegions = true;
             }
         }
 
