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