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