Merge "gralloc: Stride information fix"
diff --git a/libexternal/external.cpp b/libexternal/external.cpp
index f941404..3f13906 100644
--- a/libexternal/external.cpp
+++ b/libexternal/external.cpp
@@ -683,25 +683,6 @@
     return ret;
 }
 
-/*
- * commits the changes to the external display
- */
-bool ExternalDisplay::post()
-{
-    if(mFd == -1)
-        return false;
-
-    struct mdp_display_commit ext_commit;
-    memset(&ext_commit, 0, sizeof(struct mdp_display_commit));
-    ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY;
-    if (ioctl(mFd, MSMFB_DISPLAY_COMMIT, &ext_commit) == -1) {
-        ALOGE("%s: MSMFB_DISPLAY_COMMIT for external failed, str: %s",
-                __FUNCTION__, strerror(errno));
-        return false;
-    }
-    return true;
-}
-
 void ExternalDisplay::setDpyWfdAttr() {
     if(mHwcContext) {
         mHwcContext->dpyAttr[mExtDpyNum].xres = mVInfo.xres;
diff --git a/libexternal/external.h b/libexternal/external.h
index 39f8645..d46eec1 100644
--- a/libexternal/external.h
+++ b/libexternal/external.h
@@ -47,7 +47,6 @@
     void setExternalDisplay(bool connected, int extFbNum = 0);
     bool isExternalConnected() { return mConnected;};
     void  setExtDpyNum(int extDpyNum) { mExtDpyNum = extDpyNum;};
-    bool post();
     void setHPD(uint32_t startEnd);
     void setEDIDMode(int resMode);
     void setActionSafeDimension(int w, int h);
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index 20f7973..9af52c9 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -196,8 +196,8 @@
     if(usage & GRALLOC_USAGE_PRIVATE_MM_HEAP)
         ionFlags |= ION_HEAP(ION_CP_MM_HEAP_ID);
 
-    if(usage & GRALLOC_USAGE_PRIVATE_CAMERA_HEAP)
-        ionFlags |= ION_HEAP(ION_CAMERA_HEAP_ID);
+    if(usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP)
+        ionFlags |= ION_HEAP(ION_ADSP_HEAP_ID);
 
     if(usage & GRALLOC_USAGE_PROTECTED && !noncontig)
         ionFlags |= ION_SECURE;
diff --git a/libgralloc/fb_priv.h b/libgralloc/fb_priv.h
index b096304..01af2e1 100644
--- a/libgralloc/fb_priv.h
+++ b/libgralloc/fb_priv.h
@@ -52,13 +52,6 @@
     float fps;
     uint32_t swapInterval;
     uint32_t currentOffset;
-    bool fbPostDone;
-    pthread_mutex_t fbPostLock;
-    //Condition to inform HWC that fb_post called
-    pthread_cond_t fbPostCond;
-    bool fbPanDone;
-    pthread_mutex_t fbPanLock;
-    pthread_cond_t fbPanCond;
 };
 
 
diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp
index cc16a5f..0335f5e 100644
--- a/libgralloc/framebuffer.cpp
+++ b/libgralloc/framebuffer.cpp
@@ -54,7 +54,6 @@
 
 enum {
     PAGE_FLIP = 0x00000001,
-    LOCKED    = 0x00000002
 };
 
 struct fb_context_t {
@@ -88,8 +87,8 @@
     private_module_t* m =
         reinterpret_cast<private_module_t*>(dev->common.module);
     struct mdp_display_commit prim_commit;
+    prim_commit.wait_for_finish = 1;
     memset(&prim_commit, 0, sizeof(struct mdp_display_commit));
-    prim_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY;
     if (ioctl(m->framebuffer->fd, MSMFB_DISPLAY_COMMIT, &prim_commit) == -1) {
         ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed, str: %s",
                 __FUNCTION__, strerror(errno));
@@ -326,12 +325,6 @@
     module->framebuffer->base = intptr_t(vaddr);
     memset(vaddr, 0, fbSize);
     module->currentOffset = 0;
-    module->fbPostDone = false;
-    pthread_mutex_init(&(module->fbPostLock), NULL);
-    pthread_cond_init(&(module->fbPostCond), NULL);
-    module->fbPanDone = false;
-    pthread_mutex_init(&(module->fbPanLock), NULL);
-    pthread_cond_init(&(module->fbPanCond), NULL);
     return 0;
 }
 
diff --git a/libgralloc/gpu.cpp b/libgralloc/gpu.cpp
index 292012b..8b9a6c5 100644
--- a/libgralloc/gpu.cpp
+++ b/libgralloc/gpu.cpp
@@ -52,77 +52,6 @@
 
 }
 
