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