hwc: Add dynamic fps support for PPP
Some apps like camera and video are running on less fps than panel refresh rate. Hence setting dynamic fps will help in reducing BW voting for PPP. Change-Id: I236fe96d5c6547044083774388887638f9e32958
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
parent
a7696ddf86
commit
140965d6a4
@@ -64,6 +64,7 @@ struct copybit_context_t {
|
||||
int relFence;
|
||||
struct mdp_buf_sync sync;
|
||||
struct blitReq list;
|
||||
uint8_t dynamic_fps;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -219,6 +220,7 @@ static void set_infos(struct copybit_context_t *dev,
|
||||
struct mdp_blit_req *req, int flags)
|
||||
{
|
||||
req->alpha = dev->mAlpha;
|
||||
req->fps = dev->dynamic_fps;
|
||||
req->transp_mask = MDP_TRANSP_NOP;
|
||||
req->flags = dev->mFlags | flags;
|
||||
// check if we are blitting to f/b
|
||||
@@ -250,7 +252,7 @@ static int msm_copybit(struct copybit_context_t *dev, void const *list)
|
||||
for (unsigned int i=0 ; i<l->count ; i++) {
|
||||
ALOGE("%d: src={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n"
|
||||
" dst={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n"
|
||||
" flags=%08x"
|
||||
" flags=%08x, fps=%d"
|
||||
,
|
||||
i,
|
||||
l->req[i].src.width,
|
||||
@@ -267,7 +269,8 @@ static int msm_copybit(struct copybit_context_t *dev, void const *list)
|
||||
l->req[i].dst_rect.y,
|
||||
l->req[i].dst_rect.w,
|
||||
l->req[i].dst_rect.h,
|
||||
l->req[i].flags
|
||||
l->req[i].flags,
|
||||
l->req[i].fps
|
||||
);
|
||||
}
|
||||
#endif
|
||||
@@ -315,6 +318,9 @@ static int set_parameter_copybit(
|
||||
if (value >= 256) value = 255;
|
||||
ctx->mAlpha = (uint8_t)value;
|
||||
break;
|
||||
case COPYBIT_DYNAMIC_FPS:
|
||||
ctx->dynamic_fps = (uint8_t)value;
|
||||
break;
|
||||
case COPYBIT_DITHER:
|
||||
if (value == COPYBIT_ENABLE) {
|
||||
ctx->mFlags |= MDP_DITHER;
|
||||
@@ -747,6 +753,9 @@ static int open_copybit(const struct hw_module_t* module, const char* name,
|
||||
ctx->device.flush_get_fence = flush_get_fence;
|
||||
ctx->device.clear = clear_copybit;
|
||||
ctx->mAlpha = MDP_ALPHA_NOP;
|
||||
//dynamic_fps is zero means default
|
||||
//panel refresh rate for driver.
|
||||
ctx->dynamic_fps = 0;
|
||||
ctx->mFlags = 0;
|
||||
ctx->sync.flags = 0;
|
||||
ctx->relFence = -1;
|
||||
|
||||
@@ -79,6 +79,7 @@ enum {
|
||||
/* FB height */
|
||||
COPYBIT_FRAMEBUFFER_HEIGHT = 8,
|
||||
COPYBIT_FG_LAYER = 9,
|
||||
COPYBIT_DYNAMIC_FPS = 10,
|
||||
};
|
||||
|
||||
/* values for copybit_set_parameter(COPYBIT_TRANSFORM) */
|
||||
|
||||
@@ -810,7 +810,13 @@ int CopyBit::drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
|
||||
ALOGE("%s: Framebuffer handle is NULL", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint32_t dynamic_fps = 0;
|
||||
#ifdef DYNAMIC_FPS
|
||||
MetaData_t *mdata = hnd ? (MetaData_t *)hnd->base_metadata : NULL;
|
||||
if (mdata && (mdata->operation & UPDATE_REFRESH_RATE)) {
|
||||
dynamic_fps = roundOff(mdata->refreshrate);
|
||||
}
|
||||
#endif
|
||||
// Set the copybit source:
|
||||
copybit_image_t src;
|
||||
src.w = getWidth(hnd);
|
||||
@@ -1025,6 +1031,7 @@ int CopyBit::drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
|
||||
layerTransform);
|
||||
//TODO: once, we are able to read layer alpha, update this
|
||||
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
|
||||
copybit->set_parameter(copybit, COPYBIT_DYNAMIC_FPS, dynamic_fps);
|
||||
copybit->set_parameter(copybit, COPYBIT_BLEND_MODE,
|
||||
layer->blending);
|
||||
copybit->set_parameter(copybit, COPYBIT_DITHER,
|
||||
|
||||
Reference in New Issue
Block a user