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
389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, mVsyncEnabled);
409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
41d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    mFlinger->eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC,
42d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            mVsyncEnabled);
439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
44d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
45d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    while (true) {
46d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        status_t err = mCond.wait(mMutex);
47d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        if (err != NO_ERROR) {
48d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            ALOGE("error waiting for new events: %s (%d)",
49d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis                strerror(-err), err);
50d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            return false;
51d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        }
52d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
53d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        if (vsyncEnabled != mVsyncEnabled) {
549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, mVsyncEnabled);
569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
57d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            mFlinger->eventControl(HWC_DISPLAY_PRIMARY,
58d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis                    SurfaceFlinger::EVENT_VSYNC, mVsyncEnabled);
599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
60d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis            vsyncEnabled = mVsyncEnabled;
61d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis        }
62d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    }
63d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
64d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis    return false;
65d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis}
66d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis
67d1700756ec9520c3fba22f9a14fd064a6e288810Jamie Gennis} // namespace android
68