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);