delay omapfb layer enable
[sdl_omap.git] / src / video / omapdss / osdl_video.c
index f64f4e1..fe9a29c 100644 (file)
@@ -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);