From 510dd90271b2d1ff75c3b2640deb19de3808842d Mon Sep 17 00:00:00 2001 From: ShaoboFeng Date: Thu, 28 Sep 2023 15:38:30 +0800 Subject: [PATCH] enable hardware vsync --- .../drivers/hal/drm_backend/display_device/BUILD.gn | 1 + .../display_device/device_event_monitor.cpp | 11 ++++++----- .../hal/drm_backend/display_device/drm_display.cpp | 4 ++++ .../hal/drm_backend/display_device/drm_display.h | 2 +- .../drm_backend/display_device/drm_frame_buffer.cpp | 4 ++-- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/display_server/drivers/hal/drm_backend/display_device/BUILD.gn b/display_server/drivers/hal/drm_backend/display_device/BUILD.gn index 136cadd..a29bd75 100644 --- a/display_server/drivers/hal/drm_backend/display_device/BUILD.gn +++ b/display_server/drivers/hal/drm_backend/display_device/BUILD.gn @@ -21,6 +21,7 @@ config("display_device_public_config") { "//display_server/drivers/interfaces", "//display_server/drivers/base", ] + cflags = [ "-DENABLE_HARDWARE_VSYNC=1" ] } ft_shared_library("display_device") { diff --git a/display_server/drivers/hal/drm_backend/display_device/device_event_monitor.cpp b/display_server/drivers/hal/drm_backend/display_device/device_event_monitor.cpp index c16df20..e06d1d7 100644 --- a/display_server/drivers/hal/drm_backend/display_device/device_event_monitor.cpp +++ b/display_server/drivers/hal/drm_backend/display_device/device_event_monitor.cpp @@ -149,13 +149,17 @@ void DeviceEventMonitor::DrmPageFlipHandler(int fd, uint32_t sequence, uint32_t // DRM timestamp is MONOTONIC and our timestamp is REALTIME. TimeStamp timeStamp( static_cast(sec) * MICRO_SECS_PER_SECOND + static_cast(usec)); - LOG_DEBUG("DeviceEventMonitor::DrmPageFlipHandler, timestamp: %{public}s", timeStamp.ToFormattedString().c_str()); - display->OnVSync(sequence, static_cast(timeStamp.Nanos())); + TimeStamp tmp(TimeAdd(TimeStamp::SystemStartTime(), timeStamp.Micros())); + LOG_DEBUG("DeviceEventMonitor::DrmPageFlipHandler, timestamp: %s\n", tmp.ToFormattedString().c_str()); + auto frame = detail::GetFrameCnt(); + display->OnVSync(frame, static_cast(timeStamp.Nanos())); } void DeviceEventMonitor::OnDrmVsyncEvent(TimeStamp timeStamp) { UNUSED(timeStamp); + drmEventContext_->version = DRM_EVENT_CONTEXT_VERSION; + drmEventContext_->page_flip_handler = DrmPageFlipHandler; drmHandleEvent(dupDrmFd_, drmEventContext_.get()); } @@ -173,9 +177,6 @@ void DeviceEventMonitor::RegisterVsyncEventHandler() { #ifdef ENABLE_HARDWARE_VSYNC if (drmDevice_->SupportAtomicModeSet()) { - // TODO: drmEventContext VERSION - drmEventContext_->version = 3; - drmEventContext_->page_flip_handler = DrmPageFlipHandler; vsyncChannel_ = std::make_unique(dupDrmFd_, loop_); vsyncChannel_->SetReadCallback([this](TimeStamp timestamp) { OnDrmVsyncEvent(timestamp); }); vsyncChannel_->EnableReading(true); diff --git a/display_server/drivers/hal/drm_backend/display_device/drm_display.cpp b/display_server/drivers/hal/drm_backend/display_device/drm_display.cpp index 51e9d59..7805260 100644 --- a/display_server/drivers/hal/drm_backend/display_device/drm_display.cpp +++ b/display_server/drivers/hal/drm_backend/display_device/drm_display.cpp @@ -270,6 +270,10 @@ void DrmDisplay::OnVSync(uint32_t sequence, uint64_t timeStamp) if (cb != nullptr) { cb(sequence, timeStamp, data); } + if (enableVsync_) { + int32_t fenceFd = -1; + Commit(&fenceFd); + } } int32_t DrmDisplay::SetDisplayVsyncEnabled(bool enabled) diff --git a/display_server/drivers/hal/drm_backend/display_device/drm_display.h b/display_server/drivers/hal/drm_backend/display_device/drm_display.h index 9005d2a..9a11b98 100644 --- a/display_server/drivers/hal/drm_backend/display_device/drm_display.h +++ b/display_server/drivers/hal/drm_backend/display_device/drm_display.h @@ -91,7 +91,7 @@ private: void *vsyncUserData_ = nullptr; // guarded by mutex_; bool vSyncCbEverReged_ = false; // guarded by mutex_; #ifdef ENABLE_HARDWARE_VSYNC - // bool enableVsync_ = true; + bool enableVsync_ = true; #endif // ENABLE_HARDWARE_VSYNC void InitReservedFb(); diff --git a/display_server/drivers/hal/drm_backend/display_device/drm_frame_buffer.cpp b/display_server/drivers/hal/drm_backend/display_device/drm_frame_buffer.cpp index 946305c..c16cac1 100644 --- a/display_server/drivers/hal/drm_backend/display_device/drm_frame_buffer.cpp +++ b/display_server/drivers/hal/drm_backend/display_device/drm_frame_buffer.cpp @@ -37,11 +37,11 @@ bool AddFb(int drmFd, uint32_t fbHandle, FrameBufferInfo &fbInfo) pitches[0] = fbInfo.stride; offsets[0] = 0; - printf("AddFb: fd=%d, width=%u, height=%u, pixel_format=DRM_FORMAT_XRGB8888, handle=%u, pitch=%u, offset=%u, fbId=%u\n", + LOG_DEBUG("AddFb: fd=%d, width=%u, height=%u, pixel_format=DRM_FORMAT_XRGB8888, handle=%u, pitch=%u, offset=%u, fbId=%u\n", drmFd, fbInfo.width, fbInfo.height, handles[0], pitches[0], offsets[0], fbInfo.fbId); if (drmModeAddFB2(drmFd, fbInfo.width, fbInfo.height, DRM_FORMAT_XRGB8888, // need use DRM_FORMAT_XRGB8888 handles, pitches, offsets, &fbInfo.fbId, 0) != 0) { - printf("drmModeAddFB2 failed, error: %s\n", ErrnoToString(errno).c_str()); + LOG_ERROR("drmModeAddFB2 failed, error: %s\n", ErrnoToString(errno).c_str()); return false; } -- Gitee