drm_hwcomposer: Extract DrmHwc abstract base class
DrmHwc holds implementation details that can be shared between hwc2 and
hwc3. It exposes abstract functions for implementing callbacks to hwc
clients.
Leave the HWC2 specific implementation details in the DrmHwcTwo class, such
as the client callback implementation, and implement the DrmHwc abstract
functions in terms of hwc2.
DrmHwc is based on the DrmHwcInterface extracted in
(drm_hwcomposer: Connect ComposerClient with HwcDisplay) from !238
Co-authored-by: Dennis Tsiang <dennis.tsiang@arm.com>
Co-authored-by: Normunds Rieksts <normunds.rieksts@arm.com>
Signed-off-by: Drew Davenport <ddavenport@chromium.org>
diff --git a/drm/DrmHwc.h b/drm/DrmHwc.h
new file mode 100644
index 0000000..36ff80d
--- /dev/null
+++ b/drm/DrmHwc.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "drm/ResourceManager.h"
+#include "hwc2_device/HwcDisplay.h"
+
+namespace android {
+
+class DrmHwc : public PipelineToFrontendBindingInterface {
+ public:
+ DrmHwc();
+ ~DrmHwc() override = default;
+
+ // Client Callback functions.:
+ virtual void SendVsyncEventToClient(hwc2_display_t displayid,
+ int64_t timestamp,
+ uint32_t vsync_period) const = 0;
+ virtual void SendVsyncPeriodTimingChangedEventToClient(
+ hwc2_display_t displayid, int64_t timestamp) const = 0;
+ virtual void SendRefreshEventToClient(uint64_t displayid) = 0;
+ virtual void SendHotplugEventToClient(hwc2_display_t displayid,
+ bool connected) = 0;
+
+ // Device functions
+ HWC2::Error CreateVirtualDisplay(uint32_t width, uint32_t height,
+ int32_t *format, hwc2_display_t *display);
+ HWC2::Error DestroyVirtualDisplay(hwc2_display_t display);
+ void Dump(uint32_t *out_size, char *out_buffer);
+ uint32_t GetMaxVirtualDisplayCount();
+
+ auto GetDisplay(hwc2_display_t display_handle) {
+ return displays_.count(display_handle) != 0
+ ? displays_[display_handle].get()
+ : nullptr;
+ }
+
+ auto &GetResMan() {
+ return resource_manager_;
+ }
+
+ void ScheduleHotplugEvent(hwc2_display_t displayid, bool connected) {
+ deferred_hotplug_events_[displayid] = connected;
+ }
+
+ // PipelineToFrontendBindingInterface
+ bool BindDisplay(std::shared_ptr<DrmDisplayPipeline> pipeline) override;
+ bool UnbindDisplay(std::shared_ptr<DrmDisplayPipeline> pipeline) override;
+ void FinalizeDisplayBinding() override;
+
+ protected:
+ auto& Displays() { return displays_; }
+
+ private:
+ ResourceManager resource_manager_;
+ std::map<hwc2_display_t, std::unique_ptr<HwcDisplay>> displays_;
+ std::map<std::shared_ptr<DrmDisplayPipeline>, hwc2_display_t>
+ display_handles_;
+
+ std::string dump_string_;
+
+ std::map<hwc2_display_t, bool> deferred_hotplug_events_;
+ std::vector<hwc2_display_t> displays_for_removal_list_;
+
+ uint32_t last_display_handle_ = kPrimaryDisplay;
+};
+} // namespace android
\ No newline at end of file