Home | History | Annotate | Download | only in gui
      1 /*
      2  * Copyright 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_GUI_FRAMETIMESTAMPS_H
     18 #define ANDROID_GUI_FRAMETIMESTAMPS_H
     19 
     20 #include <ui/FenceTime.h>
     21 #include <utils/Flattenable.h>
     22 #include <utils/StrongPointer.h>
     23 #include <utils/Timers.h>
     24 
     25 #include <array>
     26 #include <bitset>
     27 #include <vector>
     28 
     29 namespace android {
     30 
     31 struct FrameEvents;
     32 class FrameEventHistoryDelta;
     33 class String8;
     34 
     35 
     36 // Identifiers for all the events that may be recorded or reported.
     37 enum class FrameEvent {
     38     POSTED,
     39     REQUESTED_PRESENT,
     40     LATCH,
     41     ACQUIRE,
     42     FIRST_REFRESH_START,
     43     LAST_REFRESH_START,
     44     GPU_COMPOSITION_DONE,
     45     DISPLAY_PRESENT,
     46     DEQUEUE_READY,
     47     RELEASE,
     48     EVENT_COUNT, // Not an actual event.
     49 };
     50 
     51 
     52 // A collection of timestamps corresponding to a single frame.
     53 struct FrameEvents {
     54     static constexpr auto EVENT_COUNT =
     55             static_cast<size_t>(FrameEvent::EVENT_COUNT);
     56     static_assert(EVENT_COUNT <= 32, "Event count sanity check failed.");
     57     static constexpr nsecs_t TIMESTAMP_PENDING = -2;
     58 
     59     static inline bool isValidTimestamp(nsecs_t time) {
     60         return time != TIMESTAMP_PENDING;
     61     }
     62 
     63     bool hasPostedInfo() const;
     64     bool hasRequestedPresentInfo() const;
     65     bool hasLatchInfo() const;
     66     bool hasFirstRefreshStartInfo() const;
     67     bool hasLastRefreshStartInfo() const;
     68     bool hasAcquireInfo() const;
     69     bool hasGpuCompositionDoneInfo() const;
     70     bool hasDisplayPresentInfo() const;
     71     bool hasReleaseInfo() const;
     72     bool hasDequeueReadyInfo() const;
     73 
     74     void checkFencesForCompletion();
     75     void dump(String8& outString) const;
     76 
     77     bool valid{false};
     78     int connectId{0};
     79     uint64_t frameNumber{0};
     80 
     81     // Whether or not certain points in the frame's life cycle have been
     82     // encountered help us determine if timestamps aren't available because
     83     // a) we'll just never get them or b) they're not ready yet.
     84     bool addPostCompositeCalled{false};
     85     bool addReleaseCalled{false};
     86 
     87     nsecs_t postedTime{TIMESTAMP_PENDING};
     88     nsecs_t requestedPresentTime{TIMESTAMP_PENDING};
     89     nsecs_t latchTime{TIMESTAMP_PENDING};
     90     nsecs_t firstRefreshStartTime{TIMESTAMP_PENDING};
     91     nsecs_t lastRefreshStartTime{TIMESTAMP_PENDING};
     92     nsecs_t dequeueReadyTime{TIMESTAMP_PENDING};
     93 
     94     std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
     95     std::shared_ptr<FenceTime> gpuCompositionDoneFence{FenceTime::NO_FENCE};
     96     std::shared_ptr<FenceTime> displayPresentFence{FenceTime::NO_FENCE};
     97     std::shared_ptr<FenceTime> releaseFence{FenceTime::NO_FENCE};
     98 };
     99 
    100 struct CompositorTiming {
    101     nsecs_t deadline{0};
    102     nsecs_t interval{16666667};
    103     nsecs_t presentLatency{16666667};
    104 };
    105 
    106 // A short history of frames that are synchronized between the consumer and
    107 // producer via deltas.
    108 class FrameEventHistory {
    109 public:
    110     virtual ~FrameEventHistory();
    111 
    112     FrameEvents* getFrame(uint64_t frameNumber);
    113     FrameEvents* getFrame(uint64_t frameNumber, size_t* iHint);
    114     void checkFencesForCompletion();
    115     void dump(String8& outString) const;
    116 
    117     static constexpr size_t MAX_FRAME_HISTORY = 8;
    118 
    119 protected:
    120     std::array<FrameEvents, MAX_FRAME_HISTORY> mFrames;
    121 
    122     CompositorTiming mCompositorTiming;
    123 };
    124 
    125 
    126 // The producer's interface to FrameEventHistory
    127 class ProducerFrameEventHistory : public FrameEventHistory {
    128 public:
    129     ~ProducerFrameEventHistory() override;
    130 
    131     // Public for testing.
    132     static nsecs_t snapToNextTick(
    133             nsecs_t timestamp, nsecs_t tickPhase, nsecs_t tickInterval);
    134 
    135     nsecs_t getNextCompositeDeadline(const nsecs_t now) const;
    136     nsecs_t getCompositeInterval() const { return mCompositorTiming.interval; }
    137     nsecs_t getCompositeToPresentLatency() const {
    138         return mCompositorTiming.presentLatency;
    139     }
    140 
    141     // virtual for testing.
    142     virtual void updateAcquireFence(
    143             uint64_t frameNumber, std::shared_ptr<FenceTime>&& acquire);
    144     void applyDelta(const FrameEventHistoryDelta& delta);
    145 
    146     void updateSignalTimes();
    147 
    148 protected:
    149     void applyFenceDelta(FenceTimeline* timeline,
    150             std::shared_ptr<FenceTime>* dst,
    151             const FenceTime::Snapshot& src) const;
    152 
    153     // virtual for testing.
    154     virtual std::shared_ptr<FenceTime> createFenceTime(
    155             const sp<Fence>& fence) const;
    156 
    157     size_t mAcquireOffset{0};
    158 
    159     // The consumer updates it's timelines in Layer and SurfaceFlinger since
    160     // they can coordinate shared timelines better. The producer doesn't have
    161     // shared timelines though, so just let it own and update all of them.
    162     FenceTimeline mAcquireTimeline;
    163     FenceTimeline mGpuCompositionDoneTimeline;
    164     FenceTimeline mPresentTimeline;
    165     FenceTimeline mReleaseTimeline;
    166 };
    167 
    168 
    169 // Used by the consumer to create a new frame event record that is
    170 // partially complete.
    171 struct NewFrameEventsEntry {
    172     uint64_t frameNumber{0};
    173     nsecs_t postedTime{0};
    174     nsecs_t requestedPresentTime{0};
    175     std::shared_ptr<FenceTime> acquireFence{FenceTime::NO_FENCE};
    176 };
    177 
    178 
    179 // Used by the consumer to keep track of which fields it already sent to
    180 // the producer.
    181 class FrameEventDirtyFields {
    182 public:
    183     inline void reset() { mBitset.reset(); }
    184     inline bool anyDirty() const { return mBitset.any(); }
    185 
    186     template <FrameEvent event>
    187     inline void setDirty() {
    188         constexpr size_t eventIndex = static_cast<size_t>(event);
    189         static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
    190         mBitset.set(eventIndex);
    191     }
    192 
    193     template <FrameEvent event>
    194     inline bool isDirty() const {
    195         constexpr size_t eventIndex = static_cast<size_t>(event);
    196         static_assert(eventIndex < FrameEvents::EVENT_COUNT, "Bad index.");
    197         return mBitset[eventIndex];
    198     }
    199 
    200 private:
    201     std::bitset<FrameEvents::EVENT_COUNT> mBitset;
    202 };
    203 
    204 
    205 // The consumer's interface to FrameEventHistory
    206 class ConsumerFrameEventHistory : public FrameEventHistory {
    207 public:
    208     ~ConsumerFrameEventHistory() override;
    209 
    210     void onDisconnect();
    211 
    212     void initializeCompositorTiming(const CompositorTiming& compositorTiming);
    213 
    214     void addQueue(const NewFrameEventsEntry& newEntry);
    215     void addLatch(uint64_t frameNumber, nsecs_t latchTime);
    216     void addPreComposition(uint64_t frameNumber, nsecs_t refreshStartTime);
    217     void addPostComposition(uint64_t frameNumber,
    218             const std::shared_ptr<FenceTime>& gpuCompositionDone,
    219             const std::shared_ptr<FenceTime>& displayPresent,
    220             const CompositorTiming& compositorTiming);
    221     void addRelease(uint64_t frameNumber, nsecs_t dequeueReadyTime,
    222             std::shared_ptr<FenceTime>&& release);
    223 
    224     void getAndResetDelta(FrameEventHistoryDelta* delta);
    225 
    226 private:
    227     void getFrameDelta(FrameEventHistoryDelta* delta,
    228             const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);
    229 
    230     std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;
    231 
    232     size_t mQueueOffset{0};
    233     size_t mCompositionOffset{0};
    234     size_t mReleaseOffset{0};
    235 
    236     int mCurrentConnectId{0};
    237     bool mProducerWantsEvents{false};
    238 };
    239 
    240 
    241 // A single frame update from the consumer to producer that can be sent
    242 // through Binder.
    243 // Although this may be sent multiple times for the same frame as new
    244 // timestamps are set, Fences only need to be sent once.
    245 class FrameEventsDelta : public Flattenable<FrameEventsDelta> {
    246 friend class ProducerFrameEventHistory;
    247 public:
    248     FrameEventsDelta() = default;
    249     FrameEventsDelta(size_t index,
    250             const FrameEvents& frameTimestamps,
    251             const FrameEventDirtyFields& dirtyFields);
    252 
    253     // Movable.
    254     FrameEventsDelta(FrameEventsDelta&& src) = default;
    255     FrameEventsDelta& operator=(FrameEventsDelta&& src) = default;
    256     // Not copyable.
    257     FrameEventsDelta(const FrameEventsDelta& src) = delete;
    258     FrameEventsDelta& operator=(const FrameEventsDelta& src) = delete;
    259 
    260     // Flattenable implementation
    261     size_t getFlattenedSize() const;
    262     size_t getFdCount() const;
    263     status_t flatten(void*& buffer, size_t& size, int*& fds,
    264             size_t& count) const;
    265     status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
    266             size_t& count);
    267 
    268 private:
    269     static constexpr size_t minFlattenedSize();
    270 
    271     size_t mIndex{0};
    272     uint64_t mFrameNumber{0};
    273 
    274     bool mAddPostCompositeCalled{0};
    275     bool mAddReleaseCalled{0};
    276 
    277     nsecs_t mPostedTime{FrameEvents::TIMESTAMP_PENDING};
    278     nsecs_t mRequestedPresentTime{FrameEvents::TIMESTAMP_PENDING};
    279     nsecs_t mLatchTime{FrameEvents::TIMESTAMP_PENDING};
    280     nsecs_t mFirstRefreshStartTime{FrameEvents::TIMESTAMP_PENDING};
    281     nsecs_t mLastRefreshStartTime{FrameEvents::TIMESTAMP_PENDING};
    282     nsecs_t mDequeueReadyTime{FrameEvents::TIMESTAMP_PENDING};
    283 
    284     FenceTime::Snapshot mGpuCompositionDoneFence;
    285     FenceTime::Snapshot mDisplayPresentFence;
    286     FenceTime::Snapshot mReleaseFence;
    287 
    288     // This is a static method with an auto return value so we can call
    289     // it without needing const and non-const versions.
    290     template <typename ThisT>
    291     static inline auto allFences(ThisT fed) ->
    292             std::array<decltype(&fed->mReleaseFence), 3> {
    293         return {{
    294             &fed->mGpuCompositionDoneFence, &fed->mDisplayPresentFence,
    295             &fed->mReleaseFence
    296         }};
    297     }
    298 };
    299 
    300 
    301 // A collection of updates from consumer to producer that can be sent
    302 // through Binder.
    303 class FrameEventHistoryDelta
    304         : public Flattenable<FrameEventHistoryDelta> {
    305 
    306 friend class ConsumerFrameEventHistory;
    307 friend class ProducerFrameEventHistory;
    308 
    309 public:
    310     FrameEventHistoryDelta() = default;
    311 
    312     // Movable.
    313     FrameEventHistoryDelta(FrameEventHistoryDelta&& src) = default;
    314     FrameEventHistoryDelta& operator=(FrameEventHistoryDelta&& src);
    315     // Not copyable.
    316     FrameEventHistoryDelta(const FrameEventHistoryDelta& src) = delete;
    317     FrameEventHistoryDelta& operator=(
    318             const FrameEventHistoryDelta& src) = delete;
    319 
    320     // Flattenable implementation.
    321     size_t getFlattenedSize() const;
    322     size_t getFdCount() const;
    323     status_t flatten(void*& buffer, size_t& size, int*& fds,
    324             size_t& count) const;
    325     status_t unflatten(void const*& buffer, size_t& size, int const*& fds,
    326             size_t& count);
    327 
    328 private:
    329     static constexpr size_t minFlattenedSize();
    330 
    331     std::vector<FrameEventsDelta> mDeltas;
    332     CompositorTiming mCompositorTiming;
    333 };
    334 
    335 
    336 } // namespace android
    337 #endif
    338