From 6dfb4c8795573e5ef72d35be3fb572fc7b5cd343 Mon Sep 17 00:00:00 2001 From: Saurabh Shah Date: Tue, 29 Oct 2013 16:12:12 -0700 Subject: [PATCH] msm8960: hwc: Do not use fb handle in hwc_prepare Do not use fb handle in prepare. Use displayFrame for dimensions, align them and hardcode format. b/8316155 - Implement HWComposer 1.3 w/ virtual display support Change-Id: I5c494a74a807d3a52a1c88257494b58c583700f5 Signed-off-by: Daniel Jarai --- msm8960/libhwcomposer/hwc.cpp | 48 +++++++++++--------------- msm8960/libhwcomposer/hwc_fbupdate.cpp | 36 ++++++++++++++----- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/msm8960/libhwcomposer/hwc.cpp b/msm8960/libhwcomposer/hwc.cpp index e81648ad..e95de9ce 100644 --- a/msm8960/libhwcomposer/hwc.cpp +++ b/msm8960/libhwcomposer/hwc.cpp @@ -154,22 +154,18 @@ static int hwc_prepare_primary(hwc_composer_device_1 *dev, if (LIKELY(list && list->numHwLayers > 1) && ctx->dpyAttr[dpy].isActive) { reset_layer_prop(ctx, dpy, list->numHwLayers - 1); - uint32_t last = list->numHwLayers - 1; - hwc_layer_1_t *fbLayer = &list->hwLayers[last]; - if(fbLayer->handle) { - setListStats(ctx, list, dpy); - int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list); - if(fbZOrder >= 0) - ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder); + setListStats(ctx, list, dpy); + int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list); + if(fbZOrder >= 0) + ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder); - /* Temporarily commenting out C2D until we support partial - copybit composition for mixed mode MDP + /* Temporarily commenting out C2D until we support partial + copybit composition for mixed mode MDP - // Use Copybit, when MDP comp fails - if((fbZOrder >= 0) && ctx->mCopyBit[dpy]) - ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); - */ - } + // Use Copybit, when MDP comp fails + if((fbZOrder >= 0) && ctx->mCopyBit[dpy]) + ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); + */ } return 0; } @@ -182,23 +178,19 @@ static int hwc_prepare_external(hwc_composer_device_1 *dev, ctx->dpyAttr[dpy].isActive && ctx->dpyAttr[dpy].connected) { reset_layer_prop(ctx, dpy, list->numHwLayers - 1); - uint32_t last = list->numHwLayers - 1; - hwc_layer_1_t *fbLayer = &list->hwLayers[last]; if(!ctx->dpyAttr[dpy].isPause) { - if(fbLayer->handle) { - ctx->mExtDispConfiguring = false; - setListStats(ctx, list, dpy); - int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list); - if(fbZOrder >= 0) - ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder); + ctx->mExtDispConfiguring = false; + setListStats(ctx, list, dpy); + int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list); + if(fbZOrder >= 0) + ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder); - /* Temporarily commenting out C2D until we support partial - copybit composition for mixed mode MDP + /* Temporarily commenting out C2D until we support partial + copybit composition for mixed mode MDP - if((fbZOrder >= 0) && ctx->mCopyBit[dpy]) - ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); - */ - } + if((fbZOrder >= 0) && ctx->mCopyBit[dpy]) + ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); + */ } else { // External Display is in Pause state. // ToDo: diff --git a/msm8960/libhwcomposer/hwc_fbupdate.cpp b/msm8960/libhwcomposer/hwc_fbupdate.cpp index 98ca2a10..9d2cc071 100644 --- a/msm8960/libhwcomposer/hwc_fbupdate.cpp +++ b/msm8960/libhwcomposer/hwc_fbupdate.cpp @@ -63,9 +63,19 @@ bool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; if (LIKELY(ctx->mOverlay)) { overlay::Overlay& ov = *(ctx->mOverlay); - private_handle_t *hnd = (private_handle_t *)layer->handle; - ovutils::Whf info(getWidth(hnd), getHeight(hnd), - ovutils::getMdpFormat(hnd->format), hnd->size); + hwc_rect_t displayFrame = layer->displayFrame; + int alignedWidth = 0; + int alignedHeight = 0; + + getBufferSizeAndDimensions(displayFrame.right - displayFrame.left, + displayFrame.bottom - displayFrame.top, + HAL_PIXEL_FORMAT_RGBA_8888, + alignedWidth, + alignedHeight); + + ovutils::Whf info(alignedWidth, + alignedHeight, + ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888)); //Request an RGB pipe ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy); @@ -105,7 +115,7 @@ bool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, static_cast(transform); ov.setTransform(orient, dest); - hwc_rect_t displayFrame = sourceCrop; + displayFrame = sourceCrop; ovutils::Dim dpos(displayFrame.left, displayFrame.top, displayFrame.right - displayFrame.left, @@ -167,9 +177,19 @@ bool FBUpdateHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; if (LIKELY(ctx->mOverlay)) { overlay::Overlay& ov = *(ctx->mOverlay); - private_handle_t *hnd = (private_handle_t *)layer->handle; - ovutils::Whf info(getWidth(hnd), getHeight(hnd), - ovutils::getMdpFormat(hnd->format), hnd->size); + hwc_rect_t displayFrame = layer->displayFrame; + int alignedWidth = 0; + int alignedHeight = 0; + + getBufferSizeAndDimensions(displayFrame.right - displayFrame.left, + displayFrame.bottom - displayFrame.top, + HAL_PIXEL_FORMAT_RGBA_8888, + alignedWidth, + alignedHeight); + + ovutils::Whf info(alignedWidth, + alignedHeight, + ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888)); //Request left RGB pipe ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); @@ -234,7 +254,7 @@ bool FBUpdateHighRes::configure(hwc_context_t *ctx, ov.setTransform(orient, destL); ov.setTransform(orient, destR); - hwc_rect_t displayFrame = sourceCrop; + displayFrame = sourceCrop; //For FB left, top will always be 0 //That should also be the case if using 2 mixers for single display ovutils::Dim dposL(displayFrame.left,