split HWComposer out of DisplayHardware
we will only ever have a single instance of HWComposer, so
it's now an attribute of SurfaceFlinger, instead of being part
of DisplayHardware.
DisplayHardware now just represents a "display" (it should be renamed).
Change-Id: Iec191e57686868e1df6daa8b880a286c9fefde56
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8f94325..2ecdeb8 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -406,6 +406,14 @@
EGLSurface surface = hw->getEGLSurface();
initializeGL(display, surface);
+ // initialize the H/W composer
+ mHwc = new HWComposer(this,
+ *static_cast<HWComposer::EventHandler *>(this),
+ hw->getRefreshPeriod());
+ if (mHwc->initCheck() == NO_ERROR) {
+ mHwc->setFrameBuffer(display, surface);
+ }
+
// start the EventThread
mEventThread = new EventThread(this);
mEventQueue.setEventThread(mEventThread);
@@ -555,6 +563,16 @@
return true;
}
+void SurfaceFlinger::onVSyncReceived(int dpy, nsecs_t timestamp) {
+ DisplayHardware& hw(const_cast<DisplayHardware&>(getDisplayHardware(dpy)));
+ hw.onVSyncReceived(timestamp);
+ mEventThread->onVSyncReceived(dpy, timestamp);
+}
+
+void SurfaceFlinger::eventControl(int event, int enabled) {
+ getHwComposer().eventControl(event, enabled);
+}
+
void SurfaceFlinger::onMessageReceived(int32_t what) {
ATRACE_CALL();
switch (what) {
@@ -705,7 +723,7 @@
// h/w composer.
const DisplayHardware& hw(getDefaultDisplayHardware());
- HWComposer& hwc(hw.getHwComposer());
+ HWComposer& hwc(getHwComposer());
const Vector< sp<LayerBase> >& layers(hw.getVisibleLayersSortedByZ());
size_t numLayers = layers.size();
const nsecs_t now = systemTime();
@@ -724,6 +742,7 @@
}
hw.flip(mSwapRegion);
+ hwc.commit();
if (hwc.initCheck() == NO_ERROR) {
HWComposer::LayerListIterator cur = hwc.begin();
@@ -1027,7 +1046,7 @@
void SurfaceFlinger::handleWorkList(const DisplayHardware& hw)
{
mHwWorkListDirty = false;
- HWComposer& hwc(hw.getHwComposer());
+ HWComposer& hwc(getHwComposer());
if (hwc.initCheck() == NO_ERROR) {
const Vector< sp<LayerBase> >& currentLayers(hw.getVisibleLayersSortedByZ());
const size_t count = currentLayers.size();
@@ -1089,7 +1108,7 @@
void SurfaceFlinger::setupHardwareComposer(const DisplayHardware& hw)
{
- HWComposer& hwc(hw.getHwComposer());
+ HWComposer& hwc(getHwComposer());
HWComposer::LayerListIterator cur = hwc.begin();
const HWComposer::LayerListIterator end = hwc.end();
if (cur == end) {
@@ -1122,7 +1141,7 @@
void SurfaceFlinger::composeSurfaces(const DisplayHardware& hw, const Region& dirty)
{
- HWComposer& hwc(hw.getHwComposer());
+ HWComposer& hwc(getHwComposer());
HWComposer::LayerListIterator cur = hwc.begin();
const HWComposer::LayerListIterator end = hwc.end();
@@ -1578,6 +1597,7 @@
void SurfaceFlinger::onScreenAcquired() {
ALOGD("Screen about to return, flinger = %p", this);
const DisplayHardware& hw(getDefaultDisplayHardware()); // XXX: this should be per DisplayHardware
+ getHwComposer().acquire();
hw.acquireScreen();
mEventThread->onScreenAcquired();
// this is a temporary work-around, eventually this should be called
@@ -1593,6 +1613,7 @@
if (hw.isScreenAcquired()) {
mEventThread->onScreenReleased();
hw.releaseScreen();
+ getHwComposer().release();
// from this point on, SF will stop drawing
}
}
@@ -1842,7 +1863,7 @@
/*
* Dump HWComposer state
*/
- HWComposer& hwc(hw.getHwComposer());
+ HWComposer& hwc(getHwComposer());
snprintf(buffer, SIZE, "h/w composer state:\n");
result.append(buffer);
snprintf(buffer, SIZE, " h/w composer %s and %s\n",
@@ -2430,7 +2451,7 @@
}
// turn off hwc while we're doing the animation
- hw.getHwComposer().disable();
+ getHwComposer().disable();
// and make sure to turn it back on (if needed) next time we compose
invalidateHwcGeometry();