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