From 897a9c3ff996570be5fe6ae9537354424b622210 Mon Sep 17 00:00:00 2001 From: Sushil Chauhan Date: Thu, 18 Jul 2013 11:09:55 -0700 Subject: [PATCH] hwc/overlay: Add Color layer support in MDP Composition. 1. Color layer has a destination rectangle, RGBA color and plane alpha. There is no gralloc buffer. Layer flag "HWC_COLOR_FILL" denotes a Color layer. 2. There is no color member in HWC layer, so RGBA color value is passed via the "tranform" member from framework to HAL. Change-Id: I8769fd3f5febcaf952a1456de0a4262679c9a0e4 --- libhwcomposer/hwc_mdpcomp.cpp | 13 +++++++-- libhwcomposer/hwc_utils.cpp | 41 +++++++++++++++++++++++++++++ libhwcomposer/hwc_utils.h | 7 ++++- liboverlay/overlay.cpp | 7 +++++ liboverlay/overlay.h | 1 + liboverlay/overlayCtrlData.h | 7 +++++ liboverlay/overlayMdp.cpp | 4 +++ liboverlay/overlayMdp.h | 2 ++ liboverlay/pipes/overlayGenPipe.cpp | 4 +++ liboverlay/pipes/overlayGenPipe.h | 2 ++ 10 files changed, 85 insertions(+), 3 deletions(-) diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp index 83426153..a524a78c 100644 --- a/libhwcomposer/hwc_mdpcomp.cpp +++ b/libhwcomposer/hwc_mdpcomp.cpp @@ -288,6 +288,10 @@ bool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { private_handle_t *hnd = (private_handle_t *)layer->handle; if(!hnd) { + if (layer->flags & HWC_COLOR_FILL) { + // Color layer + return true; + } ALOGE("%s: layer handle is NULL", __FUNCTION__); return false; } @@ -1381,8 +1385,13 @@ bool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { hwc_layer_1_t *layer = &list->hwLayers[i]; private_handle_t *hnd = (private_handle_t *)layer->handle; if(!hnd) { - ALOGE("%s handle null", __FUNCTION__); - return false; + if (!(layer->flags & HWC_COLOR_FILL)) { + ALOGE("%s handle null", __FUNCTION__); + return false; + } + // No PLAY for Color layer + layerProp[i].mFlags &= ~HWC_MDPCOMP; + continue; } int mdpIndex = mCurrentFrame.layerToMDP[i]; diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp index 9d1e30c8..477fe90d 100644 --- a/libhwcomposer/hwc_utils.cpp +++ b/libhwcomposer/hwc_utils.cpp @@ -1351,6 +1351,42 @@ int configMdp(Overlay *ov, const PipeArgs& parg, return 0; } +int configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, + const int& dpy, eMdpFlags& mdpFlags, eZorder& z, + eIsFg& isFg, const eDest& dest) { + + hwc_rect_t dst = layer->displayFrame; + trimLayer(ctx, dpy, 0, dst, dst); + + int w = ctx->dpyAttr[dpy].xres; + int h = ctx->dpyAttr[dpy].yres; + int dst_w = dst.right - dst.left; + int dst_h = dst.bottom - dst.top; + uint32_t color = layer->transform; + Whf whf(w, h, getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888), 0); + + if (layer->blending == HWC_BLENDING_PREMULT) + ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_BLEND_FG_PREMULT); + + PipeArgs parg(mdpFlags, whf, z, isFg, static_cast(0), + layer->planeAlpha, + (ovutils::eBlending) getBlending(layer->blending)); + + // Configure MDP pipe for Color layer + Dim pos(dst.left, dst.top, dst_w, dst_h); + ctx->mOverlay->setSource(parg, dest); + ctx->mOverlay->setColor(color, dest); + ctx->mOverlay->setTransform(0, dest); + ctx->mOverlay->setCrop(pos, dest); + ctx->mOverlay->setPosition(pos, dest); + + if (!ctx->mOverlay->commit(dest)) { + ALOGE("%s: Configure color layer failed!", __FUNCTION__); + return -1; + } + return 0; +} + void updateSource(eTransform& orient, Whf& whf, hwc_rect_t& crop) { Dim srcCrop(crop.left, crop.top, @@ -1381,7 +1417,12 @@ int configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, eIsFg& isFg, const eDest& dest, Rotator **rot) { private_handle_t *hnd = (private_handle_t *)layer->handle; + if(!hnd) { + if (layer->flags & HWC_COLOR_FILL) { + // Configure Color layer + return configColorLayer(ctx, layer, dpy, mdpFlags, z, isFg, dest); + } ALOGE("%s: layer handle is NULL", __FUNCTION__); return -1; } diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h index 3dc327fb..3d8b1e43 100644 --- a/libhwcomposer/hwc_utils.h +++ b/libhwcomposer/hwc_utils.h @@ -272,6 +272,10 @@ int configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg, const hwc_rect_t& pos, const MetaData_t *metadata, const ovutils::eDest& dest); +int configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, + ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, + ovutils::eIsFg& isFg, const ovutils::eDest& dest); + void updateSource(ovutils::eTransform& orient, ovutils::Whf& whf, hwc_rect_t& crop); @@ -463,7 +467,8 @@ static inline bool isYuvPresent (hwc_context_t *ctx, int dpy) { } static inline bool has90Transform(hwc_layer_1_t *layer) { - return (layer->transform & HWC_TRANSFORM_ROT_90); + return ((layer->transform & HWC_TRANSFORM_ROT_90) && + !(layer->flags & HWC_COLOR_FILL)); } inline bool isSecurePresent(hwc_context_t *ctx, int dpy) { diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp index b095e9eb..6aaf236a 100644 --- a/liboverlay/overlay.cpp +++ b/liboverlay/overlay.cpp @@ -177,6 +177,13 @@ void Overlay::setCrop(const utils::Dim& d, mPipeBook[index].mPipe->setCrop(d); } +void Overlay::setColor(const uint32_t color, + utils::eDest dest) { + int index = (int)dest; + validate(index); + mPipeBook[index].mPipe->setColor(color); +} + void Overlay::setPosition(const utils::Dim& d, utils::eDest dest) { int index = (int)dest; diff --git a/liboverlay/overlay.h b/liboverlay/overlay.h index c16f6e6b..295e1239 100644 --- a/liboverlay/overlay.h +++ b/liboverlay/overlay.h @@ -76,6 +76,7 @@ public: void setSource(const utils::PipeArgs args, utils::eDest dest); void setCrop(const utils::Dim& d, utils::eDest dest); + void setColor(const uint32_t color, utils::eDest dest); void setTransform(const int orientation, utils::eDest dest); void setPosition(const utils::Dim& dim, utils::eDest dest); void setVisualParams(const MetaData_t& data, utils::eDest dest); diff --git a/liboverlay/overlayCtrlData.h b/liboverlay/overlayCtrlData.h index c3a7aa34..d34fd2d3 100644 --- a/liboverlay/overlayCtrlData.h +++ b/liboverlay/overlayCtrlData.h @@ -61,6 +61,8 @@ public: void setSource(const utils::PipeArgs& args); /* set crop info and pass it down to mdp */ void setCrop(const utils::Dim& d); + /* set color for mdp pipe */ + void setColor(const uint32_t color); /* set orientation */ void setTransform(const utils::eTransform& p); /* set mdp position using dim */ @@ -174,6 +176,11 @@ inline void Ctrl::setCrop(const utils::Dim& d) mMdp.setCrop(d); } +inline void Ctrl::setColor(const uint32_t color) +{ + mMdp.setColor(color); +} + inline bool Ctrl::setVisualParams(const MetaData_t &metadata) { if (!mMdp.setVisualParams(metadata)) { diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp index 674e62dc..5da8b556 100644 --- a/liboverlay/overlayMdp.cpp +++ b/liboverlay/overlayMdp.cpp @@ -108,6 +108,10 @@ void MdpCtrl::setCrop(const utils::Dim& d) { setSrcRectDim(d); } +void MdpCtrl::setColor(const uint32_t color) { + mOVInfo.bg_color = color; +} + void MdpCtrl::setPosition(const overlay::utils::Dim& d) { setDstRectDim(d); } diff --git a/liboverlay/overlayMdp.h b/liboverlay/overlayMdp.h index 5bfec6b9..4a648ef1 100644 --- a/liboverlay/overlayMdp.h +++ b/liboverlay/overlayMdp.h @@ -57,6 +57,8 @@ public: * Dim - ROI dimensions. */ void setCrop(const utils::Dim& d); + /* set color for mdp pipe */ + void setColor(const uint32_t color); void setTransform(const utils::eTransform& orient); /* given a dim and w/h, set overlay dim */ void setPosition(const utils::Dim& dim); diff --git a/liboverlay/pipes/overlayGenPipe.cpp b/liboverlay/pipes/overlayGenPipe.cpp index 35f686c3..2bf23693 100644 --- a/liboverlay/pipes/overlayGenPipe.cpp +++ b/liboverlay/pipes/overlayGenPipe.cpp @@ -93,6 +93,10 @@ void GenericPipe::setCrop(const overlay::utils::Dim& d) { mCtrlData.ctrl.setCrop(d); } +void GenericPipe::setColor(const uint32_t color) { + mCtrlData.ctrl.setColor(color); +} + void GenericPipe::setTransform(const utils::eTransform& orient) { mCtrlData.ctrl.setTransform(orient); } diff --git a/liboverlay/pipes/overlayGenPipe.h b/liboverlay/pipes/overlayGenPipe.h index 2472f4ec..9b09da41 100644 --- a/liboverlay/pipes/overlayGenPipe.h +++ b/liboverlay/pipes/overlayGenPipe.h @@ -48,6 +48,8 @@ public: void setSource(const utils::PipeArgs& args); /* set crop a.k.a the region of interest */ void setCrop(const utils::Dim& d); + /* set color for mdp pipe */ + void setColor(const uint32_t color); /* set orientation*/ void setTransform(const utils::eTransform& param); /* set mdp posision using dim */