diff options
author | Jeremy Compostella <jeremy.compostella@intel.com> | 2018-07-04 04:06:01 +0200 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-07-04 04:06:01 +0200 |
commit | d3e023c265ac9a0492dfc901180cf1065c4f38c6 (patch) | |
tree | 2d34688f8c82c24b05ee493748aa00506a130efd | |
parent | Merge "No longer print hash for stashed blocks during verification of retry" (diff) | |
parent | Merge "minui/drm: wait for page flip completion" (diff) | |
download | android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.tar android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.tar.gz android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.tar.bz2 android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.tar.lz android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.tar.xz android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.tar.zst android_bootable_recovery-d3e023c265ac9a0492dfc901180cf1065c4f38c6.zip |
-rw-r--r-- | minui/graphics_drm.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/minui/graphics_drm.cpp b/minui/graphics_drm.cpp index 4c98507f6..57912d1e8 100644 --- a/minui/graphics_drm.cpp +++ b/minui/graphics_drm.cpp @@ -17,6 +17,7 @@ #include "graphics_drm.h" #include <fcntl.h> +#include <poll.h> #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> @@ -378,13 +379,49 @@ GRSurface* MinuiBackendDrm::Init() { return GRSurfaceDrms[0]; } +static void page_flip_complete(__unused int fd, + __unused unsigned int sequence, + __unused unsigned int tv_sec, + __unused unsigned int tv_usec, + void *user_data) { + *static_cast<bool*>(user_data) = false; +} + GRSurface* MinuiBackendDrm::Flip() { + bool ongoing_flip = true; + int ret = drmModePageFlip(drm_fd, main_monitor_crtc->crtc_id, - GRSurfaceDrms[current_buffer]->fb_id, 0, nullptr); + GRSurfaceDrms[current_buffer]->fb_id, + DRM_MODE_PAGE_FLIP_EVENT, &ongoing_flip); if (ret < 0) { printf("drmModePageFlip failed ret=%d\n", ret); return nullptr; } + + while (ongoing_flip) { + struct pollfd fds = { + .fd = drm_fd, + .events = POLLIN + }; + + ret = poll(&fds, 1, -1); + if (ret == -1 || !(fds.revents & POLLIN)) { + printf("poll() failed on drm fd\n"); + break; + } + + drmEventContext evctx = { + .version = DRM_EVENT_CONTEXT_VERSION, + .page_flip_handler = page_flip_complete + }; + + ret = drmHandleEvent(drm_fd, &evctx); + if (ret != 0) { + printf("drmHandleEvent failed ret=%d\n", ret); + break; + } + } + current_buffer = 1 - current_buffer; return GRSurfaceDrms[current_buffer]; } |