blob: ed5731f8d977d019037c3c17d88317be6503be21 [file] [log] [blame]
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +00001/*
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
Siarhei Vishniakou99b9d382021-04-01 08:03:41 +000020#include <kll.h>
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000021#include <statslog.h>
22#include <utils/Timers.h>
23
24#include "InputEventTimeline.h"
25
26namespace android::inputdispatcher {
27
28enum 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/**
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000050 * Keep sketches of the provided events and report slow events
51 */
52class LatencyAggregator final : public InputEventTimelineProcessor {
53public:
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
64private:
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
Siarhei Vishniakou99b9d382021-04-01 08:03:41 +000080 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;
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000086};
87
88} // namespace android::inputdispatcher
89
90#endif // _UI_INPUT_INPUTDISPATCHER_LATENCYAGGREGATOR_H