aboutsummaryrefslogtreecommitdiff
path: root/drm/VSyncWorker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drm/VSyncWorker.cpp')
-rw-r--r--drm/VSyncWorker.cpp56
1 files changed, 23 insertions, 33 deletions
diff --git a/drm/VSyncWorker.cpp b/drm/VSyncWorker.cpp
index dc52450..ed41189 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 @@ int VSyncWorker::SyntheticWaitVBlank(int64_t *timestamp) {
return ret;
float refresh = 60.0F; // Default to 60Hz refresh rate
- DrmConnector *conn = drm_->GetConnectorForDisplay(display_);
- if (conn && conn->active_mode().v_refresh() != 0.0F)
- refresh = conn->active_mode().v_refresh();
- else
- ALOGW("Vsync worker active with conn=%p refresh=%f\n", conn,
- conn ? conn->active_mode().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,27 +112,26 @@ void VSyncWorker::Routine() {
}
}
- 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->pipe() << DRM_VBLANK_HIGH_CRTC_SHIFT);
+ ret = -EAGAIN;
+ int64_t timestamp = 0;
+ drmVBlank vblank{};
- 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;
+ if (pipe != nullptr) {
+ uint32_t high_crtc = (pipe->crtc->Get()->GetIndexInResArray()
+ << DRM_VBLANK_HIGH_CRTC_SHIFT);
- int64_t timestamp = 0;
- ret = drmWaitVBlank(drm_->fd(), &vblank);
- if (ret == -EINTR)
- return;
+ 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(&timestamp);