diff --git a/drm/DrmDisplayPipeline.cpp b/drm/DrmDisplayPipeline.cpp index 8a93f9e..dd40f13 100644 --- a/drm/DrmDisplayPipeline.cpp +++ b/drm/DrmDisplayPipeline.cpp @@ -24,6 +24,7 @@ #include "DrmDevice.h" #include "DrmEncoder.h" #include "DrmPlane.h" +#include "backend/Backend.h" #include "utils/log.h" #include "utils/properties.h" diff --git a/drm/DrmDisplayPipeline.h b/drm/DrmDisplayPipeline.h index adc003f..346906f 100644 --- a/drm/DrmDisplayPipeline.h +++ b/drm/DrmDisplayPipeline.h @@ -21,6 +21,7 @@ namespace android::drm_hwcomposer { +class Backend; class DrmConnector; class DrmDevice; class DrmPlane; @@ -105,6 +106,7 @@ struct DrmDisplayPipeline { std::shared_ptr> primary_plane; std::shared_ptr atomic_state_manager; + std::unique_ptr backend; }; } // namespace android::drm_hwcomposer diff --git a/drm/DrmHwc.cpp b/drm/DrmHwc.cpp index 2724986..2491cde 100644 --- a/drm/DrmHwc.cpp +++ b/drm/DrmHwc.cpp @@ -24,7 +24,7 @@ #include #include -#include "backend/Backend.h" +#include "backend/BackendManager.h" #include "stats/CompositionStats.h" #include "utils/log.h" #include "utils/properties.h" @@ -129,6 +129,8 @@ bool DrmHwc::BindDisplay(std::shared_ptr pipeline) { pipeline->connector->Get()->GetName().c_str(), (int)disp_handle, disp_handle == kPrimaryDisplay ? " (Primary)" : ""); + pipeline->backend = BackendManager::GetInstance().CreateBackendForConnector( + pipeline->connector->Get()); displays_[disp_handle]->SetPipeline(pipeline); display_handles_[pipeline] = disp_handle; @@ -183,6 +185,9 @@ std::optional DrmHwc::CreateVirtualDisplay(uint32_t width, /* is_virtual */ true, this); disp->SetVirtualDisplayResolution(width, height); + virtual_pipeline->backend = BackendManager::GetInstance() + .CreateBackendForConnector( + virtual_pipeline->connector->Get()); disp->SetPipeline(virtual_pipeline); displays_[new_display_handle] = std::move(disp); return new_display_handle; diff --git a/hwc/HwcDisplay.cpp b/hwc/HwcDisplay.cpp index 53e372f..29bc94b 100644 --- a/hwc/HwcDisplay.cpp +++ b/hwc/HwcDisplay.cpp @@ -27,7 +27,6 @@ #include #include "backend/Backend.h" -#include "backend/BackendManager.h" #include "compositor/DisplayInfo.h" #include "drm/DrmConnector.h" #include "drm/DrmDisplayPipeline.h" @@ -343,7 +342,7 @@ auto HwcDisplay::ValidateStagedComposition() -> std::vector { flatcon_->NewFrame(); } - validated_composition_.emplace(backend_->ValidateDisplay(this)); + validated_composition_.emplace(pipeline_->backend->ValidateDisplay(this)); // Iterate through the layers to find which layers actually changed. std::vector changed_layers; @@ -638,7 +637,6 @@ void HwcDisplay::Deinit() { GetPipe().atomic_state_manager->ExecuteAtomicCommit(a_args); validated_composition_.reset(); - backend_.reset(); flatcon_.reset(); } @@ -660,12 +658,6 @@ bool HwcDisplay::Init() { } if (!IsInHeadlessMode()) { - backend_ = BackendManager::GetInstance().CreateBackendForConnector( - pipeline_->connector->Get()); - if (!backend_) { - ALOGE("Failed to set backend for d=%d\n", int(handle_)); - return false; - } auto flatcbk = (struct FlatConCallbacks){ .trigger = [this]() { hwc_->SendRefreshEventToClient(handle_); }}; flatcon_ = std::make_unique(flatcbk, @@ -1306,10 +1298,6 @@ void HwcDisplay::SetHdrOutputMetadata(ui::Hdr type) { m->white_point.y = ToU16ColorValue(whitePoint.y); } -const Backend *HwcDisplay::backend() const { - return backend_.get(); -} - bool HwcDisplay::NeedsClientLayerUpdate() const { return std::any_of(layers_.begin(), layers_.end(), [](const auto &pair) { const auto &layer = pair.second; diff --git a/hwc/HwcDisplay.h b/hwc/HwcDisplay.h index 430a931..e0c8e37 100644 --- a/hwc/HwcDisplay.h +++ b/hwc/HwcDisplay.h @@ -185,8 +185,6 @@ class HwcDisplay { return &it->second; } - const Backend *backend() const; - auto layers() -> std::map & { return layers_; }