diff options
author | Sean Paul <seanpaul@chromium.org> | 2018-08-24 16:58:35 -0400 |
---|---|---|
committer | Sean Paul <seanpaul@chromium.org> | 2018-08-27 14:13:37 -0400 |
commit | 54589d28d0b1ed8e4ea9b20bee25258e2918eb3d (patch) | |
tree | 997f34e751ac4d6c84f23eb07cfc215fe6574b14 | |
parent | f72cccd72a35f36e18674255c1886ecc30abb781 (diff) |
drm_hwcomposer: Fix HiSi import fail log spam
hikey can only display layers which do not have gralloc usage HW_FB
(hint: that leaves just the client target layer). As such, there's no
benefit trying to import them since it'll just fail. So if we encounter
a layer such as this, fake the import (the release will be a noop since
gem_handles will be 0).
Also, as a belt-and-suspenders move, replace the greedy planner with one
that only displays (usage != HW_FB) to be doubly sure that we don't try
to display the no-op layers
Change-Id: I7bf88cfb7bda1dd5f47b741709619494431558a2
Signed-off-by: Sean Paul <seanpaul@chromium.org>
-rw-r--r-- | platformhisi.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/platformhisi.cpp b/platformhisi.cpp index 5a1ac1b..e2012ec 100644 --- a/platformhisi.cpp +++ b/platformhisi.cpp @@ -71,11 +71,18 @@ int HisiImporter::Init() { } int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { + memset(bo, 0, sizeof(hwc_drm_bo_t)); + private_handle_t const *hnd = reinterpret_cast<private_handle_t const *>( handle); if (!hnd) return -EINVAL; + // We can't import these types of buffers, so pretend we did and rely on the + // planner to skip them when choosing layers for planes + if (!(hnd->usage & GRALLOC_USAGE_HW_FB)) + return 0; + uint32_t gem_handle; int ret = drmPrimeFDToHandle(drm_->fd(), hnd->share_fd, &gem_handle); if (ret) { @@ -87,7 +94,6 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { if (fmt < 0) return fmt; - memset(bo, 0, sizeof(hwc_drm_bo_t)); bo->width = hnd->width; bo->height = hnd->height; bo->format = fmt; @@ -132,9 +138,33 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { return ret; } +class PlanStageHiSi : public Planner::PlanStage { + public: + int ProvisionPlanes(std::vector<DrmCompositionPlane> *composition, + std::map<size_t, DrmHwcLayer *> &layers, DrmCrtc *crtc, + std::vector<DrmPlane *> *planes) { + // Fill up as many planes as we can with buffers that do not have HW_FB + // usage + for (auto i = layers.begin(); i != layers.end(); i = layers.erase(i)) { + if (!(i->second->gralloc_buffer_usage & GRALLOC_USAGE_HW_FB)) + continue; + + int ret = Emplace(composition, planes, DrmCompositionPlane::Type::kLayer, + crtc, i->first); + // We don't have any planes left + if (ret == -ENOENT) + break; + else if (ret) + ALOGE("Failed to emplace layer %zu, dropping it", i->first); + } + + return 0; + } +}; + std::unique_ptr<Planner> Planner::CreateInstance(DrmDevice *) { std::unique_ptr<Planner> planner(new Planner); - planner->AddStage<PlanStageGreedy>(); + planner->AddStage<PlanStageHiSi>(); return planner; } } // namespace android |