Home | History | Annotate | Download | only in surfaceflinger
      1 /*
      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 #undef LOG_TAG
     17 #define LOG_TAG "SurfaceInterceptor"
     18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
     19 
     20 #include "Layer.h"
     21 #include "SurfaceFlinger.h"
     22 #include "SurfaceInterceptor.h"
     23 
     24 #include <fstream>
     25 
     26 #include <android-base/file.h>
     27 #include <log/log.h>
     28 #include <utils/Trace.h>
     29 
     30 namespace android {
     31 
     32 // ----------------------------------------------------------------------------
     33 
     34 SurfaceInterceptor::~SurfaceInterceptor() = default;
     35 
     36 namespace impl {
     37 
     38 SurfaceInterceptor::SurfaceInterceptor(SurfaceFlinger* flinger)
     39     :   mFlinger(flinger)
     40 {
     41 }
     42 
     43 void SurfaceInterceptor::enable(const SortedVector<sp<Layer>>& layers,
     44         const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays)
     45 {
     46     if (mEnabled) {
     47         return;
     48     }
     49     ATRACE_CALL();
     50     mEnabled = true;
     51     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
     52     saveExistingDisplaysLocked(displays);
     53     saveExistingSurfacesLocked(layers);
     54 }
     55 
     56 void SurfaceInterceptor::disable() {
     57     if (!mEnabled) {
     58         return;
     59     }
     60     ATRACE_CALL();
     61     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
     62     mEnabled = false;
     63     status_t err(writeProtoFileLocked());
     64     ALOGE_IF(err == PERMISSION_DENIED, "Could not save the proto file! Permission denied");
     65     ALOGE_IF(err == NOT_ENOUGH_DATA, "Could not save the proto file! There are missing fields");
     66     mTrace.Clear();
     67 }
     68 
     69 bool SurfaceInterceptor::isEnabled() {
     70     return mEnabled;
     71 }
     72 
     73 void SurfaceInterceptor::saveExistingDisplaysLocked(
     74         const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays)
     75 {
     76     // Caveat: The initial snapshot does not capture the power mode of the existing displays
     77     ATRACE_CALL();
     78     for (size_t i = 0 ; i < displays.size() ; i++) {
     79         addDisplayCreationLocked(createTraceIncrementLocked(), displays[i]);
     80         addInitialDisplayStateLocked(createTraceIncrementLocked(), displays[i]);
     81     }
     82 }
     83 
     84 void SurfaceInterceptor::saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers) {
     85     ATRACE_CALL();
     86     for (const auto& l : layers) {
     87         l->traverseInZOrder(LayerVector::StateSet::Drawing, [this](Layer* layer) {
     88             addSurfaceCreationLocked(createTraceIncrementLocked(), layer);
     89             addInitialSurfaceStateLocked(createTraceIncrementLocked(), layer);
     90         });
     91     }
     92 }
     93 
     94 void SurfaceInterceptor::addInitialSurfaceStateLocked(Increment* increment,
     95         const sp<const Layer>& layer)
     96 {
     97     Transaction* transaction(increment->mutable_transaction());
     98     transaction->set_synchronous(layer->mTransactionFlags & BnSurfaceComposer::eSynchronous);
     99     transaction->set_animation(layer->mTransactionFlags & BnSurfaceComposer::eAnimation);
    100 
    101     const int32_t layerId(getLayerId(layer));
    102     addPositionLocked(transaction, layerId, layer->mCurrentState.active.transform.tx(),
    103             layer->mCurrentState.active.transform.ty());
    104     addDepthLocked(transaction, layerId, layer->mCurrentState.z);
    105     addAlphaLocked(transaction, layerId, layer->mCurrentState.color.a);
    106     addTransparentRegionLocked(transaction, layerId, layer->mCurrentState.activeTransparentRegion);
    107     addLayerStackLocked(transaction, layerId, layer->mCurrentState.layerStack);
    108     addCropLocked(transaction, layerId, layer->mCurrentState.crop);
    109     if (layer->mCurrentState.barrierLayer != nullptr) {
    110         addDeferTransactionLocked(transaction, layerId, layer->mCurrentState.barrierLayer.promote(),
    111                 layer->mCurrentState.frameNumber);
    112     }
    113     addFinalCropLocked(transaction, layerId, layer->mCurrentState.finalCrop);
    114     addOverrideScalingModeLocked(transaction, layerId, layer->getEffectiveScalingMode());
    115     addFlagsLocked(transaction, layerId, layer->mCurrentState.flags);
    116 }
    117 
    118 void SurfaceInterceptor::addInitialDisplayStateLocked(Increment* increment,
    119         const DisplayDeviceState& display)
    120 {
    121     Transaction* transaction(increment->mutable_transaction());
    122     transaction->set_synchronous(false);
    123     transaction->set_animation(false);
    124 
    125     addDisplaySurfaceLocked(transaction, display.displayId, display.surface);
    126     addDisplayLayerStackLocked(transaction, display.displayId, display.layerStack);
    127     addDisplaySizeLocked(transaction, display.displayId, display.width, display.height);
    128     addDisplayProjectionLocked(transaction, display.displayId, display.orientation,
    129             display.viewport, display.frame);
    130 }
    131 
    132 status_t SurfaceInterceptor::writeProtoFileLocked() {
    133     ATRACE_CALL();
    134     std::string output;
    135 
    136     if (!mTrace.IsInitialized()) {
    137         return NOT_ENOUGH_DATA;
    138     }
    139     if (!mTrace.SerializeToString(&output)) {
    140         return PERMISSION_DENIED;
    141     }
    142     if (!android::base::WriteStringToFile(output, mOutputFileName, true)) {
    143         return PERMISSION_DENIED;
    144     }
    145 
    146     return NO_ERROR;
    147 }
    148 
    149 const sp<const Layer> SurfaceInterceptor::getLayer(const wp<const IBinder>& weakHandle) {
    150     const sp<const IBinder>& handle(weakHandle.promote());
    151     const auto layerHandle(static_cast<const Layer::Handle*>(handle.get()));
    152     const sp<const Layer> layer(layerHandle->owner.promote());
    153     // layer could be a nullptr at this point
    154     return layer;
    155 }
    156 
    157 const std::string SurfaceInterceptor::getLayerName(const sp<const Layer>& layer) {
    158     return layer->getName().string();
    159 }
    160 
    161 int32_t SurfaceInterceptor::getLayerId(const sp<const Layer>& layer) {
    162     return layer->sequence;
    163 }
    164 
    165 Increment* SurfaceInterceptor::createTraceIncrementLocked() {
    166     Increment* increment(mTrace.add_increment());
    167     increment->set_time_stamp(systemTime());
    168     return increment;
    169 }
    170 
    171 SurfaceChange* SurfaceInterceptor::createSurfaceChangeLocked(Transaction* transaction,
    172         int32_t layerId)
    173 {
    174     SurfaceChange* change(transaction->add_surface_change());
    175     change->set_id(layerId);
    176     return change;
    177 }
    178 
    179 DisplayChange* SurfaceInterceptor::createDisplayChangeLocked(Transaction* transaction,
    180         int32_t displayId)
    181 {
    182     DisplayChange* dispChange(transaction->add_display_change());
    183     dispChange->set_id(displayId);
    184     return dispChange;
    185 }
    186 
    187 void SurfaceInterceptor::setProtoRectLocked(Rectangle* protoRect, const Rect& rect) {
    188     protoRect->set_left(rect.left);
    189     protoRect->set_top(rect.top);
    190     protoRect->set_right(rect.right);
    191     protoRect->set_bottom(rect.bottom);
    192 }
    193 
    194 void SurfaceInterceptor::addPositionLocked(Transaction* transaction, int32_t layerId,
    195         float x, float y)
    196 {
    197     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    198     PositionChange* posChange(change->mutable_position());
    199     posChange->set_x(x);
    200     posChange->set_y(y);
    201 }
    202 
    203 void SurfaceInterceptor::addDepthLocked(Transaction* transaction, int32_t layerId,
    204         uint32_t z)
    205 {
    206     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    207     LayerChange* depthChange(change->mutable_layer());
    208     depthChange->set_layer(z);
    209 }
    210 
    211 void SurfaceInterceptor::addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w,
    212         uint32_t h)
    213 {
    214     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    215     SizeChange* sizeChange(change->mutable_size());
    216     sizeChange->set_w(w);
    217     sizeChange->set_h(h);
    218 }
    219 
    220 void SurfaceInterceptor::addAlphaLocked(Transaction* transaction, int32_t layerId,
    221         float alpha)
    222 {
    223     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    224     AlphaChange* alphaChange(change->mutable_alpha());
    225     alphaChange->set_alpha(alpha);
    226 }
    227 
    228 void SurfaceInterceptor::addMatrixLocked(Transaction* transaction, int32_t layerId,
    229         const layer_state_t::matrix22_t& matrix)
    230 {
    231     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    232     MatrixChange* matrixChange(change->mutable_matrix());
    233     matrixChange->set_dsdx(matrix.dsdx);
    234     matrixChange->set_dtdx(matrix.dtdx);
    235     matrixChange->set_dsdy(matrix.dsdy);
    236     matrixChange->set_dtdy(matrix.dtdy);
    237 }
    238 
    239 void SurfaceInterceptor::addTransparentRegionLocked(Transaction* transaction,
    240         int32_t layerId, const Region& transRegion)
    241 {
    242     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    243     TransparentRegionHintChange* transparentChange(change->mutable_transparent_region_hint());
    244 
    245     for (const auto& rect : transRegion) {
    246         Rectangle* protoRect(transparentChange->add_region());
    247         setProtoRectLocked(protoRect, rect);
    248     }
    249 }
    250 
    251 void SurfaceInterceptor::addFlagsLocked(Transaction* transaction, int32_t layerId,
    252         uint8_t flags)
    253 {
    254     // There can be multiple flags changed
    255     if (flags & layer_state_t::eLayerHidden) {
    256         SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    257         HiddenFlagChange* flagChange(change->mutable_hidden_flag());
    258         flagChange->set_hidden_flag(true);
    259     }
    260     if (flags & layer_state_t::eLayerOpaque) {
    261         SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    262         OpaqueFlagChange* flagChange(change->mutable_opaque_flag());
    263         flagChange->set_opaque_flag(true);
    264     }
    265     if (flags & layer_state_t::eLayerSecure) {
    266         SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    267         SecureFlagChange* flagChange(change->mutable_secure_flag());
    268         flagChange->set_secure_flag(true);
    269     }
    270 }
    271 
    272 void SurfaceInterceptor::addLayerStackLocked(Transaction* transaction, int32_t layerId,
    273         uint32_t layerStack)
    274 {
    275     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    276     LayerStackChange* layerStackChange(change->mutable_layer_stack());
    277     layerStackChange->set_layer_stack(layerStack);
    278 }
    279 
    280 void SurfaceInterceptor::addCropLocked(Transaction* transaction, int32_t layerId,
    281         const Rect& rect)
    282 {
    283     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    284     CropChange* cropChange(change->mutable_crop());
    285     Rectangle* protoRect(cropChange->mutable_rectangle());
    286     setProtoRectLocked(protoRect, rect);
    287 }
    288 
    289 void SurfaceInterceptor::addFinalCropLocked(Transaction* transaction, int32_t layerId,
    290         const Rect& rect)
    291 {
    292     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    293     FinalCropChange* finalCropChange(change->mutable_final_crop());
    294     Rectangle* protoRect(finalCropChange->mutable_rectangle());
    295     setProtoRectLocked(protoRect, rect);
    296 }
    297 
    298 void SurfaceInterceptor::addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
    299         const sp<const Layer>& layer, uint64_t frameNumber)
    300 {
    301     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    302     if (layer == nullptr) {
    303         ALOGE("An existing layer could not be retrieved with the handle"
    304                 " for the deferred transaction");
    305         return;
    306     }
    307     DeferredTransactionChange* deferTransaction(change->mutable_deferred_transaction());
    308     deferTransaction->set_layer_id(getLayerId(layer));
    309     deferTransaction->set_frame_number(frameNumber);
    310 }
    311 
    312 void SurfaceInterceptor::addOverrideScalingModeLocked(Transaction* transaction,
    313         int32_t layerId, int32_t overrideScalingMode)
    314 {
    315     SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId));
    316     OverrideScalingModeChange* overrideChange(change->mutable_override_scaling_mode());
    317     overrideChange->set_override_scaling_mode(overrideScalingMode);
    318 }
    319 
    320 void SurfaceInterceptor::addSurfaceChangesLocked(Transaction* transaction,
    321         const layer_state_t& state)
    322 {
    323     const sp<const Layer> layer(getLayer(state.surface));
    324     if (layer == nullptr) {
    325         ALOGE("An existing layer could not be retrieved with the surface "
    326                 "from the layer_state_t surface in the update transaction");
    327         return;
    328     }
    329 
    330     const int32_t layerId(getLayerId(layer));
    331 
    332     if (state.what & layer_state_t::ePositionChanged) {
    333         addPositionLocked(transaction, layerId, state.x, state.y);
    334     }
    335     if (state.what & layer_state_t::eLayerChanged) {
    336         addDepthLocked(transaction, layerId, state.z);
    337     }
    338     if (state.what & layer_state_t::eSizeChanged) {
    339         addSizeLocked(transaction, layerId, state.w, state.h);
    340     }
    341     if (state.what & layer_state_t::eAlphaChanged) {
    342         addAlphaLocked(transaction, layerId, state.alpha);
    343     }
    344     if (state.what & layer_state_t::eMatrixChanged) {
    345         addMatrixLocked(transaction, layerId, state.matrix);
    346     }
    347     if (state.what & layer_state_t::eTransparentRegionChanged) {
    348         addTransparentRegionLocked(transaction, layerId, state.transparentRegion);
    349     }
    350     if (state.what & layer_state_t::eFlagsChanged) {
    351         addFlagsLocked(transaction, layerId, state.flags);
    352     }
    353     if (state.what & layer_state_t::eLayerStackChanged) {
    354         addLayerStackLocked(transaction, layerId, state.layerStack);
    355     }
    356     if (state.what & layer_state_t::eCropChanged) {
    357         addCropLocked(transaction, layerId, state.crop);
    358     }
    359     if (state.what & layer_state_t::eDeferTransaction) {
    360         sp<Layer> otherLayer = nullptr;
    361         if (state.barrierHandle != nullptr) {
    362             otherLayer = static_cast<Layer::Handle*>(state.barrierHandle.get())->owner.promote();
    363         } else if (state.barrierGbp != nullptr) {
    364             auto const& gbp = state.barrierGbp;
    365             if (mFlinger->authenticateSurfaceTextureLocked(gbp)) {
    366                 otherLayer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
    367             } else {
    368                 ALOGE("Attempt to defer transaction to to an unrecognized GraphicBufferProducer");
    369             }
    370         }
    371         addDeferTransactionLocked(transaction, layerId, otherLayer, state.frameNumber);
    372     }
    373     if (state.what & layer_state_t::eFinalCropChanged) {
    374         addFinalCropLocked(transaction, layerId, state.finalCrop);
    375     }
    376     if (state.what & layer_state_t::eOverrideScalingModeChanged) {
    377         addOverrideScalingModeLocked(transaction, layerId, state.overrideScalingMode);
    378     }
    379 }
    380 
    381 void SurfaceInterceptor::addDisplayChangesLocked(Transaction* transaction,
    382         const DisplayState& state, int32_t displayId)
    383 {
    384     if (state.what & DisplayState::eSurfaceChanged) {
    385         addDisplaySurfaceLocked(transaction, displayId, state.surface);
    386     }
    387     if (state.what & DisplayState::eLayerStackChanged) {
    388         addDisplayLayerStackLocked(transaction, displayId, state.layerStack);
    389     }
    390     if (state.what & DisplayState::eDisplaySizeChanged) {
    391         addDisplaySizeLocked(transaction, displayId, state.width, state.height);
    392     }
    393     if (state.what & DisplayState::eDisplayProjectionChanged) {
    394         addDisplayProjectionLocked(transaction, displayId, state.orientation, state.viewport,
    395                 state.frame);
    396     }
    397 }
    398 
    399 void SurfaceInterceptor::addTransactionLocked(Increment* increment,
    400         const Vector<ComposerState>& stateUpdates,
    401         const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays,
    402         const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags)
    403 {
    404     Transaction* transaction(increment->mutable_transaction());
    405     transaction->set_synchronous(transactionFlags & BnSurfaceComposer::eSynchronous);
    406     transaction->set_animation(transactionFlags & BnSurfaceComposer::eAnimation);
    407     for (const auto& compState: stateUpdates) {
    408         addSurfaceChangesLocked(transaction, compState.state);
    409     }
    410     for (const auto& disp: changedDisplays) {
    411         ssize_t dpyIdx = displays.indexOfKey(disp.token);
    412         if (dpyIdx >= 0) {
    413             const DisplayDeviceState& dispState(displays.valueAt(dpyIdx));
    414             addDisplayChangesLocked(transaction, disp, dispState.displayId);
    415         }
    416     }
    417 }
    418 
    419 void SurfaceInterceptor::addSurfaceCreationLocked(Increment* increment,
    420         const sp<const Layer>& layer)
    421 {
    422     SurfaceCreation* creation(increment->mutable_surface_creation());
    423     creation->set_id(getLayerId(layer));
    424     creation->set_name(getLayerName(layer));
    425     creation->set_w(layer->mCurrentState.active.w);
    426     creation->set_h(layer->mCurrentState.active.h);
    427 }
    428 
    429 void SurfaceInterceptor::addSurfaceDeletionLocked(Increment* increment,
    430         const sp<const Layer>& layer)
    431 {
    432     SurfaceDeletion* deletion(increment->mutable_surface_deletion());
    433     deletion->set_id(getLayerId(layer));
    434 }
    435 
    436 void SurfaceInterceptor::addBufferUpdateLocked(Increment* increment, const sp<const Layer>& layer,
    437         uint32_t width, uint32_t height, uint64_t frameNumber)
    438 {
    439     BufferUpdate* update(increment->mutable_buffer_update());
    440     update->set_id(getLayerId(layer));
    441     update->set_w(width);
    442     update->set_h(height);
    443     update->set_frame_number(frameNumber);
    444 }
    445 
    446 void SurfaceInterceptor::addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp) {
    447     VSyncEvent* event(increment->mutable_vsync_event());
    448     event->set_when(timestamp);
    449 }
    450 
    451 void SurfaceInterceptor::addDisplaySurfaceLocked(Transaction* transaction, int32_t displayId,
    452         const sp<const IGraphicBufferProducer>& surface)
    453 {
    454     if (surface == nullptr) {
    455         return;
    456     }
    457     uint64_t bufferQueueId = 0;
    458     status_t err(surface->getUniqueId(&bufferQueueId));
    459     if (err == NO_ERROR) {
    460         DisplayChange* dispChange(createDisplayChangeLocked(transaction, displayId));
    461         DispSurfaceChange* surfaceChange(dispChange->mutable_surface());
    462         surfaceChange->set_buffer_queue_id(bufferQueueId);
    463         surfaceChange->set_buffer_queue_name(surface->getConsumerName().string());
    464     }
    465     else {
    466         ALOGE("invalid graphic buffer producer received while tracing a display change (%s)",
    467                 strerror(-err));
    468     }
    469 }
    470 
    471 void SurfaceInterceptor::addDisplayLayerStackLocked(Transaction* transaction,
    472         int32_t displayId, uint32_t layerStack)
    473 {
    474     DisplayChange* dispChange(createDisplayChangeLocked(transaction, displayId));
    475     LayerStackChange* layerStackChange(dispChange->mutable_layer_stack());
    476     layerStackChange->set_layer_stack(layerStack);
    477 }
    478 
    479 void SurfaceInterceptor::addDisplaySizeLocked(Transaction* transaction, int32_t displayId,
    480         uint32_t w, uint32_t h)
    481 {
    482     DisplayChange* dispChange(createDisplayChangeLocked(transaction, displayId));
    483     SizeChange* sizeChange(dispChange->mutable_size());
    484     sizeChange->set_w(w);
    485     sizeChange->set_h(h);
    486 }
    487 
    488 void SurfaceInterceptor::addDisplayProjectionLocked(Transaction* transaction,
    489         int32_t displayId, int32_t orientation, const Rect& viewport, const Rect& frame)
    490 {
    491     DisplayChange* dispChange(createDisplayChangeLocked(transaction, displayId));
    492     ProjectionChange* projectionChange(dispChange->mutable_projection());
    493     projectionChange->set_orientation(orientation);
    494     Rectangle* viewportRect(projectionChange->mutable_viewport());
    495     setProtoRectLocked(viewportRect, viewport);
    496     Rectangle* frameRect(projectionChange->mutable_frame());
    497     setProtoRectLocked(frameRect, frame);
    498 }
    499 
    500 void SurfaceInterceptor::addDisplayCreationLocked(Increment* increment,
    501         const DisplayDeviceState& info)
    502 {
    503     DisplayCreation* creation(increment->mutable_display_creation());
    504     creation->set_id(info.displayId);
    505     creation->set_name(info.displayName);
    506     creation->set_type(info.type);
    507     creation->set_is_secure(info.isSecure);
    508 }
    509 
    510 void SurfaceInterceptor::addDisplayDeletionLocked(Increment* increment, int32_t displayId) {
    511     DisplayDeletion* deletion(increment->mutable_display_deletion());
    512     deletion->set_id(displayId);
    513 }
    514 
    515 void SurfaceInterceptor::addPowerModeUpdateLocked(Increment* increment, int32_t displayId,
    516         int32_t mode)
    517 {
    518     PowerModeUpdate* powerModeUpdate(increment->mutable_power_mode_update());
    519     powerModeUpdate->set_id(displayId);
    520     powerModeUpdate->set_mode(mode);
    521 }
    522 
    523 void SurfaceInterceptor::saveTransaction(const Vector<ComposerState>& stateUpdates,
    524         const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays,
    525         const Vector<DisplayState>& changedDisplays, uint32_t flags)
    526 {
    527     if (!mEnabled || (stateUpdates.size() <= 0 && changedDisplays.size() <= 0)) {
    528         return;
    529     }
    530     ATRACE_CALL();
    531     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    532     addTransactionLocked(createTraceIncrementLocked(), stateUpdates, displays, changedDisplays,
    533             flags);
    534 }
    535 
    536 void SurfaceInterceptor::saveSurfaceCreation(const sp<const Layer>& layer) {
    537     if (!mEnabled || layer == nullptr) {
    538         return;
    539     }
    540     ATRACE_CALL();
    541     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    542     addSurfaceCreationLocked(createTraceIncrementLocked(), layer);
    543 }
    544 
    545 void SurfaceInterceptor::saveSurfaceDeletion(const sp<const Layer>& layer) {
    546     if (!mEnabled || layer == nullptr) {
    547         return;
    548     }
    549     ATRACE_CALL();
    550     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    551     addSurfaceDeletionLocked(createTraceIncrementLocked(), layer);
    552 }
    553 
    554 void SurfaceInterceptor::saveBufferUpdate(const sp<const Layer>& layer, uint32_t width,
    555         uint32_t height, uint64_t frameNumber)
    556 {
    557     if (!mEnabled || layer == nullptr) {
    558         return;
    559     }
    560     ATRACE_CALL();
    561     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    562     addBufferUpdateLocked(createTraceIncrementLocked(), layer, width, height, frameNumber);
    563 }
    564 
    565 void SurfaceInterceptor::saveVSyncEvent(nsecs_t timestamp) {
    566     if (!mEnabled) {
    567         return;
    568     }
    569     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    570     addVSyncUpdateLocked(createTraceIncrementLocked(), timestamp);
    571 }
    572 
    573 void SurfaceInterceptor::saveDisplayCreation(const DisplayDeviceState& info) {
    574     if (!mEnabled) {
    575         return;
    576     }
    577     ATRACE_CALL();
    578     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    579     addDisplayCreationLocked(createTraceIncrementLocked(), info);
    580 }
    581 
    582 void SurfaceInterceptor::saveDisplayDeletion(int32_t displayId) {
    583     if (!mEnabled) {
    584         return;
    585     }
    586     ATRACE_CALL();
    587     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    588     addDisplayDeletionLocked(createTraceIncrementLocked(), displayId);
    589 }
    590 
    591 void SurfaceInterceptor::savePowerModeUpdate(int32_t displayId, int32_t mode) {
    592     if (!mEnabled) {
    593         return;
    594     }
    595     ATRACE_CALL();
    596     std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    597     addPowerModeUpdateLocked(createTraceIncrementLocked(), displayId, mode);
    598 }
    599 
    600 } // namespace impl
    601 } // namespace android
    602