Skip to content

Commit

Permalink
hwc: Define binder interface to set view frame of a display
Browse files Browse the repository at this point in the history
Define binder interface setViewFrame to set view frame information
of a display by surfaceflinger when projection for that display
changes.

Change-Id: If737b51ae0f04303a1a29c91a9703f64354b61fb
  • Loading branch information
Ramkumar Radhakrishnan authored and Simon Wilson committed Jan 9, 2015
1 parent e095244 commit 33f1ae8
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 33 deletions.
23 changes: 23 additions & 0 deletions msm8226/libhwcomposer/hwc_qclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
28 changes: 0 additions & 28 deletions msm8226/libhwcomposer/hwc_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
5 changes: 0 additions & 5 deletions msm8226/libhwcomposer/hwc_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
21 changes: 21 additions & 0 deletions msm8226/libqdutils/display_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<IQService> 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
3 changes: 3 additions & 0 deletions msm8226/libqdutils/display_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions msm8226/libqservice/IQService.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down

0 comments on commit 33f1ae8

Please sign in to comment.