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
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h
index 872ab98..b9c9337 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -55,8 +55,7 @@
virtual ~EventHandler() {}
};
- HWComposer(const sp<SurfaceFlinger>& flinger,
- EventHandler& handler, nsecs_t refreshPeriod);
+ HWComposer(const sp<SurfaceFlinger>& flinger, EventHandler& handler);
~HWComposer();
status_t initCheck() const;
@@ -189,6 +188,7 @@
void eventControl(int event, int enabled);
+ nsecs_t getRefreshPeriod() const;
nsecs_t getRefreshTimestamp() const;
// this class is only used to fake the VSync event on systems that don't