SurfaceFlinger now uses the new VSYNC HAL API.

If h/w composer doesn't support vsync (version < 0.3) we
"fake" it with a timer.

Change-Id: I1e3be79f43c9631d1293ad7d6cf52f9bfc42d65b
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 94d0021..e742d3e 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -22,9 +22,11 @@
 
 #include <utils/Errors.h>
 #include <utils/String8.h>
+#include <utils/Thread.h>
 #include <utils/Vector.h>
 
 #include <hardware/hardware.h>
+#include <hardware/hwcomposer.h>
 
 #include <cutils/log.h>
 
@@ -37,11 +39,16 @@
 namespace android {
 // ---------------------------------------------------------------------------
 
-HWComposer::HWComposer(const sp<SurfaceFlinger>& flinger)
+HWComposer::HWComposer(
+        const sp<SurfaceFlinger>& flinger,
+        EventHandler& handler,
+        nsecs_t refreshPeriod)
     : mFlinger(flinger),
       mModule(0), mHwc(0), mList(0), mCapacity(0),
       mNumOVLayers(0), mNumFBLayers(0),
-      mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE)
+      mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE),
+      mEventHandler(handler),
+      mRefreshPeriod(refreshPeriod)
 {
     int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
     ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
@@ -57,12 +64,20 @@
                 mHwc->registerProcs(mHwc, &mCBContext.procs);
                 memset(mCBContext.procs.zero, 0, sizeof(mCBContext.procs.zero));
             }
+
+            if (mHwc->common.version < HWC_DEVICE_API_VERSION_0_3) {
+                // we don't have VSYNC support, we need to fake it
+                mVSyncThread = new VSyncThread(*this);
+            }
         }
     }
 }
 
 HWComposer::~HWComposer() {
     free(mList);
+    if (mVSyncThread != NULL) {
+        mVSyncThread->requestExitAndWait();
+    }
     if (mHwc) {
         hwc_close(mHwc);
     }
@@ -85,6 +100,21 @@
 }
 
 void HWComposer::vsync(int dpy, int64_t timestamp) {
+    mEventHandler.onVSyncReceived(dpy, timestamp);
+}
+
+status_t HWComposer::eventControl(int event, int enabled) {
+    status_t err = NO_ERROR;
+    if (mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
+        err = mHwc->methods->eventControl(mHwc, event, enabled);
+    } else {
+        if (mVSyncThread != NULL) {
+            mVSyncThread->setEnabled(enabled);
+        } else {
+            err = BAD_VALUE;
+        }
+    }
+    return err;
 }
 
 void HWComposer::setFrameBuffer(EGLDisplay dpy, EGLSurface sur) {