FrameTimestamps.h revision 4565daa628d914f05dabfeca83d2e5ee07936a99
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,
443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    GL_COMPOSITION_DONE,
453890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    DISPLAY_PRESENT,
463890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    DISPLAY_RETIRE,
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 {
543890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasPostedInfo() const;
553890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasRequestedPresentInfo() const;
563890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasLatchInfo() const;
573890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasFirstRefreshStartInfo() const;
583890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasLastRefreshStartInfo() const;
593890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasAcquireInfo() const;
603890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasGpuCompositionDoneInfo() const;
613890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasDisplayPresentInfo() const;
623890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasDisplayRetireInfo() const;
633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool hasReleaseInfo() const;
643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
65d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void checkFencesForCompletion();
66d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void dump(String8& outString) const;
67d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static constexpr size_t EVENT_COUNT =
693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            static_cast<size_t>(FrameEvent::EVENT_COUNT);
703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static_assert(EVENT_COUNT <= 32, "Event count sanity check failed.");
713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
72d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool valid{false};
73d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    uint64_t frameNumber{0};
74d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
75d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // Whether or not certain points in the frame's life cycle have been
76d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // encountered help us determine if timestamps aren't available because
77d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    // a) we'll just never get them or b) they're not ready yet.
78d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool addPostCompositeCalled{false};
79d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    bool addRetireCalled{false};
803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool addReleaseCalled{false};
81d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
823d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    nsecs_t postedTime{-1};
833d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    nsecs_t requestedPresentTime{-1};
843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    nsecs_t latchTime{-1};
853d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    nsecs_t firstRefreshStartTime{-1};
863d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    nsecs_t lastRefreshStartTime{-1};
873d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
883d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> gpuCompositionDoneFence{FenceTime::NO_FENCE};
903d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> displayPresentFence{FenceTime::NO_FENCE};
913d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> displayRetireFence{FenceTime::NO_FENCE};
923d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> releaseFence{FenceTime::NO_FENCE};
93d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
94d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
95d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
963890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A short history of frames that are synchronized between the consumer and
973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// producer via deltas.
983890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistory {
993890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1003890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    virtual ~FrameEventHistory();
1013890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1023890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEvents* getFrame(uint64_t frameNumber);
1033890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEvents* getFrame(uint64_t frameNumber, size_t* iHint);
1043890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void checkFencesForCompletion();
1053890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void dump(String8& outString) const;
1063890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1073890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static constexpr size_t MAX_FRAME_HISTORY = 8;
1083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1093890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprotected:
1103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::array<FrameEvents, MAX_FRAME_HISTORY> mFrames;
1113890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1123890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1133890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// The producer's interface to FrameEventHistory
1153890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass ProducerFrameEventHistory : public FrameEventHistory {
1163890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    ~ProducerFrameEventHistory() override;
1183890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void updateAcquireFence(
1203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            uint64_t frameNumber, std::shared_ptr<FenceTime>&& acquire);
1213890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void applyDelta(const FrameEventHistoryDelta& delta);
1223890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1233d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void updateSignalTimes();
1243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1253890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
1263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t mAcquireOffset{0};
1273d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1283d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // The consumer updates it's timelines in Layer and SurfaceFlinger since
1293d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // they can coordinate shared timelines better. The producer doesn't have
1303d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // shared timelines though, so just let it own and update all of them.
1313d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mAcquireTimeline;
1323d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mGpuCompositionDoneTimeline;
1333d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mPresentTimeline;
1343d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mRetireTimeline;
1353d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTimeline mReleaseTimeline;
1363890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1373890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1383890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1393890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Used by the consumer to create a new frame event record that is
1403890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// partially complete.
141d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonstruct NewFrameEventsEntry {
142d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    uint64_t frameNumber{0};
143d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    nsecs_t postedTime{0};
144d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    nsecs_t requestedPresentTime{0};
1453d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
146d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
147d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
148d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Used by the consumer to keep track of which fields it already sent to
1503890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// the producer.
1513890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventDirtyFields {
152d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonpublic:
1533890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline void reset() { mBitset.reset(); }
1543890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline bool anyDirty() const { return mBitset.any(); }
1553890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1563890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    template <FrameEvent event>
1573890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline void setDirty() {
1583890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        constexpr size_t eventIndex = static_cast<size_t>(event);
1593890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
1603890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        mBitset.set(eventIndex);
1613890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
1623890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    template <FrameEvent event>
1643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    inline bool isDirty() const {
1653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        constexpr size_t eventIndex = static_cast<size_t>(event);
1663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
1673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        return mBitset[eventIndex];
1683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
1693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1703890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
1713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::bitset<FrameEvents::EVENT_COUNT> mBitset;
1723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
1733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
174d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// The consumer's interface to FrameEventHistory
1763890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass ConsumerFrameEventHistory : public FrameEventHistory {
1773890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
1783890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    ~ConsumerFrameEventHistory() override;
1793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
1803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void addQueue(const NewFrameEventsEntry& newEntry);
181d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addLatch(uint64_t frameNumber, nsecs_t latchTime);
182d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addPreComposition(uint64_t frameNumber, nsecs_t refreshStartTime);
183d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    void addPostComposition(uint64_t frameNumber,
1843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::shared_ptr<FenceTime>& gpuCompositionDone,
1853d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::shared_ptr<FenceTime>& displayPresent);
1863d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void addRetire(uint64_t frameNumber,
1873d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::shared_ptr<FenceTime>& displayRetire);
1883d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void addRelease(uint64_t frameNumber,
1893d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            std::shared_ptr<FenceTime>&& release);
190d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
1913890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    void getAndResetDelta(FrameEventHistoryDelta* delta);
1923890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
193d6927fb1143398370c0885844bfb58923ef740b7Brian Andersonprivate:
1943d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    void getFrameDelta(FrameEventHistoryDelta* delta,
1953d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);
1963d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
1973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;
198d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mQueueOffset{0};
199d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mCompositionOffset{0};
200d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mRetireOffset{0};
201d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    size_t mReleaseOffset{0};
2024565daa628d914f05dabfeca83d2e5ee07936a99Brian Anderson
2034565daa628d914f05dabfeca83d2e5ee07936a99Brian Anderson    bool mProducerWantsEvents{false};
204d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson};
205d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson
2063890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2073890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A single frame update from the consumer to producer that can be sent
2083890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// through Binder.
2093890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// Although this may be sent multiple times for the same frame as new
2103890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// timestamps are set, Fences only need to be sent once.
2113890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventsDelta : public Flattenable<FrameEventsDelta> {
2123890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ProducerFrameEventHistory;
2133890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
2143890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEventsDelta() = default;
2153890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    FrameEventsDelta(size_t index,
2163890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            const FrameEvents& frameTimestamps,
2173890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            const FrameEventDirtyFields& dirtyFields);
2183890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2193d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Movable.
2203d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta(FrameEventsDelta&& src) = default;
2213d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta& operator=(FrameEventsDelta&& src) = default;
2223d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Not copyable.
2233d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta(const FrameEventsDelta& src) = delete;
2243d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventsDelta& operator=(const FrameEventsDelta& src) = delete;
2253d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // Flattenable implementation
2273890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFlattenedSize() const;
2283890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFdCount() const;
2293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t flatten(void*& buffer, size_t& size, int*& fds,
2303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count) const;
2313890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
2323890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count);
2333890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2343890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
2353890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static size_t minFlattenedSize();
2363890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2373890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t mIndex{0};
2383890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    uint64_t mFrameNumber{0};
2393890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2403890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddPostCompositeCalled{0};
2413890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddRetireCalled{0};
2423890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    bool mAddReleaseCalled{0};
2433890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2443890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    nsecs_t mPostedTime{0};
2453890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    nsecs_t mRequestedPresentTime{0};
2463890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    nsecs_t mLatchTime{0};
2473890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    nsecs_t mFirstRefreshStartTime{0};
2483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    nsecs_t mLastRefreshStartTime{0};
2493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2503d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mGpuCompositionDoneFence;
2513d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mDisplayPresentFence;
2523d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mDisplayRetireFence;
2533d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FenceTime::Snapshot mReleaseFence;
2543890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2553890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // This is a static method with an auto return value so we can call
2563890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // it without needing const and non-const versions.
2577c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    template <typename ThisT>
2587c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    static inline auto allFences(ThisT fed) ->
2597c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            std::array<decltype(&fed->mReleaseFence), 4> {
2603890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        return {{
2617c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            &fed->mGpuCompositionDoneFence, &fed->mDisplayPresentFence,
2627c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            &fed->mDisplayRetireFence, &fed->mReleaseFence
2633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        }};
2643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    }
2653890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
2663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// A collection of updates from consumer to producer that can be sent
2693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson// through Binder.
2703890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonclass FrameEventHistoryDelta
2713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        : public Flattenable<FrameEventHistoryDelta> {
2723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2733890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ConsumerFrameEventHistory;
2743890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonfriend class ProducerFrameEventHistory;
2753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2763890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonpublic:
2773d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta() = default;
2783d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2793d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Movable.
2803d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta(FrameEventHistoryDelta&& src) = default;
2813d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta& operator=(FrameEventHistoryDelta&& src);
2823d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    // Not copyable.
2833d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta(const FrameEventHistoryDelta& src) = delete;
2843d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson    FrameEventHistoryDelta& operator=(
2853d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson            const FrameEventHistoryDelta& src) = delete;
2863d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2873890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    // Flattenable implementation.
2883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFlattenedSize() const;
2893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    size_t getFdCount() const;
2903890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t flatten(void*& buffer, size_t& size, int*& fds,
2913890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count) const;
2923890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
2933890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            size_t& count);
2943890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2953890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonprivate:
2963890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    static size_t minFlattenedSize();
2973890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
2983890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    std::vector<FrameEventsDelta> mDeltas;
2993890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson};
3003890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
3013890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson
302ce796e78a57018f186b062199c75d94545318acaPablo Ceballos} // namespace android
303ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#endif
304