-int gpu_context_t::gralloc_alloc_framebuffer_locked(size_t size, int usage,
-                                                    buffer_handle_t* pHandle)
-{
-    private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
-
-    // we don't support framebuffer allocations with graphics heap flags
-    if (usage & GRALLOC_HEAP_MASK) {
-        return -EINVAL;
-    }
-
-    if (m->framebuffer == NULL) {
-        ALOGE("%s: Invalid framebuffer", __FUNCTION__);
-        return -EINVAL;
-    }
-
-    const uint32_t bufferMask = m->bufferMask;
-    const uint32_t numBuffers = m->numBuffers;
-    size_t bufferSize = m->finfo.line_length * m->info.yres;
-
-    //adreno needs FB size to be page aligned
-    bufferSize = roundUpToPageSize(bufferSize);
-
-    if (numBuffers == 1) {
-        // If we have only one buffer, we never use page-flipping. Instead,
-        // we return a regular buffer which will be memcpy'ed to the main
-        // screen when post is called.
-        int newUsage = (usage & ~GRALLOC_USAGE_HW_FB) | GRALLOC_USAGE_HW_2D;
-        return gralloc_alloc_buffer(bufferSize, newUsage, pHandle, BUFFER_TYPE_UI,
-                                    m->fbFormat, m->info.xres, m->info.yres);
-    }
-
-    if (bufferMask >= ((1LU<<numBuffers)-1)) {
-        // We ran out of buffers.
-        return -ENOMEM;
-    }
-
-    // create a "fake" handle for it
-    intptr_t vaddr = intptr_t(m->framebuffer->base);
-    private_handle_t* hnd = new private_handle_t(
-                                dup(m->framebuffer->fd), bufferSize,
-                                private_handle_t::PRIV_FLAGS_USES_ION |
-                                private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
-                                BUFFER_TYPE_UI, m->fbFormat, m->info.xres,
-                                m->info.yres);
-
-    // find a free slot
-    for (uint32_t i=0 ; i<numBuffers ; i++) {
-        if ((bufferMask & (1LU<<i)) == 0) {
-            m->bufferMask |= (1LU<<i);
-            break;
-        }
-        vaddr += bufferSize;
-    }
-
-    hnd->base = vaddr;
-    hnd->offset = vaddr - intptr_t(m->framebuffer->base);
-    *pHandle = hnd;
-    return 0;
-}
-
-
-int gpu_context_t::gralloc_alloc_framebuffer(size_t size, int usage,
-                                             buffer_handle_t* pHandle)
-{
-    private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
-    pthread_mutex_lock(&m->lock);
-    int err = gralloc_alloc_framebuffer_locked(size, usage, pHandle);
-    pthread_mutex_unlock(&m->lock);
-    return err;
-}
-
 int gpu_context_t::gralloc_alloc_buffer(size_t size, int usage,
                                         buffer_handle_t* pHandle, int bufferType,
                                         int format, int width, int height)
@@ -267,26 +196,20 @@
 
 int gpu_context_t::free_impl(private_handle_t const* hnd) {
     private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
-    if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
-        // free this buffer
-        const size_t bufferSize = m->finfo.line_length * m->info.yres;
-        int index = (hnd->base - m->framebuffer->base) / bufferSize;
-        m->bufferMask &= ~(1<<index);
-    } else {
-        terminateBuffer(&m->base, const_cast<private_handle_t*>(hnd));
-        IMemAlloc* memalloc = mAllocCtrl->getAllocator(hnd->flags);
-        int err = memalloc->free_buffer((void*)hnd->base, (size_t) hnd->size,
-                                        hnd->offset, hnd->fd);
-        if(err)
-            return err;
-        // free the metadata space
-        unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
-        err = memalloc->free_buffer((void*)hnd->base_metadata,
-                                    (size_t) size, hnd->offset_metadata,
-                                    hnd->fd_metadata);
-        if (err)
-            return err;
-    }
+
+    terminateBuffer(&m->base, const_cast<private_handle_t*>(hnd));
+    IMemAlloc* memalloc = mAllocCtrl->getAllocator(hnd->flags);
+    int err = memalloc->free_buffer((void*)hnd->base, (size_t) hnd->size,
+                                    hnd->offset, hnd->fd);
+    if(err)
+        return err;
+    // free the metadata space
+    unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
+    err = memalloc->free_buffer((void*)hnd->base_metadata,
+                                (size_t) size, hnd->offset_metadata,
+                                hnd->fd_metadata);
+    if (err)
+        return err;
 
     delete hnd;
     return 0;
