hwc: enable dual display on hwc 1.1

Enable dual display on HWC 1.1; video uses overlay.

Bug: 7124159
Change-Id: I8333e46cfc74072f6259fba2b82368f0dd52b6df
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/liboverlay/overlayState.h b/liboverlay/overlayState.h
index e4fbece..85d61d5 100644
--- a/liboverlay/overlayState.h
+++ b/liboverlay/overlayState.h
@@ -145,6 +145,19 @@
     typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
 };
 
+template <> struct StateTraits<utils::OV_UI_VIDEO_TV>
+{
+    typedef overlay::GenericPipe<utils::EXTERNAL> pipe0; //ext UI
+    typedef overlay::GenericPipe<utils::EXTERNAL> pipe1; //ext video
+    typedef overlay::NullPipe pipe2;
+
+    typedef Rotator rot0;
+    typedef Rotator rot1;
+    typedef NullRotator rot2;
+
+    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
+};
+
 template <> struct StateTraits<utils::OV_3D_VIDEO_ON_2D_PANEL>
 {
     typedef overlay::M3DPrimaryPipe<utils::OV_PIPE0> pipe0;
@@ -199,7 +212,7 @@
 
 template <> struct StateTraits<utils::OV_UI_MIRROR>
 {
-    typedef overlay::UIMirrorPipe pipe0;
+    typedef overlay::GenericPipe<ovutils::EXTERNAL> pipe0; //Ext UI
     typedef overlay::NullPipe pipe1;   // place holder
     typedef overlay::NullPipe pipe2;   // place holder
 
@@ -212,9 +225,9 @@
 
 template <> struct StateTraits<utils::OV_2D_TRUE_UI_MIRROR>
 {
-    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe0; //Vid prim
     typedef overlay::VideoExtPipe pipe1;
-    typedef overlay::UIMirrorPipe pipe2;
+    typedef overlay::GenericPipe<ovutils::EXTERNAL> pipe2; //EXT UI
 
     typedef Rotator rot0;
     typedef Rotator rot1;
@@ -335,6 +348,9 @@
         case utils::OV_2D_TRUE_UI_MIRROR:
             newov = handle_from<utils::OV_2D_TRUE_UI_MIRROR>(toState, ov);
             break;
+        case utils::OV_UI_VIDEO_TV:
+            newov = handle_from<utils::OV_UI_VIDEO_TV>(toState, ov);
+            break;
         case utils::OV_BYPASS_1_LAYER:
             newov = handle_from<utils::OV_BYPASS_1_LAYER>(toState, ov);
             break;
@@ -391,6 +407,9 @@
         case utils::OV_2D_TRUE_UI_MIRROR:
             ov = handle_from_to<FROM_STATE, utils::OV_2D_TRUE_UI_MIRROR>(ov);
             break;
+        case utils::OV_UI_VIDEO_TV:
+            ov = handle_from_to<FROM_STATE, utils::OV_UI_VIDEO_TV>(ov);
+            break;
         case utils::OV_BYPASS_1_LAYER:
             ov = handle_from_to<FROM_STATE, utils::OV_BYPASS_1_LAYER>(ov);
             break;
@@ -580,6 +599,69 @@
     return newov;
 }
 
+/* Transition from OV_UI_MIRROR to OV_UI_VIDEO_TV */
+template<>
+inline OverlayImplBase* OverlayState::handle_from_to<
+        utils::OV_UI_MIRROR,
+        utils::OV_UI_VIDEO_TV>(
+        OverlayImplBase* ov) {
+    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
+    ALOGD("FROM_STATE = %s TO_STATE = %s",
+            utils::getStateString(utils::OV_UI_MIRROR),
+            utils::getStateString(utils::OV_UI_VIDEO_TV));
+
+    // Create new ovimpl based on new state
+    typedef StateTraits<utils::OV_UI_VIDEO_TV> NewState;
+    OverlayImplBase* newov = new NewState::ovimpl;
+
+    //copy pipe0/rot0 (ext video)
+    newov->copyOvPipe(ov, utils::OV_PIPE0);
+
+    ov->closePipe(utils::OV_PIPE1);
+    RotatorBase* rot1 = new NewState::rot1;
+    newov->initPipe(rot1, utils::OV_PIPE1);
+
+    ov->closePipe(utils::OV_PIPE2);
+    RotatorBase* rot2 = new NewState::rot2;
+    newov->initPipe(rot2, utils::OV_PIPE2);
+
+    // All pipes are copied or deleted so no more need for previous ovimpl
+    delete ov;
+    ov = 0;
+    return newov;
+}
+
+/* Transition from OV_UI_VIDEO_TV to OV_UI_MIRROR */
+template<>
+inline OverlayImplBase* OverlayState::handle_from_to<
+        utils::OV_UI_VIDEO_TV,
+        utils::OV_UI_MIRROR>(
+        OverlayImplBase* ov) {
+    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
+    ALOGD("FROM_STATE = %s TO_STATE = %s",
+            utils::getStateString(utils::OV_UI_VIDEO_TV),
+            utils::getStateString(utils::OV_UI_MIRROR));
+
+    // Create new ovimpl based on new state
+    typedef StateTraits<utils::OV_UI_MIRROR> NewState;
+    OverlayImplBase* newov = new NewState::ovimpl;
+
+    //copy pipe0/rot0 (ext video)
+    newov->copyOvPipe(ov, utils::OV_PIPE0);
+
+    ov->closePipe(utils::OV_PIPE1);
+    RotatorBase* rot1 = new NewState::rot1;
+    newov->initPipe(rot1, utils::OV_PIPE1);
+
+    ov->closePipe(utils::OV_PIPE2);
+    RotatorBase* rot2 = new NewState::rot2;
+    newov->initPipe(rot2, utils::OV_PIPE2);
+
+    // All pipes are copied or deleted so no more need for previous ovimpl
+    delete ov;
+    ov = 0;
+    return newov;
+}
 } // overlay
 
 #endif // OVERLAY_STATE_H