From 33f1ae81779c5b897987245cde0f498fd6192579 Mon Sep 17 00:00:00 2001 From: Ramkumar Radhakrishnan Date: Mon, 19 May 2014 19:53:56 -0700 Subject: [PATCH] hwc: Define binder interface to set view frame of a display Define binder interface setViewFrame to set view frame information of a display by surfaceflinger when projection for that display changes. Change-Id: If737b51ae0f04303a1a29c91a9703f64354b61fb --- msm8226/libhwcomposer/hwc_qclient.cpp | 23 ++++++++++++++++++++++ msm8226/libhwcomposer/hwc_utils.cpp | 28 --------------------------- msm8226/libhwcomposer/hwc_utils.h | 5 ----- msm8226/libqdutils/display_config.cpp | 21 ++++++++++++++++++++ msm8226/libqdutils/display_config.h | 3 +++ msm8226/libqservice/IQService.h | 1 + 6 files changed, 48 insertions(+), 33 deletions(-) diff --git a/msm8226/libhwcomposer/hwc_qclient.cpp b/msm8226/libhwcomposer/hwc_qclient.cpp index 0bb71f0737..77215cae70 100644 --- a/msm8226/libhwcomposer/hwc_qclient.cpp +++ b/msm8226/libhwcomposer/hwc_qclient.cpp @@ -193,6 +193,26 @@ static void setWfdStatus(hwc_context_t *ctx, uint32_t wfdStatus) { } } + +static status_t setViewFrame(hwc_context_t* ctx, const Parcel* inParcel) { + int dpy = inParcel->readInt32(); + if(dpy >= HWC_DISPLAY_PRIMARY && dpy <= HWC_DISPLAY_VIRTUAL) { + Locker::Autolock _sl(ctx->mDrawLock); + ctx->mViewFrame[dpy].left = inParcel->readInt32(); + ctx->mViewFrame[dpy].top = inParcel->readInt32(); + ctx->mViewFrame[dpy].right = inParcel->readInt32(); + ctx->mViewFrame[dpy].bottom = inParcel->readInt32(); + ALOGD_IF(QCLIENT_DEBUG, "%s: mViewFrame[%d] = [%d %d %d %d]", + __FUNCTION__, dpy, + ctx->mViewFrame[dpy].left, ctx->mViewFrame[dpy].top, + ctx->mViewFrame[dpy].right, ctx->mViewFrame[dpy].bottom); + return NO_ERROR; + } else { + ALOGE("In %s: invalid dpy index %d", __FUNCTION__, dpy); + return BAD_VALUE; + } +} + status_t QClient::notifyCallback(uint32_t command, const Parcel* inParcel, Parcel* outParcel) { status_t ret = NO_ERROR; @@ -232,6 +252,9 @@ status_t QClient::notifyCallback(uint32_t command, const Parcel* inParcel, case IQService::SET_WFD_STATUS: setWfdStatus(mHwcContext,inParcel->readInt32()); break; + case IQService::SET_VIEW_FRAME: + setViewFrame(mHwcContext, inParcel); + break; default: ret = NO_ERROR; } diff --git a/msm8226/libhwcomposer/hwc_utils.cpp b/msm8226/libhwcomposer/hwc_utils.cpp index 7f03c6380d..68ced2d114 100644 --- a/msm8226/libhwcomposer/hwc_utils.cpp +++ b/msm8226/libhwcomposer/hwc_utils.cpp @@ -808,28 +808,6 @@ static void trimList(hwc_context_t *ctx, hwc_display_contents_1_t *list, } } -hwc_rect_t calculateDisplayViewFrame(hwc_context_t *ctx, int dpy) { - int dstWidth = ctx->dpyAttr[dpy].xres; - int dstHeight = ctx->dpyAttr[dpy].yres; - int srcWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; - int srcHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; - // default we assume viewframe as a full frame for primary display - hwc_rect outRect = {0, 0, dstWidth, dstHeight}; - if(dpy) { - // swap srcWidth and srcHeight, if the device orientation is 90 or 270. - if(ctx->deviceOrientation & 0x1) { - swap(srcWidth, srcHeight); - } - // Get Aspect Ratio for external - getAspectRatioPosition(dstWidth, dstHeight, srcWidth, - srcHeight, outRect); - } - ALOGD_IF(HWC_UTILS_DEBUG, "%s: view frame for dpy %d is [%d %d %d %d]", - __FUNCTION__, dpy, outRect.left, outRect.top, - outRect.right, outRect.bottom); - return outRect; -} - void setListStats(hwc_context_t *ctx, hwc_display_contents_1_t *list, int dpy) { const int prevYuvCount = ctx->listStats[dpy].yuvCount; @@ -845,19 +823,13 @@ void setListStats(hwc_context_t *ctx, ctx->listStats[dpy].isDisplayAnimating = false; ctx->listStats[dpy].secureUI = false; ctx->listStats[dpy].yuv4k2kCount = 0; - ctx->mViewFrame[dpy] = (hwc_rect_t){0, 0, 0, 0}; ctx->dpyAttr[dpy].mActionSafePresent = isActionSafePresent(ctx, dpy); ctx->listStats[dpy].renderBufIndexforABC = -1; resetROI(ctx, dpy); - // Calculate view frame of ext display from primary resolution - // and primary device orientation. - ctx->mViewFrame[dpy] = calculateDisplayViewFrame(ctx, dpy); - trimList(ctx, list, dpy); optimizeLayerRects(list); - for (size_t i = 0; i < (size_t)ctx->listStats[dpy].numAppLayers; i++) { hwc_layer_1_t const* layer = &list->hwLayers[i]; private_handle_t *hnd = (private_handle_t *)layer->handle; diff --git a/msm8226/libhwcomposer/hwc_utils.h b/msm8226/libhwcomposer/hwc_utils.h index df4cc43820..06f7f9fa49 100644 --- a/msm8226/libhwcomposer/hwc_utils.h +++ b/msm8226/libhwcomposer/hwc_utils.h @@ -224,11 +224,6 @@ inline bool isNonIntegralSourceCrop(const hwc_frect_t& cropF) { // ----------------------------------------------------------------------------- // Utility functions - implemented in hwc_utils.cpp void dumpLayer(hwc_layer_1_t const* l); - -// Calculate viewframe for external/primary display from primary resolution and -// primary device orientation -hwc_rect_t calculateDisplayViewFrame(hwc_context_t *ctx, int dpy); - void setListStats(hwc_context_t *ctx, hwc_display_contents_1_t *list, int dpy); void initContext(hwc_context_t *ctx); diff --git a/msm8226/libqdutils/display_config.cpp b/msm8226/libqdutils/display_config.cpp index 60f1f68272..7ff106ffe2 100644 --- a/msm8226/libqdutils/display_config.cpp +++ b/msm8226/libqdutils/display_config.cpp @@ -113,4 +113,25 @@ int getDisplayVisibleRegion(int dpy, hwc_rect_t &rect) { return err; } +int setViewFrame(int dpy, int l, int t, int r, int b) { + status_t err = (status_t) FAILED_TRANSACTION; + sp binder = getBinder(); + Parcel inParcel, outParcel; + inParcel.writeInt32(dpy); + inParcel.writeInt32(l); + inParcel.writeInt32(t); + inParcel.writeInt32(r); + inParcel.writeInt32(b); + + if(binder != NULL) { + err = binder->dispatch(IQService::SET_VIEW_FRAME, + &inParcel, &outParcel); + } + if(err) + ALOGE("%s: Failed to set view frame for dpy %d err=%d", + __FUNCTION__, dpy, err); + + return err; +} + }; //namespace diff --git a/msm8226/libqdutils/display_config.h b/msm8226/libqdutils/display_config.h index 29edbef338..a69265ba11 100644 --- a/msm8226/libqdutils/display_config.h +++ b/msm8226/libqdutils/display_config.h @@ -73,4 +73,7 @@ int setHSIC(int dpy, const HSICData_t& hsic_data); // get the active visible region for the display // Returns 0 on success, negative values on errors int getDisplayVisibleRegion(int dpy, hwc_rect_t &rect); + +// set the view frame information in hwc context from surfaceflinger +int setViewFrame(int dpy, int l, int t, int r, int b); }; //namespace diff --git a/msm8226/libqservice/IQService.h b/msm8226/libqservice/IQService.h index 02f73412e4..5c9acf7f55 100644 --- a/msm8226/libqservice/IQService.h +++ b/msm8226/libqservice/IQService.h @@ -51,6 +51,7 @@ class IQService : public android::IInterface GET_DISPLAY_VISIBLE_REGION, // Get the visibleRegion for dpy PAUSE_WFD, // Pause/Resume WFD SET_WFD_STATUS, // Set if wfd connection is on/off + SET_VIEW_FRAME, // Set view frame of display COMMAND_LIST_END = 400, };