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