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 
     17 #ifndef ANDROID_SURFACEINTERCEPTOR_H
     18 #define ANDROID_SURFACEINTERCEPTOR_H
     19 
     20 #include <frameworks/native/cmds/surfacereplayer/proto/src/trace.pb.h>
     21 
     22 #include <mutex>
     23 
     24 #include <gui/LayerState.h>
     25 
     26 #include <utils/KeyedVector.h>
     27 #include <utils/SortedVector.h>
     28 #include <utils/StrongPointer.h>
     29 #include <utils/Vector.h>
     30 
     31 #include "DisplayDevice.h"
     32 
     33 namespace android {
     34 
     35 class BufferItem;
     36 class Layer;
     37 class SurfaceFlinger;
     38 struct ComposerState;
     39 struct DisplayDeviceState;
     40 struct DisplayState;
     41 struct layer_state_t;
     42 
     43 constexpr auto DEFAULT_FILENAME = "/data/SurfaceTrace.dat";
     44 
     45 class SurfaceInterceptor {
     46 public:
     47     virtual ~SurfaceInterceptor();
     48 
     49     // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
     50     virtual void enable(const SortedVector<sp<Layer>>& layers,
     51                         const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) = 0;
     52     virtual void disable() = 0;
     53     virtual bool isEnabled() = 0;
     54 
     55     // Intercept display and surface transactions
     56     virtual void saveTransaction(
     57             const Vector<ComposerState>& stateUpdates,
     58             const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
     59             const Vector<DisplayState>& changedDisplays, uint32_t flags) = 0;
     60 
     61     // Intercept surface data
     62     virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
     63     virtual void saveSurfaceDeletion(const sp<const Layer>& layer) = 0;
     64     virtual void saveBufferUpdate(const sp<const Layer>& layer, uint32_t width, uint32_t height,
     65                                   uint64_t frameNumber) = 0;
     66 
     67     // Intercept display data
     68     virtual void saveDisplayCreation(const DisplayDeviceState& info) = 0;
     69     virtual void saveDisplayDeletion(int32_t displayId) = 0;
     70     virtual void savePowerModeUpdate(int32_t displayId, int32_t mode) = 0;
     71     virtual void saveVSyncEvent(nsecs_t timestamp) = 0;
     72 };
     73 
     74 namespace impl {
     75 
     76 /*
     77  * SurfaceInterceptor intercepts and stores incoming streams of window
     78  * properties on SurfaceFlinger.
     79  */
     80 class SurfaceInterceptor final : public android::SurfaceInterceptor {
     81 public:
     82     explicit SurfaceInterceptor(SurfaceFlinger* const flinger);
     83     ~SurfaceInterceptor() override = default;
     84 
     85     // Both vectors are used to capture the current state of SF as the initial snapshot in the trace
     86     void enable(const SortedVector<sp<Layer>>& layers,
     87                 const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) override;
     88     void disable() override;
     89     bool isEnabled() override;
     90 
     91     // Intercept display and surface transactions
     92     void saveTransaction(const Vector<ComposerState>& stateUpdates,
     93                          const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
     94                          const Vector<DisplayState>& changedDisplays, uint32_t flags) override;
     95 
     96     // Intercept surface data
     97     void saveSurfaceCreation(const sp<const Layer>& layer) override;
     98     void saveSurfaceDeletion(const sp<const Layer>& layer) override;
     99     void saveBufferUpdate(const sp<const Layer>& layer, uint32_t width, uint32_t height,
    100                           uint64_t frameNumber) override;
    101 
    102     // Intercept display data
    103     void saveDisplayCreation(const DisplayDeviceState& info) override;
    104     void saveDisplayDeletion(int32_t displayId) override;
    105     void savePowerModeUpdate(int32_t displayId, int32_t mode) override;
    106     void saveVSyncEvent(nsecs_t timestamp) override;
    107 
    108 private:
    109     // The creation increments of Surfaces and Displays do not contain enough information to capture
    110     // the initial state of each object, so a transaction with all of the missing properties is
    111     // performed at the initial snapshot for each display and surface.
    112     void saveExistingDisplaysLocked(
    113             const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays);
    114     void saveExistingSurfacesLocked(const SortedVector<sp<Layer>>& layers);
    115     void addInitialSurfaceStateLocked(Increment* increment, const sp<const Layer>& layer);
    116     void addInitialDisplayStateLocked(Increment* increment, const DisplayDeviceState& display);
    117 
    118     status_t writeProtoFileLocked();
    119     const sp<const Layer> getLayer(const wp<const IBinder>& weakHandle);
    120     const std::string getLayerName(const sp<const Layer>& layer);
    121     int32_t getLayerId(const sp<const Layer>& layer);
    122 
    123     Increment* createTraceIncrementLocked();
    124     void addSurfaceCreationLocked(Increment* increment, const sp<const Layer>& layer);
    125     void addSurfaceDeletionLocked(Increment* increment, const sp<const Layer>& layer);
    126     void addBufferUpdateLocked(Increment* increment, const sp<const Layer>& layer, uint32_t width,
    127             uint32_t height, uint64_t frameNumber);
    128     void addVSyncUpdateLocked(Increment* increment, nsecs_t timestamp);
    129     void addDisplayCreationLocked(Increment* increment, const DisplayDeviceState& info);
    130     void addDisplayDeletionLocked(Increment* increment, int32_t displayId);
    131     void addPowerModeUpdateLocked(Increment* increment, int32_t displayId, int32_t mode);
    132 
    133     // Add surface transactions to the trace
    134     SurfaceChange* createSurfaceChangeLocked(Transaction* transaction, int32_t layerId);
    135     void setProtoRectLocked(Rectangle* protoRect, const Rect& rect);
    136     void addPositionLocked(Transaction* transaction, int32_t layerId, float x, float y);
    137     void addDepthLocked(Transaction* transaction, int32_t layerId, uint32_t z);
    138     void addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w, uint32_t h);
    139     void addAlphaLocked(Transaction* transaction, int32_t layerId, float alpha);
    140     void addMatrixLocked(Transaction* transaction, int32_t layerId,
    141             const layer_state_t::matrix22_t& matrix);
    142     void addTransparentRegionLocked(Transaction* transaction, int32_t layerId,
    143             const Region& transRegion);
    144     void addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags);
    145     void addLayerStackLocked(Transaction* transaction, int32_t layerId, uint32_t layerStack);
    146     void addCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
    147     void addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
    148             const sp<const Layer>& layer, uint64_t frameNumber);
    149     void addFinalCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
    150     void addOverrideScalingModeLocked(Transaction* transaction, int32_t layerId,
    151             int32_t overrideScalingMode);
    152     void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
    153     void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
    154             const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays,
    155             const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags);
    156 
    157     // Add display transactions to the trace
    158     DisplayChange* createDisplayChangeLocked(Transaction* transaction, int32_t displayId);
    159     void addDisplaySurfaceLocked(Transaction* transaction, int32_t displayId,
    160             const sp<const IGraphicBufferProducer>& surface);
    161     void addDisplayLayerStackLocked(Transaction* transaction, int32_t displayId,
    162             uint32_t layerStack);
    163     void addDisplaySizeLocked(Transaction* transaction, int32_t displayId, uint32_t w,
    164             uint32_t h);
    165     void addDisplayProjectionLocked(Transaction* transaction, int32_t displayId,
    166             int32_t orientation, const Rect& viewport, const Rect& frame);
    167     void addDisplayChangesLocked(Transaction* transaction,
    168             const DisplayState& state, int32_t displayId);
    169 
    170 
    171     bool mEnabled {false};
    172     std::string mOutputFileName {DEFAULT_FILENAME};
    173     std::mutex mTraceMutex {};
    174     Trace mTrace {};
    175     SurfaceFlinger* const mFlinger;
    176 };
    177 
    178 } // namespace impl
    179 } // namespace android
    180 
    181 #endif // ANDROID_SURFACEINTERCEPTOR_H
    182