diff --git a/displayengine/include/core/layer_buffer.h b/displayengine/include/core/layer_buffer.h index e4a73c3b..cf94e560 100644 --- a/displayengine/include/core/layer_buffer.h +++ b/displayengine/include/core/layer_buffer.h @@ -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, }; diff --git a/displayengine/libs/core/fb/hw_device.cpp b/displayengine/libs/core/fb/hw_device.cpp index 230092ad..f8af3e84 100644 --- a/displayengine/libs/core/fb/hw_device.cpp +++ b/displayengine/libs/core/fb/hw_device.cpp @@ -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: diff --git a/displayengine/libs/core/res_manager.cpp b/displayengine/libs/core/res_manager.cpp index 08b055b8..06f6b4d2 100644 --- a/displayengine/libs/core/res_manager.cpp +++ b/displayengine/libs/core/res_manager.cpp @@ -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: diff --git a/displayengine/libs/core/scalar_helper.cpp b/displayengine/libs/core/scalar_helper.cpp index c81e343f..b5d8989a 100644 --- a/displayengine/libs/core/scalar_helper.cpp +++ b/displayengine/libs/core/scalar_helper.cpp @@ -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: diff --git a/displayengine/libs/hwc/hwc_buffer_allocator.cpp b/displayengine/libs/hwc/hwc_buffer_allocator.cpp index 2adfc3a6..22c46404 100644 --- a/displayengine/libs/hwc/hwc_buffer_allocator.cpp +++ b/displayengine/libs/hwc/hwc_buffer_allocator.cpp @@ -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; diff --git a/displayengine/libs/hwc/hwc_buffer_allocator.h b/displayengine/libs/hwc/hwc_buffer_allocator.h index 123f04aa..eb3d1fd0 100644 --- a/displayengine/libs/hwc/hwc_buffer_allocator.h +++ b/displayengine/libs/hwc/hwc_buffer_allocator.h @@ -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_; }; diff --git a/displayengine/libs/hwc/hwc_display.cpp b/displayengine/libs/hwc/hwc_display.cpp index 124310aa..b48999e4 100644 --- a/displayengine/libs/hwc/hwc_display.cpp +++ b/displayengine/libs/hwc/hwc_display.cpp @@ -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"; } diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp index 3e17061a..b8e6a644 100644 --- a/libgralloc/alloc_controller.cpp +++ b/libgralloc/alloc_controller.cpp @@ -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);