mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git
synced 2026-04-18 06:34:27 -04:00
drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits
If the driver supports it, allow user-space to supply the DRM_MODE_PAGE_FLIP_ASYNC flag to request an async page-flip. Set drm_crtc_state.async_flip accordingly. Document that drivers will reject atomic commits if an async flip isn't possible. This allows user-space to fall back to something else. For instance, Xorg falls back to a blit. Another option is to wait as close to the next vblank as possible before performing the page-flip to reduce latency. Signed-off-by: Simon Ser <contact@emersion.fr> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Co-developed-by: André Almeida <andrealmeid@igalia.com> Signed-off-by: André Almeida <andrealmeid@igalia.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231122161941.320564-3-andrealmeid@igalia.com
This commit is contained in:
@@ -1368,6 +1368,18 @@ static void complete_signaling(struct drm_device *dev,
|
||||
kfree(fence_state);
|
||||
}
|
||||
|
||||
static void
|
||||
set_async_flip(struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *crtc_state;
|
||||
int i;
|
||||
|
||||
for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
|
||||
crtc_state->async_flip = true;
|
||||
}
|
||||
}
|
||||
|
||||
int drm_mode_atomic_ioctl(struct drm_device *dev,
|
||||
void *data, struct drm_file *file_priv)
|
||||
{
|
||||
@@ -1409,9 +1421,13 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
|
||||
}
|
||||
|
||||
if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) {
|
||||
drm_dbg_atomic(dev,
|
||||
"commit failed: invalid flag DRM_MODE_PAGE_FLIP_ASYNC\n");
|
||||
return -EINVAL;
|
||||
if (!dev->mode_config.async_page_flip) {
|
||||
drm_dbg_atomic(dev,
|
||||
"commit failed: DRM_MODE_PAGE_FLIP_ASYNC not supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
async_flip = true;
|
||||
}
|
||||
|
||||
/* can't test and expect an event at the same time. */
|
||||
@@ -1514,6 +1530,9 @@ retry:
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC)
|
||||
set_async_flip(state);
|
||||
|
||||
if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) {
|
||||
ret = drm_atomic_check_only(state);
|
||||
} else if (arg->flags & DRM_MODE_ATOMIC_NONBLOCK) {
|
||||
|
||||
Reference in New Issue
Block a user