blob: 1798b5ae7e60b9e1dbeed3e6477f619280fc909b [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
Lloyd Pique4dccc412018-01-22 17:21:36 -080024#include <gui/LayerState.h>
25
26#include <utils/KeyedVector.h>
Mark Salyzyn4dad9ce2016-09-29 08:08:05 -070027#include <utils/SortedVector.h>
Lloyd Pique4dccc412018-01-22 17:21:36 -080028#include <utils/StrongPointer.h>
Mark Salyzyn4dad9ce2016-09-29 08:08:05 -070029#include <utils/Vector.h>
30
Lloyd Pique4dccc412018-01-22 17:21:36 -080031#include "DisplayDevice.h"
32
Irvelc274c632016-06-13 16:44:08 -070033namespace android {
34
35class BufferItem;
36class Layer;
Robert Carr0d480722017-01-10 16:42:54 -080037class SurfaceFlinger;
Lloyd Pique4dccc412018-01-22 17:21:36 -080038struct ComposerState;
39struct DisplayDeviceState;
Irvelffc9efc2016-07-27 15:16:37 -070040struct DisplayState;
Irvelc274c632016-06-13 16:44:08 -070041struct layer_state_t;
Robert Delgadocb129942019-07-23 16:28:20 -070042using Transaction = surfaceflinger::Transaction;
43using Trace = surfaceflinger::Trace;
44using Rectangle = surfaceflinger::Rectangle;
45using SurfaceChange = surfaceflinger::SurfaceChange;
46using Increment = surfaceflinger::Increment;
47using DisplayChange = surfaceflinger::DisplayChange;
Irvelc274c632016-06-13 16:44:08 -070048
Robert Delgadoaa74a662019-07-31 13:02:33 -070049constexpr auto DEFAULT_FILENAME = "/data/misc/wmtrace/transaction_trace.pb";
Irvelc274c632016-06-13 16:44:08 -070050
Lloyd Pique4dccc412018-01-22 17:21:36 -080051class SurfaceInterceptor {
52public:
53 virtual ~SurfaceInterceptor();
54
55 // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
56 virtual void enable(const SortedVector<sp<Layer>>& layers,
57 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) = 0;
58 virtual void disable() = 0;
59 virtual bool isEnabled() = 0;
60
61 // Intercept display and surface transactions
62 virtual void saveTransaction(
63 const Vector<ComposerState>& stateUpdates,
64 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +000065 const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID,
66 int originUID) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080067
68 // Intercept surface data
69 virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
70 virtual void saveSurfaceDeletion(const sp<const Layer>& layer) = 0;
Rob Carra79435b2020-03-06 14:46:07 -080071 virtual void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -080072 uint64_t frameNumber) = 0;
73
74 // Intercept display data
75 virtual void saveDisplayCreation(const DisplayDeviceState& info) = 0;
Dominik Laskowski663bd282018-04-19 15:26:54 -070076 virtual void saveDisplayDeletion(int32_t sequenceId) = 0;
77 virtual void savePowerModeUpdate(int32_t sequenceId, int32_t mode) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080078 virtual void saveVSyncEvent(nsecs_t timestamp) = 0;
79};
80
81namespace impl {
82
Irvelc274c632016-06-13 16:44:08 -070083/*
84 * SurfaceInterceptor intercepts and stores incoming streams of window
85 * properties on SurfaceFlinger.
86 */
Lloyd Pique4dccc412018-01-22 17:21:36 -080087class SurfaceInterceptor final : public android::SurfaceInterceptor {
Irvelc274c632016-06-13 16:44:08 -070088public:
Lloyd Pique4dccc412018-01-22 17:21:36 -080089 explicit SurfaceInterceptor(SurfaceFlinger* const flinger);
90 ~SurfaceInterceptor() override = default;
91
Irvelffc9efc2016-07-27 15:16:37 -070092 // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
93 void enable(const SortedVector<sp<Layer>>& layers,
Lloyd Pique4dccc412018-01-22 17:21:36 -080094 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) override;
95 void disable() override;
96 bool isEnabled() override;
Irvelc274c632016-06-13 16:44:08 -070097
Irvelffc9efc2016-07-27 15:16:37 -070098 // Intercept display and surface transactions
99 void saveTransaction(const Vector<ComposerState>& stateUpdates,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800100 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000101 const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID,
102 int originUID) override;
Irvelffc9efc2016-07-27 15:16:37 -0700103
104 // Intercept surface data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800105 void saveSurfaceCreation(const sp<const Layer>& layer) override;
106 void saveSurfaceDeletion(const sp<const Layer>& layer) override;
Rob Carra79435b2020-03-06 14:46:07 -0800107 void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800108 uint64_t frameNumber) override;
Irvelffc9efc2016-07-27 15:16:37 -0700109
110 // Intercept display data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800111 void saveDisplayCreation(const DisplayDeviceState& info) override;
Dominik Laskowski663bd282018-04-19 15:26:54 -0700112 void saveDisplayDeletion(int32_t sequenceId) override;
113 void savePowerModeUpdate(int32_t sequenceId, int32_t mode) override;
Lloyd Pique4dccc412018-01-22 17:21:36 -0800114 void saveVSyncEvent(nsecs_t timestamp) override;
Irvelc274c632016-06-13 16:44:08 -0700115
116private:
Irvelffc9efc2016-07-27 15:16:37 -0700117 // The creation increments of Surfaces and Displays do not contain enough information to capture
118 // the initial state of each object, so a transaction with all of the missing properties is
119 // performed at the initial snapshot for each display and surface.
120 void saveExistingDisplaysLocked(
121 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays);
122 void saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers);
123 void addInitialSurfaceStateLocked(Increment* increment, const sp<const Layer>& layer);
124 void addInitialDisplayStateLocked(Increment* increment, const DisplayDeviceState& display);
125
Irvelc274c632016-06-13 16:44:08 -0700126 status_t writeProtoFileLocked();
Vishnu Nair456bbb22019-07-18 16:02:00 -0700127 const sp<const Layer> getLayer(const wp<const IBinder>& weakHandle) const;
Vishnu Nair456bbb22019-07-18 16:02:00 -0700128 int32_t getLayerId(const sp<const Layer>& layer) const;
129 int32_t getLayerIdFromWeakRef(const wp<const Layer>& layer) const;
130 int32_t getLayerIdFromHandle(const sp<const IBinder>& weakHandle) const;
Irvelc274c632016-06-13 16:44:08 -0700131
Irvelffc9efc2016-07-27 15:16:37 -0700132 Increment* createTraceIncrementLocked();
133 void addSurfaceCreationLocked(Increment* increment, const sp<const Layer>& layer);
134 void addSurfaceDeletionLocked(Increment* increment, const sp<const Layer>& layer);
Rob Carra79435b2020-03-06 14:46:07 -0800135 void addBufferUpdateLocked(Increment* increment, int32_t layerId, uint32_t width,
Irvelc274c632016-06-13 16:44:08 -0700136 uint32_t height, uint64_t frameNumber);
Irvelffc9efc2016-07-27 15:16:37 -0700137 void addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp);
138 void addDisplayCreationLocked(Increment* increment, const DisplayDeviceState& info);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700139 void addDisplayDeletionLocked(Increment* increment, int32_t sequenceId);
140 void addPowerModeUpdateLocked(Increment* increment, int32_t sequenceId, int32_t mode);
Irvelc274c632016-06-13 16:44:08 -0700141
Irvelffc9efc2016-07-27 15:16:37 -0700142 // Add surface transactions to the trace
143 SurfaceChange* createSurfaceChangeLocked(Transaction* transaction, int32_t layerId);
Irvelc274c632016-06-13 16:44:08 -0700144 void setProtoRectLocked(Rectangle* protoRect, const Rect& rect);
145 void addPositionLocked(Transaction* transaction, int32_t layerId, float x, float y);
146 void addDepthLocked(Transaction* transaction, int32_t layerId, uint32_t z);
147 void addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w, uint32_t h);
148 void addAlphaLocked(Transaction* transaction, int32_t layerId, float alpha);
149 void addMatrixLocked(Transaction* transaction, int32_t layerId,
150 const layer_state_t::matrix22_t& matrix);
151 void addTransparentRegionLocked(Transaction* transaction, int32_t layerId,
152 const Region& transRegion);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700153 void addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags, uint8_t mask);
Irvelc274c632016-06-13 16:44:08 -0700154 void addLayerStackLocked(Transaction* transaction, int32_t layerId, uint32_t layerStack);
155 void addCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700156 void addCornerRadiusLocked(Transaction* transaction, int32_t layerId, float cornerRadius);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800157 void addBackgroundBlurRadiusLocked(Transaction* transaction, int32_t layerId,
158 int32_t backgroundBlurRadius);
Irvelc274c632016-06-13 16:44:08 -0700159 void addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
Robert Carr0d480722017-01-10 16:42:54 -0800160 const sp<const Layer>& layer, uint64_t frameNumber);
Irvelc274c632016-06-13 16:44:08 -0700161 void addOverrideScalingModeLocked(Transaction* transaction, int32_t layerId,
162 int32_t overrideScalingMode);
Irvelffc9efc2016-07-27 15:16:37 -0700163 void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
164 void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000165 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
166 const Vector<DisplayState>& changedDisplays,
167 uint32_t transactionFlags, int originPID, int originUID);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700168 void addReparentLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
169 void addReparentChildrenLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
170 void addDetachChildrenLocked(Transaction* transaction, int32_t layerId, bool detached);
171 void addRelativeParentLocked(Transaction* transaction, int32_t layerId, int32_t parentId,
172 int z);
Vishnu Nair95a1ed42019-12-06 12:25:11 -0800173 void addShadowRadiusLocked(Transaction* transaction, int32_t layerId, float shadowRadius);
Irvelffc9efc2016-07-27 15:16:37 -0700174
175 // Add display transactions to the trace
Dominik Laskowski663bd282018-04-19 15:26:54 -0700176 DisplayChange* createDisplayChangeLocked(Transaction* transaction, int32_t sequenceId);
177 void addDisplaySurfaceLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700178 const sp<const IGraphicBufferProducer>& surface);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700179 void addDisplayLayerStackLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700180 uint32_t layerStack);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700181 void addDisplaySizeLocked(Transaction* transaction, int32_t sequenceId, uint32_t w,
Irvelffc9efc2016-07-27 15:16:37 -0700182 uint32_t h);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700183 void addDisplayProjectionLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700184 int32_t orientation, const Rect& viewport, const Rect& frame);
185 void addDisplayChangesLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700186 const DisplayState& state, int32_t sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700187
Pablo Gamito3e8f0e62020-06-22 15:55:39 +0000188 // Add transaction origin to trace
189 void setTransactionOriginLocked(Transaction* transaction, int32_t pid, int32_t uid);
Irvelc274c632016-06-13 16:44:08 -0700190
191 bool mEnabled {false};
192 std::string mOutputFileName {DEFAULT_FILENAME};
193 std::mutex mTraceMutex {};
194 Trace mTrace {};
Robert Carr0d480722017-01-10 16:42:54 -0800195 SurfaceFlinger* const mFlinger;
Irvelc274c632016-06-13 16:44:08 -0700196};
197
Lloyd Pique4dccc412018-01-22 17:21:36 -0800198} // namespace impl
Robert Delgadocb129942019-07-23 16:28:20 -0700199
Lloyd Pique4dccc412018-01-22 17:21:36 -0800200} // namespace android
Irvelc274c632016-06-13 16:44:08 -0700201
202#endif // ANDROID_SURFACEINTERCEPTOR_H