sde: resource manager: add src split support
Handle source split support case, allocate two pipes when the src
width or dst width is over the limit.
Change-Id: If17fb96f82973653caa400157d210e636b2c1725
diff --git a/displayengine/libs/core/res_config.cpp b/displayengine/libs/core/res_config.cpp
index d8b8430..fdf4177 100644
--- a/displayengine/libs/core/res_config.cpp
+++ b/displayengine/libs/core/res_config.cpp
@@ -32,6 +32,32 @@
namespace sde {
+DisplayError ResManager::SrcSplitConfig(DisplayResourceContext *display_resource_ctx,
+ const Layer &layer, const LayerRect &src_rect,
+ const LayerRect &dst_rect, HWLayerConfig *layer_config) {
+ HWDisplayAttributes &display_attributes = display_resource_ctx->display_attributes;
+ HWPipeInfo *left_pipe = &layer_config->left_pipe;
+ HWPipeInfo *right_pipe = &layer_config->right_pipe;
+ layer_config->is_right_pipe = false;
+
+ LayerTransform transform = layer.transform;
+ transform.rotation = 0.0f;
+ if ((src_rect.right - src_rect.left) >= kMaxSourcePipeWidth ||
+ (dst_rect.right - dst_rect.left) >= kMaxInterfaceWidth || hw_res_info_.always_src_split) {
+ SplitRect(transform.flip_horizontal, src_rect, dst_rect, &left_pipe->src_roi,
+ &left_pipe->dst_roi, &right_pipe->src_roi, &right_pipe->dst_roi);
+ left_pipe->pipe_id = kPipeIdNeedsAssignment;
+ right_pipe->pipe_id = kPipeIdNeedsAssignment;
+ layer_config->is_right_pipe = true;
+ } else {
+ left_pipe->src_roi = src_rect;
+ left_pipe->dst_roi = dst_rect;
+ left_pipe->pipe_id = kPipeIdNeedsAssignment;
+ right_pipe->Reset();
+ }
+ return kErrorNone;
+}
+
DisplayError ResManager::DisplaySplitConfig(DisplayResourceContext *display_resource_ctx,
const Layer &layer, const LayerRect &src_rect,
const LayerRect &dst_rect,
@@ -133,8 +159,14 @@
if (ValidateScaling(layer, src_rect, dst_rect, &rot_scale_x, &rot_scale_y))
return kErrorNotSupported;
- error = DisplaySplitConfig(display_resource_ctx, layer, src_rect,
- dst_rect, &hw_layers->config[i]);
+ if (hw_res_info_.is_src_split) {
+ error = SrcSplitConfig(display_resource_ctx, layer, src_rect,
+ dst_rect, &hw_layers->config[i]);
+ } else {
+ error = DisplaySplitConfig(display_resource_ctx, layer, src_rect,
+ dst_rect, &hw_layers->config[i]);
+ }
+
if (error != kErrorNone)
break;
diff --git a/displayengine/libs/core/res_manager.cpp b/displayengine/libs/core/res_manager.cpp
index 7add793..9579128 100644
--- a/displayengine/libs/core/res_manager.cpp
+++ b/displayengine/libs/core/res_manager.cpp
@@ -40,6 +40,8 @@
DisplayError error = kErrorNone;
+ // TODO: Remove this. Disable src_split as kernel not supported yet
+ hw_res_info_.is_src_split = false;
num_pipe_ = hw_res_info_.num_vig_pipe + hw_res_info_.num_rgb_pipe + hw_res_info_.num_dma_pipe;
if (num_pipe_ > kPipeIdMax) {
diff --git a/displayengine/libs/core/res_manager.h b/displayengine/libs/core/res_manager.h
index 88c7fb7..52d0464 100644
--- a/displayengine/libs/core/res_manager.h
+++ b/displayengine/libs/core/res_manager.h
@@ -150,6 +150,9 @@
const LayerRect &dst_rect, HWLayerConfig *layer_config);
DisplayError ValidateScaling(const Layer &layer, const LayerRect &crop,
const LayerRect &dst, float *rot_scale_x, float *rot_scale_y);
+ DisplayError SrcSplitConfig(DisplayResourceContext *display_resource_ctx,
+ const Layer &layer, const LayerRect &src_rect,
+ const LayerRect &dst_rect, HWLayerConfig *layer_config);
void CalculateCut(const LayerTransform &transform, float *left_cut_ratio, float *top_cut_ratio,
float *right_cut_ratio, float *bottom_cut_ratio);
void CalculateCropRects(const LayerRect &scissor, const LayerTransform &transform,