diff options
Diffstat (limited to 'drm/VSyncWorker.cpp')
-rw-r--r-- | drm/VSyncWorker.cpp | 56 |
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(×tamp); |