Skip to content

Commit

Permalink
drm/atomic-helpers: Recover full cursor plane behaviour
Browse files Browse the repository at this point in the history
Cursor plane updates have historically been fully async and mutliple
updates batched together for the next vsync. And userspace relies upon
that. Since implementing a full queue of async atomic updates is a bit
of work lets just recover the cursor specific behaviour with a hint
flag and some hacks to drop the vblank wait.

v2: Fix kerneldoc, reported by Wu Fengguang.

Reviewed-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
  • Loading branch information
Daniel Vetter committed Jan 27, 2015
1 parent b486e0e commit f02ad90
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 0 deletions.
11 changes: 11 additions & 0 deletions drivers/gpu/drm/drm_atomic_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,11 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
if (!crtc->state->enable)
continue;

/* Legacy cursor ioctls are completely unsynced, and userspace
* relies on that (by doing tons of cursor updates). */
if (old_state->legacy_cursor_update)
continue;

if (!framebuffer_changed(dev, old_state, crtc))
continue;

Expand Down Expand Up @@ -1335,6 +1340,9 @@ int drm_atomic_helper_update_plane(struct drm_plane *plane,
if (ret != 0)
goto fail;

if (plane == crtc->cursor)
state->legacy_cursor_update = true;

/* Driver takes ownership of state on successful commit. */
return 0;
fail:
Expand Down Expand Up @@ -1410,6 +1418,9 @@ int drm_atomic_helper_disable_plane(struct drm_plane *plane)
plane_state->src_h = 0;
plane_state->src_w = 0;

if (plane == plane->crtc->cursor)
state->legacy_cursor_update = true;

ret = drm_atomic_commit(state);
if (ret != 0)
goto fail;
Expand Down
2 changes: 2 additions & 0 deletions include/drm/drm_crtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,7 @@ struct drm_bridge {
* struct struct drm_atomic_state - the global state object for atomic updates
* @dev: parent DRM device
* @allow_modeset: allow full modeset
* @legacy_cursor_update: hint to enforce legacy cursor ioctl semantics
* @planes: pointer to array of plane pointers
* @plane_states: pointer to array of plane states pointers
* @crtcs: pointer to array of CRTC pointers
Expand All @@ -921,6 +922,7 @@ struct drm_bridge {
struct drm_atomic_state {
struct drm_device *dev;
bool allow_modeset : 1;
bool legacy_cursor_update : 1;
struct drm_plane **planes;
struct drm_plane_state **plane_states;
struct drm_crtc **crtcs;
Expand Down

0 comments on commit f02ad90

Please sign in to comment.