hwc/overlay: Video on 4k2k external, 4k2k rotation.

-Add support for Video via overlay on 4k2k external panel.
-Add support for rotating videos on 4k2k panels. We use
pre-rotation in hwc to rotate a video into a single buffer,
irrespective of panel size. Then this buffer is fed to MDP.
Rotator objects are managed by the new RotMgr.
-Cleaup mdpcomp and overlay.

Change-Id: Ifb08534747e8e18b6c58dd8a3e1a9947409100f1
This commit is contained in:
Saurabh Shah
2013-02-26 10:15:15 -08:00
committed by Gerrit - the friendly Code Review server
parent 893a34a75b
commit acf102021a
22 changed files with 1005 additions and 1274 deletions

View File

@@ -27,6 +27,7 @@
#include <utils/Trace.h>
#include <overlay.h>
#include <overlayRotator.h>
#include <fb_priv.h>
#include <mdp_version.h>
#include "hwc_utils.h"
@@ -100,11 +101,11 @@ static void reset(hwc_context_t *ctx, int numDisplays,
if(ctx->mFBUpdate[i])
ctx->mFBUpdate[i]->reset();
if(ctx->mVidOv[i])
ctx->mVidOv[i]->reset();
if(ctx->mCopyBit[i])
ctx->mCopyBit[i]->reset();
}
VideoOverlay::reset();
}
//clear prev layer prop flags and realloc for current frame
@@ -135,7 +136,7 @@ static int hwc_prepare_primary(hwc_composer_device_1 *dev,
int ret = ctx->mMDPComp->prepare(ctx, list);
if(!ret) {
// IF MDPcomp fails use this route
VideoOverlay::prepare(ctx, list, dpy);
ctx->mVidOv[dpy]->prepare(ctx, list);
ctx->mFBUpdate[dpy]->prepare(ctx, list);
}
ctx->mLayerCache[dpy]->updateLayerCache(list);
@@ -161,7 +162,7 @@ static int hwc_prepare_external(hwc_composer_device_1 *dev,
if(fbLayer->handle) {
setListStats(ctx, list, dpy);
reset_layer_prop(ctx, dpy);
VideoOverlay::prepare(ctx, list, dpy);
ctx->mVidOv[dpy]->prepare(ctx, list);
ctx->mFBUpdate[dpy]->prepare(ctx, list);
ctx->mLayerCache[dpy]->updateLayerCache(list);
if(ctx->mCopyBit[dpy])
@@ -188,6 +189,7 @@ static int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
reset(ctx, numDisplays, displays);
ctx->mOverlay->configBegin();
ctx->mRotMgr->configBegin();
for (int32_t i = numDisplays; i >= 0; i--) {
hwc_display_contents_1_t *list = displays[i];
@@ -205,6 +207,8 @@ static int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
}
ctx->mOverlay->configDone();
ctx->mRotMgr->configDone();
return ret;
}
@@ -250,6 +254,7 @@ static int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
if(blank) {
ctx->mOverlay->configBegin();
ctx->mOverlay->configDone();
ctx->mRotMgr->clear();
ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_POWERDOWN);
if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
@@ -344,12 +349,12 @@ static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
if(list->numHwLayers > 1)
hwc_sync(ctx, list, dpy, fd);
if (!VideoOverlay::draw(ctx, list, dpy)) {
ALOGE("%s: VideoOverlay::draw fail!", __FUNCTION__);
if (!ctx->mVidOv[dpy]->draw(ctx, list)) {
ALOGE("%s: VideoOverlay draw failed", __FUNCTION__);
ret = -1;
}
if (!ctx->mMDPComp->draw(ctx, list)) {
ALOGE("%s: MDPComp::draw fail!", __FUNCTION__);
ALOGE("%s: MDPComp draw failed", __FUNCTION__);
ret = -1;
}
@@ -365,7 +370,7 @@ static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
if(!(fbLayer->flags & HWC_SKIP_LAYER) &&
(list->numHwLayers > 1)) {
if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
ret = -1;
}
}
@@ -400,7 +405,7 @@ static int hwc_set_external(hwc_context_t *ctx,
if(list->numHwLayers > 1)
hwc_sync(ctx, list, dpy, fd);
if (!VideoOverlay::draw(ctx, list, dpy)) {
if (!ctx->mVidOv[dpy]->draw(ctx, list)) {
ALOGE("%s: VideoOverlay::draw fail!", __FUNCTION__);
ret = -1;
}
@@ -549,6 +554,9 @@ void hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
char ovDump[2048] = {'\0'};
ctx->mOverlay->getDump(ovDump, 2048);
dumpsys_log(aBuf, ovDump);
ovDump[0] = '\0';
ctx->mRotMgr->getDump(ovDump, 2048);
dumpsys_log(aBuf, ovDump);
strlcpy(buff, aBuf.string(), buff_len);
}