we now correctly set-up connected screens during boot

Change-Id: Ie8b1a3b97ad1821cc970e43abe96c8cec7135b66
diff --git a/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp b/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp
index 8c6ecc0..9ada197 100644
--- a/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp
+++ b/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp
@@ -46,8 +46,9 @@
  *
  */
 
-FramebufferSurface::FramebufferSurface(HWComposer& hwc) :
+FramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp) :
     ConsumerBase(new BufferQueue(true, new GraphicBufferAlloc())),
+    mDisplayType(disp),
     mCurrentBufferSlot(-1),
     mCurrentBuffer(0),
     mHwc(hwc)
@@ -55,10 +56,10 @@
     mName = "FramebufferSurface";
     mBufferQueue->setConsumerName(mName);
     mBufferQueue->setConsumerUsageBits(GRALLOC_USAGE_HW_FB |
-                                       GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_COMPOSER);
-    mBufferQueue->setDefaultBufferFormat(mHwc.getFormat(HWC_DISPLAY_PRIMARY));
-    mBufferQueue->setDefaultBufferSize(mHwc.getWidth(HWC_DISPLAY_PRIMARY),
-                                       mHwc.getHeight(HWC_DISPLAY_PRIMARY));
+                                       GRALLOC_USAGE_HW_RENDER |
+                                       GRALLOC_USAGE_HW_COMPOSER);
+    mBufferQueue->setDefaultBufferFormat(mHwc.getFormat(disp));
+    mBufferQueue->setDefaultBufferSize(mHwc.getWidth(disp),  mHwc.getHeight(disp));
     mBufferQueue->setSynchronousMode(true);
     mBufferQueue->setDefaultMaxBufferCount(NUM_FRAME_BUFFERS);
 }
@@ -111,7 +112,7 @@
                 strerror(-err), err);
         return;
     }
-    err = mHwc.fbPost(0, acquireFence, buf); // FIXME: use real display id
+    err = mHwc.fbPost(mDisplayType, acquireFence, buf);
     if (err != NO_ERROR) {
         ALOGE("error posting framebuffer: %d", err);
     }
diff --git a/services/surfaceflinger/DisplayHardware/FramebufferSurface.h b/services/surfaceflinger/DisplayHardware/FramebufferSurface.h
index 717a3f1..d64fea7 100644
--- a/services/surfaceflinger/DisplayHardware/FramebufferSurface.h
+++ b/services/surfaceflinger/DisplayHardware/FramebufferSurface.h
@@ -36,7 +36,7 @@
 
 class FramebufferSurface : public ConsumerBase {
 public:
-    FramebufferSurface(HWComposer& hwc);
+    FramebufferSurface(HWComposer& hwc, int disp);
 
     bool isUpdateOnDemand() const { return false; }
     status_t setUpdateRectangle(const Rect& updateRect);
@@ -63,6 +63,9 @@
     // BufferQueue.  The new buffer is returned in the 'buffer' argument.
     status_t nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence);
 
+    // mDisplayType must match one of the HWC display types
+    int mDisplayType;
+
     // mCurrentBufferIndex is the slot index of the current buffer or
     // INVALID_BUFFER_SLOT to indicate that either there is no current buffer
     // or the buffer is not associated with a slot.
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 09ac78d..6509a12 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -301,10 +301,7 @@
                 disp, connected);
         return;
     }
-
-    if (connected)
-        queryDisplayProperties(disp);
-
+    queryDisplayProperties(disp);
     mEventHandler.onHotplugReceived(disp, bool(connected));
 }
 
@@ -335,6 +332,7 @@
     status_t err = mHwc->getDisplayConfigs(mHwc, disp, &config, &numConfigs);
     if (err != NO_ERROR) {
         // this can happen if an unpluggable display is not connected
+        mDisplayData[disp].connected = false;
         return err;
     }
 
@@ -365,6 +363,9 @@
         }
     }
 
+    // FIXME: what should we set the format to?
+    mDisplayData[disp].format = HAL_PIXEL_FORMAT_RGBA_8888;
+    mDisplayData[disp].connected = true;
     if (mDisplayData[disp].xdpi == 0.0f || mDisplayData[disp].ydpi == 0.0f) {
         // is there anything smarter we can do?
         if (h >= 1080) {
@@ -432,6 +433,10 @@
     return mDisplayData[disp].ydpi;
 }
 
+bool HWComposer::isConnected(int disp) const {
+    return mDisplayData[disp].connected;
+}
+
 void HWComposer::eventControl(int event, int enabled) {
     status_t err = NO_ERROR;
     if (mHwc) {
@@ -503,9 +508,9 @@
         // triggers a SurfaceTextureClient::queueBuffer()  on some
         // devices (!?) -- log and ignore.
         ALOGE("HWComposer: framebufferTarget is null");
-        CallStack stack;
-        stack.update();
-        stack.dump("");
+//        CallStack stack;
+//        stack.update();
+//        stack.dump("");
         return NO_ERROR;
     }
 
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h
index ff39bc1..8f66651 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -234,6 +234,7 @@
     uint32_t getFormat(int disp) const;
     float getDpiX(int disp) const;
     float getDpiY(int disp) const;
+    bool isConnected(int disp) const;
 
     // this class is only used to fake the VSync event on systems that don't
     // have it.
@@ -283,7 +284,7 @@
 
     struct DisplayData {
         DisplayData() : xdpi(0), ydpi(0), refresh(0),
-            hasFbComp(false), hasOvComp(false),
+            connected(false), hasFbComp(false), hasOvComp(false),
             capacity(0), list(NULL),
             framebufferTarget(NULL), fbTargetHandle(NULL) { }
         ~DisplayData() {
@@ -295,6 +296,7 @@
         float xdpi;
         float ydpi;
         nsecs_t refresh;
+        bool connected;
         bool hasFbComp;
         bool hasOvComp;
         size_t capacity;