diff --git a/backend/BackendManager.cpp b/backend/BackendManager.cpp index 04b1944..232537b 100644 --- a/backend/BackendManager.cpp +++ b/backend/BackendManager.cpp @@ -43,9 +43,21 @@ int BackendManager::RegisterBackend(const std::string &name, return 0; } +std::unique_ptr BackendManager::CreatePipelineForConnector( + DrmConnector &connector) { + auto pipeline = DrmDisplayPipeline::CreatePipeline(connector); + if (pipeline) { + pipeline->backend = CreateBackendForConnector(connector); + } + if (!pipeline || !pipeline->backend) { + return nullptr; + } + return pipeline; +} + std::unique_ptr BackendManager::CreateBackendForConnector( - const DrmConnector *connector) { - auto driver_name(connector->GetDev().GetName()); + const DrmConnector &connector) { + auto driver_name(connector.GetDev().GetName()); std::string backend_name = Properties::GetBackendOverride(); if (backend_name.empty()) { backend_name = driver_name; @@ -54,14 +66,13 @@ std::unique_ptr BackendManager::CreateBackendForConnector( auto backend = GetBackendByName(backend_name); if (backend == nullptr) { ALOGE("Failed to create backend '%s' for '%s' and driver '%s'", - backend_name.c_str(), connector->GetName().c_str(), + backend_name.c_str(), connector.GetName().c_str(), driver_name.c_str()); return nullptr; } ALOGI("Backend '%s' for '%s' and driver '%s' was successfully created", - backend_name.c_str(), connector->GetName().c_str(), - driver_name.c_str()); + backend_name.c_str(), connector.GetName().c_str(), driver_name.c_str()); return backend; } diff --git a/backend/BackendManager.h b/backend/BackendManager.h index 456c028..a8b9e97 100644 --- a/backend/BackendManager.h +++ b/backend/BackendManager.h @@ -40,10 +40,14 @@ class BackendManager { static BackendManager &GetInstance(); int RegisterBackend(const std::string &name, BackendConstructorT backend_constructor); - std::unique_ptr CreateBackendForConnector( - const DrmConnector *connector); + + std::unique_ptr CreatePipelineForConnector( + DrmConnector &connector); private: + std::unique_ptr CreateBackendForConnector( + const DrmConnector &connector); + std::unique_ptr GetBackendByName(std::string &name); BackendManager() = default; diff --git a/drm/DrmHwc.cpp b/drm/DrmHwc.cpp index 2491cde..7cfd48c 100644 --- a/drm/DrmHwc.cpp +++ b/drm/DrmHwc.cpp @@ -24,7 +24,6 @@ #include #include -#include "backend/BackendManager.h" #include "stats/CompositionStats.h" #include "utils/log.h" #include "utils/properties.h" @@ -129,8 +128,6 @@ 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; @@ -185,9 +182,6 @@ 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/drm/ResourceManager.cpp b/drm/ResourceManager.cpp index 2208f11..d44e77e 100644 --- a/drm/ResourceManager.cpp +++ b/drm/ResourceManager.cpp @@ -24,6 +24,7 @@ #include #include +#include "backend/BackendManager.h" #include "bufferinfo/BufferInfoGetter.h" #include "drm/DrmAtomicStateManager.h" #include "drm/DrmDevice.h" @@ -147,8 +148,11 @@ void ResourceManager::UpdateFrontendDisplays() { if (connected) { std::shared_ptr - pipeline = DrmDisplayPipeline::CreatePipeline(*conn); - + pipeline = BackendManager::GetInstance().CreatePipelineForConnector( + *conn); + ALOGE_IF(pipeline == nullptr, + "Failed to create pipeline for connector %s", + conn->GetName().c_str()); if (pipeline) { frontend_interface_->BindDisplay(pipeline); attached_pipelines_[conn] = std::move(pipeline);