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) {
|
switch (format) {
|
||||||
case HAL_PIXEL_FORMAT_RGB_565: return MDP_RGB_565;
|
case HAL_PIXEL_FORMAT_RGB_565: return MDP_RGB_565;
|
||||||
case HAL_PIXEL_FORMAT_RGBX_8888: return MDP_RGBX_8888;
|
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_RGB_888: return MDP_RGB_888;
|
||||||
case HAL_PIXEL_FORMAT_RGBA_8888: return MDP_RGBA_8888;
|
case HAL_PIXEL_FORMAT_RGBA_8888: return MDP_RGBA_8888;
|
||||||
case HAL_PIXEL_FORMAT_BGRA_8888: return MDP_BGRA_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_YCbCr_444_SP = 0x10F,
|
||||||
HAL_PIXEL_FORMAT_YCrCb_444_SP = 0x110,
|
HAL_PIXEL_FORMAT_YCrCb_444_SP = 0x110,
|
||||||
HAL_PIXEL_FORMAT_YCrCb_422_I = 0x111,
|
HAL_PIXEL_FORMAT_YCrCb_422_I = 0x111,
|
||||||
|
HAL_PIXEL_FORMAT_BGRX_8888 = 0x112,
|
||||||
HAL_PIXEL_FORMAT_INTERLACE = 0x180,
|
HAL_PIXEL_FORMAT_INTERLACE = 0x180,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -446,6 +446,9 @@ static int hwc_query(struct hwc_composer_device_1* dev,
|
|||||||
supported |= HWC_DISPLAY_EXTERNAL_BIT;
|
supported |= HWC_DISPLAY_EXTERNAL_BIT;
|
||||||
value[0] = supported;
|
value[0] = supported;
|
||||||
break;
|
break;
|
||||||
|
case HWC_FORMAT_RB_SWAP:
|
||||||
|
value[0] = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -350,6 +350,16 @@ int CopyBit::drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
|
|||||||
src.w = hnd->width;
|
src.w = hnd->width;
|
||||||
src.h = hnd->height;
|
src.h = hnd->height;
|
||||||
src.format = hnd->format;
|
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.base = (void *)hnd->base;
|
||||||
src.handle = (native_handle_t *)layer->handle;
|
src.handle = (native_handle_t *)layer->handle;
|
||||||
src.horiz_padding = src.w - hnd->width;
|
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,
|
Whf whf(hnd->width, hnd->height,
|
||||||
getMdpFormat(hnd->format), hnd->size);
|
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(dpy && isYuvBuffer(hnd)) {
|
||||||
if(!ctx->listStats[dpy].isDisplayAnimating) {
|
if(!ctx->listStats[dpy].isDisplayAnimating) {
|
||||||
ctx->mPrevCropVideo = crop;
|
ctx->mPrevCropVideo = crop;
|
||||||
@@ -1508,6 +1516,14 @@ int configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer,
|
|||||||
Whf whf(hnd->width, hnd->height,
|
Whf whf(hnd->width, hnd->height,
|
||||||
getMdpFormat(hnd->format), hnd->size);
|
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(dpy && isYuvBuffer(hnd)) {
|
||||||
if(!ctx->listStats[dpy].isDisplayAnimating) {
|
if(!ctx->listStats[dpy].isDisplayAnimating) {
|
||||||
ctx->mPrevCropVideo = crop;
|
ctx->mPrevCropVideo = crop;
|
||||||
|
|||||||
@@ -127,6 +127,11 @@ enum {
|
|||||||
HWC_COPYBIT = 0x00000002,
|
HWC_COPYBIT = 0x00000002,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// HAL specific features
|
||||||
|
enum {
|
||||||
|
HWC_FORMAT_RB_SWAP = 0x00000040,
|
||||||
|
};
|
||||||
|
|
||||||
class LayerRotMap {
|
class LayerRotMap {
|
||||||
public:
|
public:
|
||||||
LayerRotMap() { reset(); }
|
LayerRotMap() { reset(); }
|
||||||
|
|||||||
@@ -100,6 +100,8 @@ int getMdpFormat(int format) {
|
|||||||
return MDP_RGB_565;
|
return MDP_RGB_565;
|
||||||
case HAL_PIXEL_FORMAT_BGRA_8888:
|
case HAL_PIXEL_FORMAT_BGRA_8888:
|
||||||
return MDP_BGRA_8888;
|
return MDP_BGRA_8888;
|
||||||
|
case HAL_PIXEL_FORMAT_BGRX_8888:
|
||||||
|
return MDP_BGRX_8888;
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
case HAL_PIXEL_FORMAT_YV12:
|
||||||
return MDP_Y_CR_CB_GH2V2;
|
return MDP_Y_CR_CB_GH2V2;
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
|
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
|
||||||
|
|||||||
Reference in New Issue
Block a user