diff --git a/libgralloc/gpu.h b/libgralloc/gpu.h
index 2986984..6826ffe 100644
--- a/libgralloc/gpu.h
+++ b/libgralloc/gpu.h
@@ -27,7 +27,7 @@
 #include <cutils/ashmem.h>
 
 #include "gralloc_priv.h"
-#include <fb_priv.h>
+#include "fb_priv.h"
 
 namespace gralloc {
 class IAllocController;
@@ -36,12 +36,6 @@
     gpu_context_t(const private_module_t* module,
                   IAllocController* alloc_ctrl);
 
-    int gralloc_alloc_framebuffer_locked(size_t size, int usage,
-                                         buffer_handle_t* pHandle);
-
-    int gralloc_alloc_framebuffer(size_t size, int usage,
-                                  buffer_handle_t* pHandle);
-
     int gralloc_alloc_buffer(size_t size, int usage,
                              buffer_handle_t* pHandle,
                              int bufferType, int format,
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index 719a941..c382a90 100644
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -47,8 +47,8 @@
     GRALLOC_USAGE_PRIVATE_IOMMU_HEAP      =       GRALLOC_USAGE_PRIVATE_2,
     /* MM heap is a carveout heap for video, can be secured*/
     GRALLOC_USAGE_PRIVATE_MM_HEAP         =       GRALLOC_USAGE_PRIVATE_3,
-    /* CAMERA heap is a carveout heap for camera, is not secured*/
-    GRALLOC_USAGE_PRIVATE_CAMERA_HEAP     =       0x01000000,
+    /* ADSP heap is a carveout heap, is not secured*/
+    GRALLOC_USAGE_PRIVATE_ADSP_HEAP       =       0x01000000,
 
     /* Set this for allocating uncached memory (using O_DSYNC)
      * cannot be used with noncontiguous heaps */
@@ -84,7 +84,7 @@
                              GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP    |\
                              GRALLOC_USAGE_PRIVATE_IOMMU_HEAP     |\
                              GRALLOC_USAGE_PRIVATE_MM_HEAP        |\
-                             GRALLOC_USAGE_PRIVATE_CAMERA_HEAP)
+                             GRALLOC_USAGE_PRIVATE_ADSP_HEAP)
 
 #define INTERLACE_MASK 0x80
 #define S3D_FORMAT_MASK 0xFF000
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 30555fa..540040a 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -25,10 +25,9 @@
 #include <cutils/atomic.h>
 #include <EGL/egl.h>
 #include <utils/Trace.h>
-
+#include <sys/ioctl.h>
 #include <overlay.h>
 #include <overlayRotator.h>
-#include <fb_priv.h>
 #include <mdp_version.h>
 #include "hwc_utils.h"
 #include "hwc_video.h"
@@ -122,6 +121,17 @@
     }
 }
 
