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,