drm_hwcomposer: Add GetOrderLayersByZPos method
The GetOrderLayersByZPos copies an ordered list of layer pointers.
Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
diff --git a/backend/Backend.cpp b/backend/Backend.cpp
index 4c2a931..dfff00a 100644
--- a/backend/Backend.cpp
+++ b/backend/Backend.cpp
@@ -29,37 +29,28 @@
*num_types = 0;
*num_requests = 0;
- std::map<uint32_t, DrmHwcTwo::HwcLayer *> z_map;
- std::map<uint32_t, DrmHwcTwo::HwcLayer *> z_map_tmp;
- uint32_t z_index = 0;
- // First create a map of layers and z_order values
- for (std::pair<const hwc2_layer_t, DrmHwcTwo::HwcLayer> &l :
- display->layers())
- z_map_tmp.emplace(std::make_pair(l.second.z_order(), &l.second));
- // normalise the map so that the lowest z_order layer has key 0
- for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map_tmp)
- z_map.emplace(std::make_pair(z_index++, l.second));
+ auto layers = display->GetOrderLayersByZPos();
int client_start = -1;
size_t client_size = 0;
if (display->compositor().ShouldFlattenOnClient()) {
client_start = 0;
- client_size = z_map.size();
- MarkValidated(z_map, client_start, client_size);
+ client_size = layers.size();
+ MarkValidated(layers, client_start, client_size);
} else {
- std::tie(client_start, client_size) = GetClientLayers(display, z_map);
+ std::tie(client_start, client_size) = GetClientLayers(display, layers);
- MarkValidated(z_map, client_start, client_size);
+ MarkValidated(layers, client_start, client_size);
- bool testing_needed = !(client_start == 0 && client_size == z_map.size());
+ bool testing_needed = !(client_start == 0 && client_size == layers.size());
if (testing_needed &&
display->CreateComposition(true) != HWC2::Error::None) {
++display->total_stats().failed_kms_validate_;
client_start = 0;
- client_size = z_map.size();
- MarkValidated(z_map, 0, client_size);
+ client_size = layers.size();
+ MarkValidated(layers, 0, client_size);
}
}
@@ -67,9 +58,9 @@
display->total_stats().frames_flattened_ = display->compositor()
.GetFlattenedFramesCount();
- display->total_stats().gpu_pixops_ += CalcPixOps(z_map, client_start,
+ display->total_stats().gpu_pixops_ += CalcPixOps(layers, client_start,
client_size);
- display->total_stats().total_pixops_ += CalcPixOps(z_map, 0, z_map.size());
+ display->total_stats().total_pixops_ += CalcPixOps(layers, 0, layers.size());
return *num_types ? HWC2::Error::HasChanges : HWC2::Error::None;
}
@@ -80,15 +71,15 @@
int client_start = -1;
size_t client_size = 0;
- for (const auto &[z_order, layer] : z_map) {
- if (IsClientLayer(display, layer)) {
+ for (int z_order = 0; z_order < layers.size(); ++z_order) {
+ if (IsClientLayer(display, layers[z_order])) {
if (client_start < 0)
client_start = (int)z_order;
client_size = (z_order - client_start) + 1;
}
}
- return GetExtraClientRange(display, z_map, client_start, client_size);
+ return GetExtraClientRange(display, layers, client_start, client_size);
}
bool Backend::IsClientLayer(DrmHwcTwo::HwcDisplay *display,
@@ -108,22 +99,22 @@
uint32_t Backend::CalcPixOps(const std::vector<DrmHwcTwo::HwcLayer *> &layers,
size_t first_z, size_t size) {
uint32_t pixops = 0;
- for (auto & [ z_order, layer ] : z_map) {
+ for (int z_order = 0; z_order < layers.size(); ++z_order) {
if (z_order >= first_z && z_order < first_z + size) {
- hwc_rect_t df = layer->display_frame();
+ hwc_rect_t df = layers[z_order]->display_frame();
pixops += (df.right - df.left) * (df.bottom - df.top);
}
}
return pixops;
}
-void Backend::MarkValidated(std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map,
+void Backend::MarkValidated(std::vector<DrmHwcTwo::HwcLayer *> &layers,
size_t client_first_z, size_t client_size) {
- for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map) {
- if (l.first >= client_first_z && l.first < client_first_z + client_size)
- l.second->set_validated_type(HWC2::Composition::Client);
+ for (int z_order = 0; z_order < layers.size(); ++z_order) {
+ if (z_order >= client_first_z && z_order < client_first_z + client_size)
+ layers[z_order]->set_validated_type(HWC2::Composition::Client);
else
- l.second->set_validated_type(HWC2::Composition::Device);
+ layers[z_order]->set_validated_type(HWC2::Composition::Device);
}
}
@@ -153,15 +144,15 @@
start = client_start - (int)prepend;
client_size += extra_client;
steps = 1 + std::min(std::min(append, prepend),
- int(z_map.size()) - (start + client_size));
+ int(layers.size()) - (start + client_size));
} else {
client_size = extra_client;
- steps = 1 + z_map.size() - extra_client;
+ steps = 1 + layers.size() - extra_client;
}
uint32_t gpu_pixops = INT_MAX;
for (int i = 0; i < steps; i++) {
- uint32_t po = CalcPixOps(z_map, start + i, client_size);
+ uint32_t po = CalcPixOps(layers, start + i, client_size);
if (po < gpu_pixops) {
gpu_pixops = po;
client_start = start + i;