blob: 79123f979be6bd665e74aa36d6eca26206a80774 [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 */
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080016
17// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
Irvelc274c632016-06-13 16:44:08 -070020#undef LOG_TAG
21#define LOG_TAG "SurfaceInterceptor"
22#define ATRACE_TAG ATRACE_TAG_GRAPHICS
23
24#include "Layer.h"
25#include "SurfaceFlinger.h"
26#include "SurfaceInterceptor.h"
Colin Cross63549382016-10-26 12:52:53 -070027
Irvelc274c632016-06-13 16:44:08 -070028#include <fstream>
29
Mark Salyzyn4dad9ce2016-09-29 08:08:05 -070030#include <android-base/file.h>
31#include <log/log.h>
32#include <utils/Trace.h>
33
Irvelc274c632016-06-13 16:44:08 -070034namespace android {
35
36// ----------------------------------------------------------------------------
Marissa Wall61c58622018-07-18 10:12:20 -070037// TODO(marissaw): add new layer state values to SurfaceInterceptor
Irvelc274c632016-06-13 16:44:08 -070038
Lloyd Pique4dccc412018-01-22 17:21:36 -080039SurfaceInterceptor::~SurfaceInterceptor() = default;
40
41namespace impl {
42
Robert Carr0d480722017-01-10 16:42:54 -080043SurfaceInterceptor::SurfaceInterceptor(SurfaceFlinger* flinger)
44 : mFlinger(flinger)
45{
46}
47
Irvelffc9efc2016-07-27 15:16:37 -070048void SurfaceInterceptor::enable(const SortedVector<sp<Layer>>& layers,
49 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays)
50{
Irvelc274c632016-06-13 16:44:08 -070051 if (mEnabled) {
52 return;
53 }
Irvelffc9efc2016-07-27 15:16:37 -070054 ATRACE_CALL();
Irvelc274c632016-06-13 16:44:08 -070055 mEnabled = true;
Irvelffc9efc2016-07-27 15:16:37 -070056 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
57 saveExistingDisplaysLocked(displays);
58 saveExistingSurfacesLocked(layers);
Irvelc274c632016-06-13 16:44:08 -070059}
60
61void SurfaceInterceptor::disable() {
Irvelc274c632016-06-13 16:44:08 -070062 if (!mEnabled) {
63 return;
64 }
Irvelffc9efc2016-07-27 15:16:37 -070065 ATRACE_CALL();
Irvelc274c632016-06-13 16:44:08 -070066 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
67 mEnabled = false;
68 status_t err(writeProtoFileLocked());
69 ALOGE_IF(err == PERMISSION_DENIED, "Could not save the proto file! Permission denied");
70 ALOGE_IF(err == NOT_ENOUGH_DATA, "Could not save the proto file! There are missing fields");
71 mTrace.Clear();
72}
73
Irvelffc9efc2016-07-27 15:16:37 -070074bool SurfaceInterceptor::isEnabled() {
75 return mEnabled;
76}
77
78void SurfaceInterceptor::saveExistingDisplaysLocked(
79 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays)
80{
81 // Caveat: The initial snapshot does not capture the power mode of the existing displays
Irvelc274c632016-06-13 16:44:08 -070082 ATRACE_CALL();
Irvelffc9efc2016-07-27 15:16:37 -070083 for (size_t i = 0 ; i < displays.size() ; i++) {
84 addDisplayCreationLocked(createTraceIncrementLocked(), displays[i]);
85 addInitialDisplayStateLocked(createTraceIncrementLocked(), displays[i]);
Irvelc274c632016-06-13 16:44:08 -070086 }
87}
88
Irvelffc9efc2016-07-27 15:16:37 -070089void SurfaceInterceptor::saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers) {
Irvelc274c632016-06-13 16:44:08 -070090 ATRACE_CALL();
Robert Carr1f0a16a2016-10-24 16:27:39 -070091 for (const auto& l : layers) {
Dan Stoza412903f2017-04-27 13:42:17 -070092 l->traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -070093 addSurfaceCreationLocked(createTraceIncrementLocked(), layer);
94 addInitialSurfaceStateLocked(createTraceIncrementLocked(), layer);
95 });
Irvelc274c632016-06-13 16:44:08 -070096 }
Irvelffc9efc2016-07-27 15:16:37 -070097}
98
99void SurfaceInterceptor::addInitialSurfaceStateLocked(Increment* increment,
100 const sp<const Layer>& layer)
101{
Irvelc274c632016-06-13 16:44:08 -0700102 Transaction* transaction(increment->mutable_transaction());
Lloyd Piquef1c675b2018-09-12 20:45:39 -0700103 const uint32_t layerFlags = layer->getTransactionFlags();
104 transaction->set_synchronous(layerFlags & BnSurfaceComposer::eSynchronous);
105 transaction->set_animation(layerFlags & BnSurfaceComposer::eAnimation);
Irvelc274c632016-06-13 16:44:08 -0700106
107 const int32_t layerId(getLayerId(layer));
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800108 addPositionLocked(transaction, layerId, layer->mCurrentState.active_legacy.transform.tx(),
109 layer->mCurrentState.active_legacy.transform.ty());
110 addDepthLocked(transaction, layerId, layer->mCurrentState.z);
111 addAlphaLocked(transaction, layerId, layer->mCurrentState.color.a);
Marissa Wallf58c14b2018-07-24 10:50:43 -0700112 addTransparentRegionLocked(transaction, layerId,
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800113 layer->mCurrentState.activeTransparentRegion_legacy);
114 addLayerStackLocked(transaction, layerId, layer->mCurrentState.layerStack);
115 addCropLocked(transaction, layerId, layer->mCurrentState.crop_legacy);
116 addCornerRadiusLocked(transaction, layerId, layer->mCurrentState.cornerRadius);
117 if (layer->mCurrentState.barrierLayer_legacy != nullptr) {
Marissa Wallf58c14b2018-07-24 10:50:43 -0700118 addDeferTransactionLocked(transaction, layerId,
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800119 layer->mCurrentState.barrierLayer_legacy.promote(),
120 layer->mCurrentState.frameNumber_legacy);
Irvelc274c632016-06-13 16:44:08 -0700121 }
Irvelc274c632016-06-13 16:44:08 -0700122 addOverrideScalingModeLocked(transaction, layerId, layer->getEffectiveScalingMode());
Vishnu Nair456bbb22019-07-18 16:02:00 -0700123 addFlagsLocked(transaction, layerId, layer->mCurrentState.flags,
124 layer_state_t::eLayerHidden | layer_state_t::eLayerOpaque |
125 layer_state_t::eLayerSecure);
126 addReparentLocked(transaction, layerId, getLayerIdFromWeakRef(layer->mCurrentParent));
127 addDetachChildrenLocked(transaction, layerId, layer->isLayerDetached());
128 addRelativeParentLocked(transaction, layerId,
129 getLayerIdFromWeakRef(layer->mCurrentState.zOrderRelativeOf),
130 layer->mCurrentState.z);
Vishnu Nair95a1ed42019-12-06 12:25:11 -0800131 addShadowRadiusLocked(transaction, layerId, layer->mCurrentState.shadowRadius);
Irvelc274c632016-06-13 16:44:08 -0700132}
133
Irvelffc9efc2016-07-27 15:16:37 -0700134void SurfaceInterceptor::addInitialDisplayStateLocked(Increment* increment,
135 const DisplayDeviceState& display)
136{
137 Transaction* transaction(increment->mutable_transaction());
138 transaction->set_synchronous(false);
139 transaction->set_animation(false);
140
Dominik Laskowski663bd282018-04-19 15:26:54 -0700141 addDisplaySurfaceLocked(transaction, display.sequenceId, display.surface);
142 addDisplayLayerStackLocked(transaction, display.sequenceId, display.layerStack);
143 addDisplaySizeLocked(transaction, display.sequenceId, display.width, display.height);
Dominik Laskowski718f9602019-11-09 20:01:35 -0800144 addDisplayProjectionLocked(transaction, display.sequenceId, toRotationInt(display.orientation),
145 display.viewport, display.frame);
Irvelffc9efc2016-07-27 15:16:37 -0700146}
147
Irvelc274c632016-06-13 16:44:08 -0700148status_t SurfaceInterceptor::writeProtoFileLocked() {
149 ATRACE_CALL();
Colin Cross63549382016-10-26 12:52:53 -0700150 std::string output;
151
Irvelc274c632016-06-13 16:44:08 -0700152 if (!mTrace.IsInitialized()) {
153 return NOT_ENOUGH_DATA;
154 }
Colin Cross63549382016-10-26 12:52:53 -0700155 if (!mTrace.SerializeToString(&output)) {
Irvelc274c632016-06-13 16:44:08 -0700156 return PERMISSION_DENIED;
157 }
Colin Cross63549382016-10-26 12:52:53 -0700158 if (!android::base::WriteStringToFile(output, mOutputFileName, true)) {
159 return PERMISSION_DENIED;
160 }
161
Irvelc274c632016-06-13 16:44:08 -0700162 return NO_ERROR;
163}
164
Vishnu Nair456bbb22019-07-18 16:02:00 -0700165const sp<const Layer> SurfaceInterceptor::getLayer(const wp<const IBinder>& weakHandle) const {
Irvel3017c612016-08-09 16:50:06 -0700166 const sp<const IBinder>& handle(weakHandle.promote());
Irvelc274c632016-06-13 16:44:08 -0700167 const auto layerHandle(static_cast<const Layer::Handle*>(handle.get()));
168 const sp<const Layer> layer(layerHandle->owner.promote());
169 // layer could be a nullptr at this point
170 return layer;
171}
172
Vishnu Nair456bbb22019-07-18 16:02:00 -0700173int32_t SurfaceInterceptor::getLayerId(const sp<const Layer>& layer) const {
Irvelc274c632016-06-13 16:44:08 -0700174 return layer->sequence;
175}
176
Vishnu Nair456bbb22019-07-18 16:02:00 -0700177int32_t SurfaceInterceptor::getLayerIdFromWeakRef(const wp<const Layer>& layer) const {
178 if (layer == nullptr) {
179 return -1;
180 }
181 auto strongLayer = layer.promote();
182 return strongLayer == nullptr ? -1 : getLayerId(strongLayer);
183}
184
185int32_t SurfaceInterceptor::getLayerIdFromHandle(const sp<const IBinder>& handle) const {
186 if (handle == nullptr) {
187 return -1;
188 }
189 const auto layerHandle(static_cast<const Layer::Handle*>(handle.get()));
190 const sp<const Layer> layer(layerHandle->owner.promote());
191 return layer == nullptr ? -1 : getLayerId(layer);
192}
193
Irvelffc9efc2016-07-27 15:16:37 -0700194Increment* SurfaceInterceptor::createTraceIncrementLocked() {
Irvelc274c632016-06-13 16:44:08 -0700195 Increment* increment(mTrace.add_increment());
196 increment->set_time_stamp(systemTime());
197 return increment;
198}
199
Irvelffc9efc2016-07-27 15:16:37 -0700200SurfaceChange* SurfaceInterceptor::createSurfaceChangeLocked(Transaction* transaction,
201 int32_t layerId)
202{
203 SurfaceChange* change(transaction->add_surface_change());
Irvelc274c632016-06-13 16:44:08 -0700204 change->set_id(layerId);
205 return change;
206}
207
Irvelffc9efc2016-07-27 15:16:37 -0700208DisplayChange* SurfaceInterceptor::createDisplayChangeLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700209 int32_t sequenceId)
Irvelffc9efc2016-07-27 15:16:37 -0700210{
211 DisplayChange* dispChange(transaction->add_display_change());
Dominik Laskowski663bd282018-04-19 15:26:54 -0700212 dispChange->set_id(sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700213 return dispChange;
214}
215
Irvelc274c632016-06-13 16:44:08 -0700216void SurfaceInterceptor::setProtoRectLocked(Rectangle* protoRect, const Rect& rect) {
217 protoRect->set_left(rect.left);
218 protoRect->set_top(rect.top);
219 protoRect->set_right(rect.right);
220 protoRect->set_bottom(rect.bottom);
221}
222
Irvelffc9efc2016-07-27 15:16:37 -0700223void SurfaceInterceptor::addPositionLocked(Transaction* transaction, int32_t layerId,
224 float x, float y)
Irvelc274c632016-06-13 16:44:08 -0700225{
Irvelffc9efc2016-07-27 15:16:37 -0700226 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700227 PositionChange* posChange(change->mutable_position());
228 posChange->set_x(x);
229 posChange->set_y(y);
230}
231
Irvelffc9efc2016-07-27 15:16:37 -0700232void SurfaceInterceptor::addDepthLocked(Transaction* transaction, int32_t layerId,
233 uint32_t z)
234{
235 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700236 LayerChange* depthChange(change->mutable_layer());
237 depthChange->set_layer(z);
238}
239
240void SurfaceInterceptor::addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w,
241 uint32_t h)
242{
Irvelffc9efc2016-07-27 15:16:37 -0700243 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700244 SizeChange* sizeChange(change->mutable_size());
245 sizeChange->set_w(w);
246 sizeChange->set_h(h);
247}
248
Irvelffc9efc2016-07-27 15:16:37 -0700249void SurfaceInterceptor::addAlphaLocked(Transaction* transaction, int32_t layerId,
250 float alpha)
251{
252 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700253 AlphaChange* alphaChange(change->mutable_alpha());
254 alphaChange->set_alpha(alpha);
255}
256
257void SurfaceInterceptor::addMatrixLocked(Transaction* transaction, int32_t layerId,
258 const layer_state_t::matrix22_t& matrix)
259{
Irvelffc9efc2016-07-27 15:16:37 -0700260 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700261 MatrixChange* matrixChange(change->mutable_matrix());
262 matrixChange->set_dsdx(matrix.dsdx);
263 matrixChange->set_dtdx(matrix.dtdx);
264 matrixChange->set_dsdy(matrix.dsdy);
265 matrixChange->set_dtdy(matrix.dtdy);
266}
267
Irvelffc9efc2016-07-27 15:16:37 -0700268void SurfaceInterceptor::addTransparentRegionLocked(Transaction* transaction,
269 int32_t layerId, const Region& transRegion)
Irvelc274c632016-06-13 16:44:08 -0700270{
Irvelffc9efc2016-07-27 15:16:37 -0700271 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700272 TransparentRegionHintChange* transparentChange(change->mutable_transparent_region_hint());
273
274 for (const auto& rect : transRegion) {
275 Rectangle* protoRect(transparentChange->add_region());
276 setProtoRectLocked(protoRect, rect);
277 }
278}
279
Vishnu Nair456bbb22019-07-18 16:02:00 -0700280void SurfaceInterceptor::addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags,
281 uint8_t mask) {
Irvelc274c632016-06-13 16:44:08 -0700282 // There can be multiple flags changed
Vishnu Nair456bbb22019-07-18 16:02:00 -0700283 if (mask & layer_state_t::eLayerHidden) {
Irvelffc9efc2016-07-27 15:16:37 -0700284 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700285 HiddenFlagChange* flagChange(change->mutable_hidden_flag());
Vishnu Nair456bbb22019-07-18 16:02:00 -0700286 flagChange->set_hidden_flag(flags & layer_state_t::eLayerHidden);
Irvelc274c632016-06-13 16:44:08 -0700287 }
Vishnu Nair456bbb22019-07-18 16:02:00 -0700288 if (mask & layer_state_t::eLayerOpaque) {
Irvelffc9efc2016-07-27 15:16:37 -0700289 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700290 OpaqueFlagChange* flagChange(change->mutable_opaque_flag());
Vishnu Nair456bbb22019-07-18 16:02:00 -0700291 flagChange->set_opaque_flag(flags & layer_state_t::eLayerOpaque);
Irvelc274c632016-06-13 16:44:08 -0700292 }
Vishnu Nair456bbb22019-07-18 16:02:00 -0700293 if (mask & layer_state_t::eLayerSecure) {
Irvelffc9efc2016-07-27 15:16:37 -0700294 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700295 SecureFlagChange* flagChange(change->mutable_secure_flag());
Vishnu Nair456bbb22019-07-18 16:02:00 -0700296 flagChange->set_secure_flag(flags & layer_state_t::eLayerSecure);
Irvelc274c632016-06-13 16:44:08 -0700297 }
298}
299
300void SurfaceInterceptor::addLayerStackLocked(Transaction* transaction, int32_t layerId,
301 uint32_t layerStack)
302{
Irvelffc9efc2016-07-27 15:16:37 -0700303 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700304 LayerStackChange* layerStackChange(change->mutable_layer_stack());
305 layerStackChange->set_layer_stack(layerStack);
306}
307
308void SurfaceInterceptor::addCropLocked(Transaction* transaction, int32_t layerId,
309 const Rect& rect)
310{
Irvelffc9efc2016-07-27 15:16:37 -0700311 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700312 CropChange* cropChange(change->mutable_crop());
313 Rectangle* protoRect(cropChange->mutable_rectangle());
314 setProtoRectLocked(protoRect, rect);
315}
316
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700317void SurfaceInterceptor::addCornerRadiusLocked(Transaction* transaction, int32_t layerId,
318 float cornerRadius)
319{
320 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
321 CornerRadiusChange* cornerRadiusChange(change->mutable_corner_radius());
322 cornerRadiusChange->set_corner_radius(cornerRadius);
323}
324
Irvelc274c632016-06-13 16:44:08 -0700325void SurfaceInterceptor::addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
Robert Carr0d480722017-01-10 16:42:54 -0800326 const sp<const Layer>& layer, uint64_t frameNumber)
Irvelc274c632016-06-13 16:44:08 -0700327{
Irvelffc9efc2016-07-27 15:16:37 -0700328 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700329 if (layer == nullptr) {
330 ALOGE("An existing layer could not be retrieved with the handle"
331 " for the deferred transaction");
332 return;
333 }
334 DeferredTransactionChange* deferTransaction(change->mutable_deferred_transaction());
335 deferTransaction->set_layer_id(getLayerId(layer));
336 deferTransaction->set_frame_number(frameNumber);
337}
338
Irvelffc9efc2016-07-27 15:16:37 -0700339void SurfaceInterceptor::addOverrideScalingModeLocked(Transaction* transaction,
340 int32_t layerId, int32_t overrideScalingMode)
Irvelc274c632016-06-13 16:44:08 -0700341{
Irvelffc9efc2016-07-27 15:16:37 -0700342 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
Irvelc274c632016-06-13 16:44:08 -0700343 OverrideScalingModeChange* overrideChange(change->mutable_override_scaling_mode());
344 overrideChange->set_override_scaling_mode(overrideScalingMode);
345}
346
Vishnu Nair456bbb22019-07-18 16:02:00 -0700347void SurfaceInterceptor::addReparentLocked(Transaction* transaction, int32_t layerId,
348 int32_t parentId) {
349 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
350 ReparentChange* overrideChange(change->mutable_reparent());
351 overrideChange->set_parent_id(parentId);
352}
353
354void SurfaceInterceptor::addReparentChildrenLocked(Transaction* transaction, int32_t layerId,
355 int32_t parentId) {
356 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
357 ReparentChildrenChange* overrideChange(change->mutable_reparent_children());
358 overrideChange->set_parent_id(parentId);
359}
360
361void SurfaceInterceptor::addDetachChildrenLocked(Transaction* transaction, int32_t layerId,
362 bool detached) {
363 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
364 DetachChildrenChange* overrideChange(change->mutable_detach_children());
365 overrideChange->set_detach_children(detached);
366}
367
368void SurfaceInterceptor::addRelativeParentLocked(Transaction* transaction, int32_t layerId,
369 int32_t parentId, int z) {
370 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
371 RelativeParentChange* overrideChange(change->mutable_relative_parent());
372 overrideChange->set_relative_parent_id(parentId);
373 overrideChange->set_z(z);
374}
375
Vishnu Nair95a1ed42019-12-06 12:25:11 -0800376void SurfaceInterceptor::addShadowRadiusLocked(Transaction* transaction, int32_t layerId,
377 float shadowRadius) {
378 SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
379 ShadowRadiusChange* overrideChange(change->mutable_shadow_radius());
380 overrideChange->set_radius(shadowRadius);
381}
382
Irvelffc9efc2016-07-27 15:16:37 -0700383void SurfaceInterceptor::addSurfaceChangesLocked(Transaction* transaction,
Irvelc274c632016-06-13 16:44:08 -0700384 const layer_state_t& state)
385{
386 const sp<const Layer> layer(getLayer(state.surface));
387 if (layer == nullptr) {
388 ALOGE("An existing layer could not be retrieved with the surface "
389 "from the layer_state_t surface in the update transaction");
390 return;
391 }
392
393 const int32_t layerId(getLayerId(layer));
394
395 if (state.what & layer_state_t::ePositionChanged) {
396 addPositionLocked(transaction, layerId, state.x, state.y);
397 }
398 if (state.what & layer_state_t::eLayerChanged) {
399 addDepthLocked(transaction, layerId, state.z);
400 }
401 if (state.what & layer_state_t::eSizeChanged) {
402 addSizeLocked(transaction, layerId, state.w, state.h);
403 }
404 if (state.what & layer_state_t::eAlphaChanged) {
405 addAlphaLocked(transaction, layerId, state.alpha);
406 }
407 if (state.what & layer_state_t::eMatrixChanged) {
408 addMatrixLocked(transaction, layerId, state.matrix);
409 }
410 if (state.what & layer_state_t::eTransparentRegionChanged) {
411 addTransparentRegionLocked(transaction, layerId, state.transparentRegion);
412 }
413 if (state.what & layer_state_t::eFlagsChanged) {
Vishnu Nair456bbb22019-07-18 16:02:00 -0700414 addFlagsLocked(transaction, layerId, state.flags, state.mask);
Irvelc274c632016-06-13 16:44:08 -0700415 }
416 if (state.what & layer_state_t::eLayerStackChanged) {
417 addLayerStackLocked(transaction, layerId, state.layerStack);
418 }
Marissa Wallf58c14b2018-07-24 10:50:43 -0700419 if (state.what & layer_state_t::eCropChanged_legacy) {
420 addCropLocked(transaction, layerId, state.crop_legacy);
Irvelc274c632016-06-13 16:44:08 -0700421 }
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700422 if (state.what & layer_state_t::eCornerRadiusChanged) {
423 addCornerRadiusLocked(transaction, layerId, state.cornerRadius);
424 }
Marissa Wallf58c14b2018-07-24 10:50:43 -0700425 if (state.what & layer_state_t::eDeferTransaction_legacy) {
Robert Carr0d480722017-01-10 16:42:54 -0800426 sp<Layer> otherLayer = nullptr;
Marissa Wallf58c14b2018-07-24 10:50:43 -0700427 if (state.barrierHandle_legacy != nullptr) {
428 otherLayer =
429 static_cast<Layer::Handle*>(state.barrierHandle_legacy.get())->owner.promote();
430 } else if (state.barrierGbp_legacy != nullptr) {
431 auto const& gbp = state.barrierGbp_legacy;
Robert Carr0d480722017-01-10 16:42:54 -0800432 if (mFlinger->authenticateSurfaceTextureLocked(gbp)) {
433 otherLayer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
434 } else {
435 ALOGE("Attempt to defer transaction to to an unrecognized GraphicBufferProducer");
436 }
437 }
Marissa Wallf58c14b2018-07-24 10:50:43 -0700438 addDeferTransactionLocked(transaction, layerId, otherLayer, state.frameNumber_legacy);
Irvelc274c632016-06-13 16:44:08 -0700439 }
Irvelc274c632016-06-13 16:44:08 -0700440 if (state.what & layer_state_t::eOverrideScalingModeChanged) {
441 addOverrideScalingModeLocked(transaction, layerId, state.overrideScalingMode);
442 }
Vishnu Nair456bbb22019-07-18 16:02:00 -0700443 if (state.what & layer_state_t::eReparent) {
444 addReparentLocked(transaction, layerId, getLayerIdFromHandle(state.parentHandleForChild));
445 }
446 if (state.what & layer_state_t::eReparentChildren) {
447 addReparentChildrenLocked(transaction, layerId, getLayerIdFromHandle(state.reparentHandle));
448 }
449 if (state.what & layer_state_t::eDetachChildren) {
450 addDetachChildrenLocked(transaction, layerId, true);
451 }
452 if (state.what & layer_state_t::eRelativeLayerChanged) {
453 addRelativeParentLocked(transaction, layerId,
454 getLayerIdFromHandle(state.relativeLayerHandle), state.z);
455 }
Vishnu Nair95a1ed42019-12-06 12:25:11 -0800456 if (state.what & layer_state_t::eShadowRadiusChanged) {
457 addShadowRadiusLocked(transaction, layerId, state.shadowRadius);
458 }
Irvelc274c632016-06-13 16:44:08 -0700459}
460
Irvelffc9efc2016-07-27 15:16:37 -0700461void SurfaceInterceptor::addDisplayChangesLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700462 const DisplayState& state, int32_t sequenceId)
Irvelc274c632016-06-13 16:44:08 -0700463{
Irvelffc9efc2016-07-27 15:16:37 -0700464 if (state.what & DisplayState::eSurfaceChanged) {
Dominik Laskowski663bd282018-04-19 15:26:54 -0700465 addDisplaySurfaceLocked(transaction, sequenceId, state.surface);
Irvelffc9efc2016-07-27 15:16:37 -0700466 }
467 if (state.what & DisplayState::eLayerStackChanged) {
Dominik Laskowski663bd282018-04-19 15:26:54 -0700468 addDisplayLayerStackLocked(transaction, sequenceId, state.layerStack);
Irvelffc9efc2016-07-27 15:16:37 -0700469 }
470 if (state.what & DisplayState::eDisplaySizeChanged) {
Dominik Laskowski663bd282018-04-19 15:26:54 -0700471 addDisplaySizeLocked(transaction, sequenceId, state.width, state.height);
Irvelffc9efc2016-07-27 15:16:37 -0700472 }
473 if (state.what & DisplayState::eDisplayProjectionChanged) {
Dominik Laskowski718f9602019-11-09 20:01:35 -0800474 addDisplayProjectionLocked(transaction, sequenceId, toRotationInt(state.orientation),
475 state.viewport, state.frame);
Irvelc274c632016-06-13 16:44:08 -0700476 }
477}
478
Irvelffc9efc2016-07-27 15:16:37 -0700479void SurfaceInterceptor::addTransactionLocked(Increment* increment,
480 const Vector<ComposerState>& stateUpdates,
481 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays,
482 const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags)
483{
484 Transaction* transaction(increment->mutable_transaction());
485 transaction->set_synchronous(transactionFlags & BnSurfaceComposer::eSynchronous);
486 transaction->set_animation(transactionFlags & BnSurfaceComposer::eAnimation);
487 for (const auto& compState: stateUpdates) {
488 addSurfaceChangesLocked(transaction, compState.state);
489 }
490 for (const auto& disp: changedDisplays) {
491 ssize_t dpyIdx = displays.indexOfKey(disp.token);
492 if (dpyIdx >= 0) {
493 const DisplayDeviceState& dispState(displays.valueAt(dpyIdx));
Dominik Laskowski663bd282018-04-19 15:26:54 -0700494 addDisplayChangesLocked(transaction, disp, dispState.sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700495 }
496 }
Irvelc274c632016-06-13 16:44:08 -0700497}
498
Irvelffc9efc2016-07-27 15:16:37 -0700499void SurfaceInterceptor::addSurfaceCreationLocked(Increment* increment,
500 const sp<const Layer>& layer)
501{
502 SurfaceCreation* creation(increment->mutable_surface_creation());
503 creation->set_id(getLayerId(layer));
Dominik Laskowski87a07e42019-10-10 20:38:02 -0700504 creation->set_name(layer->getName());
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800505 creation->set_w(layer->mCurrentState.active_legacy.w);
506 creation->set_h(layer->mCurrentState.active_legacy.h);
Irvelc274c632016-06-13 16:44:08 -0700507}
508
Irvelffc9efc2016-07-27 15:16:37 -0700509void SurfaceInterceptor::addSurfaceDeletionLocked(Increment* increment,
510 const sp<const Layer>& layer)
511{
512 SurfaceDeletion* deletion(increment->mutable_surface_deletion());
513 deletion->set_id(getLayerId(layer));
514}
515
516void SurfaceInterceptor::addBufferUpdateLocked(Increment* increment, const sp<const Layer>& layer,
Irvelc274c632016-06-13 16:44:08 -0700517 uint32_t width, uint32_t height, uint64_t frameNumber)
518{
519 BufferUpdate* update(increment->mutable_buffer_update());
520 update->set_id(getLayerId(layer));
521 update->set_w(width);
522 update->set_h(height);
523 update->set_frame_number(frameNumber);
524}
525
Irvelffc9efc2016-07-27 15:16:37 -0700526void SurfaceInterceptor::addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp) {
Irvelc274c632016-06-13 16:44:08 -0700527 VSyncEvent* event(increment->mutable_vsync_event());
528 event->set_when(timestamp);
529}
530
Dominik Laskowski663bd282018-04-19 15:26:54 -0700531void SurfaceInterceptor::addDisplaySurfaceLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700532 const sp<const IGraphicBufferProducer>& surface)
Irvelc274c632016-06-13 16:44:08 -0700533{
Irvelffc9efc2016-07-27 15:16:37 -0700534 if (surface == nullptr) {
Irvelc274c632016-06-13 16:44:08 -0700535 return;
536 }
Irvelffc9efc2016-07-27 15:16:37 -0700537 uint64_t bufferQueueId = 0;
538 status_t err(surface->getUniqueId(&bufferQueueId));
539 if (err == NO_ERROR) {
Dominik Laskowski663bd282018-04-19 15:26:54 -0700540 DisplayChange* dispChange(createDisplayChangeLocked(transaction, sequenceId));
Irvelffc9efc2016-07-27 15:16:37 -0700541 DispSurfaceChange* surfaceChange(dispChange->mutable_surface());
542 surfaceChange->set_buffer_queue_id(bufferQueueId);
543 surfaceChange->set_buffer_queue_name(surface->getConsumerName().string());
544 }
545 else {
546 ALOGE("invalid graphic buffer producer received while tracing a display change (%s)",
547 strerror(-err));
548 }
Irvelc274c632016-06-13 16:44:08 -0700549}
550
Irvelffc9efc2016-07-27 15:16:37 -0700551void SurfaceInterceptor::addDisplayLayerStackLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700552 int32_t sequenceId, uint32_t layerStack)
Irvelffc9efc2016-07-27 15:16:37 -0700553{
Dominik Laskowski663bd282018-04-19 15:26:54 -0700554 DisplayChange* dispChange(createDisplayChangeLocked(transaction, sequenceId));
Irvelffc9efc2016-07-27 15:16:37 -0700555 LayerStackChange* layerStackChange(dispChange->mutable_layer_stack());
556 layerStackChange->set_layer_stack(layerStack);
557}
558
Dominik Laskowski663bd282018-04-19 15:26:54 -0700559void SurfaceInterceptor::addDisplaySizeLocked(Transaction* transaction, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700560 uint32_t w, uint32_t h)
561{
Dominik Laskowski663bd282018-04-19 15:26:54 -0700562 DisplayChange* dispChange(createDisplayChangeLocked(transaction, sequenceId));
Irvelffc9efc2016-07-27 15:16:37 -0700563 SizeChange* sizeChange(dispChange->mutable_size());
564 sizeChange->set_w(w);
565 sizeChange->set_h(h);
566}
567
568void SurfaceInterceptor::addDisplayProjectionLocked(Transaction* transaction,
Dominik Laskowski663bd282018-04-19 15:26:54 -0700569 int32_t sequenceId, int32_t orientation, const Rect& viewport, const Rect& frame)
Irvelffc9efc2016-07-27 15:16:37 -0700570{
Dominik Laskowski663bd282018-04-19 15:26:54 -0700571 DisplayChange* dispChange(createDisplayChangeLocked(transaction, sequenceId));
Irvelffc9efc2016-07-27 15:16:37 -0700572 ProjectionChange* projectionChange(dispChange->mutable_projection());
573 projectionChange->set_orientation(orientation);
574 Rectangle* viewportRect(projectionChange->mutable_viewport());
575 setProtoRectLocked(viewportRect, viewport);
576 Rectangle* frameRect(projectionChange->mutable_frame());
577 setProtoRectLocked(frameRect, frame);
578}
579
580void SurfaceInterceptor::addDisplayCreationLocked(Increment* increment,
581 const DisplayDeviceState& info)
582{
583 DisplayCreation* creation(increment->mutable_display_creation());
Dominik Laskowski663bd282018-04-19 15:26:54 -0700584 creation->set_id(info.sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700585 creation->set_name(info.displayName);
Irvelffc9efc2016-07-27 15:16:37 -0700586 creation->set_is_secure(info.isSecure);
Dominik Laskowski075d3172018-05-24 15:50:06 -0700587 if (info.displayId) {
Dominik Laskowski34157762018-10-31 13:07:19 -0700588 creation->set_display_id(info.displayId->value);
Dominik Laskowski075d3172018-05-24 15:50:06 -0700589 }
Irvelffc9efc2016-07-27 15:16:37 -0700590}
591
Dominik Laskowski663bd282018-04-19 15:26:54 -0700592void SurfaceInterceptor::addDisplayDeletionLocked(Increment* increment, int32_t sequenceId) {
Irvelffc9efc2016-07-27 15:16:37 -0700593 DisplayDeletion* deletion(increment->mutable_display_deletion());
Dominik Laskowski663bd282018-04-19 15:26:54 -0700594 deletion->set_id(sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700595}
596
Dominik Laskowski663bd282018-04-19 15:26:54 -0700597void SurfaceInterceptor::addPowerModeUpdateLocked(Increment* increment, int32_t sequenceId,
Irvelffc9efc2016-07-27 15:16:37 -0700598 int32_t mode)
599{
600 PowerModeUpdate* powerModeUpdate(increment->mutable_power_mode_update());
Dominik Laskowski663bd282018-04-19 15:26:54 -0700601 powerModeUpdate->set_id(sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700602 powerModeUpdate->set_mode(mode);
603}
604
605void SurfaceInterceptor::saveTransaction(const Vector<ComposerState>& stateUpdates,
606 const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays,
607 const Vector<DisplayState>& changedDisplays, uint32_t flags)
608{
609 if (!mEnabled || (stateUpdates.size() <= 0 && changedDisplays.size() <= 0)) {
610 return;
611 }
Irvelc274c632016-06-13 16:44:08 -0700612 ATRACE_CALL();
Irvelffc9efc2016-07-27 15:16:37 -0700613 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
614 addTransactionLocked(createTraceIncrementLocked(), stateUpdates, displays, changedDisplays,
615 flags);
616}
617
618void SurfaceInterceptor::saveSurfaceCreation(const sp<const Layer>& layer) {
Irvelc274c632016-06-13 16:44:08 -0700619 if (!mEnabled || layer == nullptr) {
620 return;
621 }
Irvelc274c632016-06-13 16:44:08 -0700622 ATRACE_CALL();
Irvelffc9efc2016-07-27 15:16:37 -0700623 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
624 addSurfaceCreationLocked(createTraceIncrementLocked(), layer);
625}
626
627void SurfaceInterceptor::saveSurfaceDeletion(const sp<const Layer>& layer) {
Irvelc274c632016-06-13 16:44:08 -0700628 if (!mEnabled || layer == nullptr) {
629 return;
630 }
Irvelffc9efc2016-07-27 15:16:37 -0700631 ATRACE_CALL();
Irvelc274c632016-06-13 16:44:08 -0700632 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
Irvelffc9efc2016-07-27 15:16:37 -0700633 addSurfaceDeletionLocked(createTraceIncrementLocked(), layer);
Irvelc274c632016-06-13 16:44:08 -0700634}
635
636void SurfaceInterceptor::saveBufferUpdate(const sp<const Layer>& layer, uint32_t width,
637 uint32_t height, uint64_t frameNumber)
638{
Irvelc274c632016-06-13 16:44:08 -0700639 if (!mEnabled || layer == nullptr) {
640 return;
641 }
Irvelffc9efc2016-07-27 15:16:37 -0700642 ATRACE_CALL();
Irvelc274c632016-06-13 16:44:08 -0700643 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
Irvelffc9efc2016-07-27 15:16:37 -0700644 addBufferUpdateLocked(createTraceIncrementLocked(), layer, width, height, frameNumber);
Irvelc274c632016-06-13 16:44:08 -0700645}
646
647void SurfaceInterceptor::saveVSyncEvent(nsecs_t timestamp) {
648 if (!mEnabled) {
649 return;
650 }
651 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
Irvelffc9efc2016-07-27 15:16:37 -0700652 addVSyncUpdateLocked(createTraceIncrementLocked(), timestamp);
Irvelc274c632016-06-13 16:44:08 -0700653}
654
Irvelffc9efc2016-07-27 15:16:37 -0700655void SurfaceInterceptor::saveDisplayCreation(const DisplayDeviceState& info) {
656 if (!mEnabled) {
657 return;
658 }
659 ATRACE_CALL();
660 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
661 addDisplayCreationLocked(createTraceIncrementLocked(), info);
662}
663
Dominik Laskowski663bd282018-04-19 15:26:54 -0700664void SurfaceInterceptor::saveDisplayDeletion(int32_t sequenceId) {
Irvelffc9efc2016-07-27 15:16:37 -0700665 if (!mEnabled) {
666 return;
667 }
668 ATRACE_CALL();
669 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700670 addDisplayDeletionLocked(createTraceIncrementLocked(), sequenceId);
Irvelffc9efc2016-07-27 15:16:37 -0700671}
672
Dominik Laskowski663bd282018-04-19 15:26:54 -0700673void SurfaceInterceptor::savePowerModeUpdate(int32_t sequenceId, int32_t mode) {
Irvelffc9efc2016-07-27 15:16:37 -0700674 if (!mEnabled) {
675 return;
676 }
677 ATRACE_CALL();
678 std::lock_guard<std::mutex> protoGuard(mTraceMutex);
Dominik Laskowski663bd282018-04-19 15:26:54 -0700679 addPowerModeUpdateLocked(createTraceIncrementLocked(), sequenceId, mode);
Irvelffc9efc2016-07-27 15:16:37 -0700680}
681
Lloyd Pique4dccc412018-01-22 17:21:36 -0800682} // namespace impl
Irvelc274c632016-06-13 16:44:08 -0700683} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800684
685// TODO(b/129481165): remove the #pragma below and fix conversion issues
686#pragma clang diagnostic pop // ignored "-Wconversion"