libhwcomposer: Fix dynamic composition for 2 overlapping layers

This change allows composition to fall back to c2d even if the second
layer overlaps the base full screen layer.

CRs-Fixed: 326413
(cherry picked from commit b27338930d5bf3de17d03b06db6169e648d5e5fc)

Change-Id: Iaf1bf706fb216286047452173b58aeba1781cd9b
This commit is contained in:
Jeykumar Sankaran 2012-01-13 15:07:40 -08:00 committed by Andrew Sutherland
parent 71e0e80dbd
commit e806dc448b

View File

@ -372,7 +372,22 @@ bool canSkipComposition(hwc_context_t* ctx, int yuvBufferCount, int currentLayer
return false;
}
static bool isFullScreenUpdate(const framebuffer_device_t* fbDev, const hwc_layer_list_t* list) {
void getNonRotatedResolution(const hwc_layer_t* layer, int& width, int& height)
{
int transform = layer->transform;
hwc_rect_t displayFrame = layer->displayFrame;
width = displayFrame.right - displayFrame.left;
height = displayFrame.bottom - displayFrame.top;
if(transform & (HWC_TRANSFORM_ROT_90 | HWC_TRANSFORM_ROT_270)) {
height = displayFrame.right - displayFrame.left;
width = displayFrame.bottom - displayFrame.top;
}
}
static bool canUseCopybit(const framebuffer_device_t* fbDev, const hwc_layer_list_t* list) {
if(!fbDev) {
LOGE("ERROR: %s : fb device is invalid",__func__);
@ -383,52 +398,31 @@ static bool isFullScreenUpdate(const framebuffer_device_t* fbDev, const hwc_laye
int fb_h = fbDev->height;
/*
* We have full screen condition when
* We can use copybit when
* 1. We have 1 layer to compose
* a. layers dest rect equals display resolution.
* 2. We have 2 layers to compose
* a. Sum of their dest rects equals display resolution.
* a. Sum of both layers covers full screen
* b. One of the layers is full screen and the
* other is less than full screen (includes
* pop ups, volume bar etc.)
* TODO: Need to revisit this logic to use copybit
* based on the total blitting region instead of total
* layers count
*/
if(list->numHwLayers == 1)
{
hwc_rect_t rect = list->hwLayers[0].displayFrame;
int w = rect.right - rect.left;
int h = rect.bottom - rect.top;
int transform = list->hwLayers[0].transform;
if(transform & (HWC_TRANSFORM_ROT_90 | HWC_TRANSFORM_ROT_270))
return ((fb_w == h) && (fb_h == w));
else
return ((fb_h == h) && (fb_w == w));
}
bool use_copybit = (list->numHwLayers == 1);
if(list->numHwLayers == 2) {
int w1, h1;
int w2, h2;
hwc_rect_t rect_1 = list->hwLayers[0].displayFrame;
hwc_rect_t rect_2 = list->hwLayers[1].displayFrame;
getNonRotatedResolution(&list->hwLayers[0], w1, h1);
getNonRotatedResolution(&list->hwLayers[1], w2, h2);
int transform_1 = list->hwLayers[0].transform;
int transform_2 = list->hwLayers[1].transform;
int w1 = rect_1.right - rect_1.left;
int h1 = rect_1.bottom - rect_1.top;
int w2 = rect_2.right - rect_2.left;
int h2 = rect_2.bottom - rect_2.top;
if(transform_1 == transform_2) {
if(transform_1 & (HWC_TRANSFORM_ROT_90 | HWC_TRANSFORM_ROT_270)) {
if((fb_w == (w1 + w2)) && (fb_h == h1) && (fb_h == h2))
return true;
} else {
if((fb_w == w1) && (fb_w == w2) && (fb_h == (h1 + h2)))
return true;
}
}
use_copybit = ((fb_w >= w1) && (fb_w >= w2) && ((fb_h * 2) > (h1 + h2)));
}
return false;
return use_copybit;
}
#ifdef COMPOSITION_BYPASS
@ -816,10 +810,10 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list) {
bool isS3DCompositionNeeded = false;
int s3dVideoFormat = 0;
int numLayersNotUpdating = 0;
bool fullscreen = false;
bool useCopybit = false;
if (list) {
fullscreen = isFullScreenUpdate(hwcModule->fbDevice, list);
useCopybit = canUseCopybit(hwcModule->fbDevice, list);
yuvBufferCount = getYUVBufferCount(list);
bool skipComposition = false;
@ -899,7 +893,7 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list) {
(COMPOSITION_TYPE_C2D|COMPOSITION_TYPE_MDP))) {
list->hwLayers[i].compositionType = HWC_USE_COPYBIT;
} else if ((hwcModule->compositionType == COMPOSITION_TYPE_DYN)
&& fullscreen) {
&& useCopybit) {
list->hwLayers[i].compositionType = HWC_USE_COPYBIT;
}
else {