1d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis/*
2d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * Copyright (C) 2013 The Android Open Source Project
3d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis *
4d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
5d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * you may not use this file except in compliance with the License.
6d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * You may obtain a copy of the License at
7d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis *
8d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
9d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis *
10d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * Unless required by applicable law or agreed to in writing, software
11d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
12d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * See the License for the specific language governing permissions and
14d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis * limitations under the License.
15d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis */
16d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
17d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis#include "EventControlThread.h"
18d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis#include "SurfaceFlinger.h"
19d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
20d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennisnamespace android {
21d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
22d1700756ec9520c3fba22f9a14fd064a6e288810Jamie GennisEventControlThread::EventControlThread(const sp<SurfaceFlinger>& flinger):
23d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        mFlinger(flinger),
24d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        mVsyncEnabled(false) {
25d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis}
26d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
27d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennisvoid EventControlThread::setVsyncEnabled(bool enabled) {
28d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    Mutex::Autolock lock(mMutex);
29d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    mVsyncEnabled = enabled;
30d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    mCond.signal();
31d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis}
32d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
33d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennisbool EventControlThread::threadLoop() {
34d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    Mutex::Autolock lock(mMutex);
35d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
36d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    bool vsyncEnabled = mVsyncEnabled;
37d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
38d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    mFlinger->eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC,
39d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            mVsyncEnabled);
40d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
41d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    while (true) {
42d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        status_t err = mCond.wait(mMutex);
43d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        if (err != NO_ERROR) {
44d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            ALOGE("error waiting for new events: %s (%d)",
45d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis                strerror(-err), err);
46d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            return false;
47d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        }
48d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
49d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        if (vsyncEnabled != mVsyncEnabled) {
50d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            mFlinger->eventControl(HWC_DISPLAY_PRIMARY,
51d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis                    SurfaceFlinger::EVENT_VSYNC, mVsyncEnabled);
52d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            vsyncEnabled = mVsyncEnabled;
53d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        }
54d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    }
55d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
56d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    return false;
57d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis}
58d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
59d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis} // namespace android
60