diff options
| author | 2019-04-02 20:50:58 +0800 | |
|---|---|---|
| committer | 2019-12-13 09:31:53 +0000 | |
| commit | 544c52279b9348760314ebbd705ffa94e13ae28b (patch) | |
| tree | a7995ecd5805b8c77fbb0084962ca48b8387d10a /libs/gui/BufferQueueProducer.cpp | |
| parent | 5d4883d82c3983ce4b2d820b1bb32a320c4a3442 (diff) | |
Change the position of addAndGetFrameTimestamps when queueBuffer
BufferQueueProducer's addAndGetFrameTimestamps() call Layer to add a
new time record. When SurfaceFlinger latch buffer, it will fill
related information into the new record. Nevertheless, queueBuffer
call onFrameAvailable() before addAndGetFrameTimestamps().
SurfaceFlinger main thread may latch buffer before this thread add a
new time record. Then it cause that main thread can not fill related
information into the record. Therefore addAndGetFrameTimestamps()
should be called before call onFrameAvailable().
Bug: 146193345
Test: run cts-on-gsi -m CtsDeqpTestCases -t dEQP-EGL.functional.get_frame_timestamps#rgba8888_depth_stencil
Change-Id: Ie54480b7f8626d4cfa7f9a131f3e4fdcf211915d
Diffstat (limited to 'libs/gui/BufferQueueProducer.cpp')
| -rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 92ab41019e..3efb1b6acb 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -981,6 +981,17 @@ status_t BufferQueueProducer::queueBuffer(int slot, item.mGraphicBuffer.clear(); } + // Update and get FrameEventHistory. + nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); + NewFrameEventsEntry newFrameEventsEntry = { + currentFrameNumber, + postedTime, + requestedPresentTimestamp, + std::move(acquireFenceTime) + }; + addAndGetFrameTimestamps(&newFrameEventsEntry, + getFrameTimestamps ? &output->frameTimestamps : nullptr); + // Call back without the main BufferQueue lock held, but with the callback // lock held so we can ensure that callbacks occur in order @@ -1010,17 +1021,6 @@ status_t BufferQueueProducer::queueBuffer(int slot, mCallbackCondition.notify_all(); } - // Update and get FrameEventHistory. - nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); - NewFrameEventsEntry newFrameEventsEntry = { - currentFrameNumber, - postedTime, - requestedPresentTimestamp, - std::move(acquireFenceTime) - }; - addAndGetFrameTimestamps(&newFrameEventsEntry, - getFrameTimestamps ? &output->frameTimestamps : nullptr); - // Wait without lock held if (connectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a |