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,