sde: Add support for RGBX_8888 UBWC format

1. Add support for RGBX_8888 UBWC in display engine and gralloc APIs.
2. Set the appropriate rotator output format for RGB* UBWC formats.
3. Move the UBWC aligned format enums in their appropriate range.

Change-Id: I0107f10894f9edbe657fce29b99f6e909c675150
This commit is contained in:
Sushil Chauhan
2015-04-15 11:30:39 -07:00
parent e6b3209514
commit 6686c80f64
8 changed files with 55 additions and 19 deletions

View File

@@ -54,6 +54,9 @@ enum LayerBufferFormat {
kFormatRGB888, //!< 8-bits Red, Green, Blue interleaved in RGB order. No Alpha.
kFormatBGR888, //!< 8-bits Blue, Green, Red interleaved in BGR order. No Alpha.
kFormatRGB565, //!< 5-bit Red, 6-bit Green, 5-bit Blue interleaved in RGB order. No Alpha.
kFormatRGBA8888Ubwc, //!< UBWC aligned RGBA8888 format
kFormatRGBX8888Ubwc, //!< UBWC aligned RGBX8888 format
kFormatRGB565Ubwc, //!< UBWC aligned RGB565 format
/* All YUV-Planar formats, Any new format will be added towards end of this group to maintain
backward compatibility.
@@ -99,6 +102,8 @@ enum LayerBufferFormat {
//!< horizontally subsampled interleaved VU-plane:
//!< v(0), u(1), v(2), u(3) ... v(n-1), u(n)
kFormatYCbCr420SPVenusUbwc, //!< UBWC aligned YCbCr420SemiPlanarVenus format
/* All YUV-Packed formats, Any new format will be added towards end of this group to maintain
backward compatibility.
*/
@@ -107,15 +112,6 @@ enum LayerBufferFormat {
//!< y(0), u(0), y(1), v(0), y(2), u(2), y(3), v(2)
//!< y(n-1), u(n-1), y(n), v(n-1)
/* All UBWC aligned formats. Any new format will be added towards end of this group to maintain
backward compatibility.
*/
kFormatRGBA8888Ubwc = 0x400, //!< UBWC aligned RGBA8888 format
kFormatRGB565Ubwc, //!< UBWC aligned RGB565 format
kFormatYCbCr420SPVenusUbwc, //!< UBWC aligned Venus NV12 format
kFormatInvalid = 0xFFFFFFFF,
};

View File

@@ -523,6 +523,7 @@ DisplayError HWDevice::SetFormat(const LayerBufferFormat &source, uint32_t *targ
case kFormatYCbCr422H2V1Packed: *target = MDP_YCBYCR_H2V1; break;
case kFormatYCbCr420SemiPlanarVenus: *target = MDP_Y_CBCR_H2V2_VENUS; break;
case kFormatRGBA8888Ubwc: *target = MDP_RGBA_8888_UBWC; break;
case kFormatRGBX8888Ubwc: *target = MDP_RGBX_8888_UBWC; break;
case kFormatRGB565Ubwc: *target = MDP_RGB_565_UBWC; break;
case kFormatYCbCr420SPVenusUbwc: *target = MDP_Y_CBCR_H2V2_UBWC; break;
default:
@@ -548,6 +549,8 @@ DisplayError HWDevice::SetStride(HWDeviceType device_type, LayerBufferFormat for
case kFormatBGRA8888:
case kFormatRGBX8888:
case kFormatBGRX8888:
case kFormatRGBA8888Ubwc:
case kFormatRGBX8888Ubwc:
*target = width * 4;
break;
case kFormatRGB888:
@@ -555,7 +558,8 @@ DisplayError HWDevice::SetStride(HWDeviceType device_type, LayerBufferFormat for
*target = width * 3;
break;
case kFormatRGB565:
*target = width * 3;
case kFormatRGB565Ubwc:
*target = width * 2;
break;
case kFormatYCbCr420SemiPlanarVenus:
case kFormatYCbCr420SPVenusUbwc:

View File

@@ -1043,9 +1043,17 @@ void ResManager::SetRotatorOutputFormat(const LayerBufferFormat &input_format,
break;
}
// TODO(user): UBWC RGB formats will be handled separately
if (downscale) {
switch (input_format) {
case kFormatRGBA8888Ubwc:
*output_format = is_opaque ? kFormatRGB888 : kFormatRGBA8888;
break;
case kFormatRGBX8888Ubwc:
*output_format = kFormatRGB888;
break;
case kFormatRGB565Ubwc:
*output_format = kFormatRGB565;
break;
case kFormatYCbCr420SPVenusUbwc:
*output_format = kFormatYCbCr420SemiPlanar;
break;
@@ -1055,6 +1063,15 @@ void ResManager::SetRotatorOutputFormat(const LayerBufferFormat &input_format,
} else {
if (hw_res_info_.has_ubwc) {
switch (input_format) {
case kFormatRGBA8888:
*output_format = kFormatRGBA8888Ubwc;
break;
case kFormatRGBX8888:
*output_format = kFormatRGBX8888Ubwc;
break;
case kFormatRGB565:
*output_format = kFormatRGB565Ubwc;
break;
case kFormatYCrCb420SemiPlanar:
case kFormatYCbCr420SemiPlanar:
case kFormatYCbCr420SemiPlanarVenus:

View File

@@ -91,6 +91,7 @@ static uint32_t GetScalarFormat(LayerBufferFormat source) {
case kFormatYCbCr422H2V1Packed: format = scalar::YCBYCR_H2V1; break;
case kFormatYCbCr420SemiPlanarVenus: format = scalar::Y_CBCR_H2V2_VENUS; break;
case kFormatRGBA8888Ubwc: format = scalar::RGBA_8888_UBWC; break;
case kFormatRGBX8888Ubwc: format = scalar::RGBX_8888_UBWC; break;
case kFormatRGB565Ubwc: format = scalar::RGB_565_UBWC; break;
case kFormatYCbCr420SPVenusUbwc: format = scalar::Y_CBCR_H2V2_UBWC; break;
default:

View File

@@ -63,11 +63,6 @@ DisplayError HWCBufferAllocator::AllocateBuffer(BufferInfo *buffer_info) {
int height = INT(buffer_config.height);
int format;
error = SetHALFormat(buffer_config.format, &format);
if (error != 0) {
return kErrorParameters;
}
if (buffer_config.secure) {
alloc_flags = GRALLOC_USAGE_PRIVATE_MM_HEAP;
alloc_flags |= GRALLOC_USAGE_PROTECTED;
@@ -81,6 +76,11 @@ DisplayError HWCBufferAllocator::AllocateBuffer(BufferInfo *buffer_info) {
alloc_flags |= GRALLOC_USAGE_PRIVATE_UNCACHED;
}
error = SetBufferInfo(buffer_config.format, &format, &alloc_flags);
if (error != 0) {
return kErrorParameters;
}
int aligned_width = 0, aligned_height = 0;
uint32_t buffer_size = getBufferSizeAndDimensions(width, height, format, alloc_flags,
aligned_width, aligned_height);
@@ -147,7 +147,7 @@ DisplayError HWCBufferAllocator::FreeBuffer(BufferInfo *buffer_info) {
return kErrorNone;
}
int HWCBufferAllocator::SetHALFormat(LayerBufferFormat format, int *target) {
int HWCBufferAllocator::SetBufferInfo(LayerBufferFormat format, int *target, int *flags) {
switch (format) {
case kFormatRGBA8888: *target = HAL_PIXEL_FORMAT_RGBA_8888; break;
case kFormatRGBX8888: *target = HAL_PIXEL_FORMAT_RGBX_8888; break;
@@ -163,7 +163,18 @@ int HWCBufferAllocator::SetHALFormat(LayerBufferFormat format, int *target) {
case kFormatYCbCr420SPVenusUbwc: *target = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC; break;
case kFormatRGBA5551: *target = HAL_PIXEL_FORMAT_RGBA_5551; break;
case kFormatRGBA4444: *target = HAL_PIXEL_FORMAT_RGBA_4444; break;
case kFormatRGBA8888Ubwc:
*target = HAL_PIXEL_FORMAT_RGBA_8888;
*flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
break;
case kFormatRGBX8888Ubwc:
*target = HAL_PIXEL_FORMAT_RGBX_8888;
*flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
break;
case kFormatRGB565Ubwc:
*target = HAL_PIXEL_FORMAT_RGB_565;
*flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
break;
default:
DLOGE("Unsupported format = 0x%x", format);
return -EINVAL;

View File

@@ -57,7 +57,7 @@ class HWCBufferAllocator : public BufferAllocator {
void *base_addr; //!< Specifies the base address of the allocated output buffer.
};
int SetHALFormat(LayerBufferFormat format, int *target);
int SetBufferInfo(LayerBufferFormat format, int *target, int *flags);
gralloc::IAllocController *alloc_controller_;
};

View File

@@ -625,6 +625,7 @@ LayerBufferFormat HWCDisplay::GetSDEFormat(const int32_t &source, const int flag
if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
switch (source) {
case HAL_PIXEL_FORMAT_RGBA_8888: format = kFormatRGBA8888Ubwc; break;
case HAL_PIXEL_FORMAT_RGBX_8888: format = kFormatRGBX8888Ubwc; break;
case HAL_PIXEL_FORMAT_RGB_565: format = kFormatRGB565Ubwc; break;
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
@@ -755,6 +756,8 @@ const char *HWCDisplay::GetHALPixelFormatString(int format) {
return "INTERLACE";
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
return "YCbCr_420_SP_VENUS";
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
return "YCbCr_420_SP_VENUS_UBWC";
default:
return "Unknown pixel format";
}

View File

@@ -296,6 +296,8 @@ ADRENOPIXELFORMAT AdrenoMemInfo::getGpuPixelFormat(int hal_format)
switch (hal_format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
return ADRENO_PIXELFORMAT_R8G8B8A8;
case HAL_PIXEL_FORMAT_RGBX_8888:
return ADRENO_PIXELFORMAT_R8G8B8X8;
case HAL_PIXEL_FORMAT_RGB_565:
return ADRENO_PIXELFORMAT_B5G6R5;
case HAL_PIXEL_FORMAT_sRGB_A_8888:
@@ -787,6 +789,7 @@ static bool isUBwcSupported(int format)
{
case HAL_PIXEL_FORMAT_RGB_565:
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_sRGB_A_8888:
case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
@@ -893,6 +896,7 @@ static unsigned int getUBwcSize(int width, int height, int format,
size += getUBwcMetaBufferSize(width, height, 2);
break;
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_sRGB_A_8888:
size = alignedw * alignedh * 4;
size += getUBwcMetaBufferSize(width, height, 4);