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
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index ae7bb95..30555fa 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
}
ctx->mOverlay->configDone();
+ ctx->mRotMgr->configDone();
+
return ret;
}
@@ -250,6 +254,7 @@
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 @@
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 @@
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 @@
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 @@
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);
}