drm_hwcomposer: Initialize HwcDisplay using DrmDisplayPIpeline
HwcDisplay can now take all necessary objects from DrmDisplayPipeline.
Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/drm/DrmDevice.cpp b/drm/DrmDevice.cpp
index ece9437..d1ae7c9 100644
--- a/drm/DrmDevice.cpp
+++ b/drm/DrmDevice.cpp
@@ -30,6 +30,7 @@
#include <sstream>
#include <string>
+#include "compositor/DrmDisplayCompositor.h"
#include "drm/DrmPlane.h"
#include "utils/log.h"
#include "utils/properties.h"
@@ -168,14 +169,6 @@
return pipelines_.count(display) != 0;
}
-DrmConnector *DrmDevice::GetConnectorForDisplay(int display) const {
- return pipelines_.at(display)->connector->Get();
-}
-
-DrmCrtc *DrmDevice::GetCrtcForDisplay(int display) const {
- return pipelines_.at(display)->crtc->Get();
-}
-
auto DrmDevice::GetDisplayId(DrmConnector *conn) -> int {
for (auto &dpipe : pipelines_) {
if (dpipe.second->connector->Get() == conn) {
diff --git a/drm/DrmDevice.h b/drm/DrmDevice.h
index 8d9a34c..5220760 100644
--- a/drm/DrmDevice.h
+++ b/drm/DrmDevice.h
@@ -56,8 +56,10 @@
return max_resolution_;
}
- DrmConnector *GetConnectorForDisplay(int display) const;
- DrmCrtc *GetCrtcForDisplay(int display) const;
+ auto *GetPipelineForDisplay(int display) {
+ return pipelines_.count(display) != 0 ? pipelines_.at(display).get()
+ : nullptr;
+ }
std::string GetName() const;
@@ -102,10 +104,6 @@
DrmProperty *property) const;
private:
- int TryEncoderForDisplay(int display, DrmEncoder *enc);
-
- int CreateDisplayPipe(DrmConnector *connector);
-
UniqueFd fd_;
std::vector<std::unique_ptr<DrmConnector>> connectors_;
diff --git a/drm/DrmDisplayPipeline.cpp b/drm/DrmDisplayPipeline.cpp
index 69d28b3..0ce1afc 100644
--- a/drm/DrmDisplayPipeline.cpp
+++ b/drm/DrmDisplayPipeline.cpp
@@ -25,6 +25,7 @@
#include "DrmPlane.h"
#include "compositor/DrmDisplayCompositor.h"
#include "utils/log.h"
+#include "utils/properties.h"
namespace android {
@@ -97,9 +98,13 @@
return {};
}
- bool use_overlay_planes = true; // TODO(rsglobal): restore
- // strtol(use_overlay_planes_prop, nullptr,
- // 10);
+ char use_overlay_planes_prop[PROPERTY_VALUE_MAX];
+ property_get("vendor.hwc.drm.use_overlay_planes", use_overlay_planes_prop,
+ "1");
+ constexpr int kStrtolBase = 10;
+ bool use_overlay_planes = strtol(use_overlay_planes_prop, nullptr,
+ kStrtolBase) != 0;
+
if (use_overlay_planes) {
for (auto *plane : overlay_planes) {
auto op = plane->BindPipeline(pipe.get());
@@ -109,6 +114,8 @@
}
}
+ pipe->compositor = std::make_unique<DrmDisplayCompositor>(pipe.get());
+
return pipe;
}
diff --git a/drm/DrmDisplayPipeline.h b/drm/DrmDisplayPipeline.h
index cb5b9e2..a3e2dd9 100644
--- a/drm/DrmDisplayPipeline.h
+++ b/drm/DrmDisplayPipeline.h
@@ -79,6 +79,8 @@
std::shared_ptr<BindingOwner<DrmCrtc>> crtc;
std::shared_ptr<BindingOwner<DrmPlane>> primary_plane;
std::vector<std::shared_ptr<BindingOwner<DrmPlane>>> overlay_planes;
+
+ std::unique_ptr<DrmDisplayCompositor> compositor;
};
} // namespace android
diff --git a/drm/ResourceManager.cpp b/drm/ResourceManager.cpp
index 46f77e4..a7d99ee 100644
--- a/drm/ResourceManager.cpp
+++ b/drm/ResourceManager.cpp
@@ -24,7 +24,9 @@
#include <sstream>
#include "bufferinfo/BufferInfoGetter.h"
+#include "compositor/DrmDisplayCompositor.h"
#include "drm/DrmDevice.h"
+#include "drm/DrmDisplayPipeline.h"
#include "drm/DrmPlane.h"
#include "utils/log.h"
#include "utils/properties.h"
@@ -95,10 +97,12 @@
return ret;
}
-DrmDevice *ResourceManager::GetDrmDevice(int display) {
+DrmDisplayPipeline *ResourceManager::GetPipeline(int display) {
for (auto &drm : drms_) {
- if (drm->HandlesDisplay(display))
- return drm.get();
+ auto *pipe = drm->GetPipelineForDisplay(display);
+ if (pipe != nullptr) {
+ return pipe;
+ }
}
return nullptr;
}
diff --git a/drm/ResourceManager.h b/drm/ResourceManager.h
index f54d682..caeb098 100644
--- a/drm/ResourceManager.h
+++ b/drm/ResourceManager.h
@@ -33,8 +33,8 @@
~ResourceManager();
int Init();
- DrmDevice *GetDrmDevice(int display);
- const std::vector<std::unique_ptr<DrmDevice>> &GetDrmDevices() const {
+ auto GetPipeline(int display) -> DrmDisplayPipeline *;
+ auto &GetDrmDevices() const {
return drms_;
}
int GetDisplayCount() const {
diff --git a/drm/VSyncWorker.cpp b/drm/VSyncWorker.cpp
index 64af85b..8cb4d08 100644
--- a/drm/VSyncWorker.cpp
+++ b/drm/VSyncWorker.cpp
@@ -29,19 +29,12 @@
namespace android {
-VSyncWorker::VSyncWorker()
- : Worker("vsync", HAL_PRIORITY_URGENT_DISPLAY),
- drm_(nullptr),
- display_(-1),
- enabled_(false),
- last_timestamp_(-1) {
-}
+VSyncWorker::VSyncWorker() : Worker("vsync", HAL_PRIORITY_URGENT_DISPLAY){};
-auto VSyncWorker::Init(DrmDevice *drm, int display,
+auto VSyncWorker::Init(DrmDisplayPipeline *pipe,
std::function<void(uint64_t /*timestamp*/)> callback)
-> int {
- drm_ = drm;
- display_ = display;
+ pipe_ = pipe;
callback_ = std::move(callback);
return InitWorker();
@@ -86,12 +79,10 @@
return ret;
float refresh = 60.0F; // Default to 60Hz refresh rate
- DrmConnector *conn = drm_->GetConnectorForDisplay(display_);
- if (conn && conn->GetActiveMode().v_refresh() != 0.0F)
- refresh = conn->GetActiveMode().v_refresh();
- else
- ALOGW("Vsync worker active with conn=%p refresh=%f\n", conn,
- conn ? conn->GetActiveMode().v_refresh() : 0.0F);
+ if (pipe_ != nullptr &&
+ pipe_->connector->Get()->GetActiveMode().v_refresh() != 0.0F) {
+ refresh = pipe_->connector->Get()->GetActiveMode().v_refresh();
+ }
int64_t phased_timestamp = GetPhasedVSync(kOneSecondNs /
static_cast<int>(refresh),
@@ -121,28 +112,26 @@
}
}
- int display = display_;
+ auto *pipe = pipe_;
Unlock();
- DrmCrtc *crtc = drm_->GetCrtcForDisplay(display);
- if (!crtc) {
- ALOGE("Failed to get crtc for display");
- return;
- }
- uint32_t high_crtc = (crtc->GetIndexInResArray()
- << DRM_VBLANK_HIGH_CRTC_SHIFT);
-
- drmVBlank vblank;
- memset(&vblank, 0, sizeof(vblank));
- vblank.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE |
- (high_crtc &
- DRM_VBLANK_HIGH_CRTC_MASK));
- vblank.request.sequence = 1;
-
+ ret = -EAGAIN;
int64_t timestamp = 0;
- ret = drmWaitVBlank(drm_->GetFd(), &vblank);
- if (ret == -EINTR)
- return;
+ drmVBlank vblank{};
+
+ if (pipe != nullptr) {
+ uint32_t high_crtc = (pipe->crtc->Get()->GetIndexInResArray()
+ << DRM_VBLANK_HIGH_CRTC_SHIFT);
+
+ vblank.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE |
+ (high_crtc &
+ DRM_VBLANK_HIGH_CRTC_MASK));
+ vblank.request.sequence = 1;
+
+ ret = drmWaitVBlank(pipe->device->GetFd(), &vblank);
+ if (ret == -EINTR)
+ return;
+ }
if (ret) {
ret = SyntheticWaitVBlank(×tamp);
diff --git a/drm/VSyncWorker.h b/drm/VSyncWorker.h
index 67aaa16..1e6d39f 100644
--- a/drm/VSyncWorker.h
+++ b/drm/VSyncWorker.h
@@ -36,7 +36,7 @@
VSyncWorker();
~VSyncWorker() override = default;
- auto Init(DrmDevice *drm, int display,
+ auto Init(DrmDisplayPipeline *pipe,
std::function<void(uint64_t /*timestamp*/)> callback) -> int;
void VSyncControl(bool enabled);
@@ -48,13 +48,11 @@
int64_t GetPhasedVSync(int64_t frame_ns, int64_t current) const;
int SyntheticWaitVBlank(int64_t *timestamp);
- DrmDevice *drm_;
-
std::function<void(uint64_t /*timestamp*/)> callback_;
- int display_;
- std::atomic_bool enabled_;
- int64_t last_timestamp_;
+ DrmDisplayPipeline *pipe_ = nullptr;
+ std::atomic_bool enabled_ = false;
+ int64_t last_timestamp_ = -1;
};
} // namespace android