drm_hwcomposer: Handle all HWC2 callbacks in DrmHwcTwo.{h,cpp}
Part of frontend isolation activities.
1. Use HWC2 HAL types only inside DrmHwcTwo.{h,cpp}.
2. Use single lock for all callbacks.
3. Communicate with other drm_dwc components using std::function
without any locking.
Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/DrmHwcTwo.h b/DrmHwcTwo.h
index 2055b7b..16c4dac 100644
--- a/DrmHwcTwo.h
+++ b/DrmHwcTwo.h
@@ -42,16 +42,11 @@
HWC2::Error Init();
- hwc2_callback_data_t hotplug_callback_data_ = NULL;
- HWC2_PFN_HOTPLUG hotplug_callback_hook_ = NULL;
- std::mutex hotplug_callback_lock;
+ std::pair<HWC2_PFN_HOTPLUG, hwc2_callback_data_t> hotplug_callback_{};
+ std::pair<HWC2_PFN_VSYNC, hwc2_callback_data_t> vsync_callback_{};
+ std::pair<HWC2_PFN_REFRESH, hwc2_callback_data_t> refresh_callback_{};
- void SetHotplugCallback(hwc2_callback_data_t data,
- hwc2_function_pointer_t hook) {
- const std::lock_guard<std::mutex> lock(hotplug_callback_lock);
- hotplug_callback_data_ = data;
- hotplug_callback_hook_ = reinterpret_cast<HWC2_PFN_HOTPLUG>(hook);
- }
+ std::mutex callback_lock_;
class HwcLayer {
public:
@@ -147,14 +142,10 @@
class HwcDisplay {
public:
HwcDisplay(ResourceManager *resource_manager, DrmDevice *drm,
- hwc2_display_t handle, HWC2::DisplayType type);
+ hwc2_display_t handle, HWC2::DisplayType type, DrmHwcTwo *hwc2);
HwcDisplay(const HwcDisplay &) = delete;
HWC2::Error Init(std::vector<DrmPlane *> *planes);
- void RegisterVsyncCallback(hwc2_callback_data_t data,
- hwc2_function_pointer_t func);
- void RegisterRefreshCallback(hwc2_callback_data_t data,
- hwc2_function_pointer_t func);
HWC2::Error CreateComposition(bool test);
std::vector<DrmHwcTwo::HwcLayer *> GetOrderLayersByZPos();
@@ -304,6 +295,8 @@
constexpr static size_t MATRIX_SIZE = 16;
+ DrmHwcTwo *hwc2_;
+
ResourceManager *resource_manager_;
DrmDevice *drm_;
DrmDisplayCompositor compositor_;