Replayer.cpp revision 01041fe22aead67520962b534134b3e3291b1622
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 23c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <binder/IMemory.h> 24c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 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 64c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::fstream input(filename, std::ios::in | std::ios::binary); 65c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 66c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLoaded = mTrace.ParseFromIstream(&input); 67c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (!mLoaded) { 68c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cerr << "Trace did not load. Does " << filename << " exist?" << std::endl; 69c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju abort(); 70c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 71c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 72c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mCurrentTime = mTrace.increment(0).time_stamp(); 73c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 74c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(replayManually); 7501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 7601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (stopHere < 0) { 7701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = true; 7801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 79c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 80c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 8101041fe22aead67520962b534134b3e3291b1622Sahil DhanjuReplayer::Replayer(const Trace& t, bool replayManually, int numThreads, bool wait, nsecs_t stopHere) 8201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju : mTrace(t), 8301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mLoaded(true), 8401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mIncrementIndex(0), 8501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentTime(0), 8601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mNumThreads(numThreads), 8701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mWaitForTimeStamps(wait), 8801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mStopTimeStamp(stopHere) { 89c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju srand(RAND_COLOR_SEED); 90c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mCurrentTime = mTrace.increment(0).time_stamp(); 91c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 92c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(replayManually); 9301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 9401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (stopHere < 0) { 9501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = true; 9601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 97c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 98c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 99c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::replay() { 10001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju signal(SIGINT, Replayer::stopAutoReplayHandler); //for manual control 101c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 102c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("There are %d increments.", mTrace.increment_size()); 103c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 104c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = loadSurfaceComposerClient(); 105c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 106c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 107c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Couldn't create SurfaceComposerClient (%d)", status); 108c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 109c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 110c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 111c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(true); 112c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 113c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju initReplay(); 114c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 115c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Starting actual Replay!"); 116c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju while (!mPendingIncrements.empty()) { 11701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentIncrement = mTrace.increment(mIncrementIndex); 118c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 11901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mHasStopped == false && mCurrentIncrement.time_stamp() >= mStopTimeStamp) { 12001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = true; 12101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sReplayingManually.store(true); 12201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 123c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 12401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju waitForConsoleCommmand(); 12501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 12601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mWaitForTimeStamps) { 12701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju waitUntilTimestamp(mCurrentIncrement.time_stamp()); 12801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 129c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 130c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto event = mPendingIncrements.front(); 131c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mPendingIncrements.pop(); 132c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 133c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->complete(); 134c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 135c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (event->getIncrementType() == Increment::kVsyncEvent) { 136c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mWaitingForNextVSync = false; 137c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 138c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 139c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mIncrementIndex + mNumThreads < mTrace.increment_size()) { 140c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = dispatchEvent(mIncrementIndex + mNumThreads); 141c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 142c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 143c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 144c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 145c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 146c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 147c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 148c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mIncrementIndex++; 14901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mCurrentTime = mCurrentIncrement.time_stamp(); 150c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 151c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 152c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 153c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 154c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 155c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 156c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 157c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::initReplay() { 158c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju for (int i = 0; i < mNumThreads && i < mTrace.increment_size(); i++) { 159c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = dispatchEvent(i); 160c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 161c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 162c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Unable to dispatch event (%d)", status); 163c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 164c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 165c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 166c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 167c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 168c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 169c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 170c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::stopAutoReplayHandler(int /*signal*/) { 171c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (sReplayingManually) { 172c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 173c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju exit(0); 174c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 175c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 176c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(true); 177c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 178c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 17901041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustd::vector<std::string> split(const std::string& s, const char delim) { 18001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::vector<std::string> elems; 18101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::stringstream ss(s); 18201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::string item; 18301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju while (getline(ss, item, delim)) { 18401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju elems.push_back(item); 18501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 18601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return elems; 18701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 18801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 18901041fe22aead67520962b534134b3e3291b1622Sahil Dhanjubool isNumber(const std::string& s) { 19001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return !s.empty() && 19101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::find_if(s.begin(), s.end(), [](char c) { return !std::isdigit(c); }) == s.end(); 19201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 19301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 194c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::waitForConsoleCommmand() { 195c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (!sReplayingManually || mWaitingForNextVSync) { 196c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return; 197c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 198c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 199c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju while (true) { 200c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::string input = ""; 201c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "> "; 202c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju getline(std::cin, input); 203c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 204c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (input.empty()) { 205c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju input = mLastInput; 20601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else { 20701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mLastInput = input; 208c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 209c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 21001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mLastInput.empty()) { 21101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 21201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 21301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 21401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::vector<std::string> inputs = split(input, ' '); 21501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 21601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (inputs[0] == "n") { // next vsync 217c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mWaitingForNextVSync = true; 218c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 21901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 22001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "ni") { // next increment 22101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 22201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 22301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "c") { // continue 22401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (inputs.size() > 1 && isNumber(inputs[1])) { 22501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju long milliseconds = stoi(inputs[1]); 22601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread([&] { 22701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Started!" << std::endl; 22801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); 22901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sReplayingManually.store(true); 23001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Should have stopped!" << std::endl; 23101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju }).detach(); 23201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 233c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sReplayingManually.store(false); 234c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mWaitingForNextVSync = false; 235c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 23601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 23701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "s") { // stop at this timestamp 23801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (inputs.size() < 1) { 23901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "No time stamp given" << std::endl; 24001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 24101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 24201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sReplayingManually.store(false); 24301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mStopTimeStamp = stol(inputs[1]); 24401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mHasStopped = false; 24501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 24601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "l") { // list 24701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Time stamp: " << mCurrentIncrement.time_stamp() << "\n"; 24801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 24901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "q") { // quit 25001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::enableVSyncInjections(false); 25101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju exit(0); 25201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 25301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } else if (inputs[0] == "h") { // help 25401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju // add help menu 25501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "Manual Replay options:\n"; 25601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " n - Go to next VSync\n"; 25701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " ni - Go to next increment\n"; 25801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " c - Continue\n"; 25901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " c [milliseconds] - Continue until specified number of milliseconds\n"; 26001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " s [timestamp] - Continue and stop at specified timestamp\n"; 26101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " l - List out timestamp of current increment\n"; 26201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " h - Display help menu\n"; 26301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << std::endl; 26401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju continue; 265c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 266c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 267c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "Invalid Command" << std::endl; 268c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 269c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 270c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 271c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::dispatchEvent(int index) { 272c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto increment = mTrace.increment(index); 273c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::shared_ptr<Event> event = std::make_shared<Event>(increment.increment_case()); 274c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mPendingIncrements.push(event); 275c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 276c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = NO_ERROR; 277c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju switch (increment.increment_case()) { 278c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case increment.kTransaction: { 279c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::thread(&Replayer::doTransaction, this, increment.transaction(), event).detach(); 280c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 28101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kSurfaceCreation: { 28201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::createSurfaceControl, this, increment.surface_creation(), event) 28301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 284c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 28501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kSurfaceDeletion: { 28601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::deleteSurfaceControl, this, increment.surface_deletion(), event) 28701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 288c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 289c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case increment.kBufferUpdate: { 290c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mLayerLock); 291c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mBufferQueueSchedulerLock); 292c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 293c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Dimensions dimensions(increment.buffer_update().w(), increment.buffer_update().h()); 294c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju BufferEvent bufferEvent(event, dimensions); 295c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 296c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto layerId = increment.buffer_update().id(); 297c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mBufferQueueSchedulers.count(layerId) == 0) { 298c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[layerId] = std::make_shared<BufferQueueScheduler>( 299c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayers[layerId], mColors[layerId], layerId); 300c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[layerId]->addEvent(bufferEvent); 301c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 302c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::thread(&BufferQueueScheduler::startScheduling, 303c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[increment.buffer_update().id()].get()) 304c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju .detach(); 305c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } else { 306c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto bqs = mBufferQueueSchedulers[increment.buffer_update().id()]; 307c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bqs->addEvent(bufferEvent); 308c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 309c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 310c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case increment.kVsyncEvent: { 311c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::thread(&Replayer::injectVSyncEvent, this, increment.vsync_event(), event).detach(); 312c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } break; 31301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kDisplayCreation: { 31401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::createDisplay, this, increment.display_creation(), event) 31501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 31601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } break; 31701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kDisplayDeletion: { 31801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::deleteDisplay, this, increment.display_deletion(), event) 31901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 32001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } break; 32101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case increment.kPowerModeUpdate: { 32201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::thread(&Replayer::updatePowerMode, this, increment.power_mode_update(), event) 32301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju .detach(); 32401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } break; 325c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju default: 326c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Unknown Increment Type: %d", increment.increment_case()); 327c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = BAD_VALUE; 328c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 329c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 330c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 331c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 332c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 333c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 334c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::doTransaction(const Transaction& t, const std::shared_ptr<Event>& event) { 335c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Started Transaction"); 336c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 33701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::openGlobalTransaction(); 338c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 33901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju status_t status = NO_ERROR; 340c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 34101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju status = doSurfaceTransaction(t.surface_change()); 34201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju doDisplayTransaction(t.display_change()); 34301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 34401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (t.animation()) { 34501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setAnimationTransaction(); 346c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 347c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 34801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 349c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 35001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::closeGlobalTransaction(t.synchronous()); 35101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 35201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Ended Transaction"); 35301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 35401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return status; 35501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 35601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 35701041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::doSurfaceTransaction(const SurfaceChanges& surfaceChanges) { 358c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t status = NO_ERROR; 359c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 36001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju for (const SurfaceChange& change : surfaceChanges) { 361c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::unique_lock<std::mutex> lock(mLayerLock); 362c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mLayers[change.id()] == nullptr) { 363c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayerCond.wait(lock, [&] { return (mLayers[change.id()] != nullptr); }); 364c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 365c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 36601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju switch (change.SurfaceChange_case()) { 36701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kPosition: 368c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setPosition(change.id(), change.position()); 369c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 37001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kSize: 371c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setSize(change.id(), change.size()); 372c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 37301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kAlpha: 374c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setAlpha(change.id(), change.alpha()); 375c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 37601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kLayer: 377c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setLayer(change.id(), change.layer()); 378c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 37901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kCrop: 380c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setCrop(change.id(), change.crop()); 381c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kMatrix: 383c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setMatrix(change.id(), change.matrix()); 384c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kFinalCrop: 386c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setFinalCrop(change.id(), change.final_crop()); 387c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 38801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kOverrideScalingMode: 389c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setOverrideScalingMode(change.id(), change.override_scaling_mode()); 390c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 39101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kTransparentRegionHint: 392c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setTransparentRegionHint(change.id(), change.transparent_region_hint()); 393c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 39401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kLayerStack: 395c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setLayerStack(change.id(), change.layer_stack()); 396c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 39701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kHiddenFlag: 398c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setHiddenFlag(change.id(), change.hidden_flag()); 399c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 40001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kOpaqueFlag: 401c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setOpaqueFlag(change.id(), change.opaque_flag()); 402c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 40301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kSecureFlag: 404c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setSecureFlag(change.id(), change.secure_flag()); 405c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 40601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case SurfaceChange::SurfaceChangeCase::kDeferredTransaction: 407c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju waitUntilDeferredTransactionLayerExists(change.deferred_transaction(), lock); 408c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = setDeferredTransaction(change.id(), change.deferred_transaction()); 409c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 410c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju default: 411c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status = NO_ERROR; 412c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 413c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 414c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 415c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status != NO_ERROR) { 416c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("SET TRANSACTION FAILED"); 417c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return status; 418c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 419c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 42001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju return status; 42101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 422c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 42301041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::doDisplayTransaction(const DisplayChanges& displayChanges) { 42401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju for (const DisplayChange& change : displayChanges) { 42501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Doing display transaction"); 42601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::unique_lock<std::mutex> lock(mDisplayLock); 42701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mDisplays[change.id()] == nullptr) { 42801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplayCond.wait(lock, [&] { return (mDisplays[change.id()] != nullptr); }); 42901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 430c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 43101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju switch (change.DisplayChange_case()) { 43201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kSurface: 43301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplaySurface(change.id(), change.surface()); 43401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 43501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kLayerStack: 43601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplayLayerStack(change.id(), change.layer_stack()); 43701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 43801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kSize: 43901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplaySize(change.id(), change.size()); 44001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 44101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case DisplayChange::DisplayChangeCase::kProjection: 44201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju setDisplayProjection(change.id(), change.projection()); 44301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 44401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju default: 44501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 44601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 44701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 448c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 449c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 45001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setPosition(layer_id id, const PositionChange& pc) { 451c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Position -- x=%f, y=%f", id, pc.x(), pc.y()); 452c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setPosition(pc.x(), pc.y()); 453c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 454c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 45501041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setSize(layer_id id, const SizeChange& sc) { 456c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Size -- w=%u, h=%u", id, sc.w(), sc.h()); 457c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setSize(sc.w(), sc.h()); 458c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 459c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 46001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setLayer(layer_id id, const LayerChange& lc) { 461c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Layer -- layer=%d", id, lc.layer()); 462c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setLayer(lc.layer()); 463c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 464c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 46501041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setAlpha(layer_id id, const AlphaChange& ac) { 466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Alpha -- alpha=%f", id, ac.alpha()); 467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setAlpha(ac.alpha()); 468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 469c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 47001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setCrop(layer_id id, const CropChange& cc) { 471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Crop -- left=%d, top=%d, right=%d, bottom=%d", id, 472c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju cc.rectangle().left(), cc.rectangle().top(), cc.rectangle().right(), 473c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju cc.rectangle().bottom()); 474c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 475c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Rect r = Rect(cc.rectangle().left(), cc.rectangle().top(), cc.rectangle().right(), 476c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju cc.rectangle().bottom()); 477c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setCrop(r); 478c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 479c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 48001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setFinalCrop(layer_id id, const FinalCropChange& fcc) { 481c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Final Crop -- left=%d, top=%d, right=%d, bottom=%d", id, 482c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju fcc.rectangle().left(), fcc.rectangle().top(), fcc.rectangle().right(), 483c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju fcc.rectangle().bottom()); 484c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Rect r = Rect(fcc.rectangle().left(), fcc.rectangle().top(), fcc.rectangle().right(), 485c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju fcc.rectangle().bottom()); 486c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFinalCrop(r); 487c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 488c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 48901041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setMatrix(layer_id id, const MatrixChange& mc) { 490c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Matrix -- dsdx=%f, dtdx=%f, dsdy=%f, dtdy=%f", id, mc.dsdx(), 491c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mc.dtdx(), mc.dsdy(), mc.dtdy()); 492c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setMatrix(mc.dsdx(), mc.dtdx(), mc.dsdy(), mc.dtdy()); 493c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 494c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 49501041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setOverrideScalingMode(layer_id id, const OverrideScalingModeChange& osmc) { 496c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Override Scaling Mode -- mode=%d", id, osmc.override_scaling_mode()); 497c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setOverrideScalingMode(osmc.override_scaling_mode()); 498c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 499c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 50001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setTransparentRegionHint(layer_id id, const TransparentRegionHintChange& trhc) { 501c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Setting Transparent Region Hint"); 502c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Region re = Region(); 503c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 504c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju for (auto r : trhc.region()) { 505c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Rect rect = Rect(r.left(), r.top(), r.right(), r.bottom()); 506c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju re.merge(rect); 507c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 508c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 509c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setTransparentRegionHint(re); 510c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 511c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 51201041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setLayerStack(layer_id id, const LayerStackChange& lsc) { 513c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting LayerStack -- layer_stack=%d", id, lsc.layer_stack()); 514c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setLayerStack(lsc.layer_stack()); 515c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 516c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 51701041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setHiddenFlag(layer_id id, const HiddenFlagChange& hfc) { 518c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Hidden Flag -- hidden_flag=%d", id, hfc.hidden_flag()); 51901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju layer_id flag = hfc.hidden_flag() ? layer_state_t::eLayerHidden : 0; 520c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 521c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFlags(flag, layer_state_t::eLayerHidden); 522c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 523c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 52401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setOpaqueFlag(layer_id id, const OpaqueFlagChange& ofc) { 525c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Opaque Flag -- opaque_flag=%d", id, ofc.opaque_flag()); 52601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju layer_id flag = ofc.opaque_flag() ? layer_state_t::eLayerOpaque : 0; 527c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 528c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFlags(flag, layer_state_t::eLayerOpaque); 529c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 530c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 53101041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setSecureFlag(layer_id id, const SecureFlagChange& sfc) { 532c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Secure Flag -- secure_flag=%d", id, sfc.secure_flag()); 53301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju layer_id flag = sfc.secure_flag() ? layer_state_t::eLayerSecure : 0; 534c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 535c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->setFlags(flag, layer_state_t::eLayerSecure); 536c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 537c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 53801041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::setDeferredTransaction(layer_id id, const DeferredTransactionChange& dtc) { 539c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Layer %d: Setting Deferred Transaction -- layer_id=%d, " 540c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju "frame_number=%llu", 541c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju id, dtc.layer_id(), dtc.frame_number()); 542c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mLayers.count(dtc.layer_id()) == 0 || mLayers[dtc.layer_id()] == nullptr) { 543c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("Layer %d not found in Deferred Transaction", dtc.layer_id()); 544c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return BAD_VALUE; 545c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 546c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 547c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto handle = mLayers[dtc.layer_id()]->getHandle(); 548c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 549c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mLayers[id]->deferTransactionUntil(handle, dtc.frame_number()); 550c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 551c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 55201041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplaySurface(display_id id, const DispSurfaceChange& /*dsc*/) { 55301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sp<IGraphicBufferProducer> outProducer; 55401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sp<IGraphicBufferConsumer> outConsumer; 55501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju BufferQueue::createBufferQueue(&outProducer, &outConsumer); 55601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 55701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplaySurface(mDisplays[id], outProducer); 55801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 55901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 56001041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplayLayerStack(display_id id, const LayerStackChange& lsc) { 56101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplayLayerStack(mDisplays[id], lsc.layer_stack()); 56201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 56301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 56401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplaySize(display_id id, const SizeChange& sc) { 56501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplaySize(mDisplays[id], sc.w(), sc.h()); 56601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 56701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 56801041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::setDisplayProjection(display_id id, const ProjectionChange& pc) { 56901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju Rect viewport = Rect(pc.viewport().left(), pc.viewport().top(), pc.viewport().right(), 57001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju pc.viewport().bottom()); 57101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju Rect frame = Rect(pc.frame().left(), pc.frame().top(), pc.frame().right(), pc.frame().bottom()); 57201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 57301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplayProjection(mDisplays[id], pc.orientation(), viewport, frame); 57401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 57501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 57601041fe22aead67520962b534134b3e3291b1622Sahil Dhanjustatus_t Replayer::createSurfaceControl( 57701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju const SurfaceCreation& create, const std::shared_ptr<Event>& event) { 578c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->readyToExecute(); 579c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 580c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Creating Surface Control: ID: %d", create.id()); 581c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sp<SurfaceControl> surfaceControl = mComposerClient->createSurface( 582c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju String8(create.name().c_str()), create.w(), create.h(), PIXEL_FORMAT_RGBA_8888, 0); 583c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 584c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (surfaceControl == nullptr) { 585c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("CreateSurfaceControl: unable to create surface control"); 586c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return BAD_VALUE; 587c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 588c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 589c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mLayerLock); 590c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju auto& layer = mLayers[create.id()]; 591c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju layer = surfaceControl; 592c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 59301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mColors[create.id()] = HSV(rand() % 360, 1, 1); 594c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 595c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayerCond.notify_all(); 596c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 597c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mBufferQueueSchedulerLock); 598c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mBufferQueueSchedulers.count(create.id()) != 0) { 599c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers[create.id()]->setSurfaceControl( 600c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayers[create.id()], mColors[create.id()]); 601c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 602c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 603c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 604c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 605c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 606c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::deleteSurfaceControl( 60701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju const SurfaceDeletion& delete_, const std::shared_ptr<Event>& event) { 608c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Deleting %d Surface Control", delete_.id()); 609c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->readyToExecute(); 610c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 611c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mPendingLayersLock); 612c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 613c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayersPendingRemoval.push_back(delete_.id()); 614c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 61501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju const auto& iterator = mBufferQueueSchedulers.find(delete_.id()); 616c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (iterator != mBufferQueueSchedulers.end()) { 617c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju (*iterator).second->stopScheduling(); 618c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 619c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 620c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mLayerLock); 62101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju if (mLayers[delete_.id()] != nullptr) { 62201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mComposerClient->destroySurface(mLayers[delete_.id()]->getHandle()); 62301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } 624c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 625c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 626c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 627c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 628c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::doDeleteSurfaceControls() { 629c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock1(mPendingLayersLock); 630c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::lock_guard<std::mutex> lock2(mLayerLock); 631c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (!mLayersPendingRemoval.empty()) { 632c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju for (int id : mLayersPendingRemoval) { 633c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayers.erase(id); 634c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mColors.erase(id); 635c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mBufferQueueSchedulers.erase(id); 636c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 637c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayersPendingRemoval.clear(); 638c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 639c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 640c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 641c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::injectVSyncEvent( 642c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju const VSyncEvent& vSyncEvent, const std::shared_ptr<Event>& event) { 643c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Injecting VSync Event"); 644c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 645c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju doDeleteSurfaceControls(); 646c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 647c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju event->readyToExecute(); 648c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 649c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju SurfaceComposerClient::injectVSync(vSyncEvent.when()); 650c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 651c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return NO_ERROR; 652c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 653c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 65401041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::createDisplay(const DisplayCreation& create, const std::shared_ptr<Event>& event) { 65501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Creating display"); 65601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 65701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 65801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::lock_guard<std::mutex> lock(mDisplayLock); 65901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju sp<IBinder> display = SurfaceComposerClient::createDisplay( 66001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju String8(create.name().c_str()), create.is_secure()); 66101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplays[create.id()] = display; 66201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 66301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplayCond.notify_all(); 66401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 66501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Done creating display"); 66601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 66701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 66801041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::deleteDisplay(const DisplayDeletion& delete_, const std::shared_ptr<Event>& event) { 66901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Delete display"); 67001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 67101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 67201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::lock_guard<std::mutex> lock(mDisplayLock); 67301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::destroyDisplay(mDisplays[delete_.id()]); 67401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju mDisplays.erase(delete_.id()); 67501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 67601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 67701041fe22aead67520962b534134b3e3291b1622Sahil Dhanjuvoid Replayer::updatePowerMode(const PowerModeUpdate& pmu, const std::shared_ptr<Event>& event) { 67801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju ALOGV("Updating power mode"); 67901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju event->readyToExecute(); 68001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju SurfaceComposerClient::setDisplayPowerMode(mDisplays[pmu.id()], pmu.mode()); 68101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju} 68201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 683c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::waitUntilTimestamp(int64_t timestamp) { 684c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGV("Waiting for %lld nanoseconds...", static_cast<int64_t>(timestamp - mCurrentTime)); 685c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::this_thread::sleep_for(std::chrono::nanoseconds(timestamp - mCurrentTime)); 686c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 687c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 688c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid Replayer::waitUntilDeferredTransactionLayerExists( 689c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju const DeferredTransactionChange& dtc, std::unique_lock<std::mutex>& lock) { 690c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (mLayers.count(dtc.layer_id()) == 0 || mLayers[dtc.layer_id()] == nullptr) { 691c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mLayerCond.wait(lock, [&] { return (mLayers[dtc.layer_id()] != nullptr); }); 692c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 693c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 694c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 695c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t Replayer::loadSurfaceComposerClient() { 696c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju mComposerClient = new SurfaceComposerClient; 697c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return mComposerClient->initCheck(); 698c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 699