+static int display_commit(hwc_context_t *ctx, int dpy) {
+    struct mdp_display_commit commit_info;
+    memset(&commit_info, 0, sizeof(struct mdp_display_commit));
+    commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
+    if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) {
+       ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__);
+       return -errno;
+    }
+    return 0;
+}
+
 static int hwc_prepare_primary(hwc_composer_device_1 *dev,
         hwc_display_contents_1_t *list) {
     hwc_context_t* ctx = (hwc_context_t*)(dev);
@@ -217,8 +227,6 @@
 {
     int ret = 0;
     hwc_context_t* ctx = (hwc_context_t*)(dev);
-    private_module_t* m = reinterpret_cast<private_module_t*>(
-                ctx->mFbDev->common.module);
     pthread_mutex_lock(&ctx->vstate.lock);
     switch(event) {
         case HWC_EVENT_VSYNC:
@@ -243,8 +251,7 @@
 {
     ATRACE_CALL();
     hwc_context_t* ctx = (hwc_context_t*)(dev);
-    private_module_t* m = reinterpret_cast<private_module_t*>(
-        ctx->mFbDev->common.module);
+
     Locker::Autolock _l(ctx->mBlankLock);
     int ret = 0;
     ALOGD("%s: %s display: %d", __FUNCTION__,
@@ -255,13 +262,13 @@
                 ctx->mOverlay->configBegin();
                 ctx->mOverlay->configDone();
                 ctx->mRotMgr->clear();
-                ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_POWERDOWN);
+                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_POWERDOWN);
 
                 if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
                     // Surfaceflinger does not send Blank/unblank event to hwc
                     // for virtual display, handle it explicitly when blank for
                     // primary is invoked, so that any pipes unset get committed
-                    if (!ctx->mExtDisplay->post()) {
+                    if (display_commit(ctx, HWC_DISPLAY_VIRTUAL) < 0) {
                         ret = -1;
                         ALOGE("%s:post failed for virtual display !!",
                                                             __FUNCTION__);
@@ -270,7 +277,7 @@
                     }
                 }
             } else {
-                ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_UNBLANK);
+                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, FB_BLANK_UNBLANK);
                 if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
                     ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
                 }
@@ -278,12 +285,11 @@
             break;
         case HWC_DISPLAY_EXTERNAL:
             if(blank) {
-                // External post commits the changes to display
-                // Call this on blank, so that any pipe unsets gets committed
-                if (!ctx->mExtDisplay->post()) {
+                // call external framebuffer commit on blank,
+                // so that any pipe unsets gets committed
+                if (display_commit(ctx, dpy) < 0) {
                     ret = -1;
-                    ALOGE("%s:post failed for external display !! ",
-                                                           __FUNCTION__);
+                    ALOGE("%s:post failed for external display !! ", __FUNCTION__);
                 }
             } else {
             }
@@ -311,8 +317,6 @@
                      int param, int* value)
 {
     hwc_context_t* ctx = (hwc_context_t*)(dev);
-    private_module_t* m = reinterpret_cast<private_module_t*>(
-        ctx->mFbDev->common.module);
     int supported = HWC_DISPLAY_PRIMARY_BIT;
 
     switch (param) {
@@ -320,10 +324,6 @@
         // Not supported for now
         value[0] = 0;
         break;
-    case HWC_VSYNC_PERIOD: //Not used for hwc > 1.1
-        value[0] = m->fps;
-        ALOGI("fps: %d", value[0]);
-        break;
     case HWC_DISPLAY_TYPES_SUPPORTED:
         if(ctx->mMDP.hasOverlay)
             supported |= HWC_DISPLAY_EXTERNAL_BIT;
@@ -336,6 +336,7 @@
 
 }
 
+
 static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
     ATRACE_CALL();
     int ret = 0;
@@ -375,9 +376,10 @@
                 }
             }
         }
-        if (ctx->mFbDev->post(ctx->mFbDev, fbLayer->handle)) {
-            ALOGE("%s: ctx->mFbDev->post fail!", __FUNCTION__);
-            ret = -1;
+
+        if (display_commit(ctx, dpy) < 0) {
+            ALOGE("%s: display commit fail!", __FUNCTION__);
+            return -1;
         }
     }
 
@@ -425,9 +427,10 @@
                 ret = -1;
             }
         }
-        if (!ctx->mExtDisplay->post()) {
-            ALOGE("%s: ctx->mExtDisplay->post fail!", __FUNCTION__);
-            ret = -1;
+
+        if (display_commit(ctx, dpy) < 0) {
+            ALOGE("%s: display commit fail!", __FUNCTION__);
+            return -1;
         }
     }
 
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index e79523d..f7fce09 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -20,7 +20,6 @@
 
 #define DEBUG_FBUPDATE 0
 #include <gralloc_priv.h>
