From e17256978730314b79b851a9f80275065d7b5ca0 Mon Sep 17 00:00:00 2001 From: cehoyos Date: Thu, 10 Dec 2009 23:16:08 +0000 Subject: Update the SuperH VEU vidix driver with code that calls fsync() after each frame to make sure the frame is flushed in case of deferred io. Patch by Magnus Damm, damm opensource se git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29988 b3059339-0415-0410-9bf9-f77b7e298cf2 --- vidix/sh_veu_vid.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/vidix/sh_veu_vid.c b/vidix/sh_veu_vid.c index 7ce49b4a94..03868ac364 100644 --- a/vidix/sh_veu_vid.c +++ b/vidix/sh_veu_vid.c @@ -1,6 +1,6 @@ /* * VIDIX driver for SuperH Mobile VEU hardware block. - * Copyright (C) 2008 Magnus Damm + * Copyright (C) 2008, 2009 Magnus Damm * * Requires a kernel that exposes the VEU hardware block to user space * using UIO. Available in upstream linux-2.6.27 or later. @@ -179,8 +179,7 @@ static int get_fb_info(char *device, struct fb_info *fip) memset(iomem, 0, fip->line_length * fip->height); munmap(iomem, fip->size); - close(fd); - return 0; + return fd; } #define VESTR 0x00 /* start register */ @@ -268,6 +267,7 @@ struct sh_veu_plane { static struct sh_veu_plane _src, _dst; static vidix_playback_t my_info; +static int fb_fd; static int sh_veu_probe(int verbose, int force) { @@ -276,6 +276,7 @@ static int sh_veu_probe(int verbose, int force) ret = get_fb_info("/dev/fb0", &fbi); if (ret < 0) return ret; + fb_fd = ret; if (fbi.bpp != 16) { printf("sh_veu: only 16bpp supported\n"); @@ -315,6 +316,9 @@ static void sh_veu_wait_irq(vidix_playback_t *info) read(uio_dev.fd, &n_pending, sizeof(unsigned long)); write_reg(&uio_mmio, 0x100, VEVTR); /* ack int, write 0 to bit 0 */ + + /* flush framebuffer to handle deferred io case */ + fsync(fb_fd); } static int sh_veu_is_veu2h(void) @@ -486,6 +490,7 @@ static int sh_veu_init(void) static void sh_veu_destroy(void) { + close(fb_fd); } static int sh_veu_get_caps(vidix_capability_t *to) -- cgit v1.2.3