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;