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