make multi-display more real

- displays are represented by a binder on the client side
- c++ clients can now create and modify displays

Change-Id: I203ea5b4beae0819d742ec5171c27568f4e8354b
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index da417ff..6438bee 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -78,7 +78,10 @@
 // ---------------------------------------------------------------------------
 
 enum {
-    eTransactionNeeded = 0x01, eTraversalNeeded = 0x02
+    eTransactionNeeded        = 0x01,
+    eTraversalNeeded          = 0x02,
+    eDisplayTransactionNeeded = 0x04,
+    eTransactionMask          = 0x07
 };
 
 class SurfaceFlinger : public BinderService<SurfaceFlinger>,
@@ -158,19 +161,18 @@
 
     struct DisplayDeviceState {
         DisplayDeviceState();
+        DisplayDeviceState(int32_t id);
         int32_t id;
+        sp<ISurfaceTexture> surface;
         uint32_t layerStack;
         Rect viewport;
         Rect frame;
         uint8_t orientation;
-        inline bool operator < (const DisplayDeviceState& rhs) const {
-            return id < rhs.id;
-        }
     };
 
     struct State {
         LayerVector layersSortedByZ;
-        KeyedVector<int32_t, DisplayDeviceState> displays;
+        DefaultKeyedVector< wp<IBinder>, DisplayDeviceState> displays;
     };
 
     /* ------------------------------------------------------------------------
@@ -185,6 +187,8 @@
      */
     virtual sp<ISurfaceComposerClient> createConnection();
     virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc();
+    virtual sp<IBinder> createDisplay();
+    virtual sp<IBinder> getBuiltInDisplay(int32_t id);
     virtual void setTransactionState(const Vector<ComposerState>& state,
             const Vector<DisplayState>& displays, uint32_t flags);
     virtual void bootFinished();
@@ -256,6 +260,7 @@
     void commitTransaction();
     uint32_t setClientStateLocked(const sp<Client>& client,
         const layer_state_t& s);
+    uint32_t setDisplayStateLocked(const DisplayState& s);
 
     /* ------------------------------------------------------------------------
      * Layer management
@@ -391,6 +396,7 @@
     EGLContext mEGLContext;
     EGLConfig mEGLConfig;
     EGLDisplay mEGLDisplay;
+    sp<IBinder> mDefaultDisplays[DisplayDevice::DISPLAY_ID_COUNT];
 
     // Can only accessed from the main thread, these members
     // don't need synchronization