drm_hwcomposer: HWC3: Reduce graphics memory consumption Implement [1]. [1]: https://source.android.com/docs/core/graphics/reduce-consumption Change-Id: I28436aae3e1ce0be296536366a6961ef91d5f58b Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp index 2a7a1f6..c8cb37c 100644 --- a/hwc3/ComposerClient.cpp +++ b/hwc3/ComposerClient.cpp
@@ -425,6 +425,24 @@ return lp; } + [[maybe_unused]] + auto HandleClearSlot(int32_t slot_id) + -> std::optional<HwcLayer::LayerProperties> { + if (slots_.count(slot_id) == 0) { + return std::nullopt; + } + + slots_.erase(slot_id); + + auto lp = HwcLayer::LayerProperties{}; + lp.slot_buffer = { + .slot_id = slot_id, + .bi = std::nullopt, + }; + + return lp; + } + private: std::map<int32_t /*slot*/, std::shared_ptr<Hwc3BufferHandle>> slots_; }; @@ -555,6 +573,22 @@ return; } +#if __ANDROID_API__ >= 34 + /* https://source.android.com/docs/core/graphics/reduce-consumption */ + if (command.bufferSlotsToClear) { + auto hwc3_layer = GetHwc3Layer(*layer); + for (const auto& slot : *command.bufferSlotsToClear) { + auto lp = hwc3_layer->HandleClearSlot(slot); + if (!lp) { + cmd_result_writer_->AddError(hwc3::Error::kBadLayer); + return; + } + + layer->SetLayerProperties(lp.value()); + } + } +#endif + HwcLayer::LayerProperties properties; if (command.buffer) { auto hwc3_layer = GetHwc3Layer(*layer);