summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2023-10-17 19:51:39 +0000
committer Alec Mouri <alecmouri@google.com> 2023-11-15 17:26:19 +0000
commit21d94322a3bec4b8f16010b91eb1da564c345da7 (patch)
tree625742e64597343f190533807412dba2fbdeaed9 /services/surfaceflinger/Layer.cpp
parentecbfa07774714ed49884f8424e5d9a92826a8f9c (diff)
Assign previous release fence to previous frame ID
...as otherwise the release timestamps for EGL/Vk timing apis are shifted by one frame. Bug: 295456126 Bug: 301055892 Bug: 303385401 Bug: 310927247 Test: Log and inspect timestamps Change-Id: If1d8a525053591f15b95aeec8dc0bad8a13e6833
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rw-r--r--services/surfaceflinger/Layer.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 66ea15ca2d..63dba93792 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -165,6 +165,7 @@ Layer::Layer(const surfaceflinger::LayerCreationArgs& args)
mDrawingState.sequence = 0;
mDrawingState.transform.set(0, 0);
mDrawingState.frameNumber = 0;
+ mDrawingState.previousFrameNumber = 0;
mDrawingState.barrierFrameNumber = 0;
mDrawingState.producerId = 0;
mDrawingState.barrierProducerId = 0;
@@ -2931,7 +2932,6 @@ void Layer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult,
break;
}
}
-
if (ch != nullptr) {
ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
@@ -2940,6 +2940,10 @@ void Layer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult,
if (mBufferInfo.mBuffer) {
mPreviouslyPresentedLayerStacks.push_back(layerStack);
}
+
+ if (mDrawingState.frameNumber > 0) {
+ mDrawingState.previousFrameNumber = mDrawingState.frameNumber;
+ }
}
void Layer::onSurfaceFrameCreated(
@@ -3144,6 +3148,7 @@ void Layer::releasePreviousBuffer() {
void Layer::resetDrawingStateBufferInfo() {
mDrawingState.producerId = 0;
mDrawingState.frameNumber = 0;
+ mDrawingState.previousFrameNumber = 0;
mDrawingState.releaseBufferListener = nullptr;
mDrawingState.buffer = nullptr;
mDrawingState.acquireFence = sp<Fence>::make(-1);
@@ -3420,6 +3425,7 @@ bool Layer::setTransactionCompletedListeners(const std::vector<sp<CallbackHandle
// If this transaction set an acquire fence on this layer, set its acquire time
handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence;
handle->frameNumber = mDrawingState.frameNumber;
+ handle->previousFrameNumber = mDrawingState.previousFrameNumber;
// Store so latched time and release fence can be set
mDrawingState.callbackHandles.push_back(handle);