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