compositor-drm: Use apply_state for starting repaint
Rather than open-coding it ourselves, use the new apply_state helper in drm_output_start_repaint. Signed-off-by: Daniel Stone <daniels@collabora.com> Reported-by: Fabien DESSENNE <fabien.dessenne@st.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
parent
a08512f464
commit
8747f95682
@ -2047,13 +2047,10 @@ static void
|
|||||||
drm_output_start_repaint_loop(struct weston_output *output_base)
|
drm_output_start_repaint_loop(struct weston_output *output_base)
|
||||||
{
|
{
|
||||||
struct drm_output *output = to_drm_output(output_base);
|
struct drm_output *output = to_drm_output(output_base);
|
||||||
struct drm_pending_state *pending_state = NULL;
|
struct drm_pending_state *pending_state;
|
||||||
struct drm_output_state *state;
|
|
||||||
struct drm_plane_state *plane_state;
|
|
||||||
struct drm_plane *scanout_plane = output->scanout_plane;
|
struct drm_plane *scanout_plane = output->scanout_plane;
|
||||||
struct drm_backend *backend =
|
struct drm_backend *backend =
|
||||||
to_drm_backend(output_base->compositor);
|
to_drm_backend(output_base->compositor);
|
||||||
uint32_t fb_id;
|
|
||||||
struct timespec ts, tnow;
|
struct timespec ts, tnow;
|
||||||
struct timespec vbl2now;
|
struct timespec vbl2now;
|
||||||
int64_t refresh_nsec;
|
int64_t refresh_nsec;
|
||||||
@ -2109,44 +2106,23 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
|
|||||||
/* Immediate query didn't provide valid timestamp.
|
/* Immediate query didn't provide valid timestamp.
|
||||||
* Use pageflip fallback.
|
* Use pageflip fallback.
|
||||||
*/
|
*/
|
||||||
fb_id = scanout_plane->state_cur->fb->fb_id;
|
|
||||||
|
|
||||||
assert(!output->page_flip_pending);
|
assert(!output->page_flip_pending);
|
||||||
assert(!output->state_last);
|
assert(!output->state_last);
|
||||||
|
|
||||||
pending_state = drm_pending_state_alloc(backend);
|
pending_state = drm_pending_state_alloc(backend);
|
||||||
state = drm_output_state_duplicate(output->state_cur, pending_state,
|
drm_output_state_duplicate(output->state_cur, pending_state,
|
||||||
DRM_OUTPUT_STATE_PRESERVE_PLANES);
|
DRM_OUTPUT_STATE_PRESERVE_PLANES);
|
||||||
|
|
||||||
if (drmModePageFlip(backend->drm.fd, output->crtc_id, fb_id,
|
ret = drm_pending_state_apply(pending_state);
|
||||||
DRM_MODE_PAGE_FLIP_EVENT, output) < 0) {
|
if (ret != 0) {
|
||||||
weston_log("queueing pageflip failed: %m\n");
|
weston_log("applying repaint-start state failed: %m\n");
|
||||||
goto finish_frame;
|
goto finish_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output->pageflip_timer)
|
|
||||||
wl_event_source_timer_update(output->pageflip_timer,
|
|
||||||
backend->pageflip_timeout);
|
|
||||||
|
|
||||||
wl_list_for_each(plane_state, &state->plane_list, link) {
|
|
||||||
if (plane_state->plane->type != WDRM_PLANE_TYPE_OVERLAY)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT;
|
|
||||||
vbl.request.type |= drm_waitvblank_pipe(output);
|
|
||||||
vbl.request.sequence = 1;
|
|
||||||
vbl.request.signal = (unsigned long) plane_state;
|
|
||||||
drmWaitVBlank(backend->drm.fd, &vbl);
|
|
||||||
}
|
|
||||||
|
|
||||||
drm_output_assign_state(state, DRM_STATE_APPLY_ASYNC);
|
|
||||||
drm_pending_state_free(pending_state);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
finish_frame:
|
finish_frame:
|
||||||
drm_pending_state_free(pending_state);
|
|
||||||
|
|
||||||
/* if we cannot page-flip, immediately finish frame */
|
/* if we cannot page-flip, immediately finish frame */
|
||||||
weston_output_finish_frame(output_base, NULL,
|
weston_output_finish_frame(output_base, NULL,
|
||||||
WP_PRESENTATION_FEEDBACK_INVALID);
|
WP_PRESENTATION_FEEDBACK_INVALID);
|
||||||
|
Loading…
Reference in New Issue
Block a user