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,
46f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson    DEQUEUE_READY,
473890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    RELEASE,
483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    EVENT_COUNT, // Not an actual event.
49ce796e78a57018f186b062199c75d94545318acaPablo Ceballos};
50ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
51d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
52d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson// A collection of timestamps corresponding to a single frame.
53d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonstruct FrameEvents {
54ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static constexpr auto EVENT_COUNT =
55ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson            static_cast<size_t>(FrameEvent::EVENT_COUNT);
56ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static_assert(EVENT_COUNT <= 32, "Event count sanity check failed.");
57dc96fdfa58260867c993fff78611220874753201Brian Anderson    static constexpr nsecs_t TIMESTAMP_PENDING = -2;
58ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson
59ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    static inline bool isValidTimestamp(nsecs_t time) {
60ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson        return time != TIMESTAMP_PENDING;
61ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    }
62ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson
633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasPostedInfo() const;
643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasRequestedPresentInfo() const;
653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasLatchInfo() const;
663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasFirstRefreshStartInfo() const;
673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasLastRefreshStartInfo() const;
683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasAcquireInfo() const;
693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasGpuCompositionDoneInfo() const;
703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasDisplayPresentInfo() const;
713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasReleaseInfo() const;
72f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson    bool hasDequeueReadyInfo() const;
733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
74d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void checkFencesForCompletion();
75d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void dump(String8& outString) const;
76d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
77d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool valid{false};
785ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    int connectId{0};
79d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    uint64_t frameNumber{0};
80d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
81d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // Whether or not certain points in the frame's life cycle have been
82d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // encountered help us determine if timestamps aren't available because
83d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // a) we'll just never get them or b) they're not ready yet.
84d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool addPostCompositeCalled{false};
853890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool addReleaseCalled{false};
86d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
87ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t postedTime{TIMESTAMP_PENDING};
88ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t requestedPresentTime{TIMESTAMP_PENDING};
89ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t latchTime{TIMESTAMP_PENDING};
90ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t firstRefreshStartTime{TIMESTAMP_PENDING};
91ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t lastRefreshStartTime{TIMESTAMP_PENDING};
92ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t dequeueReadyTime{TIMESTAMP_PENDING};
933d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
943d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
953d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> gpuCompositionDoneFence{FenceTime::NO_FENCE};
963d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> displayPresentFence{FenceTime::NO_FENCE};
973d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> releaseFence{FenceTime::NO_FENCE};
98d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
99d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1000a61b0c813f5991bf462e36a2314dda062727a10Brian Andersonstruct CompositorTiming {
1010a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t deadline{0};
1020a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t interval{16666667};
103d001058145c2186f454a3fb043388d6d9b84c9d8Brian Anderson    nsecs_t presentLatency{16666667};
1040a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson};
105d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1063890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A short history of frames that are synchronized between the consumer and
1073890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// producer via deltas.
1083890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistory {
1093890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    virtual ~FrameEventHistory();
1113890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1123890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEvents* getFrame(uint64_t frameNumber);
1133890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEvents* getFrame(uint64_t frameNumber, size_t* iHint);
1143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void checkFencesForCompletion();
1153890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void dump(String8& outString) const;
1163890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static constexpr size_t MAX_FRAME_HISTORY = 8;
1183890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1193890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprotected:
1203890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::array<FrameEvents, MAX_FRAME_HISTORY> mFrames;
1210a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1220a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming mCompositorTiming;
1233890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1243890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1253890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// The producer's interface to FrameEventHistory
1273890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass ProducerFrameEventHistory : public FrameEventHistory {
1283890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    ~ProducerFrameEventHistory() override;
1303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1310a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    // Public for testing.
1320a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    static nsecs_t snapToNextTick(
1330a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson            nsecs_t timestamp, nsecs_t tickPhase, nsecs_t tickInterval);
1340a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1350a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t getNextCompositeDeadline(const nsecs_t now) const;
1360a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t getCompositeInterval() const { return mCompositorTiming.interval; }
1370a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    nsecs_t getCompositeToPresentLatency() const {
1380a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson        return mCompositorTiming.presentLatency;
1390a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    }
1400a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
1413da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    // virtual for testing.
1423da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    virtual void updateAcquireFence(
1433d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            uint64_t frameNumber, std::shared_ptr<FenceTime>&& acquire);
1443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void applyDelta(const FrameEventHistoryDelta& delta);
1453890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1463d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void updateSignalTimes();
1473d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1483da8d2748580b2575e368e203ce2c7f8d34dea05Brian Andersonprotected:
1493da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    void applyFenceDelta(FenceTimeline* timeline,
1503da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson            std::shared_ptr<FenceTime>* dst,
1513da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson            const FenceTime::Snapshot& src) const;
1523da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson
1533da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    // virtual for testing.
1543da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson    virtual std::shared_ptr<FenceTime> createFenceTime(
1553da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson            const sp<Fence>& fence) const;
1563da8d2748580b2575e368e203ce2c7f8d34dea05Brian Anderson
1573890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t mAcquireOffset{0};
1583d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1593d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // The consumer updates it's timelines in Layer and SurfaceFlinger since
1603d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // they can coordinate shared timelines better. The producer doesn't have
1613d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // shared timelines though, so just let it own and update all of them.
1623d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mAcquireTimeline;
1633d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mGpuCompositionDoneTimeline;
1643d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mPresentTimeline;
1653d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mReleaseTimeline;
1663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Used by the consumer to create a new frame event record that is
1703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// partially complete.
171d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonstruct NewFrameEventsEntry {
172d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    uint64_t frameNumber{0};
173d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    nsecs_t postedTime{0};
174d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    nsecs_t requestedPresentTime{0};
1753d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
176d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
177d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
178d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Used by the consumer to keep track of which fields it already sent to
1803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// the producer.
1813890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventDirtyFields {
182d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonpublic:
1833890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline void reset() { mBitset.reset(); }
1843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline bool anyDirty() const { return mBitset.any(); }
1853890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1863890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    template <FrameEvent event>
1873890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline void setDirty() {
1883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        constexpr size_t eventIndex = static_cast<size_t>(event);
1893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
1903890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mBitset.set(eventIndex);
1913890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
1923890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1933890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    template <FrameEvent event>
1943890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline bool isDirty() const {
1953890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        constexpr size_t eventIndex = static_cast<size_t>(event);
1963890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
1973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        return mBitset[eventIndex];
1983890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
1993890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2003890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
2013890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::bitset<FrameEvents::EVENT_COUNT> mBitset;
2023890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
2033890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
204d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2053890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// The consumer's interface to FrameEventHistory
2063890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass ConsumerFrameEventHistory : public FrameEventHistory {
2073890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
2083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    ~ConsumerFrameEventHistory() override;
2093890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2105ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    void onDisconnect();
2115ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
2120a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    void initializeCompositorTiming(const CompositorTiming& compositorTiming);
2130a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson
2143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void addQueue(const NewFrameEventsEntry& newEntry);
215d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addLatch(uint64_t frameNumber, nsecs_t latchTime);
216d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addPreComposition(uint64_t frameNumber, nsecs_t refreshStartTime);
217d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addPostComposition(uint64_t frameNumber,
2183d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::shared_ptr<FenceTime>& gpuCompositionDone,
2190a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson            const std::shared_ptr<FenceTime>& displayPresent,
2200a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson            const CompositorTiming& compositorTiming);
221f6386862dffb0fb9cb39343d959104a32e5e95b7Brian Anderson    void addRelease(uint64_t frameNumber, nsecs_t dequeueReadyTime,
2223d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            std::shared_ptr<FenceTime>&& release);
223d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2243890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void getAndResetDelta(FrameEventHistoryDelta* delta);
2253890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
226d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonprivate:
2273d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void getFrameDelta(FrameEventHistoryDelta* delta,
2283d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);
2293d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;
2315ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
232d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mQueueOffset{0};
233d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mCompositionOffset{0};
234d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mReleaseOffset{0};
2354565daa628d914f05dabfeca83d2e5ee07936a99Brian Anderson
2365ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    int mCurrentConnectId{0};
2374565daa628d914f05dabfeca83d2e5ee07936a99Brian Anderson    bool mProducerWantsEvents{false};
238d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
239d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2403890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2413890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A single frame update from the consumer to producer that can be sent
2423890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// through Binder.
2433890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Although this may be sent multiple times for the same frame as new
2443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// timestamps are set, Fences only need to be sent once.
2453890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventsDelta : public Flattenable<FrameEventsDelta> {
2463890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ProducerFrameEventHistory;
2473890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
2483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEventsDelta() = default;
2493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEventsDelta(size_t index,
2503890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            const FrameEvents& frameTimestamps,
2513890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            const FrameEventDirtyFields& dirtyFields);
2523890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2533d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Movable.
2543d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta(FrameEventsDelta&& src) = default;
2553d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta& operator=(FrameEventsDelta&& src) = default;
2563d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Not copyable.
2573d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta(const FrameEventsDelta& src) = delete;
2583d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta& operator=(const FrameEventsDelta& src) = delete;
2593d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2603890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // Flattenable implementation
2613890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFlattenedSize() const;
2623890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFdCount() const;
2633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t flatten(void*& buffer, size_t& size, int*& fds,
2643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count) const;
2653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
2663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count);
2673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2683890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
2690a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    static constexpr size_t minFlattenedSize();
2703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t mIndex{0};
2723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    uint64_t mFrameNumber{0};
2733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2743890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddPostCompositeCalled{0};
2753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddReleaseCalled{0};
2763890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
277ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mPostedTime{FrameEvents::TIMESTAMP_PENDING};
278ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mRequestedPresentTime{FrameEvents::TIMESTAMP_PENDING};
279ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mLatchTime{FrameEvents::TIMESTAMP_PENDING};
280ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mFirstRefreshStartTime{FrameEvents::TIMESTAMP_PENDING};
281ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mLastRefreshStartTime{FrameEvents::TIMESTAMP_PENDING};
282ed816e6cb4ca15181bf6120890c85290b5f7c02bBrian Anderson    nsecs_t mDequeueReadyTime{FrameEvents::TIMESTAMP_PENDING};
2833890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mGpuCompositionDoneFence;
2853d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mDisplayPresentFence;
2863d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mReleaseFence;
2873890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // This is a static method with an auto return value so we can call
2893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // it without needing const and non-const versions.
2907c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    template <typename ThisT>
2917c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    static inline auto allFences(ThisT fed) ->
2924e606e3901b500bdd0f3ea21b8cb63734087bf0aBrian Anderson            std::array<decltype(&fed->mReleaseFence), 3> {
2933890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        return {{
2947c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            &fed->mGpuCompositionDoneFence, &fed->mDisplayPresentFence,
2954e606e3901b500bdd0f3ea21b8cb63734087bf0aBrian Anderson            &fed->mReleaseFence
2963890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        }};
2973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
2983890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
2993890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3003890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3013890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A collection of updates from consumer to producer that can be sent
3023890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// through Binder.
3033890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistoryDelta
3043890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        : public Flattenable<FrameEventHistoryDelta> {
3053890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3063890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ConsumerFrameEventHistory;
3073890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ProducerFrameEventHistory;
3083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3093890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
3103d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta() = default;
3113d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
3123d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Movable.
3133d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta(FrameEventHistoryDelta&& src) = default;
3143d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta& operator=(FrameEventHistoryDelta&& src);
3153d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Not copyable.
3163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta(const FrameEventHistoryDelta& src) = delete;
3173d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta& operator=(
3183d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const FrameEventHistoryDelta& src) = delete;
3193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
3203890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // Flattenable implementation.
3213890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFlattenedSize() const;
3223890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFdCount() const;
3233890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t flatten(void*& buffer, size_t& size, int*& fds,
3243890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count) const;
3253890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
3263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count);
3273890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3283890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
3290a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    static constexpr size_t minFlattenedSize();
3303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3313890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::vector<FrameEventsDelta> mDeltas;
3320a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson    CompositorTiming mCompositorTiming;
3333890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
3343890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3353890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
336ce796e78a57018f186b062199c75d94545318acaPablo Ceballos} // namespace android
337ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#endif
338