summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Olbrich <m.olbrich@pengutronix.de>2013-09-24 17:03:33 +0200
committerMichael Olbrich <m.olbrich@pengutronix.de>2013-09-24 17:32:12 +0200
commitd24ff64079c5c58da459d6b8177a180357f75f75 (patch)
tree7a677fb4e96a6ca70437b1170ab0f57adde467cb
parent99d518a595ded0f23eeb22aff1cc7362c2a14e44 (diff)
downloadkmsfbwrap-d24ff64079c5c58da459d6b8177a180357f75f75.tar.gz
kmsfbwrap-d24ff64079c5c58da459d6b8177a180357f75f75.tar.xz
bgi: wait before flipping
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r--src/bgi.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/bgi.c b/src/bgi.c
index bfabfa5..78f1dfd 100644
--- a/src/bgi.c
+++ b/src/bgi.c
@@ -20,6 +20,7 @@
static struct kms_fb *fb3d;
static int crtc3d;
+static int can_wait;
int do_wait_vblank;
static struct fb_fix_screeninfo fix = {
@@ -106,6 +107,11 @@ static int wait_vblank(void)
struct timeval timeout = { .tv_sec = 0, .tv_usec = 200000 };
fd_set fds;
+ if (!can_wait)
+ return 0;
+
+ can_wait = 0;
+
FD_ZERO(&fds);
FD_SET(drmfd, &fds);
ret = select(drmfd + 1, &fds, NULL, NULL, &timeout);
@@ -159,18 +165,20 @@ static void do_pageflip(unsigned int offset)
return;
}
+ if (do_wait_vblank)
+ wait_vblank();
+
flip.fb_id = fb_id;
flip.crtc_id = crtc3d;
- flip.flags = DRM_MODE_PAGE_FLIP_EVENT;
+ flip.flags = can_wait ? 0 : DRM_MODE_PAGE_FLIP_EVENT;
flip.reserved = 0;
ret = ioctl(drmfd, DRM_IOCTL_MODE_PAGE_FLIP, &flip);
if (ret) {
pr_err("page flip failed: %s\n", strerror(errno));
+ return;
}
-
- if (do_wait_vblank)
- wait_vblank();
+ can_wait = 1;
}
static void fbdev_ioctl(fuse_req_t req, int cmd, void *arg,
@@ -246,6 +254,7 @@ int bgi_init(struct kms_fb *fb, int crtc)
fb3d = fb;
crtc3d = crtc;
+ can_wait = 0;
fix.smem_start = fb->phys;
fix.smem_len = fb->pitch * fb->yres * 3;