SurfaceFlinger: check transaction timings even if it doesn't have a buffer
Bufferless transactions should also not be applied if they are considered
early.
Bug: 181978893
Test: launch an app and observe systraces
Test: adb shell /data/nativetest64/SurfaceFlinger_test/SurfaceFlinger_test
Change-Id: Ie6cff82f8316c1a299d4c9f151eaf637cb60e154
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e27b8dd..548d45d 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3389,18 +3389,16 @@
for (const ComposerState& state : states) {
const layer_state_t& s = state.state;
- if (!(s.what & layer_state_t::eAcquireFenceChanged)) {
- continue;
- }
-
- if (s.acquireFence && s.acquireFence->getStatus() == Fence::Status::Unsignaled) {
+ const bool acquireFenceChanged = (s.what & layer_state_t::eAcquireFenceChanged);
+ if (acquireFenceChanged && s.acquireFence &&
+ s.acquireFence->getStatus() == Fence::Status::Unsignaled) {
ready = false;
}
sp<Layer> layer = nullptr;
if (s.surface) {
layer = fromHandleLocked(s.surface).promote();
- } else {
+ } else if (acquireFenceChanged) {
ALOGW("Transaction with buffer, but no Layer?");
continue;
}
@@ -3420,11 +3418,14 @@
ready = false;
}
- // If backpressure is enabled and we already have a buffer to commit, keep the
- // transaction in the queue.
- const bool hasPendingBuffer = pendingBuffers.find(s.surface) != pendingBuffers.end();
- if (layer->backpressureEnabled() && hasPendingBuffer && isAutoTimestamp) {
- ready = false;
+ if (acquireFenceChanged) {
+ // If backpressure is enabled and we already have a buffer to commit, keep the
+ // transaction in the queue.
+ const bool hasPendingBuffer = pendingBuffers.find(s.surface) != pendingBuffers.end();
+ if (layer->backpressureEnabled() && hasPendingBuffer && isAutoTimestamp) {
+ ready = false;
+ }
+ pendingBuffers.insert(s.surface);
}
pendingBuffers.insert(s.surface);
}