diff options
author | 2016-05-16 13:36:29 -0700 | |
---|---|---|
committer | 2016-05-16 13:36:29 -0700 | |
commit | 14e54ba747942312f5cd143a27e603eacd7573f7 (patch) | |
tree | e69d4e4557c1b1783f158bc7ba775b1e2c5aaca1 | |
parent | 853f8f9c0b95120731459c1f7567af69ce457fe0 (diff) |
SF: Remove forced transaction on screenshot
Removes the forced transaction that screenshots used to perform
before capturing the screen. This was initially added to prevent
screenshot capture from sneaking in between when a transaction is
closed and when it is actually applied (at the next vsync), but in
the presence of deferred transactions today, forcing a transaction
to occur doesn't guarantee that the last transaction that
WindowManager pushed has actually been committed yet, since it may be
waiting for a buffer with which to synchronize.
If WindowManager wants to guarantee some arrangement of windows is
present for a screenshot, it needs to set the synchronous flag to
true when calling closeGlobalTransaction and wait for the call to
return.
Bug: 27098060
Change-Id: Iaa36d76df521076cc8ed16576f651543bae419a8
-rw-r--r-- | services/surfaceflinger/MessageQueue.cpp | 14 | ||||
-rw-r--r-- | services/surfaceflinger/MessageQueue.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 11 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 11 |
4 files changed, 0 insertions, 40 deletions
diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index 99efd3905f..34dc24b1f3 100644 --- a/services/surfaceflinger/MessageQueue.cpp +++ b/services/surfaceflinger/MessageQueue.cpp @@ -61,12 +61,6 @@ void MessageQueue::Handler::dispatchInvalidate() { } } -void MessageQueue::Handler::dispatchTransaction() { - if ((android_atomic_or(eventMaskTransaction, &mEventMask) & eventMaskTransaction) == 0) { - mQueue.mLooper->sendMessage(this, Message(MessageQueue::TRANSACTION)); - } -} - void MessageQueue::Handler::handleMessage(const Message& message) { switch (message.what) { case INVALIDATE: @@ -77,10 +71,6 @@ void MessageQueue::Handler::handleMessage(const Message& message) { android_atomic_and(~eventMaskRefresh, &mEventMask); mQueue.mFlinger->onMessageReceived(message.what); break; - case TRANSACTION: - android_atomic_and(~eventMaskTransaction, &mEventMask); - mQueue.mFlinger->onMessageReceived(message.what); - break; } } @@ -155,10 +145,6 @@ status_t MessageQueue::postMessage( */ #define INVALIDATE_ON_VSYNC 1 -void MessageQueue::invalidateTransactionNow() { - mHandler->dispatchTransaction(); -} - void MessageQueue::invalidate() { #if INVALIDATE_ON_VSYNC mEvents->requestNextVsync(); diff --git a/services/surfaceflinger/MessageQueue.h b/services/surfaceflinger/MessageQueue.h index b77e08e7cc..1004f4c0c6 100644 --- a/services/surfaceflinger/MessageQueue.h +++ b/services/surfaceflinger/MessageQueue.h @@ -73,7 +73,6 @@ class MessageQueue { virtual void handleMessage(const Message& message); void dispatchRefresh(); void dispatchInvalidate(); - void dispatchTransaction(); }; friend class Handler; @@ -93,7 +92,6 @@ public: enum { INVALIDATE = 0, REFRESH = 1, - TRANSACTION = 2 }; MessageQueue(); @@ -108,8 +106,6 @@ public: void invalidate(); // sends REFRESH message at next VSYNC void refresh(); - // sends TRANSACTION message immediately - void invalidateTransactionNow(); }; // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 91815f314e..7e048f362a 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -903,10 +903,6 @@ void SurfaceFlinger::setVsyncEnabled(int disp, int enabled) { void SurfaceFlinger::onMessageReceived(int32_t what) { ATRACE_CALL(); switch (what) { - case MessageQueue::TRANSACTION: { - handleMessageTransaction(); - break; - } case MessageQueue::INVALIDATE: { bool refreshNeeded = handleMessageTransaction(); refreshNeeded |= handleMessageInvalidate(); @@ -3274,13 +3270,6 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display, } }; - // make sure to process transactions before screenshots -- a transaction - // might already be pending but scheduled for VSYNC; this guarantees we - // will handle it before the screenshot. When VSYNC finally arrives - // the scheduled transaction will be a no-op. If no transactions are - // scheduled at this time, this will end-up being a no-op as well. - mEventQueue.invalidateTransactionNow(); - // this creates a "fake" BBinder which will serve as a "fake" remote // binder to receive the marshaled calls and forward them to the // real remote (a BpGraphicBufferProducer) diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index de46dfa0ff..223579fdd9 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -907,10 +907,6 @@ void SurfaceFlinger::eventControl(int disp, int event, int enabled) { void SurfaceFlinger::onMessageReceived(int32_t what) { ATRACE_CALL(); switch (what) { - case MessageQueue::TRANSACTION: { - handleMessageTransaction(); - break; - } case MessageQueue::INVALIDATE: { bool refreshNeeded = handleMessageTransaction(); refreshNeeded |= handleMessageInvalidate(); @@ -3297,13 +3293,6 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display, } }; - // make sure to process transactions before screenshots -- a transaction - // might already be pending but scheduled for VSYNC; this guarantees we - // will handle it before the screenshot. When VSYNC finally arrives - // the scheduled transaction will be a no-op. If no transactions are - // scheduled at this time, this will end-up being a no-op as well. - mEventQueue.invalidateTransactionNow(); - // this creates a "fake" BBinder which will serve as a "fake" remote // binder to receive the marshaled calls and forward them to the // real remote (a BpGraphicBufferProducer) |