Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7347f0b5 authored by David Stevens's avatar David Stevens
Browse files

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
parent 2f1e99b8
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -166,6 +166,10 @@ cc_defaults {
        "bufferqueue/2.0/types.cpp",
    ],

    whole_static_libs: [
        "LibGuiProperties",
    ],

    shared_libs: [
        "android.hardware.graphics.bufferqueue@1.0",
        "android.hardware.graphics.bufferqueue@2.0",
+11 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#define LOG_TAG "FrameEvents"

#include <LibGuiProperties.sysprop.h>
#include <android-base/stringprintf.h>
#include <cutils/compiler.h>  // For CC_[UN]LIKELY
#include <inttypes.h>
@@ -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<FrameEvents>(MAX_FRAME_HISTORY)) {}

FrameEventHistory::~FrameEventHistory() = default;

FrameEvents* FrameEventHistory::getFrame(uint64_t frameNumber) {
@@ -348,6 +354,9 @@ std::shared_ptr<FenceTime> ProducerFrameEventHistory::createFenceTime(
// ConsumerFrameEventHistory
// ============================================================================

ConsumerFrameEventHistory::ConsumerFrameEventHistory()
      : mFramesDirty(std::vector<FrameEventDirtyFields>(MAX_FRAME_HISTORY)) {}

ConsumerFrameEventHistory::~ConsumerFrameEventHistory() = default;

void ConsumerFrameEventHistory::onDisconnect() {
@@ -443,9 +452,8 @@ void ConsumerFrameEventHistory::addRelease(uint64_t frameNumber,
    mFramesDirty[mReleaseOffset].setDirty<FrameEvent::RELEASE>();
}

void ConsumerFrameEventHistory::getFrameDelta(
        FrameEventHistoryDelta* delta,
        const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame) {
void ConsumerFrameEventHistory::getFrameDelta(FrameEventHistoryDelta* delta,
                                              const std::vector<FrameEvents>::iterator& frame) {
    mProducerWantsEvents = true;
    size_t i = static_cast<size_t>(std::distance(mFrames.begin(), frame));
    if (mFramesDirty[i].anyDirty()) {
+6 −4
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ struct CompositorTiming {
// producer via deltas.
class FrameEventHistory {
public:
    FrameEventHistory();
    virtual ~FrameEventHistory();

    FrameEvents* getFrame(uint64_t frameNumber);
@@ -113,10 +114,10 @@ public:
    void checkFencesForCompletion();
    void dump(std::string& outString) const;

    static constexpr size_t MAX_FRAME_HISTORY = 8;
    static const size_t MAX_FRAME_HISTORY;

protected:
    std::array<FrameEvents, MAX_FRAME_HISTORY> mFrames;
    std::vector<FrameEvents> mFrames;

    CompositorTiming mCompositorTiming;
};
@@ -204,6 +205,7 @@ private:
// The consumer's interface to FrameEventHistory
class ConsumerFrameEventHistory : public FrameEventHistory {
public:
    ConsumerFrameEventHistory();
    ~ConsumerFrameEventHistory() override;

    void onDisconnect();
@@ -224,9 +226,9 @@ public:

private:
    void getFrameDelta(FrameEventHistoryDelta* delta,
            const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);
                       const std::vector<FrameEvents>::iterator& frame);

    std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;
    std::vector<FrameEventDirtyFields> mFramesDirty;

    size_t mQueueOffset{0};
    size_t mCompositionOffset{0};
+7 −0
Original line number Diff line number Diff line
sysprop_library {
    name: "LibGuiProperties",
    srcs: ["*.sysprop"],
    api_packages: ["android.sysprop"],
    property_owner: "Platform",
    vendor_available: true,
}
+25 −0
Original line number Diff line number Diff line
# Copyright (C) 2020 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the License);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an AS IS BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

module: "android.sysprop.LibGuiProperties"
owner: Platform

# Indicates how many elements should be present in the frame event histories.
prop {
    api_name: "frame_event_history_size"
    type: Integer
    scope: Public
    access: Readonly
    prop_name: "ro.lib_gui.frame_event_history_size"
}
Loading