blob: c9555969dcc5bb0e3fcfdbb7a79ea1177d60c4ca [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 Gamito6ee484d2020-07-30 14:26:28 +000063 virtual void addTransactionTraceListener(
64 const sp<gui::ITransactionTraceListener>& listener) = 0;
Pablo Gamito5cfc6e52020-09-10 11:18:03 +000065 virtual void binderDied(const wp<IBinder>& who) = 0;
66
Lloyd Pique4dccc412018-01-22 17:21:36 -080067 // Intercept display and surface transactions
68 virtual void saveTransaction(
69 const Vector<ComposerState>& stateUpdates,
70 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
Pablo Gamito7eb7ee72020-08-05 10:57:05 +000071 const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPid,
72 int originUid, uint64_t transactionId) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080073
74 // Intercept surface data
75 virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
76 virtual void saveSurfaceDeletion(const sp<const Layer>& layer) = 0;
Rob Carra79435b2020-03-06 14:46:07 -080077 virtual void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -080078 uint64_t frameNumber) = 0;
79
80 // Intercept display data
81 virtual void saveDisplayCreation(const DisplayDeviceState& info) = 0;
Dominik Laskowski663bd282018-04-19 15:26:54 -070082 virtual void saveDisplayDeletion(int32_t sequenceId) = 0;
83 virtual void savePowerModeUpdate(int32_t sequenceId, int32_t mode) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080084 virtual void saveVSyncEvent(nsecs_t timestamp) = 0;
85};
86
87namespace impl {
88
Irvelc274c632016-06-13 16:44:08 -070089/*
90 * SurfaceInterceptor intercepts and stores incoming streams of window
91 * properties on SurfaceFlinger.
92 */
Lloyd Pique4dccc412018-01-22 17:21:36 -080093class SurfaceInterceptor final : public android::SurfaceInterceptor {
Irvelc274c632016-06-13 16:44:08 -070094public:
Pablo Gamitoc351d6f2020-09-17 15:34:26 +000095 SurfaceInterceptor() = default;
Lloyd Pique4dccc412018-01-22 17:21:36 -080096 ~SurfaceInterceptor() override = default;
97
Irvelffc9efc2016-07-27 15:16:37 -070098 // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
99 void enable(const SortedVector<sp<Layer>>& layers,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800100 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) override;
101 void disable() override;
102 bool isEnabled() override;
Irvelc274c632016-06-13 16:44:08 -0700103
Pablo Gamito6ee484d2020-07-30 14:26:28 +0000104 void addTransactionTraceListener(const sp<gui::ITransactionTraceListener>& listener) override;
Pablo Gamito5cfc6e52020-09-10 11:18:03 +0000105 void binderDied(const wp<IBinder>& who) override;
106
Irvelffc9efc2016-07-27 15:16:37 -0700107 // Intercept display and surface transactions
108 void saveTransaction(const Vector<ComposerState>& stateUpdates,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800109 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000110 const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPid,
111 int originUid, uint64_t transactionId) override;
Irvelffc9efc2016-07-27 15:16:37 -0700112
113 // Intercept surface data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800114 void saveSurfaceCreation(const sp<const Layer>& layer) override;
115 void saveSurfaceDeletion(const sp<const Layer>& layer) override;
Rob Carra79435b2020-03-06 14:46:07 -0800116 void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800117 uint64_t frameNumber) override;
Irvelffc9efc2016-07-27 15:16:37 -0700118
119 // Intercept display data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800120 void saveDisplayCreation(const DisplayDeviceState& info) override;
Dominik Laskowski663bd282018-04-19 15:26:54 -0700121 void saveDisplayDeletion(int32_t sequenceId) override;
122 void savePowerModeUpdate(int32_t sequenceId, int32_t mode) override;
Lloyd Pique4dccc412018-01-22 17:21:36 -0800123 void saveVSyncEvent(nsecs_t timestamp) override;
Irvelc274c632016-06-13 16:44:08 -0700124
125private:
Irvelffc9efc2016-07-27 15:16:37 -0700126 // The creation increments of Surfaces and Displays do not contain enough information to capture
127 // the initial state of each object, so a transaction with all of the missing properties is
128 // performed at the initial snapshot for each display and surface.
129 void saveExistingDisplaysLocked(
130 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays);
131 void saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers);
132 void addInitialSurfaceStateLocked(Increment* increment, const sp<const Layer>& layer);
133 void addInitialDisplayStateLocked(Increment* increment, const DisplayDeviceState& display);
134
Irvelc274c632016-06-13 16:44:08 -0700135 status_t writeProtoFileLocked();
Vishnu Naira8c7c542021-07-20 18:49:42 -0700136 const sp<const Layer> getLayer(const wp<IBinder>& weakHandle) const;
Vishnu Nair456bbb22019-07-18 16:02:00 -0700137 int32_t getLayerId(const sp<const Layer>& layer) const;
138 int32_t getLayerIdFromWeakRef(const wp<const Layer>& layer) const;
Vishnu Naira8c7c542021-07-20 18:49:42 -0700139 int32_t getLayerIdFromHandle(const sp<IBinder>& weakHandle) const;
Irvelc274c632016-06-13 16:44:08 -0700140
Irvelffc9efc2016-07-27 15:16:37 -0700141 Increment* createTraceIncrementLocked();
142 void addSurfaceCreationLocked(Increment* increment, const sp<const Layer>& layer);
143 void addSurfaceDeletionLocked(Increment* increment, const sp<const Layer>& layer);
Rob Carra79435b2020-03-06 14:46:07 -0800144 void addBufferUpdateLocked(Increment* increment, int32_t layerId, uint32_t width,
Irvelc274c632016-06-13 16:44:08 -0700145 uint32_t height, uint64_t frameNumber);
Irvelffc9efc2016-07-27 15:16:37 -0700146 void addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp);
147 void addDisplayCreationLocked(Increment* increment, const DisplayDeviceState& info);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700148 void addDisplayDeletionLocked(Increment* increment, int32_t sequenceId);
149 void addPowerModeUpdateLocked(Increment* increment, int32_t sequenceId, int32_t mode);
Irvelc274c632016-06-13 16:44:08 -0700150
Irvelffc9efc2016-07-27 15:16:37 -0700151 // Add surface transactions to the trace
152 SurfaceChange* createSurfaceChangeLocked(Transaction* transaction, int32_t layerId);
Irvelc274c632016-06-13 16:44:08 -0700153 void setProtoRectLocked(Rectangle* protoRect, const Rect& rect);
154 void addPositionLocked(Transaction* transaction, int32_t layerId, float x, float y);
155 void addDepthLocked(Transaction* transaction, int32_t layerId, uint32_t z);
156 void addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w, uint32_t h);
157 void addAlphaLocked(Transaction* transaction, int32_t layerId, float alpha);
158 void addMatrixLocked(Transaction* transaction, int32_t layerId,
159 const layer_state_t::matrix22_t& matrix);
160 void addTransparentRegionLocked(Transaction* transaction, int32_t layerId,
161 const Region& transRegion);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700162 void addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags, uint8_t mask);
Irvelc274c632016-06-13 16:44:08 -0700163 void addLayerStackLocked(Transaction* transaction, int32_t layerId, uint32_t layerStack);
164 void addCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700165 void addCornerRadiusLocked(Transaction* transaction, int32_t layerId, float cornerRadius);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800166 void addBackgroundBlurRadiusLocked(Transaction* transaction, int32_t layerId,
167 int32_t backgroundBlurRadius);
Lucas Dupinc3800b82020-10-02 16:24:48 -0700168 void addBlurRegionsLocked(Transaction* transaction, int32_t layerId,
169 const std::vector<BlurRegion>& effectRegions);
Irvelffc9efc2016-07-27 15:16:37 -0700170 void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
171 void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000172 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
173 const Vector<DisplayState>& changedDisplays,
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000174 uint32_t transactionFlags, int originPid, int originUid,
175 uint64_t transactionId);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700176 void addReparentLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700177 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);
Winson Chunga30f7c92021-06-29 15:42:56 -0700180 void addTrustedOverlayLocked(Transaction* transaction, int32_t layerId, bool isTrustedOverlay);
Irvelffc9efc2016-07-27 15:16:37 -0700181
182 // Add display transactions to the trace
Dominik Laskowski663bd282018-04-19 15:26:54 -0700183 DisplayChange* createDisplayChangeLocked(Transaction* transaction, int32_t sequenceId);
184 void addDisplaySurfaceLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700185 const sp<const IGraphicBufferProducer>& surface);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700186 void addDisplayLayerStackLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700187 uint32_t layerStack);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700188 void addDisplaySizeLocked(Transaction* transaction, int32_t sequenceId, uint32_t w,
Irvelffc9efc2016-07-27 15:16:37 -0700189 uint32_t h);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700190 void addDisplayProjectionLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700191 int32_t orientation, const Rect& viewport, const Rect& frame);
192 void addDisplayChangesLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700193 const DisplayState& state, int32_t sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700194
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000195 // Add transaction origin to trace
196 void setTransactionOriginLocked(Transaction* transaction, int32_t pid, int32_t uid);
Irvelc274c632016-06-13 16:44:08 -0700197
198 bool mEnabled {false};
199 std::string mOutputFileName {DEFAULT_FILENAME};
200 std::mutex mTraceMutex {};
201 Trace mTrace {};
Pablo Gamito6ee484d2020-07-30 14:26:28 +0000202 std::mutex mListenersMutex;
203 std::map<wp<IBinder>, sp<gui::ITransactionTraceListener>> mTraceToggledListeners
204 GUARDED_BY(mListenersMutex);
Irvelc274c632016-06-13 16:44:08 -0700205};
206
Lloyd Pique4dccc412018-01-22 17:21:36 -0800207} // namespace impl
Robert Delgadocb129942019-07-23 16:28:20 -0700208
Lloyd Pique4dccc412018-01-22 17:21:36 -0800209} // namespace android
Irvelc274c632016-06-13 16:44:08 -0700210
211#endif // ANDROID_SURFACEINTERCEPTOR_H