libhwcomposer: MDP composition for Higher Resolution panels

This patch:
       -Implements MDP composition for higher resolution
        panels of width more than 2k.
       -Adds DMA pipe support for high res. MDP composition

Change-Id: Ib7b1f822e3600eca81521294fedfe05e948b65c3
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 45cd77b..fae460c 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2012, The Linux Foundation. All rights reserved.
+ * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
+ *
  * Not a Contribution, Apache license notifications and license are retained
  * for attribution purposes only.
  *
@@ -30,14 +31,15 @@
 namespace qhwc {
 namespace ovutils = overlay::utils;
 
+
 class MDPComp {
 public:
-    virtual ~MDPComp() {}
+    virtual ~MDPComp(){};
     /*sets up mdp comp for the current frame */
-    virtual bool prepare(hwc_context_t *ctx,
-            hwc_display_contents_1_t* list) = 0;
+    bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list);
     /* draw */
     virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
+
     void dump(android::String8& buf);
     bool isUsed() { return (mState == MDPCOMP_ON); };
 
@@ -55,24 +57,62 @@
     enum ePipeType {
         MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
         MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
+        MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
         MDPCOMP_OV_ANY,
     };
+    struct MdpPipeInfo {
+        int zOrder;
+        virtual ~MdpPipeInfo(){};
+    };
+    struct PipeLayerPair {
+        MdpPipeInfo *pipeInfo;
+        native_handle_t* handle;
+    };
+
+    /* introduced for mixed mode implementation */
+    struct FrameInfo {
+        int count;
+        struct PipeLayerPair* pipeLayer;
+    };
+
+    /* calculates pipes needed for the panel */
+    virtual int pipesNeeded(hwc_context_t *ctx,
+                            hwc_display_contents_1_t* list) = 0;
+    /* allocates pipe from pipe book */
+    virtual bool allocLayerPipes(hwc_context_t *ctx,
+                hwc_display_contents_1_t* list,FrameInfo& current_frame) = 0;
+    /* configures MPD pipes */
+    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
+                        MdpPipeInfo* mdp_info) = 0;
+    /* Is rotation supported */
+    virtual bool canRotate(){ return true; };
+
 
     /* set/reset flags for MDPComp */
     void setMDPCompLayerFlags(hwc_context_t *ctx,
                                        hwc_display_contents_1_t* list);
     void unsetMDPCompLayerFlags(hwc_context_t* ctx,
                                        hwc_display_contents_1_t* list);
-    void printInfo(hwc_layer_1_t* layer);
     /* get/set states */
     eState getState() { return mState; };
-
+    /* reset state */
+    void reset( hwc_context_t *ctx, hwc_display_contents_1_t* list );
+    /* configure MDP flags for video buffers */
+    void setVidInfo(hwc_layer_1_t *layer, ovutils::eMdpFlags &mdpFlags);
+    /* allocate MDP pipes from overlay */
+    ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type);
+    /* checks for conditions where mdpcomp is not possible */
+    bool isDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list);
+    /* sets up MDP comp for current frame */
+    bool setup(hwc_context_t* ctx, hwc_display_contents_1_t* list);
     /* set up Border fill as Base pipe */
     static bool setupBasePipe(hwc_context_t*);
     /* Is debug enabled */
     static bool isDebug() { return sDebugLogs ? true : false; };
     /* Is feature enabled */
     static bool isEnabled() { return sEnabled; };
+    /* checks for mdp comp width limitation */
+    bool isWidthValid(hwc_context_t *ctx, hwc_layer_1_t *layer);
 
     eState mState;
 
@@ -80,63 +120,58 @@
     static bool sDebugLogs;
     static bool sIdleFallBack;
     static IdleInvalidator *idleInvalidator;
-
+    struct FrameInfo mCurrentFrame;
 };
 
 class MDPCompLowRes : public MDPComp {
 public:
-    virtual ~MDPCompLowRes() {}
-    virtual bool prepare(hwc_context_t *ctx,
-            hwc_display_contents_1_t* list);
-    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
+     virtual ~MDPCompLowRes(){};
+     virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
 
 private:
-    struct MdpPipeInfo {
-        int index;
-        int zOrder;
+    struct MdpPipeInfoLowRes : public MdpPipeInfo {
+        ovutils::eDest index;
+        virtual ~MdpPipeInfoLowRes() {};
     };
 
-    struct PipeLayerPair {
-        MdpPipeInfo pipeIndex;
-        native_handle_t* handle;
-    };
-
-    struct FrameInfo {
-        int count;
-        struct PipeLayerPair* pipeLayer;
-
-    };
-    /* checks for mdp comp width limitation */
-    bool isWidthValid(hwc_context_t *ctx, hwc_layer_1_t *layer);
     /* configure's overlay pipes for the frame */
-    int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
-                        MdpPipeInfo& mdp_info);
-    /* checks for conditions where mdpcomp is not possible */
-    bool isDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list);
-    bool setup(hwc_context_t* ctx, hwc_display_contents_1_t* list);
+    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
+                        MdpPipeInfo* mdp_info);
+
     /* allocates pipes to selected candidates */
-    bool allocLayerPipes(hwc_context_t *ctx,
+    virtual bool allocLayerPipes(hwc_context_t *ctx,
             hwc_display_contents_1_t* list,
             FrameInfo& current_frame);
-    /* reset state */
-    void reset( hwc_context_t *ctx, hwc_display_contents_1_t* list );
-    /* configure MDP flags for video buffers */
-    void setVidInfo(hwc_layer_1_t *layer, ovutils::eMdpFlags &mdpFlags);
-    /* allocate MDP pipes from overlay */
-    int getMdpPipe(hwc_context_t *ctx, ePipeType type);
 
-    struct FrameInfo mCurrentFrame;
+    virtual int pipesNeeded(hwc_context_t *ctx,
+                        hwc_display_contents_1_t* list);
 };
 
 class MDPCompHighRes : public MDPComp {
 public:
-    virtual ~MDPCompHighRes() {}
-    virtual bool prepare(hwc_context_t *ctx,
-            hwc_display_contents_1_t* list) { return false; }
-    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) {
-        return true;
-    }
-};
+    virtual ~MDPCompHighRes(){};
+    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
+private:
+    struct MdpPipeInfoHighRes : public MdpPipeInfo {
+        ovutils::eDest lIndex;
+        ovutils::eDest rIndex;
+        virtual ~MdpPipeInfoHighRes() {};
+    };
 
+    bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
+                        MdpPipeInfoHighRes& pipe_info, ePipeType type);
+
+    /* configure's overlay pipes for the frame */
+    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
+                        MdpPipeInfo* mdp_info);
+
+    /* allocates pipes to selected candidates */
+    virtual bool allocLayerPipes(hwc_context_t *ctx,
+            hwc_display_contents_1_t* list,
+            FrameInfo& current_frame);
+
+    virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
+    virtual bool canRotate(){ return false; };
+};
 }; //namespace
 #endif