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