X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvideo%2Fomapdss%2Fosdl_video.c;h=5a291a79c6d424456ca5c3aa7db8eba3a3501dd3;hb=5cc6dcb71c2f2f24e54bf1ab9f09d8e560e8e4d9;hp=f64f4e194997d43bfa2b958c9c885ed2be6608ad;hpb=21e209de05a7f4712a567eb83d98a887b9c33c20;p=sdl_omap.git diff --git a/src/video/omapdss/osdl_video.c b/src/video/omapdss/osdl_video.c index f64f4e1..5a291a7 100644 --- a/src/video/omapdss/osdl_video.c +++ b/src/video/omapdss/osdl_video.c @@ -46,6 +46,7 @@ static int osdl_setup_omapfb(struct omapfb_state *ostate, int fd, int enabled, struct omapfb_plane_info pi; struct omapfb_mem_info mi; int mem_blocks = *buffer_count; + unsigned int size_cur; int ret; memset(&pi, 0, sizeof(pi)); @@ -62,6 +63,7 @@ static int osdl_setup_omapfb(struct omapfb_state *ostate, int fd, int enabled, err_perror("QUERY_MEM"); return -1; } + size_cur = mi.size; /* must disable when changing stuff */ if (pi.enabled) { @@ -71,19 +73,20 @@ static int osdl_setup_omapfb(struct omapfb_state *ostate, int fd, int enabled, err_perror("SETUP_PLANE"); } - if (mi.size < mem * mem_blocks) { - for (; mem_blocks > 0; mem_blocks--) { - mi.size = mem * mem_blocks; - ret = ioctl(fd, OMAPFB_SETUP_MEM, &mi); - if (ret == 0) - break; - } - if (ret != 0 || mem_blocks <= 0) { - err("failed to allocate at least %d bytes of vram:\n", mem); - err_perror("SETUP_MEM"); - return -1; - } + /* allocate more mem, if needed */ + for (; size_cur < mem * mem_blocks && mem_blocks > 0; mem_blocks--) { + mi.size = mem * mem_blocks; + ret = ioctl(fd, OMAPFB_SETUP_MEM, &mi); + if (ret == 0) + break; + mi.size = size_cur; + } + if (mem_blocks <= 0) { + err("failed to allocate at least %d bytes of vram:\n", mem); + err_perror("SETUP_MEM"); + return -1; } + *buffer_count = mem_blocks; pi.pos_x = x; @@ -104,6 +107,19 @@ static int osdl_setup_omapfb(struct omapfb_state *ostate, int fd, int enabled, return 0; } +static int osdl_setup_omapfb_enable(struct omapfb_state *ostate, + int fd, int enabled) +{ + int ret; + + ostate->pi.enabled = enabled; + ret = ioctl(fd, OMAPFB_SETUP_PLANE, &ostate->pi); + if (ret != 0) + err_perror("SETUP_PLANE"); + + return ret; +} + static int read_sysfs(const char *fname, char *buff, size_t size) { FILE *f; @@ -337,7 +353,7 @@ static int osdl_setup_omap_layer(struct SDL_PrivateVideoData *pdata, x = screen_w / 2 - w / 2; y = screen_h / 2 - h / 2; - ret = osdl_setup_omapfb(pdata->saved_layer, fd, 1, x, y, w, h, + ret = osdl_setup_omapfb(pdata->saved_layer, fd, 0, x, y, w, h, width * height * ((bpp + 7) / 8), buffer_count); if (ret == 0) { pdata->layer_x = x; @@ -403,6 +419,13 @@ void *osdl_video_set_mode(struct SDL_PrivateVideoData *pdata, } } + ret = osdl_setup_omapfb_enable(pdata->saved_layer, + vout_fbdev_get_fd(pdata->fbdev), 1); + if (ret != 0) { + err("layer enable failed"); + goto fail; + } + if (buffers_try != buffers_set) { log("only %d/%d buffers available, expect tearing\n", buffers_set, buffers_try); @@ -431,6 +454,14 @@ void *osdl_video_flip(struct SDL_PrivateVideoData *pdata) return ret; } +void *osdl_video_get_active_buffer(struct SDL_PrivateVideoData *pdata) +{ + if (pdata->fbdev == NULL) + return NULL; + + return vout_fbdev_get_active_mem(pdata->fbdev); +} + int osdl_video_pause(struct SDL_PrivateVideoData *pdata, int is_pause) { struct omapfb_state *state = pdata->saved_layer;