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 136cadd0f9110c29b6f7f5502a956053f2e6607b..a29bd758ef2ce92cdf03d3d9681c6fd72617bb48 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 c16df20305fe50f1afe89c5f3313c5e3f83971b5..e06d1d74c8dc9dc45a97884a0f4b7d40798b9d1a 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 51e9d597682dd16fb4605fbdb1b714efccbcaaef..78052600d21c05f49392cec9d9cff1ff19d1100a 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 9005d2ab992a0680a957a2516f3b783a943a07c4..9a11b988963256b6d422822646831bd39dbc7b35 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 946305ce3eda2741edd3139d7b92d018b53c061c..c16cac1e432c779ebb0d18eed940d59d5c718745 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; }