Merge "sdm: Fix hw layer stack corruption"
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 173dc4f..9f6a5d6 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -524,9 +524,9 @@
 
   std::vector<Layer> hw_layers = {};  // Layers which need to be programmed on the HW
 
-  uint32_t index[kMaxSDELayers] = {};   // Indexes of the layers from the layer stack which need to
-                                        // be programmed on hardware.
-  uint32_t roi_index[kMaxSDELayers] = {0};  // Stores the ROI index where the layers are visible.
+  std::vector<uint32_t> index;   // Indexes of the layers from the layer stack which need to
+                                 // be programmed on hardware.
+  std::vector<uint32_t> roi_index;  // Stores the ROI index where the layers are visible.
 
   int sync_handle = -1;         // Release fence id for current draw cycle.
   int set_idle_time_ms = -1;    // Set idle time to the new specified value.
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 81529a0..51aa012 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -598,7 +598,7 @@
   DumpImpl::AppendString(buffer, length, newline);
 
   for (uint32_t i = 0; i < num_hw_layers; i++) {
-    uint32_t layer_index = hw_layers_.info.index[i];
+    uint32_t layer_index = hw_layers_.info.index.at(i);
     // sdm-layer from client layer stack
     Layer *sdm_layer = hw_layers_.info.stack->layers.at(layer_index);
     // hw-layer from hw layers info
@@ -1319,7 +1319,7 @@
   uint32_t hw_layers_count = UINT32(hw_layers_.info.hw_layers.size());
 
   for (uint32_t i = 0; i < hw_layers_count; i++) {
-    Layer *sdm_layer = layer_stack->layers.at(hw_layers_.info.index[i]);
+    Layer *sdm_layer = layer_stack->layers.at(hw_layers_.info.index.at(i));
     Layer &hw_layer = hw_layers_.info.hw_layers.at(i);
 
     hw_layer.input_buffer.planes[0].fd = sdm_layer->input_buffer.planes[0].fd;
@@ -1339,7 +1339,7 @@
   std::vector<uint32_t> fence_dup_flag;
 
   for (uint32_t i = 0; i < hw_layers_count; i++) {
-    uint32_t sdm_layer_index = hw_layers_.info.index[i];
+    uint32_t sdm_layer_index = hw_layers_.info.index.at(i);
     Layer *sdm_layer = layer_stack->layers.at(sdm_layer_index);
     Layer &hw_layer = hw_layers_.info.hw_layers.at(i);
 
diff --git a/sdm/libs/core/strategy.cpp b/sdm/libs/core/strategy.cpp
index 85c648e..d682070 100644
--- a/sdm/libs/core/strategy.cpp
+++ b/sdm/libs/core/strategy.cpp
@@ -144,9 +144,9 @@
   LayerRect dst_domain = (LayerRect){0.0f, 0.0f, layer_mixer_width, layer_mixer_height};
 
   Layer layer = *gpu_target_layer;
-  hw_layers_info_->index[0] = hw_layers_info_->gpu_target_index;
+  hw_layers_info_->index.push_back(hw_layers_info_->gpu_target_index);
+  hw_layers_info_->roi_index.push_back(0);
   MapRect(src_domain, dst_domain, layer.dst_rect, &layer.dst_rect);
-  hw_layers_info_->hw_layers.clear();
   hw_layers_info_->hw_layers.push_back(layer);
 
   return kErrorNone;