sde: Allocate the rotator buffers after bandwidth checks
1. Allocate the rotator buffers after scale data configuration and
bandwidth checks, to make sure that allocation happens only for a
successful strategy.
2. Rotator ouput format needs to consider downscale for NV12_UBWC.
3. Add support for NV12_UBWC pixel format in SDE utility functions.
Change-Id: Ic1f781d5076816a3d365f3763ebd929a32767797
diff --git a/displayengine/libs/core/hw_framebuffer.cpp b/displayengine/libs/core/hw_framebuffer.cpp
index f47361b..99c24ff 100644
--- a/displayengine/libs/core/hw_framebuffer.cpp
+++ b/displayengine/libs/core/hw_framebuffer.cpp
@@ -1154,6 +1154,7 @@
*target = width * 3;
break;
case kFormatYCbCr420SemiPlanarVenus:
+ case kFormatYCbCr420SPVenusUbwc:
case kFormatYCbCr420Planar:
case kFormatYCrCb420Planar:
case kFormatYCbCr420SemiPlanar:
diff --git a/displayengine/libs/core/res_config.cpp b/displayengine/libs/core/res_config.cpp
index 66f5cba..1b5bb6d 100644
--- a/displayengine/libs/core/res_config.cpp
+++ b/displayengine/libs/core/res_config.cpp
@@ -33,12 +33,13 @@
namespace sde {
-void ResManager::RotationConfig(const LayerTransform &transform, const float &downscale,
- LayerRect *src_rect, struct HWLayerConfig *layer_config,
- uint32_t *rotate_count) {
+void ResManager::RotationConfig(LayerBufferFormat format, const LayerTransform &transform,
+ const float &downscale, LayerRect *src_rect,
+ struct HWLayerConfig *layer_config, uint32_t *rotate_count) {
HWRotateInfo *rotate = &layer_config->rotates[0];
float src_width = src_rect->right - src_rect->left;
float src_height = src_rect->bottom - src_rect->top;
+ bool rot90 = IsRotationNeeded(transform.rotation);
LayerRect dst_rect;
// Rotate output is a temp buffer, always output to the top left corner for saving memory
dst_rect.top = 0.0f;
@@ -47,7 +48,7 @@
rotate->downscale_ratio = downscale;
// downscale when doing rotation
- if (IsRotationNeeded(transform.rotation)) {
+ if (rot90) {
if (downscale > 1.0f) {
src_height = ROUND_UP_ALIGN_DOWN(src_height, downscale);
src_rect->bottom = src_rect->top + src_height;
@@ -71,6 +72,14 @@
rotate->valid = true;
rotate->dst_roi = dst_rect;
+ // Set WHF for Rotator output
+ LayerBufferFormat ouput_format;
+ SetRotatorOutputFormat(format, false /* bwc */, rot90, downscale, &ouput_format);
+ HWBufferInfo *hw_buffer_info = &rotate->hw_buffer_info;
+ hw_buffer_info->buffer_config.format = ouput_format;
+ hw_buffer_info->buffer_config.width = UINT32(rotate->dst_roi.right);
+ hw_buffer_info->buffer_config.height = UINT32(rotate->dst_roi.bottom);
+
*src_rect = dst_rect;
layer_config->num_rotate = 1;
(*rotate_count)++;
@@ -240,7 +249,8 @@
LayerTransform transform = layer.transform;
if (IsRotationNeeded(transform.rotation) || UINT32(rot_scale) != 1) {
- RotationConfig(layer.transform, rot_scale, &src_rect, layer_config, rotate_count);
+ RotationConfig(layer.input_buffer->format, layer.transform, rot_scale, &src_rect,
+ layer_config, rotate_count);
// rotator will take care of flipping, reset tranform
transform = LayerTransform();
}
diff --git a/displayengine/libs/core/res_manager.cpp b/displayengine/libs/core/res_manager.cpp
index 9868ddf..dbb41e5 100644
--- a/displayengine/libs/core/res_manager.cpp
+++ b/displayengine/libs/core/res_manager.cpp
@@ -385,12 +385,6 @@
i, layer_config.left_pipe.pipe_id, pipe_info->pipe_id);
}
- error = AllocRotatorBuffer(display_ctx, hw_layers);
- if (error != kErrorNone) {
- DLOGV_IF(kTagResources, "Rotator buffer allocation failed");
- goto CleanupOnError;
- }
-
#ifdef USES_SCALAR
if (!ScalarHelper::GetInstance()->ConfigureScale(hw_layers)) {
DLOGV_IF(kTagResources, "Scale data configuration has failed!");
@@ -403,6 +397,12 @@
goto CleanupOnError;
}
+ error = AllocRotatorBuffer(display_ctx, hw_layers);
+ if (error != kErrorNone) {
+ DLOGV_IF(kTagResources, "Rotator buffer allocation failed");
+ goto CleanupOnError;
+ }
+
return kErrorNone;
CleanupOnError:
@@ -621,6 +621,7 @@
case kFormatYCbCr420SemiPlanar:
case kFormatYCrCb420SemiPlanar:
case kFormatYCbCr420SemiPlanarVenus:
+ case kFormatYCbCr420SPVenusUbwc:
return 1.5f;
default:
DLOGE("GetBpp: Invalid buffer format: %x", format);
@@ -643,16 +644,9 @@
for (uint32_t i = 0; i < layer_info.count; i++) {
Layer& layer = layer_info.stack->layers[layer_info.index[i]];
HWRotateInfo *rotate = &hw_layers->config[i].rotates[0];
- bool rot90 = (layer.transform.rotation == 90.0f);
if (rotate->valid) {
- LayerBufferFormat rot_ouput_format;
- SetRotatorOutputFormat(layer.input_buffer->format, false, rot90, &rot_ouput_format);
-
HWBufferInfo *hw_buffer_info = &rotate->hw_buffer_info;
- hw_buffer_info->buffer_config.width = UINT32(rotate->dst_roi.right - rotate->dst_roi.left);
- hw_buffer_info->buffer_config.height = UINT32(rotate->dst_roi.bottom - rotate->dst_roi.top);
- hw_buffer_info->buffer_config.format = rot_ouput_format;
// Allocate two rotator output buffers by default for double buffering.
hw_buffer_info->buffer_config.buffer_count = 2;
hw_buffer_info->buffer_config.secure = layer.input_buffer->flags.secure;
@@ -665,13 +659,7 @@
rotate = &hw_layers->config[i].rotates[1];
if (rotate->valid) {
- LayerBufferFormat rot_ouput_format;
- SetRotatorOutputFormat(layer.input_buffer->format, false, rot90, &rot_ouput_format);
-
HWBufferInfo *hw_buffer_info = &rotate->hw_buffer_info;
- hw_buffer_info->buffer_config.width = UINT32(rotate->dst_roi.right - rotate->dst_roi.left);
- hw_buffer_info->buffer_config.height = UINT32(rotate->dst_roi.bottom - rotate->dst_roi.top);
- hw_buffer_info->buffer_config.format = rot_ouput_format;
// Allocate two rotator output buffers by default for double buffering.
hw_buffer_info->buffer_config.buffer_count = 2;
hw_buffer_info->buffer_config.secure = layer.input_buffer->flags.secure;
@@ -1093,33 +1081,32 @@
}
void ResManager::SetRotatorOutputFormat(const LayerBufferFormat &input_format, bool bwc, bool rot90,
- LayerBufferFormat *output_format) {
+ bool downscale, LayerBufferFormat *output_format) {
+ *output_format = input_format;
+
switch (input_format) {
case kFormatRGB565:
if (rot90)
*output_format = kFormatRGB888;
- else
- *output_format = input_format;
break;
case kFormatRGBA8888:
if (bwc)
*output_format = kFormatBGRA8888;
- else
- *output_format = input_format;
break;
case kFormatYCbCr420SemiPlanarVenus:
case kFormatYCbCr420SemiPlanar:
if (rot90)
*output_format = kFormatYCrCb420SemiPlanar;
- else
- *output_format = input_format;
+ break;
+ case kFormatYCbCr420SPVenusUbwc:
+ if (downscale)
+ *output_format = kFormatYCrCb420SemiPlanar;
break;
case kFormatYCbCr420Planar:
case kFormatYCrCb420Planar:
*output_format = kFormatYCrCb420SemiPlanar;
break;
default:
- *output_format = input_format;
break;
}
diff --git a/displayengine/libs/core/res_manager.h b/displayengine/libs/core/res_manager.h
index 9ff5384..be785c1 100644
--- a/displayengine/libs/core/res_manager.h
+++ b/displayengine/libs/core/res_manager.h
@@ -194,16 +194,16 @@
bool IsYuvFormat(LayerBufferFormat format) { return (format >= kFormatYCbCr420Planar); }
bool IsRotationNeeded(float rotation)
{ return (UINT32(rotation) == 90 || UINT32(rotation) == 270); }
- void RotationConfig(const LayerTransform &transform, const float &downscale,
- LayerRect *src_rect, struct HWLayerConfig *layer_config,
- uint32_t *rotate_count);
+ void RotationConfig(LayerBufferFormat format, const LayerTransform &transform,
+ const float &downscale, LayerRect *src_rect,
+ struct HWLayerConfig *layer_config, uint32_t *rotate_count);
DisplayError AcquireRotator(DisplayResourceContext *display_resource_ctx,
const uint32_t roate_cnt);
void AssignRotator(HWRotateInfo *rotate, uint32_t *rotate_cnt);
void ClearRotator(DisplayResourceContext *display_resource_ctx);
DisplayError AllocRotatorBuffer(Handle display_ctx, HWLayers *hw_layers);
void SetRotatorOutputFormat(const LayerBufferFormat &input_format, bool bwc, bool rot90,
- LayerBufferFormat *output_format);
+ bool downscale, LayerBufferFormat *output_format);
DisplayError AlignPipeConfig(const Layer &layer, const LayerTransform &transform,
HWPipeInfo *left_pipe, HWPipeInfo *right_pipe,
uint32_t align_x, uint32_t align_y);
diff --git a/displayengine/libs/core/scalar_helper.cpp b/displayengine/libs/core/scalar_helper.cpp
index 57c51c0..22488b3 100755
--- a/displayengine/libs/core/scalar_helper.cpp
+++ b/displayengine/libs/core/scalar_helper.cpp
@@ -126,7 +126,8 @@
for (uint32_t i = 0; i < hw_layer_info.count; i++) {
Layer &layer = hw_layer_info.stack->layers[hw_layer_info.index[i]];
- LayerBuffer *input_buffer = layer.input_buffer;
+ uint32_t width = layer.input_buffer->width;
+ LayerBufferFormat format = layer.input_buffer->format;
HWPipeInfo* left_pipe = &hw_layers->config[i].left_pipe;
HWPipeInfo* right_pipe = &hw_layers->config[i].right_pipe;
@@ -147,15 +148,17 @@
HWRotateInfo* rotate_info = &hw_layers->config[i].rotates[count];
scalar::PipeInfo* pipe = (count == 0) ? &layer_info.left_pipe : &layer_info.right_pipe;
- if (rotate_info->valid)
- input_buffer = &rotate_info->hw_buffer_info.output_buffer;
+ if (rotate_info->valid) {
+ width = rotate_info->hw_buffer_info.buffer_config.width;
+ format = rotate_info->hw_buffer_info.buffer_config.format;
+ }
pipe->flags = flags;
pipe->scale_data = GetScaleRef(i, !count);
- pipe->scale_data->src_width = input_buffer->width;
+ pipe->scale_data->src_width = width;
SetPipeInfo(hw_pipe, pipe);
}
- layer_info.src_format = GetScalarFormat(input_buffer->format);
+ layer_info.src_format = GetScalarFormat(format);
DLOGV_IF(kTagScalar, "Scalar Input[%d] flags=%x format=%x", i, flags, layer_info.src_format);
DLOGV_IF(kTagScalar, "Left: id=%d hD=%d vD=%d srcRect=[%d %d %d %d] dstRect=[%d %d %d %d]",
diff --git a/displayengine/libs/hwc/hwc_buffer_allocator.cpp b/displayengine/libs/hwc/hwc_buffer_allocator.cpp
index d4f4bac..f2383b2 100644
--- a/displayengine/libs/hwc/hwc_buffer_allocator.cpp
+++ b/displayengine/libs/hwc/hwc_buffer_allocator.cpp
@@ -159,6 +159,7 @@
case kFormatYCbCr420SemiPlanar: *target = HAL_PIXEL_FORMAT_YCbCr_420_SP; break;
case kFormatYCbCr422Packed: *target = HAL_PIXEL_FORMAT_YCbCr_422_I; break;
case kFormatYCbCr420SemiPlanarVenus: *target = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS; break;
+ case kFormatYCbCr420SPVenusUbwc: *target = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC; break;
default:
DLOGE("Unsupported format = 0x%x", format);