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:
@@ -54,6 +54,9 @@ enum LayerBufferFormat {
|
|||||||
kFormatRGB888, //!< 8-bits Red, Green, Blue interleaved in RGB order. No Alpha.
|
kFormatRGB888, //!< 8-bits Red, Green, Blue interleaved in RGB order. No Alpha.
|
||||||
kFormatBGR888, //!< 8-bits Blue, Green, Red interleaved in BGR 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.
|
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
|
/* All YUV-Planar formats, Any new format will be added towards end of this group to maintain
|
||||||
backward compatibility.
|
backward compatibility.
|
||||||
@@ -99,6 +102,8 @@ enum LayerBufferFormat {
|
|||||||
//!< horizontally subsampled interleaved VU-plane:
|
//!< horizontally subsampled interleaved VU-plane:
|
||||||
//!< v(0), u(1), v(2), u(3) ... v(n-1), u(n)
|
//!< 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
|
/* All YUV-Packed formats, Any new format will be added towards end of this group to maintain
|
||||||
backward compatibility.
|
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(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)
|
//!< 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,
|
kFormatInvalid = 0xFFFFFFFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -523,6 +523,7 @@ DisplayError HWDevice::SetFormat(const LayerBufferFormat &source, uint32_t *targ
|
|||||||
case kFormatYCbCr422H2V1Packed: *target = MDP_YCBYCR_H2V1; break;
|
case kFormatYCbCr422H2V1Packed: *target = MDP_YCBYCR_H2V1; break;
|
||||||
case kFormatYCbCr420SemiPlanarVenus: *target = MDP_Y_CBCR_H2V2_VENUS; break;
|
case kFormatYCbCr420SemiPlanarVenus: *target = MDP_Y_CBCR_H2V2_VENUS; break;
|
||||||
case kFormatRGBA8888Ubwc: *target = MDP_RGBA_8888_UBWC; 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 kFormatRGB565Ubwc: *target = MDP_RGB_565_UBWC; break;
|
||||||
case kFormatYCbCr420SPVenusUbwc: *target = MDP_Y_CBCR_H2V2_UBWC; break;
|
case kFormatYCbCr420SPVenusUbwc: *target = MDP_Y_CBCR_H2V2_UBWC; break;
|
||||||
default:
|
default:
|
||||||
@@ -548,6 +549,8 @@ DisplayError HWDevice::SetStride(HWDeviceType device_type, LayerBufferFormat for
|
|||||||
case kFormatBGRA8888:
|
case kFormatBGRA8888:
|
||||||
case kFormatRGBX8888:
|
case kFormatRGBX8888:
|
||||||
case kFormatBGRX8888:
|
case kFormatBGRX8888:
|
||||||
|
case kFormatRGBA8888Ubwc:
|
||||||
|
case kFormatRGBX8888Ubwc:
|
||||||
*target = width * 4;
|
*target = width * 4;
|
||||||
break;
|
break;
|
||||||
case kFormatRGB888:
|
case kFormatRGB888:
|
||||||
@@ -555,7 +558,8 @@ DisplayError HWDevice::SetStride(HWDeviceType device_type, LayerBufferFormat for
|
|||||||
*target = width * 3;
|
*target = width * 3;
|
||||||
break;
|
break;
|
||||||
case kFormatRGB565:
|
case kFormatRGB565:
|
||||||
*target = width * 3;
|
case kFormatRGB565Ubwc:
|
||||||
|
*target = width * 2;
|
||||||
break;
|
break;
|
||||||
case kFormatYCbCr420SemiPlanarVenus:
|
case kFormatYCbCr420SemiPlanarVenus:
|
||||||
case kFormatYCbCr420SPVenusUbwc:
|
case kFormatYCbCr420SPVenusUbwc:
|
||||||
|
|||||||
@@ -1043,9 +1043,17 @@ void ResManager::SetRotatorOutputFormat(const LayerBufferFormat &input_format,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(user): UBWC RGB formats will be handled separately
|
|
||||||
if (downscale) {
|
if (downscale) {
|
||||||
switch (input_format) {
|
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:
|
case kFormatYCbCr420SPVenusUbwc:
|
||||||
*output_format = kFormatYCbCr420SemiPlanar;
|
*output_format = kFormatYCbCr420SemiPlanar;
|
||||||
break;
|
break;
|
||||||
@@ -1055,6 +1063,15 @@ void ResManager::SetRotatorOutputFormat(const LayerBufferFormat &input_format,
|
|||||||
} else {
|
} else {
|
||||||
if (hw_res_info_.has_ubwc) {
|
if (hw_res_info_.has_ubwc) {
|
||||||
switch (input_format) {
|
switch (input_format) {
|
||||||
|
case kFormatRGBA8888:
|
||||||
|
*output_format = kFormatRGBA8888Ubwc;
|
||||||
|
break;
|
||||||
|
case kFormatRGBX8888:
|
||||||
|
*output_format = kFormatRGBX8888Ubwc;
|
||||||
|
break;
|
||||||
|
case kFormatRGB565:
|
||||||
|
*output_format = kFormatRGB565Ubwc;
|
||||||
|
break;
|
||||||
case kFormatYCrCb420SemiPlanar:
|
case kFormatYCrCb420SemiPlanar:
|
||||||
case kFormatYCbCr420SemiPlanar:
|
case kFormatYCbCr420SemiPlanar:
|
||||||
case kFormatYCbCr420SemiPlanarVenus:
|
case kFormatYCbCr420SemiPlanarVenus:
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ static uint32_t GetScalarFormat(LayerBufferFormat source) {
|
|||||||
case kFormatYCbCr422H2V1Packed: format = scalar::YCBYCR_H2V1; break;
|
case kFormatYCbCr422H2V1Packed: format = scalar::YCBYCR_H2V1; break;
|
||||||
case kFormatYCbCr420SemiPlanarVenus: format = scalar::Y_CBCR_H2V2_VENUS; break;
|
case kFormatYCbCr420SemiPlanarVenus: format = scalar::Y_CBCR_H2V2_VENUS; break;
|
||||||
case kFormatRGBA8888Ubwc: format = scalar::RGBA_8888_UBWC; 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 kFormatRGB565Ubwc: format = scalar::RGB_565_UBWC; break;
|
||||||
case kFormatYCbCr420SPVenusUbwc: format = scalar::Y_CBCR_H2V2_UBWC; break;
|
case kFormatYCbCr420SPVenusUbwc: format = scalar::Y_CBCR_H2V2_UBWC; break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -63,11 +63,6 @@ DisplayError HWCBufferAllocator::AllocateBuffer(BufferInfo *buffer_info) {
|
|||||||
int height = INT(buffer_config.height);
|
int height = INT(buffer_config.height);
|
||||||
int format;
|
int format;
|
||||||
|
|
||||||
error = SetHALFormat(buffer_config.format, &format);
|
|
||||||
if (error != 0) {
|
|
||||||
return kErrorParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer_config.secure) {
|
if (buffer_config.secure) {
|
||||||
alloc_flags = GRALLOC_USAGE_PRIVATE_MM_HEAP;
|
alloc_flags = GRALLOC_USAGE_PRIVATE_MM_HEAP;
|
||||||
alloc_flags |= GRALLOC_USAGE_PROTECTED;
|
alloc_flags |= GRALLOC_USAGE_PROTECTED;
|
||||||
@@ -81,6 +76,11 @@ DisplayError HWCBufferAllocator::AllocateBuffer(BufferInfo *buffer_info) {
|
|||||||
alloc_flags |= GRALLOC_USAGE_PRIVATE_UNCACHED;
|
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;
|
int aligned_width = 0, aligned_height = 0;
|
||||||
uint32_t buffer_size = getBufferSizeAndDimensions(width, height, format, alloc_flags,
|
uint32_t buffer_size = getBufferSizeAndDimensions(width, height, format, alloc_flags,
|
||||||
aligned_width, aligned_height);
|
aligned_width, aligned_height);
|
||||||
@@ -147,7 +147,7 @@ DisplayError HWCBufferAllocator::FreeBuffer(BufferInfo *buffer_info) {
|
|||||||
return kErrorNone;
|
return kErrorNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HWCBufferAllocator::SetHALFormat(LayerBufferFormat format, int *target) {
|
int HWCBufferAllocator::SetBufferInfo(LayerBufferFormat format, int *target, int *flags) {
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case kFormatRGBA8888: *target = HAL_PIXEL_FORMAT_RGBA_8888; break;
|
case kFormatRGBA8888: *target = HAL_PIXEL_FORMAT_RGBA_8888; break;
|
||||||
case kFormatRGBX8888: *target = HAL_PIXEL_FORMAT_RGBX_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 kFormatYCbCr420SPVenusUbwc: *target = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC; break;
|
||||||
case kFormatRGBA5551: *target = HAL_PIXEL_FORMAT_RGBA_5551; break;
|
case kFormatRGBA5551: *target = HAL_PIXEL_FORMAT_RGBA_5551; break;
|
||||||
case kFormatRGBA4444: *target = HAL_PIXEL_FORMAT_RGBA_4444; 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:
|
default:
|
||||||
DLOGE("Unsupported format = 0x%x", format);
|
DLOGE("Unsupported format = 0x%x", format);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class HWCBufferAllocator : public BufferAllocator {
|
|||||||
void *base_addr; //!< Specifies the base address of the allocated output buffer.
|
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_;
|
gralloc::IAllocController *alloc_controller_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -625,6 +625,7 @@ LayerBufferFormat HWCDisplay::GetSDEFormat(const int32_t &source, const int flag
|
|||||||
if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
|
if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
|
||||||
switch (source) {
|
switch (source) {
|
||||||
case HAL_PIXEL_FORMAT_RGBA_8888: format = kFormatRGBA8888Ubwc; break;
|
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_RGB_565: format = kFormatRGB565Ubwc; break;
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
|
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
|
||||||
@@ -755,6 +756,8 @@ const char *HWCDisplay::GetHALPixelFormatString(int format) {
|
|||||||
return "INTERLACE";
|
return "INTERLACE";
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
||||||
return "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:
|
default:
|
||||||
return "Unknown pixel format";
|
return "Unknown pixel format";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -296,6 +296,8 @@ ADRENOPIXELFORMAT AdrenoMemInfo::getGpuPixelFormat(int hal_format)
|
|||||||
switch (hal_format) {
|
switch (hal_format) {
|
||||||
case HAL_PIXEL_FORMAT_RGBA_8888:
|
case HAL_PIXEL_FORMAT_RGBA_8888:
|
||||||
return ADRENO_PIXELFORMAT_R8G8B8A8;
|
return ADRENO_PIXELFORMAT_R8G8B8A8;
|
||||||
|
case HAL_PIXEL_FORMAT_RGBX_8888:
|
||||||
|
return ADRENO_PIXELFORMAT_R8G8B8X8;
|
||||||
case HAL_PIXEL_FORMAT_RGB_565:
|
case HAL_PIXEL_FORMAT_RGB_565:
|
||||||
return ADRENO_PIXELFORMAT_B5G6R5;
|
return ADRENO_PIXELFORMAT_B5G6R5;
|
||||||
case HAL_PIXEL_FORMAT_sRGB_A_8888:
|
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_RGB_565:
|
||||||
case HAL_PIXEL_FORMAT_RGBA_8888:
|
case HAL_PIXEL_FORMAT_RGBA_8888:
|
||||||
|
case HAL_PIXEL_FORMAT_RGBX_8888:
|
||||||
case HAL_PIXEL_FORMAT_sRGB_A_8888:
|
case HAL_PIXEL_FORMAT_sRGB_A_8888:
|
||||||
case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
|
case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
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);
|
size += getUBwcMetaBufferSize(width, height, 2);
|
||||||
break;
|
break;
|
||||||
case HAL_PIXEL_FORMAT_RGBA_8888:
|
case HAL_PIXEL_FORMAT_RGBA_8888:
|
||||||
|
case HAL_PIXEL_FORMAT_RGBX_8888:
|
||||||
case HAL_PIXEL_FORMAT_sRGB_A_8888:
|
case HAL_PIXEL_FORMAT_sRGB_A_8888:
|
||||||
size = alignedw * alignedh * 4;
|
size = alignedw * alignedh * 4;
|
||||||
size += getUBwcMetaBufferSize(width, height, 4);
|
size += getUBwcMetaBufferSize(width, height, 4);
|
||||||
|
|||||||
Reference in New Issue
Block a user