summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Compostella <jeremy.compostella@intel.com>2018-06-07 19:51:33 +0200
committerTao Bao <tbao@google.com>2018-07-03 19:43:06 +0200
commit955da1e26dc43ea56c5cd28404145d453ae448ba (patch)
treee905eff073fd050c37e35c5aca0abe14c3c58f6e
parentMerge "updater: Check the number of args in Command::Parse." (diff)
downloadandroid_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.tar
android_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.tar.gz
android_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.tar.bz2
android_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.tar.lz
android_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.tar.xz
android_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.tar.zst
android_bootable_recovery-955da1e26dc43ea56c5cd28404145d453ae448ba.zip
-rw-r--r--minui/graphics_drm.cpp39
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];
}