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_SURFACEREPLAYER_H 18 #define ANDROID_SURFACEREPLAYER_H 19 20 #include "BufferQueueScheduler.h" 21 #include "Color.h" 22 #include "Event.h" 23 24 #include <frameworks/native/cmds/surfacereplayer/proto/src/trace.pb.h> 25 26 #include <gui/SurfaceComposerClient.h> 27 #include <gui/SurfaceControl.h> 28 29 #include <utils/Errors.h> 30 #include <utils/StrongPointer.h> 31 32 #include <stdatomic.h> 33 #include <condition_variable> 34 #include <memory> 35 #include <mutex> 36 #include <queue> 37 #include <thread> 38 #include <unordered_map> 39 #include <utility> 40 41 namespace android { 42 43 const auto DEFAULT_PATH = "/data/local/tmp/SurfaceTrace.dat"; 44 const auto RAND_COLOR_SEED = 700; 45 const auto DEFAULT_THREADS = 3; 46 47 typedef int32_t layer_id; 48 typedef int32_t display_id; 49 50 typedef google::protobuf::RepeatedPtrField<SurfaceChange> SurfaceChanges; 51 typedef google::protobuf::RepeatedPtrField<DisplayChange> DisplayChanges; 52 53 class Replayer { 54 public: 55 Replayer(const std::string& filename, bool replayManually = false, 56 int numThreads = DEFAULT_THREADS, bool wait = true, nsecs_t stopHere = -1); 57 Replayer(const Trace& trace, bool replayManually = false, int numThreads = DEFAULT_THREADS, 58 bool wait = true, nsecs_t stopHere = -1); 59 60 status_t replay(); 61 62 private: 63 status_t initReplay(); 64 65 void waitForConsoleCommmand(); 66 static void stopAutoReplayHandler(int signal); 67 68 status_t dispatchEvent(int index); 69 70 status_t doTransaction(const Transaction& transaction, const std::shared_ptr<Event>& event); 71 status_t createSurfaceControl(const SurfaceCreation& create, 72 const std::shared_ptr<Event>& event); 73 status_t injectVSyncEvent(const VSyncEvent& vsyncEvent, const std::shared_ptr<Event>& event); 74 void createDisplay(const DisplayCreation& create, const std::shared_ptr<Event>& event); 75 void deleteDisplay(const DisplayDeletion& delete_, const std::shared_ptr<Event>& event); 76 void updatePowerMode(const PowerModeUpdate& update, const std::shared_ptr<Event>& event); 77 78 status_t doSurfaceTransaction(SurfaceComposerClient::Transaction& transaction, 79 const SurfaceChanges& surfaceChange); 80 void doDisplayTransaction(SurfaceComposerClient::Transaction& transaction, 81 const DisplayChanges& displayChange); 82 83 void setPosition(SurfaceComposerClient::Transaction& t, 84 layer_id id, const PositionChange& pc); 85 void setSize(SurfaceComposerClient::Transaction& t, 86 layer_id id, const SizeChange& sc); 87 void setAlpha(SurfaceComposerClient::Transaction& t, 88 layer_id id, const AlphaChange& ac); 89 void setLayer(SurfaceComposerClient::Transaction& t, 90 layer_id id, const LayerChange& lc); 91 void setCrop(SurfaceComposerClient::Transaction& t, 92 layer_id id, const CropChange& cc); 93 void setCornerRadius(SurfaceComposerClient::Transaction& t, 94 layer_id id, const CornerRadiusChange& cc); 95 void setMatrix(SurfaceComposerClient::Transaction& t, 96 layer_id id, const MatrixChange& mc); 97 void setOverrideScalingMode(SurfaceComposerClient::Transaction& t, 98 layer_id id, const OverrideScalingModeChange& osmc); 99 void setTransparentRegionHint(SurfaceComposerClient::Transaction& t, 100 layer_id id, const TransparentRegionHintChange& trgc); 101 void setLayerStack(SurfaceComposerClient::Transaction& t, 102 layer_id id, const LayerStackChange& lsc); 103 void setHiddenFlag(SurfaceComposerClient::Transaction& t, 104 layer_id id, const HiddenFlagChange& hfc); 105 void setOpaqueFlag(SurfaceComposerClient::Transaction& t, 106 layer_id id, const OpaqueFlagChange& ofc); 107 void setSecureFlag(SurfaceComposerClient::Transaction& t, 108 layer_id id, const SecureFlagChange& sfc); 109 void setDeferredTransaction(SurfaceComposerClient::Transaction& t, 110 layer_id id, const DeferredTransactionChange& dtc); 111 112 void setDisplaySurface(SurfaceComposerClient::Transaction& t, 113 display_id id, const DispSurfaceChange& dsc); 114 void setDisplayLayerStack(SurfaceComposerClient::Transaction& t, 115 display_id id, const LayerStackChange& lsc); 116 void setDisplaySize(SurfaceComposerClient::Transaction& t, 117 display_id id, const SizeChange& sc); 118 void setDisplayProjection(SurfaceComposerClient::Transaction& t, 119 display_id id, const ProjectionChange& pc); 120 121 void waitUntilTimestamp(int64_t timestamp); 122 void waitUntilDeferredTransactionLayerExists( 123 const DeferredTransactionChange& dtc, std::unique_lock<std::mutex>& lock); 124 status_t loadSurfaceComposerClient(); 125 126 Trace mTrace; 127 bool mLoaded = false; 128 int32_t mIncrementIndex = 0; 129 int64_t mCurrentTime = 0; 130 int32_t mNumThreads = DEFAULT_THREADS; 131 132 Increment mCurrentIncrement; 133 134 std::string mLastInput; 135 136 static atomic_bool sReplayingManually; 137 bool mWaitingForNextVSync; 138 bool mWaitForTimeStamps; 139 nsecs_t mStopTimeStamp; 140 bool mHasStopped; 141 142 std::mutex mLayerLock; 143 std::condition_variable mLayerCond; 144 std::unordered_map<layer_id, sp<SurfaceControl>> mLayers; 145 std::unordered_map<layer_id, HSV> mColors; 146 147 std::mutex mPendingLayersLock; 148 std::vector<layer_id> mLayersPendingRemoval; 149 150 std::mutex mBufferQueueSchedulerLock; 151 std::unordered_map<layer_id, std::shared_ptr<BufferQueueScheduler>> mBufferQueueSchedulers; 152 153 std::mutex mDisplayLock; 154 std::condition_variable mDisplayCond; 155 std::unordered_map<display_id, sp<IBinder>> mDisplays; 156 157 sp<SurfaceComposerClient> mComposerClient; 158 std::queue<std::shared_ptr<Event>> mPendingIncrements; 159 }; 160 161 } // namespace android 162 #endif 163