drm_hwcomposer: Make flattening thread-based instead of vsync-based
Using vsync means consume some CPU time every frame for
IRQ -> Kernel_Thread -> UserSpace_listener thread transitions.
Framework tries to reduce vsync usage to the minimum, by using timelines
instead.
New flattening controller thread wakes-up only once per second.
This commit also removes flattening info from dumpsys. Practice shows
that it is almost useless. Instead debugging can be done using ALOGV
dumps.
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/backend/Backend.cpp b/backend/Backend.cpp
index f3156ed..3ca6e92 100644
--- a/backend/Backend.cpp
+++ b/backend/Backend.cpp
@@ -33,27 +33,36 @@
int client_start = -1;
size_t client_size = 0;
- if (display->ProcessClientFlatteningState(layers.size() <= 1)) {
- display->total_stats().frames_flattened_++;
+ auto flatcon = display->GetFlatCon();
+ if (flatcon) {
+ bool should_flatten = false;
+ if (layers.size() <= 1)
+ flatcon->Disable();
+ else
+ should_flatten = flatcon->NewFrame();
+
+ if (should_flatten) {
+ display->total_stats().frames_flattened_++;
+ MarkValidated(layers, 0, layers.size());
+ *num_types = layers.size();
+ return HWC2::Error::HasChanges;
+ }
+ }
+
+ std::tie(client_start, client_size) = GetClientLayers(display, layers);
+
+ MarkValidated(layers, client_start, client_size);
+
+ auto testing_needed = client_start != 0 || client_size != layers.size();
+
+ AtomicCommitArgs a_args = {.test_only = true};
+
+ if (testing_needed &&
+ display->CreateComposition(a_args) != HWC2::Error::None) {
+ ++display->total_stats().failed_kms_validate_;
client_start = 0;
client_size = layers.size();
- MarkValidated(layers, client_start, client_size);
- } else {
- std::tie(client_start, client_size) = GetClientLayers(display, layers);
-
- MarkValidated(layers, client_start, client_size);
-
- auto testing_needed = client_start != 0 || client_size != layers.size();
-
- AtomicCommitArgs a_args = {.test_only = true};
-
- if (testing_needed &&
- display->CreateComposition(a_args) != HWC2::Error::None) {
- ++display->total_stats().failed_kms_validate_;
- client_start = 0;
- client_size = layers.size();
- MarkValidated(layers, 0, client_size);
- }
+ MarkValidated(layers, 0, client_size);
}
*num_types = client_size;