-#include <fb_priv.h>
 #include "hwc_fbupdate.h"
 
 namespace qhwc {
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 11f7dc5..3a85d47 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -23,7 +23,6 @@
 #include <EGL/egl.h>
 #include <cutils/properties.h>
 #include <gralloc_priv.h>
-#include <fb_priv.h>
 #include <overlay.h>
 #include <overlayRotator.h>
 #include "hwc_utils.h"
@@ -46,25 +45,59 @@
 
 namespace qhwc {
 
-// Opens Framebuffer device
-static void openFramebufferDevice(hwc_context_t *ctx)
+static int openFramebufferDevice(hwc_context_t *ctx)
 {
-    hw_module_t const *module;
-    if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
-        framebuffer_open(module, &(ctx->mFbDev));
-        private_module_t* m = reinterpret_cast<private_module_t*>(
-                ctx->mFbDev->common.module);
-        //xres, yres may not be 32 aligned
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = m->finfo.line_length /
-                                                (m->info.xres/8);
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = m->info.xres;
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = m->info.yres;
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = ctx->mFbDev->xdpi;
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ctx->mFbDev->ydpi;
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period =
-                1000000000l / ctx->mFbDev->fps;
-        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = openFb(HWC_DISPLAY_PRIMARY);
+    struct fb_fix_screeninfo finfo;
+    struct fb_var_screeninfo info;
+
+    int fb_fd = openFb(HWC_DISPLAY_PRIMARY);
+
+    if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &info) == -1)
+        return -errno;
+
+    if (int(info.width) <= 0 || int(info.height) <= 0) {
+        // the driver doesn't return that information
+        // default to 160 dpi
+        info.width  = ((info.xres * 25.4f)/160.0f + 0.5f);
+        info.height = ((info.yres * 25.4f)/160.0f + 0.5f);
     }
+
+    float xdpi = (info.xres * 25.4f) / info.width;
+    float ydpi = (info.yres * 25.4f) / info.height;
+
+#ifdef MSMFB_METADATA_GET
+    struct msmfb_metadata metadata;
+    memset(&metadata, 0 , sizeof(metadata));
+    metadata.op = metadata_op_frame_rate;
+
+    if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) {
+        ALOGE("Error retrieving panel frame rate");
+        return -errno;
+    }
+
+    float fps  = metadata.data.panel_frame_rate;
+#else
+    //XXX: Remove reserved field usage on all baselines
+    //The reserved[3] field is used to store FPS by the driver.
+    float fps  = info.reserved[3] & 0xFF;
+#endif
+
+    if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) == -1)
+        return -errno;
+
+    if (finfo.smem_len <= 0)
+        return -errno;
+
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = fb_fd;
+    //xres, yres may not be 32 aligned
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = finfo.line_length /(info.xres/8);
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = info.xres;
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = info.yres;
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = xdpi;
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ydpi;
+    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period = 1000000000l / fps;
+
+    return 0;
 }
 
 void initContext(hwc_context_t *ctx)
@@ -143,9 +176,7 @@
         }
     }
 
-    if(ctx->mFbDev) {
-        framebuffer_close(ctx->mFbDev);
-        ctx->mFbDev = NULL;
+    if(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd) {
         close(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd);
         ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = -1;
     }
@@ -603,6 +634,9 @@
     Dim srcCrop(crop.left, crop.top,
             crop.right - crop.left,
             crop.bottom - crop.top);
+    //getMdpOrient will switch the flips if the source is 90 rotated.
+    //Clients in Android dont factor in 90 rotation while deciding the flip.
+    orient = static_cast<eTransform>(ovutils::getMdpOrient(orient));
     preRotateSource(orient, whf, srcCrop);
     crop.left = srcCrop.x;
     crop.top = srcCrop.y;
@@ -653,11 +687,13 @@
             return -1;
         whf.format = (*rot)->getDstFormat();
         updateSource(orient, whf, crop);
-        //For the mdp, since we are pre-rotating
-        transform = 0;
         rotFlags |= ovutils::ROT_PREROTATED;
     }
 
+    //For the mdp, since either we are pre-rotating or MDP does flips
+    orient = OVERLAY_TRANSFORM_0;
+    transform = 0;
+
     PipeArgs parg(mdpFlags, whf, z, isFg, static_cast<eRotFlags>(rotFlags));
     if(configMdp(ctx->mOverlay, parg, orient, crop, dst, dest) < 0) {
         ALOGE("%s: commit failed for low res panel", __FUNCTION__);
@@ -699,8 +735,6 @@
             return -1;
         whf.format = (*rot)->getDstFormat();
         updateSource(orient, whf, crop);
-        //For the mdp, since we are pre-rotating
-        transform = 0;
         rotFlags |= ROT_PREROTATED;
     }
 
