1 /* 2 * Copyright (C) 2021 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 _UI_INPUT_INPUTDISPATCHER_LATENCYAGGREGATOR_H 18 #define _UI_INPUT_INPUTDISPATCHER_LATENCYAGGREGATOR_H 19 20 #include <kll.h> 21 #include <statslog.h> 22 #include <utils/Timers.h> 23 24 #include "InputEventTimeline.h" 25 26 namespace android::inputdispatcher { 27 28 enum SketchIndex : size_t { 29 EVENT_TO_READ = 0, 30 READ_TO_DELIVER = 1, 31 DELIVER_TO_CONSUME = 2, 32 CONSUME_TO_FINISH = 3, 33 CONSUME_TO_GPU_COMPLETE = 4, 34 GPU_COMPLETE_TO_PRESENT = 5, 35 END_TO_END = 6, // EVENT_TO_PRESENT 36 SIZE = 7, // Must be last 37 }; 38 39 // Let's create a full timeline here: 40 // eventTime 41 // readTime 42 // <---- after this point, the data becomes per-connection 43 // deliveryTime // time at which the event was sent to the receiver 44 // consumeTime // time at which the receiver read the event 45 // finishTime // time at which the finish event was received 46 // GraphicsTimeline::GPU_COMPLETED_TIME 47 // GraphicsTimeline::PRESENT_TIME 48 49 /** 50 * Keep sketches of the provided events and report slow events 51 */ 52 class LatencyAggregator final : public InputEventTimelineProcessor { 53 public: 54 LatencyAggregator(); 55 /** 56 * Record a complete event timeline 57 */ 58 void processTimeline(const InputEventTimeline& timeline) override; 59 60 std::string dump(const char* prefix); 61 62 ~LatencyAggregator(); 63 64 private: 65 static AStatsManager_PullAtomCallbackReturn pullAtomCallback(int32_t atom_tag, 66 AStatsEventList* data, 67 void* cookie); 68 AStatsManager_PullAtomCallbackReturn pullData(AStatsEventList* data); 69 // ---------- Slow event handling ---------- 70 void processSlowEvent(const InputEventTimeline& timeline); 71 nsecs_t mLastSlowEventTime = 0; 72 // How many slow events have been skipped due to rate limiting 73 size_t mNumSkippedSlowEvents = 0; 74 // How many events have been received since the last time we reported a slow event 75 size_t mNumEventsSinceLastSlowEventReport = 0; 76 77 // ---------- Statistics handling ---------- 78 void processStatistics(const InputEventTimeline& timeline); 79 // Sketches 80 std::array<std::unique_ptr<dist_proc::aggregation::KllQuantile>, SketchIndex::SIZE> 81 mDownSketches; 82 std::array<std::unique_ptr<dist_proc::aggregation::KllQuantile>, SketchIndex::SIZE> 83 mMoveSketches; 84 // How many events have been processed so far 85 size_t mNumSketchEventsProcessed = 0; 86 }; 87 88 } // namespace android::inputdispatcher 89 90 #endif // _UI_INPUT_INPUTDISPATCHER_LATENCYAGGREGATOR_H 91