drm_hwcomposer: Rework CreateLayer/DestroyLayer
- Make HwcDisplay CreateLayer/DestroyLayer frontend-agnostic.
- Provide LayerId as an input for CreateLayer. It is necessary to add
the HWC3 LayerLifecycleBatchCommand feature, where layer ID is
generated by the client.
Change-Id: I317dcf22461fe4390ced9f0c0c780cffaa3b8f5d
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp
index a1a1e26..09d8817 100644
--- a/hwc3/ComposerClient.cpp
+++ b/hwc3/ComposerClient.cpp
@@ -494,13 +494,16 @@
return ToBinderStatus(hwc3::Error::kBadDisplay);
}
- hwc2_layer_t hwc2_layer_id = 0;
- auto err = Hwc2toHwc3Error(display->CreateLayer(&hwc2_layer_id));
- if (err != hwc3::Error::kNone) {
- return ToBinderStatus(err);
+ auto hwc3display = DrmHwcThree::GetHwc3Display(*display);
+
+ if (!display->CreateLayer(hwc3display->next_layer_id)) {
+ return ToBinderStatus(hwc3::Error::kBadDisplay);
}
- *layer_id = Hwc2LayerToHwc3(hwc2_layer_id);
+ *layer_id = hwc3display->next_layer_id;
+
+ hwc3display->next_layer_id++;
+
return ndk::ScopedAStatus::ok();
}
@@ -534,12 +537,11 @@
return ToBinderStatus(hwc3::Error::kBadDisplay);
}
- auto err = Hwc2toHwc3Error(display->DestroyLayer(Hwc3LayerToHwc2(layer_id)));
- if (err != hwc3::Error::kNone) {
- return ToBinderStatus(err);
+ if (!display->DestroyLayer(layer_id)) {
+ return ToBinderStatus(hwc3::Error::kBadLayer);
}
- return ToBinderStatus(err);
+ return ToBinderStatus(hwc3::Error::kNone);
}
ndk::ScopedAStatus ComposerClient::destroyVirtualDisplay(int64_t display_id) {
@@ -698,8 +700,7 @@
changed_layers = display->ValidateStagedComposition();
DisplayChanges changes{};
for (auto [layer_id, composition_type] : changed_layers) {
- changes.AddLayerCompositionChange(command.display,
- Hwc2LayerToHwc3(layer_id),
+ changes.AddLayerCompositionChange(command.display, layer_id,
static_cast<Composition>(
composition_type));
}
@@ -743,8 +744,7 @@
std::unordered_map<int64_t, unique_fd> hal_release_fences;
for (const auto& [layer_id, release_fence] : release_fences) {
- hal_release_fences[Hwc2LayerToHwc3(layer_id)] = //
- unique_fd(::android::DupFd(release_fence));
+ hal_release_fences[layer_id] = unique_fd(::android::DupFd(release_fence));
}
cmd_result_writer_->AddReleaseFence(display_id, hal_release_fences);
}
diff --git a/hwc3/DrmHwcThree.h b/hwc3/DrmHwcThree.h
index 44168aa..10470ea 100644
--- a/hwc3/DrmHwcThree.h
+++ b/hwc3/DrmHwcThree.h
@@ -26,6 +26,8 @@
class Hwc3Display : public ::android::FrontendDisplayBase {
public:
bool must_validate = false;
+
+ int64_t next_layer_id = 1;
};
class DrmHwcThree : public ::android::DrmHwc {
diff --git a/hwc3/Utils.h b/hwc3/Utils.h
index 642c777..e892832 100644
--- a/hwc3/Utils.h
+++ b/hwc3/Utils.h
@@ -57,12 +57,6 @@
return ToBinderStatus(Hwc2toHwc3Error(error));
}
-// ID conversion. HWC2 uses typedef'd unsigned integer types while HWC3 uses
-// signed integer types. static_cast in between these.
-inline int64_t Hwc2LayerToHwc3(hwc2_layer_t layer) {
- return static_cast<int64_t>(layer);
-}
-
inline int64_t Hwc2DisplayToHwc3(hwc2_display_t display) {
return static_cast<int64_t>(display);
}
@@ -71,10 +65,6 @@
return static_cast<int32_t>(config_id);
}
-inline hwc2_layer_t Hwc3LayerToHwc2(int64_t layer) {
- return static_cast<hwc2_layer_t>(layer);
-}
-
inline hwc2_display_t Hwc3DisplayToHwc2(int64_t display) {
return static_cast<hwc2_display_t>(display);
}