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:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -127,6 +127,11 @@ enum {
|
||||
HWC_COPYBIT = 0x00000002,
|
||||
};
|
||||
|
||||
// HAL specific features
|
||||
enum {
|
||||
HWC_FORMAT_RB_SWAP = 0x00000040,
|
||||
};
|
||||
|
||||
class LayerRotMap {
|
||||
public:
|
||||
LayerRotMap() { reset(); }
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user