blob: 896bdcc259ea86feec54b9c14a5fface14423d27 [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,
65 const Vector<DisplayState>& changedDisplays, uint32_t flags) = 0;
66
67 // Intercept surface data
68 virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
69 virtual void saveSurfaceDeletion(const sp<const Layer>& layer) = 0;
Rob Carra79435b2020-03-06 14:46:07 -080070 virtual void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -080071 uint64_t frameNumber) = 0;
72
73 // Intercept display data
74 virtual void saveDisplayCreation(const DisplayDeviceState& info) = 0;
Dominik Laskowski663bd282018-04-19 15:26:54 -070075 virtual void saveDisplayDeletion(int32_t sequenceId) = 0;
76 virtual void savePowerModeUpdate(int32_t sequenceId, int32_t mode) = 0;
Lloyd Pique4dccc412018-01-22 17:21:36 -080077 virtual void saveVSyncEvent(nsecs_t timestamp) = 0;
78};
79
80namespace impl {
81
Irvelc274c632016-06-13 16:44:08 -070082/*
83 * SurfaceInterceptor intercepts and stores incoming streams of window
84 * properties on SurfaceFlinger.
85 */
Lloyd Pique4dccc412018-01-22 17:21:36 -080086class SurfaceInterceptor final : public android::SurfaceInterceptor {
Irvelc274c632016-06-13 16:44:08 -070087public:
Lloyd Pique4dccc412018-01-22 17:21:36 -080088 explicit SurfaceInterceptor(SurfaceFlinger* const flinger);
89 ~SurfaceInterceptor() override = default;
90
Irvelffc9efc2016-07-27 15:16:37 -070091 // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
92 void enable(const SortedVector<sp<Layer>>& layers,
Lloyd Pique4dccc412018-01-22 17:21:36 -080093 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) override;
94 void disable() override;
95 bool isEnabled() override;
Irvelc274c632016-06-13 16:44:08 -070096
Irvelffc9efc2016-07-27 15:16:37 -070097 // Intercept display and surface transactions
98 void saveTransaction(const Vector<ComposerState>& stateUpdates,
Lloyd Pique4dccc412018-01-22 17:21:36 -080099 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
100 const Vector<DisplayState>& changedDisplays, uint32_t flags) override;
Irvelffc9efc2016-07-27 15:16:37 -0700101
102 // Intercept surface data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800103 void saveSurfaceCreation(const sp<const Layer>& layer) override;
104 void saveSurfaceDeletion(const sp<const Layer>& layer) override;
Rob Carra79435b2020-03-06 14:46:07 -0800105 void saveBufferUpdate(int32_t layerId, uint32_t width, uint32_t height,
Lloyd Pique4dccc412018-01-22 17:21:36 -0800106 uint64_t frameNumber) override;
Irvelffc9efc2016-07-27 15:16:37 -0700107
108 // Intercept display data
Lloyd Pique4dccc412018-01-22 17:21:36 -0800109 void saveDisplayCreation(const DisplayDeviceState& info) override;
Dominik Laskowski663bd282018-04-19 15:26:54 -0700110 void saveDisplayDeletion(int32_t sequenceId) override;
111 void savePowerModeUpdate(int32_t sequenceId, int32_t mode) override;
Lloyd Pique4dccc412018-01-22 17:21:36 -0800112 void saveVSyncEvent(nsecs_t timestamp) override;
Irvelc274c632016-06-13 16:44:08 -0700113
114private:
Irvelffc9efc2016-07-27 15:16:37 -0700115 // The creation increments of Surfaces and Displays do not contain enough information to capture
116 // the initial state of each object, so a transaction with all of the missing properties is
117 // performed at the initial snapshot for each display and surface.
118 void saveExistingDisplaysLocked(
119 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays);
120 void saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers);
121 void addInitialSurfaceStateLocked(Increment* increment, const sp<const Layer>& layer);
122 void addInitialDisplayStateLocked(Increment* increment, const DisplayDeviceState& display);
123
Irvelc274c632016-06-13 16:44:08 -0700124 status_t writeProtoFileLocked();
Vishnu Nair456bbb22019-07-18 16:02:00 -0700125 const sp<const Layer> getLayer(const wp<const IBinder>& weakHandle) const;
Vishnu Nair456bbb22019-07-18 16:02:00 -0700126 int32_t getLayerId(const sp<const Layer>& layer) const;
127 int32_t getLayerIdFromWeakRef(const wp<const Layer>& layer) const;
128 int32_t getLayerIdFromHandle(const sp<const IBinder>& weakHandle) const;
Irvelc274c632016-06-13 16:44:08 -0700129
Irvelffc9efc2016-07-27 15:16:37 -0700130 Increment* createTraceIncrementLocked();
131 void addSurfaceCreationLocked(Increment* increment, const sp<const Layer>& layer);
132 void addSurfaceDeletionLocked(Increment* increment, const sp<const Layer>& layer);
Rob Carra79435b2020-03-06 14:46:07 -0800133 void addBufferUpdateLocked(Increment* increment, int32_t layerId, uint32_t width,
Irvelc274c632016-06-13 16:44:08 -0700134 uint32_t height, uint64_t frameNumber);
Irvelffc9efc2016-07-27 15:16:37 -0700135 void addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp);
136 void addDisplayCreationLocked(Increment* increment, const DisplayDeviceState& info);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700137 void addDisplayDeletionLocked(Increment* increment, int32_t sequenceId);
138 void addPowerModeUpdateLocked(Increment* increment, int32_t sequenceId, int32_t mode);
Irvelc274c632016-06-13 16:44:08 -0700139
Irvelffc9efc2016-07-27 15:16:37 -0700140 // Add surface transactions to the trace
141 SurfaceChange* createSurfaceChangeLocked(Transaction* transaction, int32_t layerId);
Irvelc274c632016-06-13 16:44:08 -0700142 void setProtoRectLocked(Rectangle* protoRect, const Rect& rect);
143 void addPositionLocked(Transaction* transaction, int32_t layerId, float x, float y);
144 void addDepthLocked(Transaction* transaction, int32_t layerId, uint32_t z);
145 void addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w, uint32_t h);
146 void addAlphaLocked(Transaction* transaction, int32_t layerId, float alpha);
147 void addMatrixLocked(Transaction* transaction, int32_t layerId,
148 const layer_state_t::matrix22_t& matrix);
149 void addTransparentRegionLocked(Transaction* transaction, int32_t layerId,
150 const Region& transRegion);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700151 void addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags, uint8_t mask);
Irvelc274c632016-06-13 16:44:08 -0700152 void addLayerStackLocked(Transaction* transaction, int32_t layerId, uint32_t layerStack);
153 void addCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700154 void addCornerRadiusLocked(Transaction* transaction, int32_t layerId, float cornerRadius);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800155 void addBackgroundBlurRadiusLocked(Transaction* transaction, int32_t layerId,
156 int32_t backgroundBlurRadius);
Irvelc274c632016-06-13 16:44:08 -0700157 void addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
Robert Carr0d480722017-01-10 16:42:54 -0800158 const sp<const Layer>& layer, uint64_t frameNumber);
Irvelc274c632016-06-13 16:44:08 -0700159 void addOverrideScalingModeLocked(Transaction* transaction, int32_t layerId,
160 int32_t overrideScalingMode);
Irvelffc9efc2016-07-27 15:16:37 -0700161 void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
162 void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
163 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays,
164 const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags);
Vishnu Nair456bbb22019-07-18 16:02:00 -0700165 void addReparentLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
166 void addReparentChildrenLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
167 void addDetachChildrenLocked(Transaction* transaction, int32_t layerId, bool detached);
168 void addRelativeParentLocked(Transaction* transaction, int32_t layerId, int32_t parentId,
169 int z);
Vishnu Nair95a1ed42019-12-06 12:25:11 -0800170 void addShadowRadiusLocked(Transaction* transaction, int32_t layerId, float shadowRadius);
Irvelffc9efc2016-07-27 15:16:37 -0700171
172 // Add display transactions to the trace
Dominik Laskowski663bd282018-04-19 15:26:54 -0700173 DisplayChange* createDisplayChangeLocked(Transaction* transaction, int32_t sequenceId);
174 void addDisplaySurfaceLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700175 const sp<const IGraphicBufferProducer>& surface);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700176 void addDisplayLayerStackLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700177 uint32_t layerStack);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700178 void addDisplaySizeLocked(Transaction* transaction, int32_t sequenceId, uint32_t w,
Irvelffc9efc2016-07-27 15:16:37 -0700179 uint32_t h);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700180 void addDisplayProjectionLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700181 int32_t orientation, const Rect& viewport, const Rect& frame);
182 void addDisplayChangesLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700183 const DisplayState& state, int32_t sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700184
Irvelc274c632016-06-13 16:44:08 -0700185
186 bool mEnabled {false};
187 std::string mOutputFileName {DEFAULT_FILENAME};
188 std::mutex mTraceMutex {};
189 Trace mTrace {};
Robert Carr0d480722017-01-10 16:42:54 -0800190 SurfaceFlinger* const mFlinger;
Irvelc274c632016-06-13 16:44:08 -0700191};
192
Lloyd Pique4dccc412018-01-22 17:21:36 -0800193} // namespace impl
Robert Delgadocb129942019-07-23 16:28:20 -0700194
Lloyd Pique4dccc412018-01-22 17:21:36 -0800195} // namespace android
Irvelc274c632016-06-13 16:44:08 -0700196
197#endif // ANDROID_SURFACEINTERCEPTOR_H