sdm: Destination scalar fixes during rotation and suspend-resume.

1. Reconfigure display after resume to update destination scale data.
2. Fix to map the FB_TARGET layer's destination coordinate(mapped to
   FB resolution 1080x1920) to destination coordinates of mixer
   resolution When mixer and panel resolutions are same(1600x2560).
3. Align mixer width and height before setting the mixer resolution
   to avoid device crash during rotation.

Change-Id: Id6af57495ffe4d0d071544b621c2251cf3b66930
CRs-Fixed: 1038976
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 461d81f..9998938 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -452,6 +452,16 @@
 
   case kStateOn:
     error = hw_intf_->PowerOn();
+    if (error != kErrorNone) {
+      return error;
+    }
+
+    error = comp_manager_->ReconfigureDisplay(display_comp_ctx_, display_attributes_,
+                                              hw_panel_info_, mixer_attributes_, fb_config_);
+    if (error != kErrorNone) {
+      return error;
+    }
+
     active = true;
     break;
 
@@ -959,6 +969,8 @@
   uint32_t max_layer_area = 0;
   uint32_t max_area_layer_index = 0;
   std::vector<Layer *> layers = layer_stack->layers;
+  uint32_t align_x = display_attributes_.is_device_split ? 4 : 2;
+  uint32_t align_y = 2;
 
   for (uint32_t i = 0; i < layer_count; i++) {
     Layer *layer = layers.at(i);
@@ -996,8 +1008,8 @@
     // Align the width and height according to fb's aspect ratio
     layer_width = UINT32((FLOAT(fb_width) / FLOAT(fb_height)) * layer_height);
 
-    *new_mixer_width = layer_width;
-    *new_mixer_height = layer_height;
+    *new_mixer_width = FloorToMultipleOf(layer_width, align_x);
+    *new_mixer_height = FloorToMultipleOf(layer_height, align_y);
 
     return true;
   } else {
diff --git a/sdm/libs/core/strategy.cpp b/sdm/libs/core/strategy.cpp
index 0761d0a..1734b9c 100644
--- a/sdm/libs/core/strategy.cpp
+++ b/sdm/libs/core/strategy.cpp
@@ -26,6 +26,7 @@
 #include <utils/debug.h>
 
 #include "strategy.h"
+#include "utils/rect.h"
 
 #define __CLASS__ "Strategy"
 
@@ -135,11 +136,23 @@
   }
 
   if (!extn_start_success_) {
+    // When mixer resolution and panel resolutions are same (1600x2560) and FB resolution is
+    // 1080x1920 FB_Target destination coordinates(mapped to FB resolution 1080x1920) need to
+    // be mapped to destination coordinates of mixer resolution(1600x2560).
     hw_layers_info_->count = 0;
     uint32_t &hw_layer_count = hw_layers_info_->count;
     Layer *gpu_target_layer = layer_stack->layers.at(hw_layers_info_->gpu_target_index);
+    float layer_mixer_width = FLOAT(mixer_attributes_.width);
+    float layer_mixer_height = FLOAT(mixer_attributes_.height);
+    float fb_width = FLOAT(fb_config_.x_pixels);
+    float fb_height = FLOAT(fb_config_.y_pixels);
+    LayerRect src_domain = (LayerRect){0.0f, 0.0f, fb_width, fb_height};
+    LayerRect dst_domain = (LayerRect){0.0f, 0.0f, layer_mixer_width, layer_mixer_height};
+
     hw_layers_info_->updated_src_rect[hw_layer_count] = gpu_target_layer->src_rect;
-    hw_layers_info_->updated_dst_rect[hw_layer_count] = gpu_target_layer->dst_rect;
+    MapRect(src_domain, dst_domain, gpu_target_layer->dst_rect,
+            &hw_layers_info_->updated_dst_rect[hw_layer_count]);
+
     hw_layers_info_->index[hw_layer_count++] = hw_layers_info_->gpu_target_index;
   }
 
@@ -180,9 +193,7 @@
                          const HWDisplayAttributes &display_attributes,
                          const HWMixerAttributes &mixer_attributes,
                          const DisplayConfigVariableInfo &fb_config) {
-  hw_panel_info_ = hw_panel_info;
-  display_attributes_ = display_attributes;
-  mixer_attributes_ = mixer_attributes;
+  DisplayError error = kErrorNone;
 
   if (!extension_intf_) {
     return kErrorNone;
@@ -195,12 +206,22 @@
     partial_update_intf_ = NULL;
   }
 
-  extension_intf_->CreatePartialUpdate(display_type_, hw_resource_info_, hw_panel_info_,
-                                       mixer_attributes_, display_attributes_,
+  extension_intf_->CreatePartialUpdate(display_type_, hw_resource_info_, hw_panel_info,
+                                       mixer_attributes, display_attributes,
                                        &partial_update_intf_);
 
-  return strategy_intf_->Reconfigure(hw_panel_info_.mode, hw_panel_info_.s3d_mode, mixer_attributes,
+  error = strategy_intf_->Reconfigure(hw_panel_info.mode, hw_panel_info.s3d_mode, mixer_attributes,
                                      fb_config);
+  if (error != kErrorNone) {
+    return error;
+  }
+
+  hw_panel_info_ = hw_panel_info;
+  display_attributes_ = display_attributes;
+  mixer_attributes_ = mixer_attributes;
+  fb_config_ = fb_config;
+
+  return kErrorNone;
 }
 
 }  // namespace sdm