summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2016-11-08 17:46:10 +0000
committerDaniel Stone <daniels@collabora.com>2017-02-07 19:16:32 +0000
commit43483a004375104a330f62aec62c49195d15c985 (patch)
tree05b3c11cbbad439075dfdba01f71243876311cc2
parent7068aed2635bf56b74224970bfac01f0e560ab40 (diff)
compositor-drm: Split repaint into helper
We can separate repainting into two phases: one performing the actual repaint (essentially drm_output_render) and populating the plane state that wasn't already populated by drm_output_assign_planes, and another applying this state to the device. Differential Revision: https://phabricator.freedesktop.org/D1500 Signed-off-by: Daniel Stone <daniels@collabora.com>
-rw-r--r--libweston/compositor-drm.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 7eae4617..172bea29 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1526,13 +1526,10 @@ drm_waitvblank_pipe(struct drm_output *output)
}
static int
-drm_output_repaint(struct weston_output *output_base,
- pixman_region32_t *damage,
- void *repaint_data)
+drm_output_apply_state(struct drm_output_state *state)
{
- struct drm_output *output = to_drm_output(output_base);
- struct drm_backend *backend =
- to_drm_backend(output->base.compositor);
+ struct drm_output *output = state->output;
+ struct drm_backend *backend = to_drm_backend(output->base.compositor);
struct drm_plane *scanout_plane = output->scanout_plane;
struct drm_plane_state *scanout_state;
struct drm_plane_state *ps;
@@ -1540,20 +1537,7 @@ drm_output_repaint(struct weston_output *output_base,
struct drm_mode *mode;
int ret = 0;
- if (output->disable_pending || output->destroy_pending)
- goto err;
-
- assert(!output->state_last);
- if (!output->state_pending)
- output->state_pending =
- drm_output_state_duplicate(output->state_cur,
- DRM_OUTPUT_STATE_CLEAR_PLANES);
-
- drm_output_render(output, damage);
- scanout_state = drm_output_state_get_plane(output->state_pending,
- scanout_plane);
- if (!scanout_state || !scanout_state->fb)
- goto err;
+ scanout_state = drm_output_state_get_plane(state, scanout_plane);
/* The legacy SetCrtc API doesn't allow us to do scaling, and the
* legacy PageFlip API doesn't allow us to do clipping either. */
@@ -1580,7 +1564,7 @@ drm_output_repaint(struct weston_output *output_base,
weston_log("set mode failed: %m\n");
goto err;
}
- output_base->set_dpms(output_base, WESTON_DPMS_ON);
+ output->base.set_dpms(&output->base, WESTON_DPMS_ON);
}
if (drmModePageFlip(backend->drm.fd, output->crtc_id,
@@ -1592,7 +1576,7 @@ drm_output_repaint(struct weston_output *output_base,
assert(!output->page_flip_pending);
- drm_output_set_cursor(output->state_pending);
+ drm_output_set_cursor(state);
/*
* Now, update all the sprite surfaces
@@ -1655,6 +1639,38 @@ err:
return -1;
}
+static int
+drm_output_repaint(struct weston_output *output_base,
+ pixman_region32_t *damage,
+ void *repaint_data)
+{
+ struct drm_output *output = to_drm_output(output_base);
+ struct drm_plane_state *scanout_state;
+
+ if (output->disable_pending || output->destroy_pending)
+ goto err;
+
+ assert(!output->state_last);
+ if (!output->state_pending)
+ output->state_pending =
+ drm_output_state_duplicate(output->state_cur,
+ DRM_OUTPUT_STATE_CLEAR_PLANES);
+
+ drm_output_render(output, damage);
+ scanout_state = drm_output_state_get_plane(output->state_pending,
+ output->scanout_plane);
+ if (!scanout_state || !scanout_state->fb)
+ goto err;
+
+ return drm_output_apply_state(output->state_pending);
+
+err:
+ drm_output_state_free(output->state_pending);
+ output->state_pending = NULL;
+ return -1;
+}
+
+
static void
drm_output_start_repaint_loop(struct weston_output *output_base)
{