blob: 62cc717c7783802737c8f34d5cf31a9602326948 [file] [log] [blame]
Irvelc274c632016-06-13 16:44:08 -07001/*
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_SURFACEINTERCEPTOR_H
18#define ANDROID_SURFACEINTERCEPTOR_H
19
Sahil Dhanjua05cafa2016-07-29 09:37:48 -070020#include <frameworks/native/cmds/surfacereplayer/proto/src/trace.pb.h>
Irvelc274c632016-06-13 16:44:08 -070021
22#include <mutex>
23
Pablo Gamito5cfc6e52020-09-10 11:18:03 +000024#include <binder/IBinder.h>
25
Lloyd Pique4dccc412018-01-22 17:21:36 -080026#include <gui/LayerState.h>
27
28#include <utils/KeyedVector.h>
Mark Salyzyn4dad9ce2016-09-29 08:08:05 -070029#include <utils/SortedVector.h>
Lloyd Pique4dccc412018-01-22 17:21:36 -080030#include <utils/StrongPointer.h>
Mark Salyzyn4dad9ce2016-09-29 08:08:05 -070031#include <utils/Vector.h>
32
Lloyd Pique4dccc412018-01-22 17:21:36 -080033#include "DisplayDevice.h"
34
Irvelc274c632016-06-13 16:44:08 -070035namespace android {
36
37class BufferItem;
38class Layer;
Robert Carr0d480722017-01-10 16:42:54 -080039class SurfaceFlinger;
Lloyd Pique4dccc412018-01-22 17:21:36 -080040struct ComposerState;
41struct DisplayDeviceState;
Irvelffc9efc2016-07-27 15:16:37 -070042struct DisplayState;
Irvelc274c632016-06-13 16:44:08 -070043struct layer_state_t;
Robert Delgadocb129942019-07-23 16:28:20 -070044using Transaction = surfaceflinger::Transaction;
45using Trace = surfaceflinger::Trace;
46using Rectangle = surfaceflinger::Rectangle;
47using SurfaceChange = surfaceflinger::SurfaceChange;
48using Increment = surfaceflinger::Increment;
49using DisplayChange = surfaceflinger::DisplayChange;
Irvelc274c632016-06-13 16:44:08 -070050
Robert Delgadoaa74a662019-07-31 13:02:33 -070051constexpr auto DEFAULT_FILENAME = "/data/misc/wmtrace/transaction_trace.pb";
Irvelc274c632016-06-13 16:44:08 -070052
Pablo Gamito5cfc6e52020-09-10 11:18:03 +000053class SurfaceInterceptor : public IBinder::DeathRecipient {
Lloyd Pique4dccc412018-01-22 17:21:36 -080054public:
55 virtual ~SurfaceInterceptor();
56
57 // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
58 virtual void enable(const SortedVector<sp<Layer>>& layers,
59 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) = 0;
60 virtual void disable() = 0;
61 virtual bool isEnabled() = 0;
62
Pablo Gamito5cfc6e52020-09-10 11:18:03 +000063 virtual void binderDied(const wp<IBinder>& who) = 0;
64
Lloyd Pique4dccc412018-01-22 17:21:36 -080065 // Intercept display and surface transactions
66 virtual void saveTransaction(
67 const Vector<ComposerState>& stateUpdates,
68 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +000069 const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID,
70 int originUID) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080071
72 // Intercept surface data
73 virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
74 virtual void saveSurfaceDeletion(const sp<const Layer>& layer) = 0;
Rob Carra79435b2020-03-06 14:46:07 -080075 virtual void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -080076 uint64_t frameNumber) = 0;
77
78 // Intercept display data
79 virtual void saveDisplayCreation(const DisplayDeviceState& info) = 0;
Dominik Laskowski663bd282018-04-19 15:26:54 -070080 virtual void saveDisplayDeletion(int32_t sequenceId) = 0;
81 virtual void savePowerModeUpdate(int32_t sequenceId, int32_t mode) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080082 virtual void saveVSyncEvent(nsecs_t timestamp) = 0;
83};
84
85namespace impl {
86
Irvelc274c632016-06-13 16:44:08 -070087/*
88 * SurfaceInterceptor intercepts and stores incoming streams of window
89 * properties on SurfaceFlinger.
90 */
Lloyd Pique4dccc412018-01-22 17:21:36 -080091class SurfaceInterceptor final : public android::SurfaceInterceptor {
Irvelc274c632016-06-13 16:44:08 -070092public:
Lloyd Pique4dccc412018-01-22 17:21:36 -080093 explicit SurfaceInterceptor(SurfaceFlinger* const flinger);
94 ~SurfaceInterceptor() override = default;
95
Irvelffc9efc2016-07-27 15:16:37 -070096 // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
97 void enable(const SortedVector<sp<Layer>>& layers,
Lloyd Pique4dccc412018-01-22 17:21:36 -080098 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) override;
99 void disable() override;
100 bool isEnabled() override;
Irvelc274c632016-06-13 16:44:08 -0700101
Pablo Gamito5cfc6e52020-09-10 11:18:03 +0000102 void binderDied(const wp<IBinder>& who) override;
103
Irvelffc9efc2016-07-27 15:16:37 -0700104 // Intercept display and surface transactions
105 void saveTransaction(const Vector<ComposerState>& stateUpdates,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800106 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000107 const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID,
108 int originUID) override;
Irvelffc9efc2016-07-27 15:16:37 -0700109
110 // Intercept surface data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800111 void saveSurfaceCreation(const sp<const Layer>& layer) override;
112 void saveSurfaceDeletion(const sp<const Layer>& layer) override;
Rob Carra79435b2020-03-06 14:46:07 -0800113 void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800114 uint64_t frameNumber) override;
Irvelffc9efc2016-07-27 15:16:37 -0700115
116 // Intercept display data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800117 void saveDisplayCreation(const DisplayDeviceState& info) override;
Dominik Laskowski663bd282018-04-19 15:26:54 -0700118 void saveDisplayDeletion(int32_t sequenceId) override;
119 void savePowerModeUpdate(int32_t sequenceId, int32_t mode) override;
Lloyd Pique4dccc412018-01-22 17:21:36 -0800120 void saveVSyncEvent(nsecs_t timestamp) override;
Irvelc274c632016-06-13 16:44:08 -0700121
122private:
Irvelffc9efc2016-07-27 15:16:37 -0700123 // The creation increments of Surfaces and Displays do not contain enough information to capture
124 // the initial state of each object, so a transaction with all of the missing properties is
125 // performed at the initial snapshot for each display and surface.
126 void saveExistingDisplaysLocked(
127 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays);
128 void saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers);
129 void addInitialSurfaceStateLocked(Increment* increment, const sp<const Layer>& layer);
130 void addInitialDisplayStateLocked(Increment* increment, const DisplayDeviceState& display);
131
Irvelc274c632016-06-13 16:44:08 -0700132 status_t writeProtoFileLocked();
Vishnu Nair456bbb22019-07-18 16:02:00 -0700133 const sp<const Layer> getLayer(const wp<const IBinder>& weakHandle) const;
Vishnu Nair456bbb22019-07-18 16:02:00 -0700134 int32_t getLayerId(const sp<const Layer>& layer) const;
135 int32_t getLayerIdFromWeakRef(const wp<const Layer>& layer) const;
136 int32_t getLayerIdFromHandle(const sp<const IBinder>& weakHandle) const;
Irvelc274c632016-06-13 16:44:08 -0700137
Irvelffc9efc2016-07-27 15:16:37 -0700138 Increment* createTraceIncrementLocked();
139 void addSurfaceCreationLocked(Increment* increment, const sp<const Layer>& layer);
140 void addSurfaceDeletionLocked(Increment* increment, const sp<const Layer>& layer);
Rob Carra79435b2020-03-06 14:46:07 -0800141 void addBufferUpdateLocked(Increment* increment, int32_t layerId, uint32_t width,
Irvelc274c632016-06-13 16:44:08 -0700142 uint32_t height, uint64_t frameNumber);
Irvelffc9efc2016-07-27 15:16:37 -0700143 void addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp);
144 void addDisplayCreationLocked(Increment* increment, const DisplayDeviceState& info);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700145 void addDisplayDeletionLocked(Increment* increment, int32_t sequenceId);
146 void addPowerModeUpdateLocked(Increment* increment, int32_t sequenceId, int32_t mode);
Irvelc274c632016-06-13 16:44:08 -0700147
Irvelffc9efc2016-07-27 15:16:37 -0700148 // Add surface transactions to the trace
149 SurfaceChange* createSurfaceChangeLocked(Transaction* transaction, int32_t layerId);
Irvelc274c632016-06-13 16:44:08 -0700150 void setProtoRectLocked(Rectangle* protoRect, const Rect& rect);
151 void addPositionLocked(Transaction* transaction, int32_t layerId, float x, float y);
152 void addDepthLocked(Transaction* transaction, int32_t layerId, uint32_t z);
153 void addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w, uint32_t h);
154 void addAlphaLocked(Transaction* transaction, int32_t layerId, float alpha);
155 void addMatrixLocked(Transaction* transaction, int32_t layerId,
156 const layer_state_t::matrix22_t& matrix);
157 void addTransparentRegionLocked(Transaction* transaction, int32_t layerId,
158 const Region& transRegion);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700159 void addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags, uint8_t mask);
Irvelc274c632016-06-13 16:44:08 -0700160 void addLayerStackLocked(Transaction* transaction, int32_t layerId, uint32_t layerStack);
161 void addCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700162 void addCornerRadiusLocked(Transaction* transaction, int32_t layerId, float cornerRadius);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800163 void addBackgroundBlurRadiusLocked(Transaction* transaction, int32_t layerId,
164 int32_t backgroundBlurRadius);
Irvelc274c632016-06-13 16:44:08 -0700165 void addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
Robert Carr0d480722017-01-10 16:42:54 -0800166 const sp<const Layer>& layer, uint64_t frameNumber);
Irvelc274c632016-06-13 16:44:08 -0700167 void addOverrideScalingModeLocked(Transaction* transaction, int32_t layerId,
168 int32_t overrideScalingMode);
Irvelffc9efc2016-07-27 15:16:37 -0700169 void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
170 void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000171 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
172 const Vector<DisplayState>& changedDisplays,
173 uint32_t transactionFlags, int originPID, int originUID);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700174 void addReparentLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
175 void addReparentChildrenLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
176 void addDetachChildrenLocked(Transaction* transaction, int32_t layerId, bool detached);
177 void addRelativeParentLocked(Transaction* transaction, int32_t layerId, int32_t parentId,
178 int z);
Vishnu Nair95a1ed42019-12-06 12:25:11 -0800179 void addShadowRadiusLocked(Transaction* transaction, int32_t layerId, float shadowRadius);
Irvelffc9efc2016-07-27 15:16:37 -0700180
181 // Add display transactions to the trace
Dominik Laskowski663bd282018-04-19 15:26:54 -0700182 DisplayChange* createDisplayChangeLocked(Transaction* transaction, int32_t sequenceId);
183 void addDisplaySurfaceLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700184 const sp<const IGraphicBufferProducer>& surface);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700185 void addDisplayLayerStackLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700186 uint32_t layerStack);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700187 void addDisplaySizeLocked(Transaction* transaction, int32_t sequenceId, uint32_t w,
Irvelffc9efc2016-07-27 15:16:37 -0700188 uint32_t h);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700189 void addDisplayProjectionLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700190 int32_t orientation, const Rect& viewport, const Rect& frame);
191 void addDisplayChangesLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700192 const DisplayState& state, int32_t sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700193
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000194 // Add transaction origin to trace
195 void setTransactionOriginLocked(Transaction* transaction, int32_t pid, int32_t uid);
Irvelc274c632016-06-13 16:44:08 -0700196
197 bool mEnabled {false};
198 std::string mOutputFileName {DEFAULT_FILENAME};
199 std::mutex mTraceMutex {};
200 Trace mTrace {};
Robert Carr0d480722017-01-10 16:42:54 -0800201 SurfaceFlinger* const mFlinger;
Irvelc274c632016-06-13 16:44:08 -0700202};
203
Lloyd Pique4dccc412018-01-22 17:21:36 -0800204} // namespace impl
Robert Delgadocb129942019-07-23 16:28:20 -0700205
Lloyd Pique4dccc412018-01-22 17:21:36 -0800206} // namespace android
Irvelc274c632016-06-13 16:44:08 -0700207
208#endif // ANDROID_SURFACEINTERCEPTOR_H