FrameTimestamps.h revision ed816e6cb4ca15181bf6120890c85290b5f7c02b
1ce796e78a57018f186b062199c75d94545318acaPablo Ceballos/*
2ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * Copyright 2016 The Android Open Source Project
3ce796e78a57018f186b062199c75d94545318acaPablo Ceballos *
4ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * Licensed under the Apache License, Version 2.0 (the "License");
5ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * you may not use this file except in compliance with the License.
6ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * You may obtain a copy of the License at
7ce796e78a57018f186b062199c75d94545318acaPablo Ceballos *
8ce796e78a57018f186b062199c75d94545318acaPablo Ceballos *      http://www.apache.org/licenses/LICENSE-2.0
9ce796e78a57018f186b062199c75d94545318acaPablo Ceballos *
10ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * Unless required by applicable law or agreed to in writing, software
11ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * distributed under the License is distributed on an "AS IS" BASIS,
12ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * See the License for the specific language governing permissions and
14ce796e78a57018f186b062199c75d94545318acaPablo Ceballos * limitations under the License.
15ce796e78a57018f186b062199c75d94545318acaPablo Ceballos */
16ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
17ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#ifndef ANDROID_GUI_FRAMETIMESTAMPS_H
18ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#define ANDROID_GUI_FRAMETIMESTAMPS_H
19ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson#include <ui/FenceTime.h>
21ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#include <utils/Flattenable.h>
22d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#include <utils/StrongPointer.h>
23d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#include <utils/Timers.h>
24d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
25d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson#include <array>
263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson#include <bitset>
273890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson#include <vector>
28ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
29ce796e78a57018f186b062199c75d94545318acaPablo Ceballosnamespace android {
30ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
31d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonstruct FrameEvents;
323890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistoryDelta;
33d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonclass String8;
34d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
35d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
363d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson// Identifiers for all the events that may be recorded or reported.
373890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonenum class FrameEvent {
383890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    POSTED,
39069b365163470d2736eb6f591c354d208b5da23bBrian Anderson    REQUESTED_PRESENT,
403890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    LATCH,
41069b365163470d2736eb6f591c354d208b5da23bBrian Anderson    ACQUIRE,
423890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FIRST_REFRESH_START,
433890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    LAST_REFRESH_START,
44b04c6f03a2334b03ae0105ec005aeecfa61f4a90Brian Anderson    GPU_COMPOSITION_DONE,
453890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    DISPLAY_PRESENT,
463890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    DISPLAY_RETIRE,
47f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson    DEQUEUE_READY,
483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    RELEASE,
493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    EVENT_COUNT, // Not an actual event.
50ce796e78a57018f186b062199c75d94545318acaPablo Ceballos};
51ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
52d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
53d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson// A collection of timestamps corresponding to a single frame.
54d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonstruct FrameEvents {
55ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static constexpr auto EVENT_COUNT =
56ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson            static_cast<size_t>(FrameEvent::EVENT_COUNT);
57ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static_assert(EVENT_COUNT <= 32, "Event count sanity check failed.");
58ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static constexpr nsecs_t TIMESTAMP_PENDING =
59ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson            std::numeric_limits<nsecs_t>::max();
60ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson
61ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static inline bool isValidTimestamp(nsecs_t time) {
62ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson        return time != TIMESTAMP_PENDING;
63ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    }
64ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson
653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasPostedInfo() const;
663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasRequestedPresentInfo() const;
673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasLatchInfo() const;
683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasFirstRefreshStartInfo() const;
693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasLastRefreshStartInfo() const;
703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasAcquireInfo() const;
713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasGpuCompositionDoneInfo() const;
723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasDisplayPresentInfo() const;
733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasDisplayRetireInfo() const;
743890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasReleaseInfo() const;
75f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson    bool hasDequeueReadyInfo() const;
763890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
77d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void checkFencesForCompletion();
78d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void dump(String8& outString) const;
79d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
80d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool valid{false};
81d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    uint64_t frameNumber{0};
82d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
83d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // Whether or not certain points in the frame's life cycle have been
84d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // encountered help us determine if timestamps aren't available because
85d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // a) we'll just never get them or b) they're not ready yet.
86d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool addPostCompositeCalled{false};
87d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool addRetireCalled{false};
883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool addReleaseCalled{false};
89d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
90ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t postedTime{TIMESTAMP_PENDING};
91ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t requestedPresentTime{TIMESTAMP_PENDING};
92ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t latchTime{TIMESTAMP_PENDING};
93ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t firstRefreshStartTime{TIMESTAMP_PENDING};
94ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t lastRefreshStartTime{TIMESTAMP_PENDING};
95ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t dequeueReadyTime{TIMESTAMP_PENDING};
963d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
973d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
983d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> gpuCompositionDoneFence{FenceTime::NO_FENCE};
993d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> displayPresentFence{FenceTime::NO_FENCE};
1003d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> displayRetireFence{FenceTime::NO_FENCE};
1013d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> releaseFence{FenceTime::NO_FENCE};
102d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
103d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1040a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonstruct CompositorTiming {
1050a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t deadline{0};
1060a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t interval{16666667};
1070a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t presentLatency{0};
1080a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson};
109d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A short history of frames that are synchronized between the consumer and
1113890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// producer via deltas.
1123890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistory {
1133890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    virtual ~FrameEventHistory();
1153890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1163890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEvents* getFrame(uint64_t frameNumber);
1173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEvents* getFrame(uint64_t frameNumber, size_t* iHint);
1183890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void checkFencesForCompletion();
1193890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void dump(String8& outString) const;
1203890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1213890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static constexpr size_t MAX_FRAME_HISTORY = 8;
1223890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1233890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprotected:
1243890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::array<FrameEvents, MAX_FRAME_HISTORY> mFrames;
1250a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1260a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming mCompositorTiming;
1273890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1283890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// The producer's interface to FrameEventHistory
1313890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass ProducerFrameEventHistory : public FrameEventHistory {
1323890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1333890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    ~ProducerFrameEventHistory() override;
1343890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    // Public for testing.
1360a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    static nsecs_t snapToNextTick(
1370a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson            nsecs_t timestamp, nsecs_t tickPhase, nsecs_t tickInterval);
1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1390a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t getNextCompositeDeadline(const nsecs_t now) const;
1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t getCompositeInterval() const { return mCompositorTiming.interval; }
1410a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t getCompositeToPresentLatency() const {
1420a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        return mCompositorTiming.presentLatency;
1430a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    }
1440a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1453da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    // virtual for testing.
1463da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    virtual void updateAcquireFence(
1473d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            uint64_t frameNumber, std::shared_ptr<FenceTime>&& acquire);
1483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void applyDelta(const FrameEventHistoryDelta& delta);
1493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1503d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void updateSignalTimes();
1513d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1523da8d2748580b2575e368e203ce2c7f8d34dea05Brian Andersonprotected:
1533da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    void applyFenceDelta(FenceTimeline* timeline,
1543da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson            std::shared_ptr<FenceTime>* dst,
1553da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson            const FenceTime::Snapshot& src) const;
1563da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson
1573da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    // virtual for testing.
1583da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    virtual std::shared_ptr<FenceTime> createFenceTime(
1593da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson            const sp<Fence>& fence) const;
1603da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson
1613890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t mAcquireOffset{0};
1623d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1633d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // The consumer updates it's timelines in Layer and SurfaceFlinger since
1643d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // they can coordinate shared timelines better. The producer doesn't have
1653d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // shared timelines though, so just let it own and update all of them.
1663d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mAcquireTimeline;
1673d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mGpuCompositionDoneTimeline;
1683d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mPresentTimeline;
1693d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mRetireTimeline;
1703d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mReleaseTimeline;
1713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1743890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Used by the consumer to create a new frame event record that is
1753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// partially complete.
176d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonstruct NewFrameEventsEntry {
177d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    uint64_t frameNumber{0};
178d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    nsecs_t postedTime{0};
179d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    nsecs_t requestedPresentTime{0};
1803d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
181d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
182d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
183d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Used by the consumer to keep track of which fields it already sent to
1853890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// the producer.
1863890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventDirtyFields {
187d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonpublic:
1883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline void reset() { mBitset.reset(); }
1893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline bool anyDirty() const { return mBitset.any(); }
1903890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1913890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    template <FrameEvent event>
1923890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline void setDirty() {
1933890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        constexpr size_t eventIndex = static_cast<size_t>(event);
1943890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
1953890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mBitset.set(eventIndex);
1963890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
1973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1983890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    template <FrameEvent event>
1993890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline bool isDirty() const {
2003890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        constexpr size_t eventIndex = static_cast<size_t>(event);
2013890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
2023890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        return mBitset[eventIndex];
2033890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
2043890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2053890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
2063890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::bitset<FrameEvents::EVENT_COUNT> mBitset;
2073890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
2083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
209d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// The consumer's interface to FrameEventHistory
2113890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass ConsumerFrameEventHistory : public FrameEventHistory {
2123890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
2133890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    ~ConsumerFrameEventHistory() override;
2143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2150a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    void initializeCompositorTiming(const CompositorTiming& compositorTiming);
2160a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
2173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void addQueue(const NewFrameEventsEntry& newEntry);
218d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addLatch(uint64_t frameNumber, nsecs_t latchTime);
219d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addPreComposition(uint64_t frameNumber, nsecs_t refreshStartTime);
220d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addPostComposition(uint64_t frameNumber,
2213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::shared_ptr<FenceTime>& gpuCompositionDone,
2220a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson            const std::shared_ptr<FenceTime>& displayPresent,
2230a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson            const CompositorTiming& compositorTiming);
2243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void addRetire(uint64_t frameNumber,
2253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::shared_ptr<FenceTime>& displayRetire);
226f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson    void addRelease(uint64_t frameNumber, nsecs_t dequeueReadyTime,
2273d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            std::shared_ptr<FenceTime>&& release);
228d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void getAndResetDelta(FrameEventHistoryDelta* delta);
2303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
231d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonprivate:
2323d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void getFrameDelta(FrameEventHistoryDelta* delta,
2333d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);
2343d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2353890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;
236d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mQueueOffset{0};
237d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mCompositionOffset{0};
238d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mRetireOffset{0};
239d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mReleaseOffset{0};
2404565daa628d914f05dabfeca83d2e5ee07936a99Brian Anderson
2414565daa628d914f05dabfeca83d2e5ee07936a99Brian Anderson    bool mProducerWantsEvents{false};
242d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
243d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2453890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A single frame update from the consumer to producer that can be sent
2463890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// through Binder.
2473890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Although this may be sent multiple times for the same frame as new
2483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// timestamps are set, Fences only need to be sent once.
2493890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventsDelta : public Flattenable<FrameEventsDelta> {
2503890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ProducerFrameEventHistory;
2513890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
2523890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEventsDelta() = default;
2533890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEventsDelta(size_t index,
2543890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            const FrameEvents& frameTimestamps,
2553890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            const FrameEventDirtyFields& dirtyFields);
2563890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2573d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Movable.
2583d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta(FrameEventsDelta&& src) = default;
2593d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta& operator=(FrameEventsDelta&& src) = default;
2603d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Not copyable.
2613d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta(const FrameEventsDelta& src) = delete;
2623d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta& operator=(const FrameEventsDelta& src) = delete;
2633d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // Flattenable implementation
2653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFlattenedSize() const;
2663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFdCount() const;
2673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t flatten(void*& buffer, size_t& size, int*& fds,
2683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count) const;
2693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
2703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count);
2713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2723890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
2730a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    static constexpr size_t minFlattenedSize();
2743890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t mIndex{0};
2763890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    uint64_t mFrameNumber{0};
2773890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2783890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddPostCompositeCalled{0};
2793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddRetireCalled{0};
2803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddReleaseCalled{0};
2813890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
282ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mPostedTime{FrameEvents::TIMESTAMP_PENDING};
283ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mRequestedPresentTime{FrameEvents::TIMESTAMP_PENDING};
284ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mLatchTime{FrameEvents::TIMESTAMP_PENDING};
285ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mFirstRefreshStartTime{FrameEvents::TIMESTAMP_PENDING};
286ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mLastRefreshStartTime{FrameEvents::TIMESTAMP_PENDING};
287ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mDequeueReadyTime{FrameEvents::TIMESTAMP_PENDING};
2883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mGpuCompositionDoneFence;
2903d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mDisplayPresentFence;
2913d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mDisplayRetireFence;
2923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mReleaseFence;
2933890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2943890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // This is a static method with an auto return value so we can call
2953890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // it without needing const and non-const versions.
2967c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    template <typename ThisT>
2977c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    static inline auto allFences(ThisT fed) ->
2987c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            std::array<decltype(&fed->mReleaseFence), 4> {
2993890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        return {{
3007c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            &fed->mGpuCompositionDoneFence, &fed->mDisplayPresentFence,
3017c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            &fed->mDisplayRetireFence, &fed->mReleaseFence
3023890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        }};
3033890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
3043890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
3053890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3063890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3073890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A collection of updates from consumer to producer that can be sent
3083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// through Binder.
3093890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistoryDelta
3103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        : public Flattenable<FrameEventHistoryDelta> {
3113890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3123890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ConsumerFrameEventHistory;
3133890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ProducerFrameEventHistory;
3143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3153890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
3163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta() = default;
3173d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
3183d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Movable.
3193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta(FrameEventHistoryDelta&& src) = default;
3203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta& operator=(FrameEventHistoryDelta&& src);
3213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Not copyable.
3223d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta(const FrameEventHistoryDelta& src) = delete;
3233d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta& operator=(
3243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const FrameEventHistoryDelta& src) = delete;
3253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
3263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // Flattenable implementation.
3273890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFlattenedSize() const;
3283890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFdCount() const;
3293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t flatten(void*& buffer, size_t& size, int*& fds,
3303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count) const;
3313890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
3323890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count);
3333890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3343890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
3350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    static constexpr size_t minFlattenedSize();
3363890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3373890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::vector<FrameEventsDelta> mDeltas;
3380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming mCompositorTiming;
3393890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
3403890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3413890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
342ce796e78a57018f186b062199c75d94545318acaPablo Ceballos} // namespace android
343ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#endif
344