@@ -726,7 +760,7 @@
     //When buffer is flipped, contents of mixer config also needs to swapped.
     //Not needed if the layer is confined to one half of the screen.
     //If rotator has been used then it has also done the flips, so ignore them.
-    if(layer->transform & HWC_TRANSFORM_FLIP_V && lDest != OV_INVALID
+    if((orient & OVERLAY_TRANSFORM_FLIP_V) && lDest != OV_INVALID
             && rDest != OV_INVALID && rot == NULL) {
         hwc_rect_t new_cropR;
         new_cropR.left = tmp_cropL.left;
@@ -744,6 +778,10 @@
 
     }
 
+    //For the mdp, since either we are pre-rotating or MDP does flips
+    orient = OVERLAY_TRANSFORM_0;
+    transform = 0;
+
     //configure left mixer
     if(lDest != OV_INVALID) {
         PipeArgs pargL(mdpFlagsL, whf, z, isFg,
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 67745f4..7221c13 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -29,6 +29,7 @@
 #include <utils/String8.h>
 #include "qdMetaData.h"
 #include <overlayUtils.h>
+#include <linux/fb.h>
 
 #define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
 #define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
@@ -44,7 +45,6 @@
 
 //Fwrd decls
 struct hwc_context_t;
-struct framebuffer_device_t;
 
 namespace ovutils = overlay::utils;
 
@@ -262,8 +262,6 @@
 struct hwc_context_t {
     hwc_composer_device_1_t device;
     const hwc_procs_t* proc;
-    //Framebuffer device
-    framebuffer_device_t *mFbDev;
 
     //CopyBit objects
     qhwc::CopyBit *mCopyBit[MAX_DISPLAYS];
diff --git a/liboverlay/overlayMdp.h b/liboverlay/overlayMdp.h
index 7d3bbee..08d744f 100644
--- a/liboverlay/overlayMdp.h
+++ b/liboverlay/overlayMdp.h
@@ -296,10 +296,8 @@
 
 inline void MdpCtrl::setRotationFlags() {
     const int u = getUserData();
-    if (u == MDP_ROT_90 || u == MDP_ROT_270)
+    if (u & MDP_ROT_90)
         mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
-    else
-        mOVInfo.flags &= ~MDP_SOURCE_ROTATED_90;
 }
 
 ///////    MdpCtrl3D //////
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index 4cc7a37..8cc9cc0 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -32,7 +32,6 @@
 #include <linux/msm_mdp.h>
 #include <cutils/properties.h>
 #include "gralloc_priv.h"
-#include "fb_priv.h"
 #include "overlayUtils.h"
 #include "mdpWrapper.h"
 #include "mdp_version.h"
@@ -213,7 +212,10 @@
     return x - ( y + z );
 }
 
-void preRotateSource(eTransform& tr, Whf& whf, Dim& srcCrop) {
+//Expects transform to be adjusted for clients of Android.
+//i.e flips switched if 90 component present.
+//See getMdpOrient()
+void preRotateSource(const eTransform& tr, Whf& whf, Dim& srcCrop) {
     if(tr & OVERLAY_TRANSFORM_FLIP_H) {
         srcCrop.x = compute(whf.w, srcCrop.x, srcCrop.w);
     }
@@ -229,7 +231,6 @@
         swap(whf.w, whf.h);
         swap(srcCrop.w, srcCrop.h);
     }
-    tr = OVERLAY_TRANSFORM_0;
 }
 
 bool is3DTV() {
diff --git a/liboverlay/overlayUtils.h b/liboverlay/overlayUtils.h
index 5eb0e1e..3eabc1d 100644
--- a/liboverlay/overlayUtils.h
+++ b/liboverlay/overlayUtils.h
@@ -688,7 +688,7 @@
         value--;
 }
 
-void preRotateSource(eTransform& tr, Whf& whf, Dim& srcCrop);
+void preRotateSource(const eTransform& tr, Whf& whf, Dim& srcCrop);
 void getDump(char *buf, size_t len, const char *prefix, const mdp_overlay& ov);
 void getDump(char *buf, size_t len, const char *prefix, const msmfb_img& ov);
 void getDump(char *buf, size_t len, const char *prefix, const mdp_rect& ov);