diff options
author | Matvii Zorin <matvii.zorin@globallogic.com> | 2021-01-29 15:48:20 +0200 |
---|---|---|
committer | Matvii Zorin <matvii.zorin@globallogic.com> | 2021-04-06 12:46:22 +0300 |
commit | b3b15166f9dafbb4181a10f7f10da19053c6a306 (patch) | |
tree | 65639788f5c089e8ad72e3d9a053f7034f67a591 /backend | |
parent | 2c91df5620a14f7074724e32d856389d486fe847 (diff) | |
download | drm_hwcomposer-b3b15166f9dafbb4181a10f7f10da19053c6a306.tar.gz |
drm_hwcomposer: Add GetExtraClientRange method
Separate the correction of client range into the separate method.
Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
Diffstat (limited to 'backend')
-rw-r--r-- | backend/Backend.cpp | 96 | ||||
-rw-r--r-- | backend/Backend.h | 4 |
2 files changed, 55 insertions, 45 deletions
diff --git a/backend/Backend.cpp b/backend/Backend.cpp index 80b22d4..196a893 100644 --- a/backend/Backend.cpp +++ b/backend/Backend.cpp @@ -28,15 +28,6 @@ HWC2::Error Backend::ValidateDisplay(DrmHwcTwo::HwcDisplay *display, uint32_t *num_requests) { *num_types = 0; *num_requests = 0; - size_t avail_planes = display->primary_planes().size() + - display->overlay_planes().size(); - - /* - * If more layers then planes, save one plane - * for client composited layers - */ - if (avail_planes < display->layers().size()) - avail_planes--; std::map<uint32_t, DrmHwcTwo::HwcLayer *> z_map; std::map<uint32_t, DrmHwcTwo::HwcLayer *> z_map_tmp; @@ -49,9 +40,6 @@ HWC2::Error Backend::ValidateDisplay(DrmHwcTwo::HwcDisplay *display, for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map_tmp) z_map.emplace(std::make_pair(z_index++, l.second)); - uint32_t total_pixops = CalcPixOps(z_map, 0, z_map.size()); - uint32_t gpu_pixops = 0; - int client_start = -1; size_t client_size = 0; @@ -62,34 +50,6 @@ HWC2::Error Backend::ValidateDisplay(DrmHwcTwo::HwcDisplay *display, } else { std::tie(client_start, client_size) = GetClientLayers(display, z_map); - int extra_client = int(z_map.size() - client_size) - int(avail_planes); - if (extra_client > 0) { - int start = 0; - size_t steps = 0; - if (client_size != 0) { - int prepend = std::min(client_start, extra_client); - int append = std::min(int(z_map.size()) - - int(client_start + client_size), - extra_client); - start = client_start - (int)prepend; - client_size += extra_client; - steps = 1 + std::min(std::min(append, prepend), - int(z_map.size()) - int(start + client_size)); - } else { - client_size = extra_client; - steps = 1 + z_map.size() - extra_client; - } - - gpu_pixops = INT_MAX; - for (int i = 0; i < steps; i++) { - uint32_t po = CalcPixOps(z_map, start + i, client_size); - if (po < gpu_pixops) { - gpu_pixops = po; - client_start = start + i; - } - } - } - display->MarkValidated(z_map, client_start, client_size); bool testing_needed = !(client_start == 0 && client_size == z_map.size()); @@ -97,7 +57,7 @@ HWC2::Error Backend::ValidateDisplay(DrmHwcTwo::HwcDisplay *display, if (testing_needed && display->CreateComposition(true) != HWC2::Error::None) { ++display->total_stats().failed_kms_validate_; - gpu_pixops = total_pixops; + client_start = 0; client_size = z_map.size(); display->MarkValidated(z_map, 0, client_size); } @@ -107,15 +67,16 @@ HWC2::Error Backend::ValidateDisplay(DrmHwcTwo::HwcDisplay *display, display->total_stats().frames_flattened_ = display->compositor() .GetFlattenedFramesCount(); - display->total_stats().gpu_pixops_ += gpu_pixops; - display->total_stats().total_pixops_ += total_pixops; + display->total_stats().gpu_pixops_ += CalcPixOps(z_map, client_start, + client_size); + display->total_stats().total_pixops_ += CalcPixOps(z_map, 0, z_map.size()); return *num_types ? HWC2::Error::HasChanges : HWC2::Error::None; } std::tuple<int, size_t> Backend::GetClientLayers( DrmHwcTwo::HwcDisplay *display, - const std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map) { + const std::vector<DrmHwcTwo::HwcLayer *> &layers) { int client_start = -1; size_t client_size = 0; @@ -127,7 +88,7 @@ std::tuple<int, size_t> Backend::GetClientLayers( } } - return std::make_tuple(client_start, client_size); + return GetExtraClientRange(display, z_map, client_start, client_size); } bool Backend::IsClientLayer(DrmHwcTwo::HwcDisplay *display, @@ -151,6 +112,51 @@ uint32_t Backend::CalcPixOps(const std::vector<DrmHwcTwo::HwcLayer *> &layers, return pixops; } +std::tuple<int, int> Backend::GetExtraClientRange( + DrmHwcTwo::HwcDisplay *display, + const std::vector<DrmHwcTwo::HwcLayer *> &layers, int client_start, + size_t client_size) { + size_t avail_planes = display->primary_planes().size() + + display->overlay_planes().size(); + + /* + * If more layers then planes, save one plane + * for client composited layers + */ + if (avail_planes < display->layers().size()) + avail_planes--; + + size_t extra_client = (layers.size() - client_size) - avail_planes; + + if (extra_client > 0) { + int start = 0; + size_t steps = 0; + if (client_size != 0) { + size_t prepend = std::min((size_t)client_start, extra_client); + size_t append = std::min(layers.size() - (client_start + client_size), + extra_client); + start = client_start - (int)prepend; + client_size += extra_client; + steps = 1 + std::min(std::min(append, prepend), + int(z_map.size()) - (start + client_size)); + } else { + client_size = extra_client; + steps = 1 + z_map.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); + if (po < gpu_pixops) { + gpu_pixops = po; + client_start = start + i; + } + } + } + + return std::make_tuple(client_start, client_size); +} + // clang-format off // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables, cert-err58-cpp) REGISTER_BACKEND("generic", Backend); diff --git a/backend/Backend.h b/backend/Backend.h index 8658efa..a32c57f 100644 --- a/backend/Backend.h +++ b/backend/Backend.h @@ -36,6 +36,10 @@ class Backend { protected: uint32_t CalcPixOps(const std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map, size_t first_z, size_t size); + std::tuple<int, int> GetExtraClientRange( + DrmHwcTwo::HwcDisplay *display, + const std::vector<DrmHwcTwo::HwcLayer *> &layers, int client_start, + size_t client_size); }; } // namespace android |