commit b561fc7

Michael Forney  ·  2014-01-21 04:32:06 +0000 UTC
parent 0366670
framebuffer_plane: Keep track of when a modeset is needed
2 files changed,  +19, -19
+18, -19
 1@@ -106,30 +106,28 @@ static bool attach(struct swc_view * view, struct swc_buffer * buffer)
 2     if (!framebuffer)
 3         return false;
 4 
 5-    if (drmModePageFlip(swc.drm->fd, plane->crtc, framebuffer->id,
 6-                        DRM_MODE_PAGE_FLIP_EVENT, &plane->drm_handler) != 0)
 7+    if (plane->need_modeset)
 8     {
 9-        if (errno == EINVAL)
10+        if (drmModeSetCrtc(swc.drm->fd, plane->crtc, framebuffer->id, 0, 0,
11+                           plane->connectors.data, plane->connectors.size / 4,
12+                           &plane->mode.info) == 0)
13         {
14-            WARNING("Page flip failed with EINVAL, trying to set CRTC\n");
15-
16-            if (drmModeSetCrtc(swc.drm->fd, plane->crtc, framebuffer->id, 0, 0,
17-                               plane->connectors.data,
18-                               plane->connectors.size / 4,
19-                               &plane->mode.info) == 0)
20-            {
21-                swc_view_frame(&plane->view, swc_time());
22-            }
23-            else
24-            {
25-                ERROR("Could not set CRTC to next framebuffer: %s\n",
26-                      strerror(errno));
27-                return false;
28-            }
29+            swc_view_frame(&plane->view, swc_time());
30+            plane->need_modeset = false;
31         }
32         else
33         {
34-            ERROR("Could not schedule page flip: %s\n", strerror(errno));
35+            ERROR("Could not set CRTC to next framebuffer: %s\n",
36+                  strerror(errno));
37+            return false;
38+        }
39+    }
40+    else
41+    {
42+        if (drmModePageFlip(swc.drm->fd, plane->crtc, framebuffer->id,
43+                            DRM_MODE_PAGE_FLIP_EVENT, &plane->drm_handler) != 0)
44+        {
45+            ERROR("Page flip failed: %s\n", strerror(errno));
46             return false;
47         }
48     }
49@@ -185,6 +183,7 @@ bool swc_framebuffer_plane_initialize(struct swc_framebuffer_plane * plane,
50 
51     plane->crtc = crtc;
52     plane->drm_handler.page_flip = &handle_page_flip;
53+    plane->need_modeset = true;
54     swc_view_initialize(&plane->view, &view_impl);
55     swc_mode_initialize(&plane->mode, mode);
56 
+1, -0
1@@ -39,6 +39,7 @@ struct swc_framebuffer_plane
2     struct swc_view view;
3     struct swc_drm_handler drm_handler;
4     struct wl_array connectors;
5+    bool need_modeset;
6 };
7 
8 bool swc_framebuffer_plane_initialize(struct swc_framebuffer_plane * plane,