1c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju/* Copyright 2016 The Android Open Source Project 2c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 3c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Licensed under the Apache License, Version 2.0 (the "License"); 4c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * you may not use this file except in compliance with the License. 5c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * You may obtain a copy of the License at 6c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 7c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * http://www.apache.org/licenses/LICENSE-2.0 8c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 9c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Unless required by applicable law or agreed to in writing, software 10c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * distributed under the License is distributed on an "AS IS" BASIS, 11c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * See the License for the specific language governing permissions and 13c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * limitations under the License. 14c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju */ 15c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 16c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju//#define LOG_NDEBUG 0 17c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#define LOG_TAG "SurfaceReplayer" 18c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 19c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include "Replayer.h" 20c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 21c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <android/native_window.h> 22c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 23635493810ef89f476490d60115fed9ba74e9d704Colin Cross#include <android-base/file.h> 24635493810ef89f476490d60115fed9ba74e9d704Colin Cross 2501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju#include <gui/BufferQueue.h> 26c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <gui/ISurfaceComposer.h> 27c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <gui/Surface.h> 28c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <private/gui/ComposerService.h> 29c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <private/gui/LayerState.h> 30c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 31c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <ui/DisplayInfo.h> 32c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <utils/Log.h> 33c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <utils/String8.h> 34c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <utils/Trace.h> 35c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 36c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <chrono> 37c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <cmath> 38c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <condition_variable> 39c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <cstdlib> 40c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <fstream> 41c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <functional> 42c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <iostream> 43c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <mutex> 4401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju#include <sstream> 45c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <string> 46c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <thread> 4701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju#include <vector> 48c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 49c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuusing namespace android; 50c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 51c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustd::atomic_bool Replayer::sReplayingManually(false); 52c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 5301041fe22aead67520962b534134b3e3291b1622Sahil DhanjuReplayer::Replayer(const std::string& filename, bool replayManually, int numThreads, bool wait, 5401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju nsecs_t stopHere) 5501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju : mTrace(), 5601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mLoaded(false), 5701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mIncrementIndex(0), 5801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentTime(0), 5901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mNumThreads(numThreads), 6001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mWaitForTimeStamps(wait), 6101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mStopTimeStamp(stopHere) { 62c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju srand(RAND_COLOR_SEED); 63c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 64635493810ef89f476490d60115fed9ba74e9d704Colin Cross std::string input; 65635493810ef89f476490d60115fed9ba74e9d704Colin Cross if (!android::base::ReadFileToString(filename, &input, true)) { 66635493810ef89f476490d60115fed9ba74e9d704Colin Cross std::cerr << "Trace did not load. Does " << filename << " exist?" << std::endl; 67635493810ef89f476490d60115fed9ba74e9d704Colin Cross abort(); 68635493810ef89f476490d60115fed9ba74e9d704Colin Cross } 69c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 70635493810ef89f476490d60115fed9ba74e9d704Colin Cross mLoaded = mTrace.ParseFromString(input); 71c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (!mLoaded) { 72635493810ef89f476490d60115fed9ba74e9d704Colin Cross std::cerr << "Trace did not load." << std::endl; 73c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju abort(); 74c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 75c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 76c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mCurrentTime = mTrace.increment(0).time_stamp(); 77c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 78c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(replayManually); 7901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 8001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (stopHere < 0) { 8101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = true; 8201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 83c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 84c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 8501041fe22aead67520962b534134b3e3291b1622Sahil DhanjuReplayer::Replayer(const Trace& t, bool replayManually, int numThreads, bool wait, nsecs_t stopHere) 8601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju : mTrace(t), 8701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mLoaded(true), 8801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mIncrementIndex(0), 8901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentTime(0), 9001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mNumThreads(numThreads), 9101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mWaitForTimeStamps(wait), 9201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mStopTimeStamp(stopHere) { 93c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju srand(RAND_COLOR_SEED); 94c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mCurrentTime = mTrace.increment(0).time_stamp(); 95c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 96c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(replayManually); 9701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 9801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (stopHere < 0) { 9901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = true; 10001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 101c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 102c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 103c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::replay() { 10401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju signal(SIGINT, Replayer::stopAutoReplayHandler); //for manual control 105c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 106c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("There are %d increments.", mTrace.increment_size()); 107c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 108c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = loadSurfaceComposerClient(); 109c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 110c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 111c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Couldn't create SurfaceComposerClient (%d)", status); 112c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 113c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 114c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 115c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(true); 116c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 117c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju initReplay(); 118c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 119c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Starting actual Replay!"); 120c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju while (!mPendingIncrements.empty()) { 12101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentIncrement = mTrace.increment(mIncrementIndex); 122c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 12301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mHasStopped == false && mCurrentIncrement.time_stamp() >= mStopTimeStamp) { 12401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = true; 12501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sReplayingManually.store(true); 12601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 127c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 12801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju waitForConsoleCommmand(); 12901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 13001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mWaitForTimeStamps) { 13101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju waitUntilTimestamp(mCurrentIncrement.time_stamp()); 13201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 133c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 134c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto event = mPendingIncrements.front(); 135c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mPendingIncrements.pop(); 136c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 137c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->complete(); 138c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 139c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (event->getIncrementType() == Increment::kVsyncEvent) { 140c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mWaitingForNextVSync = false; 141c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 142c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 143c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mIncrementIndex + mNumThreads < mTrace.increment_size()) { 144c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = dispatchEvent(mIncrementIndex + mNumThreads); 145c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 146c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 147c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 148c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 149c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 150c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 151c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 152c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mIncrementIndex++; 15301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentTime = mCurrentIncrement.time_stamp(); 154c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 155c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 156c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 157c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 158c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 159c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 160c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 161c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::initReplay() { 162c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju for (int i = 0; i < mNumThreads && i < mTrace.increment_size(); i++) { 163c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = dispatchEvent(i); 164c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 165c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 166c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Unable to dispatch event (%d)", status); 167c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 168c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 169c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 170c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 171c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 172c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 173c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 174c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::stopAutoReplayHandler(int /*signal*/) { 175c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (sReplayingManually) { 176c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 177c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju exit(0); 178c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 179c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 180c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(true); 181c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 182c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 18301041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustd::vector<std::string> split(const std::string& s, const char delim) { 18401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::vector<std::string> elems; 18501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::stringstream ss(s); 18601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::string item; 18701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju while (getline(ss, item, delim)) { 18801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju elems.push_back(item); 18901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 19001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return elems; 19101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 19201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 19301041fe22aead67520962b534134b3e3291b1622Sahil Dhanjubool isNumber(const std::string& s) { 19401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return !s.empty() && 19501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::find_if(s.begin(), s.end(), [](char c) { return !std::isdigit(c); }) == s.end(); 19601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 19701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 198c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::waitForConsoleCommmand() { 199c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (!sReplayingManually || mWaitingForNextVSync) { 200c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return; 201c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 202c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 203c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju while (true) { 204c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::string input = ""; 205c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "> "; 206c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju getline(std::cin, input); 207c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 208c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (input.empty()) { 209c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju input = mLastInput; 21001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else { 21101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mLastInput = input; 212c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 213c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 21401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mLastInput.empty()) { 21501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 21601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 21701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 21801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::vector<std::string> inputs = split(input, ' '); 21901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 22001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (inputs[0] == "n") { // next vsync 221c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mWaitingForNextVSync = true; 222c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 22301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 22401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "ni") { // next increment 22501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 22601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 22701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "c") { // continue 22801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (inputs.size() > 1 && isNumber(inputs[1])) { 22901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju long milliseconds = stoi(inputs[1]); 23001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread([&] { 23101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Started!" << std::endl; 23201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); 23301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sReplayingManually.store(true); 23401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Should have stopped!" << std::endl; 23501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju }).detach(); 23601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 237c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(false); 238c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mWaitingForNextVSync = false; 239c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 24001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 24101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "s") { // stop at this timestamp 24201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (inputs.size() < 1) { 24301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "No time stamp given" << std::endl; 24401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 24501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 24601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sReplayingManually.store(false); 24701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mStopTimeStamp = stol(inputs[1]); 24801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = false; 24901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 25001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "l") { // list 25101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Time stamp: " << mCurrentIncrement.time_stamp() << "\n"; 25201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 25301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "q") { // quit 25401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 25501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju exit(0); 25601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 25701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "h") { // help 25801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju // add help menu 25901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Manual Replay options:\n"; 26001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " n - Go to next VSync\n"; 26101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " ni - Go to next increment\n"; 26201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " c - Continue\n"; 26301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " c [milliseconds] - Continue until specified number of milliseconds\n"; 26401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " s [timestamp] - Continue and stop at specified timestamp\n"; 26501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " l - List out timestamp of current increment\n"; 26601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " h - Display help menu\n"; 26701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << std::endl; 26801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 269c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 270c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 271c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "Invalid Command" << std::endl; 272c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 273c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 274c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 275c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::dispatchEvent(int index) { 276c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto increment = mTrace.increment(index); 277c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::shared_ptr<Event> event = std::make_shared<Event>(increment.increment_case()); 278c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mPendingIncrements.push(event); 279c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 280c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = NO_ERROR; 281c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju switch (increment.increment_case()) { 282c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case increment.kTransaction: { 283c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::thread(&Replayer::doTransaction, this, increment.transaction(), event).detach(); 284c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 28501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kSurfaceCreation: { 28601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::createSurfaceControl, this, increment.surface_creation(), event) 28701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 288c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 28901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kSurfaceDeletion: { 29001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::deleteSurfaceControl, this, increment.surface_deletion(), event) 29101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 292c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 293c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case increment.kBufferUpdate: { 294c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mLayerLock); 295c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mBufferQueueSchedulerLock); 296c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 297c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Dimensions dimensions(increment.buffer_update().w(), increment.buffer_update().h()); 298c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju BufferEvent bufferEvent(event, dimensions); 299c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 300c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto layerId = increment.buffer_update().id(); 301c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mBufferQueueSchedulers.count(layerId) == 0) { 302c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[layerId] = std::make_shared<BufferQueueScheduler>( 303c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayers[layerId], mColors[layerId], layerId); 304c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[layerId]->addEvent(bufferEvent); 305c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 306c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::thread(&BufferQueueScheduler::startScheduling, 307c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[increment.buffer_update().id()].get()) 308c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju .detach(); 309c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } else { 310c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto bqs = mBufferQueueSchedulers[increment.buffer_update().id()]; 311c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bqs->addEvent(bufferEvent); 312c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 313c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 314c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case increment.kVsyncEvent: { 315c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::thread(&Replayer::injectVSyncEvent, this, increment.vsync_event(), event).detach(); 316c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 31701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kDisplayCreation: { 31801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::createDisplay, this, increment.display_creation(), event) 31901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 32001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } break; 32101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kDisplayDeletion: { 32201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::deleteDisplay, this, increment.display_deletion(), event) 32301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 32401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } break; 32501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kPowerModeUpdate: { 32601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::updatePowerMode, this, increment.power_mode_update(), event) 32701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 32801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } break; 329c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju default: 330c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Unknown Increment Type: %d", increment.increment_case()); 331c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = BAD_VALUE; 332c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 333c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 334c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 335c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 336c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 337c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 338c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::doTransaction(const Transaction& t, const std::shared_ptr<Event>& event) { 339c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Started Transaction"); 340c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 34101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::openGlobalTransaction(); 342c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 34301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju status_t status = NO_ERROR; 344c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 34501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju status = doSurfaceTransaction(t.surface_change()); 34601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju doDisplayTransaction(t.display_change()); 34701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 34801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (t.animation()) { 34901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setAnimationTransaction(); 350c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 351c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 35201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 353c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 35401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::closeGlobalTransaction(t.synchronous()); 35501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 35601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Ended Transaction"); 35701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 35801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return status; 35901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 36001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 36101041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::doSurfaceTransaction(const SurfaceChanges& surfaceChanges) { 362c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = NO_ERROR; 363c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 36401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju for (const SurfaceChange& change : surfaceChanges) { 365c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::unique_lock<std::mutex> lock(mLayerLock); 366c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mLayers[change.id()] == nullptr) { 367c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayerCond.wait(lock, [&] { return (mLayers[change.id()] != nullptr); }); 368c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 369c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 37001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju switch (change.SurfaceChange_case()) { 37101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kPosition: 372c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setPosition(change.id(), change.position()); 373c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 37401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kSize: 375c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setSize(change.id(), change.size()); 376c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 37701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kAlpha: 378c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setAlpha(change.id(), change.alpha()); 379c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kLayer: 381c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setLayer(change.id(), change.layer()); 382c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kCrop: 384c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setCrop(change.id(), change.crop()); 385c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kMatrix: 387c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setMatrix(change.id(), change.matrix()); 388c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kFinalCrop: 390c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setFinalCrop(change.id(), change.final_crop()); 391c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 39201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kOverrideScalingMode: 393c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setOverrideScalingMode(change.id(), change.override_scaling_mode()); 394c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 39501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kTransparentRegionHint: 396c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setTransparentRegionHint(change.id(), change.transparent_region_hint()); 397c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 39801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kLayerStack: 399c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setLayerStack(change.id(), change.layer_stack()); 400c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 40101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kHiddenFlag: 402c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setHiddenFlag(change.id(), change.hidden_flag()); 403c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 40401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kOpaqueFlag: 405c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setOpaqueFlag(change.id(), change.opaque_flag()); 406c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 40701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kSecureFlag: 408c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setSecureFlag(change.id(), change.secure_flag()); 409c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 41001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kDeferredTransaction: 411c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju waitUntilDeferredTransactionLayerExists(change.deferred_transaction(), lock); 412c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setDeferredTransaction(change.id(), change.deferred_transaction()); 413c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 414c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju default: 415c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = NO_ERROR; 416c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 417c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 418c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 419c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 420c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("SET TRANSACTION FAILED"); 421c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 422c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 423c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 42401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return status; 42501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 426c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 42701041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::doDisplayTransaction(const DisplayChanges& displayChanges) { 42801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju for (const DisplayChange& change : displayChanges) { 42901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Doing display transaction"); 43001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::unique_lock<std::mutex> lock(mDisplayLock); 43101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mDisplays[change.id()] == nullptr) { 43201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplayCond.wait(lock, [&] { return (mDisplays[change.id()] != nullptr); }); 43301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 434c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 43501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju switch (change.DisplayChange_case()) { 43601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kSurface: 43701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplaySurface(change.id(), change.surface()); 43801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 43901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kLayerStack: 44001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplayLayerStack(change.id(), change.layer_stack()); 44101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 44201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kSize: 44301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplaySize(change.id(), change.size()); 44401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 44501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kProjection: 44601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplayProjection(change.id(), change.projection()); 44701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 44801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju default: 44901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 45001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 45101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 452c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 453c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 45401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setPosition(layer_id id, const PositionChange& pc) { 455c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Position -- x=%f, y=%f", id, pc.x(), pc.y()); 456c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setPosition(pc.x(), pc.y()); 457c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 458c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 45901041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setSize(layer_id id, const SizeChange& sc) { 460c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Size -- w=%u, h=%u", id, sc.w(), sc.h()); 461c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setSize(sc.w(), sc.h()); 462c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 463c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 46401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setLayer(layer_id id, const LayerChange& lc) { 465c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Layer -- layer=%d", id, lc.layer()); 466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setLayer(lc.layer()); 467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 46901041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setAlpha(layer_id id, const AlphaChange& ac) { 470c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Alpha -- alpha=%f", id, ac.alpha()); 471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setAlpha(ac.alpha()); 472c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 473c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 47401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setCrop(layer_id id, const CropChange& cc) { 475c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Crop -- left=%d, top=%d, right=%d, bottom=%d", id, 476c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju cc.rectangle().left(), cc.rectangle().top(), cc.rectangle().right(), 477c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju cc.rectangle().bottom()); 478c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 479c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Rect r = Rect(cc.rectangle().left(), cc.rectangle().top(), cc.rectangle().right(), 480c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju cc.rectangle().bottom()); 481c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setCrop(r); 482c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 483c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 48401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setFinalCrop(layer_id id, const FinalCropChange& fcc) { 485c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Final Crop -- left=%d, top=%d, right=%d, bottom=%d", id, 486c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju fcc.rectangle().left(), fcc.rectangle().top(), fcc.rectangle().right(), 487c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju fcc.rectangle().bottom()); 488c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Rect r = Rect(fcc.rectangle().left(), fcc.rectangle().top(), fcc.rectangle().right(), 489c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju fcc.rectangle().bottom()); 490c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFinalCrop(r); 491c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 492c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 49301041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setMatrix(layer_id id, const MatrixChange& mc) { 494c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Matrix -- dsdx=%f, dtdx=%f, dsdy=%f, dtdy=%f", id, mc.dsdx(), 495c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mc.dtdx(), mc.dsdy(), mc.dtdy()); 496c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setMatrix(mc.dsdx(), mc.dtdx(), mc.dsdy(), mc.dtdy()); 497c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 498c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 49901041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setOverrideScalingMode(layer_id id, const OverrideScalingModeChange& osmc) { 500c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Override Scaling Mode -- mode=%d", id, osmc.override_scaling_mode()); 501c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setOverrideScalingMode(osmc.override_scaling_mode()); 502c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 503c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 50401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setTransparentRegionHint(layer_id id, const TransparentRegionHintChange& trhc) { 505c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Setting Transparent Region Hint"); 506c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Region re = Region(); 507c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 508c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju for (auto r : trhc.region()) { 509c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Rect rect = Rect(r.left(), r.top(), r.right(), r.bottom()); 510c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju re.merge(rect); 511c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 512c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 513c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setTransparentRegionHint(re); 514c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 515c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 51601041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setLayerStack(layer_id id, const LayerStackChange& lsc) { 517c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting LayerStack -- layer_stack=%d", id, lsc.layer_stack()); 518c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setLayerStack(lsc.layer_stack()); 519c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 520c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 52101041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setHiddenFlag(layer_id id, const HiddenFlagChange& hfc) { 522c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Hidden Flag -- hidden_flag=%d", id, hfc.hidden_flag()); 52301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju layer_id flag = hfc.hidden_flag() ? layer_state_t::eLayerHidden : 0; 524c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 525c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFlags(flag, layer_state_t::eLayerHidden); 526c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 527c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 52801041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setOpaqueFlag(layer_id id, const OpaqueFlagChange& ofc) { 529c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Opaque Flag -- opaque_flag=%d", id, ofc.opaque_flag()); 53001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju layer_id flag = ofc.opaque_flag() ? layer_state_t::eLayerOpaque : 0; 531c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 532c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFlags(flag, layer_state_t::eLayerOpaque); 533c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 534c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 53501041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setSecureFlag(layer_id id, const SecureFlagChange& sfc) { 536c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Secure Flag -- secure_flag=%d", id, sfc.secure_flag()); 53701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju layer_id flag = sfc.secure_flag() ? layer_state_t::eLayerSecure : 0; 538c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 539c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFlags(flag, layer_state_t::eLayerSecure); 540c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 541c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 54201041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setDeferredTransaction(layer_id id, const DeferredTransactionChange& dtc) { 543c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Deferred Transaction -- layer_id=%d, " 544c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju "frame_number=%llu", 545c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju id, dtc.layer_id(), dtc.frame_number()); 546c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mLayers.count(dtc.layer_id()) == 0 || mLayers[dtc.layer_id()] == nullptr) { 547c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Layer %d not found in Deferred Transaction", dtc.layer_id()); 548c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return BAD_VALUE; 549c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 550c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 551c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto handle = mLayers[dtc.layer_id()]->getHandle(); 552c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 553c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->deferTransactionUntil(handle, dtc.frame_number()); 554c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 555c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 55601041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplaySurface(display_id id, const DispSurfaceChange& /*dsc*/) { 55701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sp<IGraphicBufferProducer> outProducer; 55801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sp<IGraphicBufferConsumer> outConsumer; 55901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju BufferQueue::createBufferQueue(&outProducer, &outConsumer); 56001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 56101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplaySurface(mDisplays[id], outProducer); 56201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 56301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 56401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplayLayerStack(display_id id, const LayerStackChange& lsc) { 56501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplayLayerStack(mDisplays[id], lsc.layer_stack()); 56601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 56701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 56801041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplaySize(display_id id, const SizeChange& sc) { 56901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplaySize(mDisplays[id], sc.w(), sc.h()); 57001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 57101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 57201041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplayProjection(display_id id, const ProjectionChange& pc) { 57301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju Rect viewport = Rect(pc.viewport().left(), pc.viewport().top(), pc.viewport().right(), 57401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju pc.viewport().bottom()); 57501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju Rect frame = Rect(pc.frame().left(), pc.frame().top(), pc.frame().right(), pc.frame().bottom()); 57601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 57701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplayProjection(mDisplays[id], pc.orientation(), viewport, frame); 57801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 57901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 58001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::createSurfaceControl( 58101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju const SurfaceCreation& create, const std::shared_ptr<Event>& event) { 582c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->readyToExecute(); 583c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 584c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Creating Surface Control: ID: %d", create.id()); 585c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sp<SurfaceControl> surfaceControl = mComposerClient->createSurface( 586c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju String8(create.name().c_str()), create.w(), create.h(), PIXEL_FORMAT_RGBA_8888, 0); 587c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 588c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (surfaceControl == nullptr) { 589c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("CreateSurfaceControl: unable to create surface control"); 590c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return BAD_VALUE; 591c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 592c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 593c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mLayerLock); 594c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto& layer = mLayers[create.id()]; 595c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju layer = surfaceControl; 596c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 59701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mColors[create.id()] = HSV(rand() % 360, 1, 1); 598c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 599c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayerCond.notify_all(); 600c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 601c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mBufferQueueSchedulerLock); 602c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mBufferQueueSchedulers.count(create.id()) != 0) { 603c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[create.id()]->setSurfaceControl( 604c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayers[create.id()], mColors[create.id()]); 605c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 606c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 607c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 608c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 609c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 610c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::deleteSurfaceControl( 61101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju const SurfaceDeletion& delete_, const std::shared_ptr<Event>& event) { 612c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Deleting %d Surface Control", delete_.id()); 613c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->readyToExecute(); 614c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 615c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mPendingLayersLock); 616c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 617c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayersPendingRemoval.push_back(delete_.id()); 618c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 61901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju const auto& iterator = mBufferQueueSchedulers.find(delete_.id()); 620c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (iterator != mBufferQueueSchedulers.end()) { 621c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju (*iterator).second->stopScheduling(); 622c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 623c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 624c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mLayerLock); 62501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mLayers[delete_.id()] != nullptr) { 62601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mComposerClient->destroySurface(mLayers[delete_.id()]->getHandle()); 62701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 628c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 629c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 630c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 631c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 632c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::doDeleteSurfaceControls() { 633c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mPendingLayersLock); 634c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mLayerLock); 635c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (!mLayersPendingRemoval.empty()) { 636c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju for (int id : mLayersPendingRemoval) { 637c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayers.erase(id); 638c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mColors.erase(id); 639c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers.erase(id); 640c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 641c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayersPendingRemoval.clear(); 642c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 643c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 644c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 645c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::injectVSyncEvent( 646c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju const VSyncEvent& vSyncEvent, const std::shared_ptr<Event>& event) { 647c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Injecting VSync Event"); 648c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 649c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju doDeleteSurfaceControls(); 650c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 651c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->readyToExecute(); 652c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 653c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::injectVSync(vSyncEvent.when()); 654c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 655c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 656c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 657c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 65801041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::createDisplay(const DisplayCreation& create, const std::shared_ptr<Event>& event) { 65901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Creating display"); 66001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 66101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 66201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::lock_guard<std::mutex> lock(mDisplayLock); 66301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sp<IBinder> display = SurfaceComposerClient::createDisplay( 66401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju String8(create.name().c_str()), create.is_secure()); 66501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplays[create.id()] = display; 66601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 66701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplayCond.notify_all(); 66801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 66901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Done creating display"); 67001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 67101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 67201041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::deleteDisplay(const DisplayDeletion& delete_, const std::shared_ptr<Event>& event) { 67301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Delete display"); 67401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 67501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 67601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::lock_guard<std::mutex> lock(mDisplayLock); 67701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::destroyDisplay(mDisplays[delete_.id()]); 67801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplays.erase(delete_.id()); 67901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 68001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 68101041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::updatePowerMode(const PowerModeUpdate& pmu, const std::shared_ptr<Event>& event) { 68201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Updating power mode"); 68301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 68401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplayPowerMode(mDisplays[pmu.id()], pmu.mode()); 68501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 68601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 687c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::waitUntilTimestamp(int64_t timestamp) { 688c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Waiting for %lld nanoseconds...", static_cast<int64_t>(timestamp - mCurrentTime)); 689c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::this_thread::sleep_for(std::chrono::nanoseconds(timestamp - mCurrentTime)); 690c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 691c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 692c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::waitUntilDeferredTransactionLayerExists( 693c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju const DeferredTransactionChange& dtc, std::unique_lock<std::mutex>& lock) { 694c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mLayers.count(dtc.layer_id()) == 0 || mLayers[dtc.layer_id()] == nullptr) { 695c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayerCond.wait(lock, [&] { return (mLayers[dtc.layer_id()] != nullptr); }); 696c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 697c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 698c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 699c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::loadSurfaceComposerClient() { 700c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mComposerClient = new SurfaceComposerClient; 701c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mComposerClient->initCheck(); 702c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 703