From 7347f0b5cdfff5d8758c7147b98dc04d8fb0fc32 Mon Sep 17 00:00:00 2001 From: David Stevens Date: Wed, 15 Jan 2020 20:19:22 +0900 Subject: libgui: make MAX_FRAME_HISTORY a configurable property Some devices have particularly large pipelines for decoding video. This can result in large queues of decoded frames waiting to be displayed. If the frame event history isn't large enough, then frame events can fall out of the queue before the buffers are actually rendered, which causes failures when processing consumer frame events. Test: manually check that MAX_FRAME_HISTORY is configurable at build Change-Id: I8bfcc6bf095e775c93a39669840d721417a58113 --- libs/gui/FrameTimestamps.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'libs/gui/FrameTimestamps.cpp') diff --git a/libs/gui/FrameTimestamps.cpp b/libs/gui/FrameTimestamps.cpp index c04d9072bb..3215eca50f 100644 --- a/libs/gui/FrameTimestamps.cpp +++ b/libs/gui/FrameTimestamps.cpp @@ -18,6 +18,7 @@ #define LOG_TAG "FrameEvents" +#include #include #include // For CC_[UN]LIKELY #include @@ -167,6 +168,11 @@ struct FrameNumberEqual { } // namespace +const size_t FrameEventHistory::MAX_FRAME_HISTORY = + sysprop::LibGuiProperties::frame_event_history_size().value_or(8); + +FrameEventHistory::FrameEventHistory() : mFrames(std::vector(MAX_FRAME_HISTORY)) {} + FrameEventHistory::~FrameEventHistory() = default; FrameEvents* FrameEventHistory::getFrame(uint64_t frameNumber) { @@ -348,6 +354,9 @@ std::shared_ptr ProducerFrameEventHistory::createFenceTime( // ConsumerFrameEventHistory // ============================================================================ +ConsumerFrameEventHistory::ConsumerFrameEventHistory() + : mFramesDirty(std::vector(MAX_FRAME_HISTORY)) {} + ConsumerFrameEventHistory::~ConsumerFrameEventHistory() = default; void ConsumerFrameEventHistory::onDisconnect() { @@ -443,9 +452,8 @@ void ConsumerFrameEventHistory::addRelease(uint64_t frameNumber, mFramesDirty[mReleaseOffset].setDirty(); } -void ConsumerFrameEventHistory::getFrameDelta( - FrameEventHistoryDelta* delta, - const std::array::iterator& frame) { +void ConsumerFrameEventHistory::getFrameDelta(FrameEventHistoryDelta* delta, + const std::vector::iterator& frame) { mProducerWantsEvents = true; size_t i = static_cast(std::distance(mFrames.begin(), frame)); if (mFramesDirty[i].anyDirty()) { -- cgit v1.2.3-59-g8ed1b