hwc/copybit: Handle "R/B swap" for RGBA and RGBX color formats.

1.Framework notifies HAL with "HWC_FORMAT_RB_SWAP" layer flag to handle
a limitation where R and B components were swapped in Rendering phase.
2.Add "R/B swap" in hwc query to enable framework to query for support
in display HAL, at run-time.

Change-Id: I3b44d15b51b4f24939048fee9d1bac2b9009c97c
This commit is contained in:
Sushil Chauhan
2013-10-11 11:49:35 -07:00
parent 11888cb1bd
commit 1f6d68fce6
7 changed files with 38 additions and 0 deletions

View File

@@ -126,6 +126,7 @@ static int get_format(int format) {
switch (format) {
case HAL_PIXEL_FORMAT_RGB_565: return MDP_RGB_565;
case HAL_PIXEL_FORMAT_RGBX_8888: return MDP_RGBX_8888;
case HAL_PIXEL_FORMAT_BGRX_8888: return MDP_BGRX_8888;
case HAL_PIXEL_FORMAT_RGB_888: return MDP_RGB_888;
case HAL_PIXEL_FORMAT_RGBA_8888: return MDP_RGBA_8888;
case HAL_PIXEL_FORMAT_BGRA_8888: return MDP_BGRA_8888;

View File

@@ -104,6 +104,7 @@ enum {
HAL_PIXEL_FORMAT_YCbCr_444_SP = 0x10F,
HAL_PIXEL_FORMAT_YCrCb_444_SP = 0x110,
HAL_PIXEL_FORMAT_YCrCb_422_I = 0x111,
HAL_PIXEL_FORMAT_BGRX_8888 = 0x112,
HAL_PIXEL_FORMAT_INTERLACE = 0x180,
};

View File

@@ -446,6 +446,9 @@ static int hwc_query(struct hwc_composer_device_1* dev,
supported |= HWC_DISPLAY_EXTERNAL_BIT;
value[0] = supported;
break;
case HWC_FORMAT_RB_SWAP:
value[0] = 1;
break;
default:
return -EINVAL;
}

View File

@@ -350,6 +350,16 @@ int CopyBit::drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
src.w = hnd->width;
src.h = hnd->height;
src.format = hnd->format;
// Handle R/B swap
if ((layer->flags & HWC_FORMAT_RB_SWAP)) {
if (src.format == HAL_PIXEL_FORMAT_RGBA_8888) {
src.format = HAL_PIXEL_FORMAT_BGRA_8888;
} else if (src.format == HAL_PIXEL_FORMAT_RGBX_8888) {
src.format = HAL_PIXEL_FORMAT_BGRX_8888;
}
}
src.base = (void *)hnd->base;
src.handle = (native_handle_t *)layer->handle;
src.horiz_padding = src.w - hnd->width;

View File

@@ -1385,6 +1385,14 @@ int configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer,
Whf whf(hnd->width, hnd->height,
getMdpFormat(hnd->format), hnd->size);
// Handle R/B swap
if (layer->flags & HWC_FORMAT_RB_SWAP) {
if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888)
whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888);
else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888)
whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888);
}
if(dpy && isYuvBuffer(hnd)) {
if(!ctx->listStats[dpy].isDisplayAnimating) {
ctx->mPrevCropVideo = crop;
@@ -1508,6 +1516,14 @@ int configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer,
Whf whf(hnd->width, hnd->height,
getMdpFormat(hnd->format), hnd->size);
// Handle R/B swap
if (layer->flags & HWC_FORMAT_RB_SWAP) {
if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888)
whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888);
else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888)
whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888);
}
if(dpy && isYuvBuffer(hnd)) {
if(!ctx->listStats[dpy].isDisplayAnimating) {
ctx->mPrevCropVideo = crop;

View File

@@ -127,6 +127,11 @@ enum {
HWC_COPYBIT = 0x00000002,
};
// HAL specific features
enum {
HWC_FORMAT_RB_SWAP = 0x00000040,
};
class LayerRotMap {
public:
LayerRotMap() { reset(); }

View File

@@ -100,6 +100,8 @@ int getMdpFormat(int format) {
return MDP_RGB_565;
case HAL_PIXEL_FORMAT_BGRA_8888:
return MDP_BGRA_8888;
case HAL_PIXEL_FORMAT_BGRX_8888:
return MDP_BGRX_8888;
case HAL_PIXEL_FORMAT_YV12:
return MDP_Y_CR_CB_GH2V2;
case HAL_PIXEL_FORMAT_YCbCr_422_SP: