display: Add support for HW Cursor

- Retrieve cursor pipe info from driver
- Configure the layer marked with flag HWC_IS_CURSOR_LAYER to the
  HWCursor using the fb_cursor ioctl.
- The config happens only when it satisfies the hw limitions of
  cursor
- HWCursor is supported on primary display
- Since cursor configuration happens first, make use of drop
  layer/count to handle other composition strategies
- Add support for hwc_setCursorPositionAsync as per HWC 1.4

Change-Id: I8663b6da89b0c2dd9b48af96d64a433b2b8a302c
This commit is contained in:
Arun Kumar K.R
2015-03-27 11:28:36 -07:00
parent 642ce38173
commit 00b84792b7
10 changed files with 437 additions and 24 deletions

View File

@@ -30,6 +30,7 @@
#include <overlay.h>
#include <overlayRotator.h>
#include <overlayWriteback.h>
#include <overlayCursor.h>
#include "hwc_utils.h"
#include "hwc_mdpcomp.h"
#include "hwc_fbupdate.h"
@@ -1085,6 +1086,7 @@ void setListStats(hwc_context_t *ctx,
ctx->listStats[dpy].renderBufIndexforABC = -1;
ctx->listStats[dpy].secureRGBCount = 0;
ctx->listStats[dpy].refreshRateRequest = ctx->dpyAttr[dpy].refreshRate;
ctx->listStats[dpy].cursorLayerPresent = false;
uint32_t refreshRate = 0;
qdutils::MDPVersion& mdpHw = qdutils::MDPVersion::getInstance();
int s3dFormat = HAL_NO_3D;
@@ -1116,6 +1118,12 @@ void setListStats(hwc_context_t *ctx,
if(ctx->listStats[dpy].numAppLayers > MAX_NUM_APP_LAYERS)
continue;
// Valid cursor must be the top most layer
if((int)i == (ctx->listStats[dpy].numAppLayers - 1) &&
isCursorLayer(&list->hwLayers[i])) {
ctx->listStats[dpy].cursorLayerPresent = true;
}
//reset yuv indices
ctx->listStats[dpy].yuvIndices[i] = -1;
ctx->listStats[dpy].yuv4k2kIndices[i] = -1;
@@ -1942,6 +1950,46 @@ void updateSource(eTransform& orient, Whf& whf,
crop.bottom = transformedCrop.y + transformedCrop.h;
}
bool configHwCursor(const int fd, int dpy, hwc_layer_1_t* layer) {
if(dpy > HWC_DISPLAY_PRIMARY) {
// HWCursor not supported on secondary displays
return false;
}
private_handle_t *hnd = (private_handle_t *)layer->handle;
hwc_rect dst = layer->displayFrame;
hwc_rect src = integerizeSourceCrop(layer->sourceCropf);
int srcW = src.right - src.left;
int srcH = src.bottom - src.top;
int dstW = dst.right - dst.left;
int dstH = dst.bottom - dst.top;
Whf whf(getWidth(hnd), getHeight(hnd), hnd->format);
Dim crop(src.left, src.top, srcW, srcH);
Dim dest(dst.left, dst.top, dstW, dstH);
ovutils::PipeArgs pargs(ovutils::OV_MDP_FLAGS_NONE,
whf,
Z_SYSTEM_ALLOC,
ovutils::ROT_FLAGS_NONE,
layer->planeAlpha,
(ovutils::eBlending)
getBlending(layer->blending));
ALOGD_IF(HWC_UTILS_DEBUG, "%s: CursorInfo: w = %d h = %d "
"crop [%d, %d, %d, %d] dst [%d, %d, %d, %d]", __FUNCTION__,
getWidth(hnd), getHeight(hnd), src.left, src.top, srcW, srcH,
dst.left, dst.top, dstW, dstH);
return HWCursor::getInstance()->config(fd, (void*)hnd->base, pargs,
crop, dest);
}
void freeHwCursor(const int fd, int dpy) {
if (dpy == HWC_DISPLAY_PRIMARY) {
HWCursor::getInstance()->free(fd);
}
}
int getRotDownscale(hwc_context_t *ctx, const hwc_layer_1_t *layer) {
if(not qdutils::MDPVersion::getInstance().isRotDownscaleEnabled()) {
return 0;