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);