summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dan Stoza <stoza@google.com> 2016-05-16 13:36:29 -0700
committer Dan Stoza <stoza@google.com> 2016-05-16 13:36:29 -0700
commit14e54ba747942312f5cd143a27e603eacd7573f7 (patch)
treee69d4e4557c1b1783f158bc7ba775b1e2c5aaca1
parent853f8f9c0b95120731459c1f7567af69ce457fe0 (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.cpp14
-rw-r--r--services/surfaceflinger/MessageQueue.h4
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp11
-rw-r--r--services/surfaceflinger/SurfaceFlinger_hwc1.cpp11
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)