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
diff --git a/displayengine/include/core/layer_buffer.h b/displayengine/include/core/layer_buffer.h
index e4a73c3..cf94e56 100644
--- a/displayengine/include/core/layer_buffer.h
+++ b/displayengine/include/core/layer_buffer.h
@@ -54,6 +54,9 @@
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 @@
//!< 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 @@
//!< 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,
};
diff --git a/displayengine/libs/core/fb/hw_device.cpp b/displayengine/libs/core/fb/hw_device.cpp
index 230092a..f8af3e8 100644
--- a/displayengine/libs/core/fb/hw_device.cpp
+++ b/displayengine/libs/core/fb/hw_device.cpp
@@ -523,6 +523,7 @@
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 @@
case kFormatBGRA8888:
case kFormatRGBX8888:
case kFormatBGRX8888:
+ case kFormatRGBA8888Ubwc:
+ case kFormatRGBX8888Ubwc:
*target = width * 4;
break;
case kFormatRGB888:
@@ -555,7 +558,8 @@
*target = width * 3;
break;
case kFormatRGB565:
- *target = width * 3;
+ case kFormatRGB565Ubwc:
+ *target = width * 2;
break;
case kFormatYCbCr420SemiPlanarVenus:
case kFormatYCbCr420SPVenusUbwc:
diff --git a/displayengine/libs/core/res_manager.cpp b/displayengine/libs/core/res_manager.cpp
index 08b055b..06f6b4d 100644
--- a/displayengine/libs/core/res_manager.cpp
+++ b/displayengine/libs/core/res_manager.cpp
@@ -1043,9 +1043,17 @@
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 @@
} 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:
diff --git a/displayengine/libs/core/scalar_helper.cpp b/displayengine/libs/core/scalar_helper.cpp
index c81e343..b5d8989 100644
--- a/displayengine/libs/core/scalar_helper.cpp
+++ b/displayengine/libs/core/scalar_helper.cpp
@@ -91,6 +91,7 @@
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:
diff --git a/displayengine/libs/hwc/hwc_buffer_allocator.cpp b/displayengine/libs/hwc/hwc_buffer_allocator.cpp
index 2adfc3a..22c4640 100644
--- a/displayengine/libs/hwc/hwc_buffer_allocator.cpp
+++ b/displayengine/libs/hwc/hwc_buffer_allocator.cpp
@@ -63,11 +63,6 @@
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 @@
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 @@
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 @@
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;
diff --git a/displayengine/libs/hwc/hwc_buffer_allocator.h b/displayengine/libs/hwc/hwc_buffer_allocator.h
index 123f04a..eb3d1fd 100644
--- a/displayengine/libs/hwc/hwc_buffer_allocator.h
+++ b/displayengine/libs/hwc/hwc_buffer_allocator.h
@@ -57,7 +57,7 @@
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_;
};
diff --git a/displayengine/libs/hwc/hwc_display.cpp b/displayengine/libs/hwc/hwc_display.cpp
index 124310a..b48999e 100644
--- a/displayengine/libs/hwc/hwc_display.cpp
+++ b/displayengine/libs/hwc/hwc_display.cpp
@@ -625,6 +625,7 @@
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 @@
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";
}
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index 3e17061..b8e6a64 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -296,6 +296,8 @@
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 @@
{
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 @@
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);