remove a dependency of DisplayDevice on the refresh rate

this remove a dependency (not all) on FramebufferSurface

Change-Id: Ie07ce70760cdcedfb41b5b41bea8da45637bf474
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index d337805..2a51fb6 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -101,14 +101,12 @@
 
 HWComposer::HWComposer(
         const sp<SurfaceFlinger>& flinger,
-        EventHandler& handler,
-        nsecs_t refreshPeriod)
+        EventHandler& handler)
     : mFlinger(flinger),
       mModule(0), mHwc(0), mList(0), mCapacity(0),
       mNumOVLayers(0), mNumFBLayers(0),
       mCBContext(new cb_context),
-      mEventHandler(handler),
-      mRefreshPeriod(refreshPeriod),
+      mEventHandler(handler), mRefreshPeriod(0),
       mVSyncCount(0), mDebugForceFakeVSync(false)
 {
     char value[PROPERTY_VALUE_MAX];
@@ -137,6 +135,11 @@
                 // always turn vsync off when we start
                 mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
                 needVSyncThread = false;
+
+                int period;
+                if (mHwc->query(mHwc, HWC_VSYNC_PERIOD, &period) == NO_ERROR) {
+                    mRefreshPeriod = nsecs_t(period);
+                }
             }
             if (mHwc->registerProcs) {
                 mCBContext->hwc = this;
@@ -148,6 +151,26 @@
         }
     }
 
+    if (mRefreshPeriod == 0) {
+        // for compatibility, we attempt to get the refresh rate from
+        // the FB HAL if we couldn't get it from the HWC HAL.
+        hw_module_t const* module;
+        if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
+            framebuffer_device_t* fbDev;
+            int err = framebuffer_open(module, &fbDev);
+            if (!err && fbDev) {
+                mRefreshPeriod = nsecs_t(1e9 / fbDev->fps);
+                framebuffer_close(fbDev);
+            }
+        }
+        ALOGW("getting VSYNC period from fb HAL: %lld", mRefreshPeriod);
+    }
+
+    if (mRefreshPeriod == 0) {
+        mRefreshPeriod = nsecs_t(1e9 / 60.0);
+        ALOGW("getting VSYNC period thin air: %lld", mRefreshPeriod);
+    }
+
     if (needVSyncThread) {
         // we don't have VSYNC support, we need to fake it
         mVSyncThread = new VSyncThread(*this);
@@ -189,6 +212,10 @@
     mLastHwVSync = timestamp;
 }
 
+nsecs_t HWComposer::getRefreshPeriod() const {
+    return mRefreshPeriod;
+}
+
 nsecs_t HWComposer::getRefreshTimestamp() const {
     // this returns the last refresh timestamp.
     // if the last one is not available, we estimate it based on