* [PATCH v7 0/6] drm: Add support for atomic async page-flip
@ 2023-10-17 9:28 André Almeida
2023-10-17 9:28 ` [PATCH v7 1/6] drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits André Almeida
` (6 more replies)
0 siblings, 7 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
Hi,
This work from me and Simon adds support for DRM_MODE_PAGE_FLIP_ASYNC through
the atomic API. This feature is already available via the legacy API. The use
case is to be able to present a new frame immediately (or as soon as
possible), even if after missing a vblank. This might result in tearing, but
it's useful when a high framerate is desired, such as for gaming.
Differently from earlier versions, this one refuses to flip if any prop changes
for async flips. The idea is that the fast path of immediate page flips doesn't
play well with modeset changes, so only the fb_id can be changed.
Thanks,
André
- User-space patch: https://github.com/Plagman/gamescope/pull/595
- IGT tests: https://gitlab.freedesktop.org/andrealmeid/igt-gpu-tools/-/tree/atomic_async_page_flip
Changes from v6:
- Dropped the exception to allow MODE_ID changes (Simon)
- Clarify what happens when flipping with the same FB_ID (Pekka)
v6: https://lore.kernel.org/dri-devel/20230815185710.159779-1-andrealmeid@igalia.com/
Changes from v5:
- Add note in the docs that not every redundant attribute will result in no-op,
some might cause oversynchronization issues.
v5: https://lore.kernel.org/dri-devel/20230707224059.305474-1-andrealmeid@igalia.com/
Changes from v4:
- Documentation rewrote by Pekka Paalanen
v4: https://lore.kernel.org/dri-devel/20230701020917.143394-1-andrealmeid@igalia.com/
Changes from v3:
- Add new patch to reject prop changes
- Add a documentation clarifying the KMS atomic state set
v3: https://lore.kernel.org/dri-devel/20220929184307.258331-1-contact@emersion.fr/
André Almeida (1):
drm: Refuse to async flip with atomic prop changes
Pekka Paalanen (1):
drm/doc: Define KMS atomic state set
Simon Ser (4):
drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits
drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
drm: introduce drm_mode_config.atomic_async_page_flip_not_supported
amd/display: indicate support for atomic async page-flips on DC
Documentation/gpu/drm-uapi.rst | 47 ++++++++++++
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
drivers/gpu/drm/drm_atomic_uapi.c | 75 +++++++++++++++++--
drivers/gpu/drm/drm_crtc_internal.h | 2 +-
drivers/gpu/drm/drm_ioctl.c | 5 ++
drivers/gpu/drm/drm_mode_object.c | 2 +-
.../drm/i915/display/intel_display_driver.c | 1 +
drivers/gpu/drm/nouveau/nouveau_display.c | 1 +
include/drm/drm_mode_config.h | 11 +++
include/uapi/drm/drm.h | 10 ++-
include/uapi/drm/drm_mode.h | 9 +++
11 files changed, 155 insertions(+), 9 deletions(-)
--
2.42.0
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v7 1/6] drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
@ 2023-10-17 9:28 ` André Almeida
2023-10-17 9:28 ` [PATCH v7 2/6] drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP André Almeida
` (5 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
From: Simon Ser <contact@emersion.fr>
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>
---
drivers/gpu/drm/drm_atomic_uapi.c | 28 +++++++++++++++++++++++++---
include/uapi/drm/drm_mode.h | 9 +++++++++
2 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 98d3b10c08ae..a15121e75a0a 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1323,6 +1323,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)
{
@@ -1363,9 +1375,16 @@ 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;
+ }
+ if (dev->mode_config.atomic_async_page_flip_not_supported) {
+ drm_dbg_atomic(dev,
+ "commit failed: DRM_MODE_PAGE_FLIP_ASYNC not supported with atomic\n");
+ return -EINVAL;
+ }
}
/* can't test and expect an event at the same time. */
@@ -1468,6 +1487,9 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
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) {
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index ea1b639bcb28..04e6a3caa675 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -957,6 +957,15 @@ struct hdr_output_metadata {
* Request that the page-flip is performed as soon as possible, ie. with no
* delay due to waiting for vblank. This may cause tearing to be visible on
* the screen.
+ *
+ * When used with atomic uAPI, the driver will return an error if the hardware
+ * doesn't support performing an asynchronous page-flip for this update.
+ * User-space should handle this, e.g. by falling back to a regular page-flip.
+ *
+ * Note, some hardware might need to perform one last synchronous page-flip
+ * before being able to switch to asynchronous page-flips. As an exception,
+ * the driver will return success even though that first page-flip is not
+ * asynchronous.
*/
#define DRM_MODE_PAGE_FLIP_ASYNC 0x02
#define DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE 0x4
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v7 2/6] drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
2023-10-17 9:28 ` [PATCH v7 1/6] drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits André Almeida
@ 2023-10-17 9:28 ` André Almeida
2023-10-17 9:28 ` [PATCH v7 3/6] drm: introduce drm_mode_config.atomic_async_page_flip_not_supported André Almeida
` (4 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
From: Simon Ser <contact@emersion.fr>
This new kernel capability indicates whether async page-flips are
supported via the atomic uAPI. DRM clients can use it to check
for support before feeding DRM_MODE_PAGE_FLIP_ASYNC to the kernel.
Make it clear that DRM_CAP_ASYNC_PAGE_FLIP is for legacy uAPI only.
Signed-off-by: Simon Ser <contact@emersion.fr>
Reviewed-by: André Almeida <andrealmeid@igalia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
drivers/gpu/drm/drm_ioctl.c | 5 +++++
include/uapi/drm/drm.h | 10 +++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 77590b0f38fa..a96e7acb9071 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -301,6 +301,11 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
case DRM_CAP_CRTC_IN_VBLANK_EVENT:
req->value = 1;
break;
+ case DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP:
+ req->value = drm_core_check_feature(dev, DRIVER_ATOMIC) &&
+ dev->mode_config.async_page_flip &&
+ !dev->mode_config.atomic_async_page_flip_not_supported;
+ break;
default:
return -EINVAL;
}
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 794c1d857677..58baefe32c23 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -713,7 +713,8 @@ struct drm_gem_open {
/**
* DRM_CAP_ASYNC_PAGE_FLIP
*
- * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC.
+ * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC for legacy
+ * page-flips.
*/
#define DRM_CAP_ASYNC_PAGE_FLIP 0x7
/**
@@ -773,6 +774,13 @@ struct drm_gem_open {
* :ref:`drm_sync_objects`.
*/
#define DRM_CAP_SYNCOBJ_TIMELINE 0x14
+/**
+ * DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
+ *
+ * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC for atomic
+ * commits.
+ */
+#define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15
/* DRM_IOCTL_GET_CAP ioctl argument type */
struct drm_get_cap {
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v7 3/6] drm: introduce drm_mode_config.atomic_async_page_flip_not_supported
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
2023-10-17 9:28 ` [PATCH v7 1/6] drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits André Almeida
2023-10-17 9:28 ` [PATCH v7 2/6] drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP André Almeida
@ 2023-10-17 9:28 ` André Almeida
2023-10-17 9:28 ` [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes André Almeida
` (3 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
From: Simon Ser <contact@emersion.fr>
This new field indicates whether the driver has the necessary logic
to support async page-flips via the atomic uAPI. This is leveraged by
the next commit to allow user-space to use this functionality.
All atomic drivers setting drm_mode_config.async_page_flip are updated
to also set drm_mode_config.atomic_async_page_flip_not_supported. We
will gradually check and update these drivers to properly handle
drm_crtc_state.async_flip in their atomic logic.
The goal of this negative flag is the same as
fb_modifiers_not_supported: we want to eventually get rid of all
drivers missing atomic support for async flips. New drivers should not
set this flag, instead they should support atomic async flips (if
they support async flips at all). IOW, we don't want more drivers
with async flip support for legacy but not atomic.
Signed-off-by: Simon Ser <contact@emersion.fr>
Reviewed-by: André Almeida <andrealmeid@igalia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 +
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
drivers/gpu/drm/i915/display/intel_display_driver.c | 1 +
drivers/gpu/drm/nouveau/nouveau_display.c | 1 +
include/drm/drm_mode_config.h | 11 +++++++++++
5 files changed, 15 insertions(+)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index c6fd34bab358..9d5742923aed 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3997,6 +3997,7 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
adev_to_drm(adev)->mode_config.prefer_shadow = 1;
/* indicates support for immediate flip */
adev_to_drm(adev)->mode_config.async_page_flip = true;
+ adev_to_drm(adev)->mode_config.atomic_async_page_flip_not_supported = true;
state = kzalloc(sizeof(*state), GFP_KERNEL);
if (!state)
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 84c54e8622d1..f1d9bb1d7c34 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -639,6 +639,7 @@ static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev)
dev->mode_config.max_height = dc->desc->max_height;
dev->mode_config.funcs = &mode_config_funcs;
dev->mode_config.async_page_flip = true;
+ dev->mode_config.atomic_async_page_flip_not_supported = true;
return 0;
}
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 44b59ac301e6..6142c83fba06 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -126,6 +126,7 @@ static void intel_mode_config_init(struct drm_i915_private *i915)
mode_config->helper_private = &intel_mode_config_funcs;
mode_config->async_page_flip = HAS_ASYNC_FLIPS(i915);
+ mode_config->atomic_async_page_flip_not_supported = true;
/*
* Maximum framebuffer dimensions, chosen to match
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index d8c92521226d..586aa51794e8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -720,6 +720,7 @@ nouveau_display_create(struct drm_device *dev)
dev->mode_config.async_page_flip = false;
else
dev->mode_config.async_page_flip = true;
+ dev->mode_config.atomic_async_page_flip_not_supported = true;
drm_kms_helper_poll_init(dev);
drm_kms_helper_poll_disable(dev);
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index 973119a9176b..47b005671e6a 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -918,6 +918,17 @@ struct drm_mode_config {
*/
bool async_page_flip;
+ /**
+ * @atomic_async_page_flip_not_supported:
+ *
+ * If true, the driver does not support async page-flips with the
+ * atomic uAPI. This is only used by old drivers which haven't yet
+ * accomodated for &drm_crtc_state.async_flip in their atomic logic,
+ * even if they have &drm_mode_config.async_page_flip set to true.
+ * New drivers shall not set this flag.
+ */
+ bool atomic_async_page_flip_not_supported;
+
/**
* @fb_modifiers_not_supported:
*
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
` (2 preceding siblings ...)
2023-10-17 9:28 ` [PATCH v7 3/6] drm: introduce drm_mode_config.atomic_async_page_flip_not_supported André Almeida
@ 2023-10-17 9:28 ` André Almeida
2023-10-17 10:18 ` Simon Ser
2023-10-17 15:55 ` kernel test robot
2023-10-17 9:28 ` [PATCH v7 5/6] drm/doc: Define KMS atomic state set André Almeida
` (2 subsequent siblings)
6 siblings, 2 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
Given that prop changes may lead to modesetting, which would defeat the
fast path of the async flip, refuse any atomic prop change for async
flips in atomic API. The only exceptions are the framebuffer ID to flip
to and the mode ID, that could be referring to an identical mode.
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
v7: drop the mode_id exception for prop changes
---
drivers/gpu/drm/drm_atomic_uapi.c | 47 +++++++++++++++++++++++++++--
drivers/gpu/drm/drm_crtc_internal.h | 2 +-
drivers/gpu/drm/drm_mode_object.c | 2 +-
3 files changed, 46 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index a15121e75a0a..b358de1bf4e7 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1006,13 +1006,28 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_state *state,
return ret;
}
+static int drm_atomic_check_prop_changes(int ret, uint64_t old_val, uint64_t prop_value,
+ struct drm_property *prop)
+{
+ if (ret != 0 || old_val != prop_value) {
+ drm_dbg_atomic(prop->dev,
+ "[PROP:%d:%s] No prop can be changed during async flip\n",
+ prop->base.id, prop->name);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
int drm_atomic_set_property(struct drm_atomic_state *state,
struct drm_file *file_priv,
struct drm_mode_object *obj,
struct drm_property *prop,
- uint64_t prop_value)
+ uint64_t prop_value,
+ bool async_flip)
{
struct drm_mode_object *ref;
+ uint64_t old_val;
int ret;
if (!drm_property_change_valid_get(prop, prop_value, &ref))
@@ -1029,6 +1044,13 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
break;
}
+ if (async_flip) {
+ ret = drm_atomic_connector_get_property(connector, connector_state,
+ prop, &old_val);
+ ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
+ break;
+ }
+
ret = drm_atomic_connector_set_property(connector,
connector_state, file_priv,
prop, prop_value);
@@ -1037,6 +1059,7 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
case DRM_MODE_OBJECT_CRTC: {
struct drm_crtc *crtc = obj_to_crtc(obj);
struct drm_crtc_state *crtc_state;
+ struct drm_mode_config *config = &crtc->dev->mode_config;
crtc_state = drm_atomic_get_crtc_state(state, crtc);
if (IS_ERR(crtc_state)) {
@@ -1044,6 +1067,13 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
break;
}
+ if (async_flip) {
+ ret = drm_atomic_crtc_get_property(crtc, crtc_state,
+ prop, &old_val);
+ ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
+ break;
+ }
+
ret = drm_atomic_crtc_set_property(crtc,
crtc_state, prop, prop_value);
break;
@@ -1051,6 +1081,7 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
case DRM_MODE_OBJECT_PLANE: {
struct drm_plane *plane = obj_to_plane(obj);
struct drm_plane_state *plane_state;
+ struct drm_mode_config *config = &plane->dev->mode_config;
plane_state = drm_atomic_get_plane_state(state, plane);
if (IS_ERR(plane_state)) {
@@ -1058,6 +1089,13 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
break;
}
+ if (async_flip && prop != config->prop_fb_id) {
+ ret = drm_atomic_plane_get_property(plane, plane_state,
+ prop, &old_val);
+ ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
+ break;
+ }
+
ret = drm_atomic_plane_set_property(plane,
plane_state, file_priv,
prop, prop_value);
@@ -1349,6 +1387,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
struct drm_out_fence_state *fence_state;
int ret = 0;
unsigned int i, j, num_fences;
+ bool async_flip = false;
/* disallow for drivers not supporting atomic: */
if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
@@ -1385,6 +1424,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
"commit failed: DRM_MODE_PAGE_FLIP_ASYNC not supported with atomic\n");
return -EINVAL;
}
+
+ async_flip = true;
}
/* can't test and expect an event at the same time. */
@@ -1469,8 +1510,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
goto out;
}
- ret = drm_atomic_set_property(state, file_priv,
- obj, prop, prop_value);
+ ret = drm_atomic_set_property(state, file_priv, obj,
+ prop, prop_value, async_flip);
if (ret) {
drm_mode_object_put(obj);
goto out;
diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
index 8556c3b3ff88..a4c2ea33b1ef 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -251,7 +251,7 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
struct drm_file *file_priv,
struct drm_mode_object *obj,
struct drm_property *prop,
- uint64_t prop_value);
+ uint64_t prop_value, bool async_flip);
int drm_atomic_get_property(struct drm_mode_object *obj,
struct drm_property *property, uint64_t *val);
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
index ac0d2ce3f870..0e8355063eee 100644
--- a/drivers/gpu/drm/drm_mode_object.c
+++ b/drivers/gpu/drm/drm_mode_object.c
@@ -538,7 +538,7 @@ static int set_property_atomic(struct drm_mode_object *obj,
obj_to_connector(obj),
prop_value);
} else {
- ret = drm_atomic_set_property(state, file_priv, obj, prop, prop_value);
+ ret = drm_atomic_set_property(state, file_priv, obj, prop, prop_value, false);
if (ret)
goto out;
ret = drm_atomic_commit(state);
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v7 5/6] drm/doc: Define KMS atomic state set
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
` (3 preceding siblings ...)
2023-10-17 9:28 ` [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes André Almeida
@ 2023-10-17 9:28 ` André Almeida
2023-10-17 9:28 ` [PATCH v7 6/6] amd/display: indicate support for atomic async page-flips on DC André Almeida
2023-10-17 13:47 ` [PATCH v7 0/6] drm: Add support for atomic async page-flip Helen Koike
6 siblings, 0 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, Pekka Paalanen,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, André Almeida, hwentlan,
christian.koenig, joshua
From: Pekka Paalanen <pekka.paalanen@collabora.com>
Specify how the atomic state is maintained between userspace and
kernel, plus the special case for async flips.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
v7:
- add a note that drivers can make exceptions for ad-hoc prop changes
- add a note about flipping the same FB_ID as a no-op
---
Documentation/gpu/drm-uapi.rst | 47 ++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
index 632989df3727..34bd02270ee7 100644
--- a/Documentation/gpu/drm-uapi.rst
+++ b/Documentation/gpu/drm-uapi.rst
@@ -570,3 +570,50 @@ dma-buf interoperability
Please see Documentation/userspace-api/dma-buf-alloc-exchange.rst for
information on how dma-buf is integrated and exposed within DRM.
+
+KMS atomic state
+================
+
+An atomic commit can change multiple KMS properties in an atomic fashion,
+without ever applying intermediate or partial state changes. Either the whole
+commit succeeds or fails, and it will never be applied partially. This is the
+fundamental improvement of the atomic API over the older non-atomic API which is
+referred to as the "legacy API". Applying intermediate state could unexpectedly
+fail, cause visible glitches, or delay reaching the final state.
+
+An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
+complete state change is validated but not applied. Userspace should use this
+flag to validate any state change before asking to apply it. If validation fails
+for any reason, userspace should attempt to fall back to another, perhaps
+simpler, final state. This allows userspace to probe for various configurations
+without causing visible glitches on screen and without the need to undo a
+probing change.
+
+The changes recorded in an atomic commit apply on top the current KMS state in
+the kernel. Hence, the complete new KMS state is the complete old KMS state with
+the committed property settings done on top. The kernel will try to avoid
+no-operation changes, so it is safe for userspace to send redundant property
+settings. However, not every situation allows for no-op changes, due to the
+need to acquire locks for some attributes. Userspace needs to be aware that some
+redundant information might result in oversynchronization issues. No-operation
+changes do not count towards actually needed changes, e.g. setting MODE_ID to a
+different blob with identical contents as the current KMS state shall not be a
+modeset on its own. As a special exception for VRR needs, explicitly setting
+FB_ID to its current value is not a no-op.
+
+A "modeset" is a change in KMS state that might enable, disable, or temporarily
+disrupt the emitted video signal, possibly causing visible glitches on screen. A
+modeset may also take considerably more time to complete than other kinds of
+changes, and the video sink might also need time to adapt to the new signal
+properties. Therefore a modeset must be explicitly allowed with the flag
+DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
+DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
+likely to cause visible disruption on screen and avoid such changes when end
+users do not expect them.
+
+An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
+effectively change only the FB_ID property on any planes. No-operation changes
+are ignored as always. Changing any other property will cause the commit to be
+rejected. Each driver may relax this restriction if they have guarantees that
+such property change doesn't cause modesets. Userspace can use TEST_ONLY commits
+to query the driver about this.
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v7 6/6] amd/display: indicate support for atomic async page-flips on DC
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
` (4 preceding siblings ...)
2023-10-17 9:28 ` [PATCH v7 5/6] drm/doc: Define KMS atomic state set André Almeida
@ 2023-10-17 9:28 ` André Almeida
2023-10-17 13:47 ` [PATCH v7 0/6] drm: Add support for atomic async page-flip Helen Koike
6 siblings, 0 replies; 15+ messages in thread
From: André Almeida @ 2023-10-17 9:28 UTC (permalink / raw)
To: dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
From: Simon Ser <contact@emersion.fr>
amdgpu_dm_commit_planes() already sets the flip_immediate flag for
async page-flips. This flag is used to set the UNP_FLIP_CONTROL
register. Thus, no additional change is required to handle async
page-flips with the atomic uAPI.
Signed-off-by: Simon Ser <contact@emersion.fr>
Reviewed-by: André Almeida <andrealmeid@igalia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 9d5742923aed..c6fd34bab358 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3997,7 +3997,6 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
adev_to_drm(adev)->mode_config.prefer_shadow = 1;
/* indicates support for immediate flip */
adev_to_drm(adev)->mode_config.async_page_flip = true;
- adev_to_drm(adev)->mode_config.atomic_async_page_flip_not_supported = true;
state = kzalloc(sizeof(*state), GFP_KERNEL);
if (!state)
--
2.42.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-17 9:28 ` [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes André Almeida
@ 2023-10-17 10:18 ` Simon Ser
2023-10-17 12:16 ` Simon Ser
2023-10-17 15:55 ` kernel test robot
1 sibling, 1 reply; 15+ messages in thread
From: Simon Ser @ 2023-10-17 10:18 UTC (permalink / raw)
To: André Almeida
Cc: pierre-eric.pelloux-prayer, 'Marek Olšák',
Michel Dänzer, Randy Dunlap, linux-kernel, amd-gfx,
Pekka Paalanen, dri-devel, kernel-dev, alexander.deucher,
hwentlan, christian.koenig, joshua
Reviewed-by: Simon Ser <contact@emersion.fr>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-17 10:18 ` Simon Ser
@ 2023-10-17 12:16 ` Simon Ser
2023-10-22 10:12 ` Michel Dänzer
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ser @ 2023-10-17 12:16 UTC (permalink / raw)
To: André Almeida
Cc: pierre-eric.pelloux-prayer, 'Marek Olšák',
Michel Dänzer, Randy Dunlap, linux-kernel, amd-gfx,
Pekka Paalanen, dri-devel, kernel-dev, alexander.deucher,
hwentlan, christian.koenig, joshua
After discussing with André it seems like we missed a plane type check
here. We need to make sure FB_ID changes are only allowed on primary
planes.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 0/6] drm: Add support for atomic async page-flip
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
` (5 preceding siblings ...)
2023-10-17 9:28 ` [PATCH v7 6/6] amd/display: indicate support for atomic async page-flips on DC André Almeida
@ 2023-10-17 13:47 ` Helen Koike
6 siblings, 0 replies; 15+ messages in thread
From: Helen Koike @ 2023-10-17 13:47 UTC (permalink / raw)
To: André Almeida, dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, 'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
alexander.deucher, hwentlan, christian.koenig, joshua
On 17/10/2023 06:28, André Almeida wrote:
> Hi,
>
> This work from me and Simon adds support for DRM_MODE_PAGE_FLIP_ASYNC through
> the atomic API. This feature is already available via the legacy API. The use
> case is to be able to present a new frame immediately (or as soon as
> possible), even if after missing a vblank. This might result in tearing, but
> it's useful when a high framerate is desired, such as for gaming.
>
> Differently from earlier versions, this one refuses to flip if any prop changes
> for async flips. The idea is that the fast path of immediate page flips doesn't
> play well with modeset changes, so only the fb_id can be changed.
> Thanks,
> André
>
> - User-space patch: https://github.com/Plagman/gamescope/pull/595
> - IGT tests: https://gitlab.freedesktop.org/andrealmeid/igt-gpu-tools/-/tree/atomic_async_page_flip
>
> Changes from v6:
> - Dropped the exception to allow MODE_ID changes (Simon)
> - Clarify what happens when flipping with the same FB_ID (Pekka)
>
> v6: https://lore.kernel.org/dri-devel/20230815185710.159779-1-andrealmeid@igalia.com/
>
> Changes from v5:
> - Add note in the docs that not every redundant attribute will result in no-op,
> some might cause oversynchronization issues.
>
> v5: https://lore.kernel.org/dri-devel/20230707224059.305474-1-andrealmeid@igalia.com/
>
> Changes from v4:
> - Documentation rewrote by Pekka Paalanen
>
> v4: https://lore.kernel.org/dri-devel/20230701020917.143394-1-andrealmeid@igalia.com/
>
> Changes from v3:
> - Add new patch to reject prop changes
> - Add a documentation clarifying the KMS atomic state set
>
> v3: https://lore.kernel.org/dri-devel/20220929184307.258331-1-contact@emersion.fr/
>
> André Almeida (1):
> drm: Refuse to async flip with atomic prop changes
>
> Pekka Paalanen (1):
> drm/doc: Define KMS atomic state set
>
> Simon Ser (4):
> drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits
> drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
> drm: introduce drm_mode_config.atomic_async_page_flip_not_supported
> amd/display: indicate support for atomic async page-flips on DC
>
> Documentation/gpu/drm-uapi.rst | 47 ++++++++++++
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
> drivers/gpu/drm/drm_atomic_uapi.c | 75 +++++++++++++++++--
> drivers/gpu/drm/drm_crtc_internal.h | 2 +-
> drivers/gpu/drm/drm_ioctl.c | 5 ++
> drivers/gpu/drm/drm_mode_object.c | 2 +-
> .../drm/i915/display/intel_display_driver.c | 1 +
> drivers/gpu/drm/nouveau/nouveau_display.c | 1 +
> include/drm/drm_mode_config.h | 11 +++
> include/uapi/drm/drm.h | 10 ++-
> include/uapi/drm/drm_mode.h | 9 +++
> 11 files changed, 155 insertions(+), 9 deletions(-)
>
Hello o/
Maybe it is not related (since there are a few years I don't work on
this) but this reminds me of
https://yhbt.net/lore/all/20190412125827.5877-1-helen.koike@collabora.com/T/
(just sharing for the sake of communication flow)
Regards,
Helen
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-17 9:28 ` [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes André Almeida
2023-10-17 10:18 ` Simon Ser
@ 2023-10-17 15:55 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2023-10-17 15:55 UTC (permalink / raw)
To: André Almeida, dri-devel, amd-gfx, linux-kernel
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Michel Dänzer, Randy Dunlap, Pekka Paalanen, kernel-dev,
oe-kbuild-all, alexander.deucher, hwentlan, christian.koenig,
joshua
Hi André,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm/drm-next linus/master v6.6-rc6 next-20231017]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Andr-Almeida/drm-allow-DRM_MODE_PAGE_FLIP_ASYNC-for-atomic-commits/20231017-173047
base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
patch link: https://lore.kernel.org/r/20231017092837.32428-5-andrealmeid%40igalia.com
patch subject: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20231017/202310172311.kgvIGcqy-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231017/202310172311.kgvIGcqy-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310172311.kgvIGcqy-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/gpu/drm/drm_atomic_uapi.c: In function 'drm_atomic_set_property':
>> drivers/gpu/drm/drm_atomic_uapi.c:1062:41: warning: unused variable 'config' [-Wunused-variable]
1062 | struct drm_mode_config *config = &crtc->dev->mode_config;
| ^~~~~~
vim +/config +1062 drivers/gpu/drm/drm_atomic_uapi.c
1021
1022 int drm_atomic_set_property(struct drm_atomic_state *state,
1023 struct drm_file *file_priv,
1024 struct drm_mode_object *obj,
1025 struct drm_property *prop,
1026 uint64_t prop_value,
1027 bool async_flip)
1028 {
1029 struct drm_mode_object *ref;
1030 uint64_t old_val;
1031 int ret;
1032
1033 if (!drm_property_change_valid_get(prop, prop_value, &ref))
1034 return -EINVAL;
1035
1036 switch (obj->type) {
1037 case DRM_MODE_OBJECT_CONNECTOR: {
1038 struct drm_connector *connector = obj_to_connector(obj);
1039 struct drm_connector_state *connector_state;
1040
1041 connector_state = drm_atomic_get_connector_state(state, connector);
1042 if (IS_ERR(connector_state)) {
1043 ret = PTR_ERR(connector_state);
1044 break;
1045 }
1046
1047 if (async_flip) {
1048 ret = drm_atomic_connector_get_property(connector, connector_state,
1049 prop, &old_val);
1050 ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
1051 break;
1052 }
1053
1054 ret = drm_atomic_connector_set_property(connector,
1055 connector_state, file_priv,
1056 prop, prop_value);
1057 break;
1058 }
1059 case DRM_MODE_OBJECT_CRTC: {
1060 struct drm_crtc *crtc = obj_to_crtc(obj);
1061 struct drm_crtc_state *crtc_state;
> 1062 struct drm_mode_config *config = &crtc->dev->mode_config;
1063
1064 crtc_state = drm_atomic_get_crtc_state(state, crtc);
1065 if (IS_ERR(crtc_state)) {
1066 ret = PTR_ERR(crtc_state);
1067 break;
1068 }
1069
1070 if (async_flip) {
1071 ret = drm_atomic_crtc_get_property(crtc, crtc_state,
1072 prop, &old_val);
1073 ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
1074 break;
1075 }
1076
1077 ret = drm_atomic_crtc_set_property(crtc,
1078 crtc_state, prop, prop_value);
1079 break;
1080 }
1081 case DRM_MODE_OBJECT_PLANE: {
1082 struct drm_plane *plane = obj_to_plane(obj);
1083 struct drm_plane_state *plane_state;
1084 struct drm_mode_config *config = &plane->dev->mode_config;
1085
1086 plane_state = drm_atomic_get_plane_state(state, plane);
1087 if (IS_ERR(plane_state)) {
1088 ret = PTR_ERR(plane_state);
1089 break;
1090 }
1091
1092 if (async_flip && prop != config->prop_fb_id) {
1093 ret = drm_atomic_plane_get_property(plane, plane_state,
1094 prop, &old_val);
1095 ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
1096 break;
1097 }
1098
1099 ret = drm_atomic_plane_set_property(plane,
1100 plane_state, file_priv,
1101 prop, prop_value);
1102 break;
1103 }
1104 default:
1105 drm_dbg_atomic(prop->dev, "[OBJECT:%d] has no properties\n", obj->id);
1106 ret = -EINVAL;
1107 break;
1108 }
1109
1110 drm_property_change_valid_put(prop, ref);
1111 return ret;
1112 }
1113
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-17 12:16 ` Simon Ser
@ 2023-10-22 10:12 ` Michel Dänzer
2023-10-23 8:27 ` Simon Ser
0 siblings, 1 reply; 15+ messages in thread
From: Michel Dänzer @ 2023-10-22 10:12 UTC (permalink / raw)
To: Simon Ser, André Almeida
Cc: pierre-eric.pelloux-prayer, 'Marek Olšák',
Randy Dunlap, linux-kernel, amd-gfx, Pekka Paalanen, dri-devel,
kernel-dev, alexander.deucher, hwentlan, christian.koenig,
joshua
On 10/17/23 14:16, Simon Ser wrote:
> After discussing with André it seems like we missed a plane type check
> here. We need to make sure FB_ID changes are only allowed on primary
> planes.
Can you elaborate why that's needed?
--
Earthling Michel Dänzer | https://redhat.com
Libre software enthusiast | Mesa and Xwayland developer
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-22 10:12 ` Michel Dänzer
@ 2023-10-23 8:27 ` Simon Ser
2023-10-23 8:42 ` Michel Dänzer
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ser @ 2023-10-23 8:27 UTC (permalink / raw)
To: Michel Dänzer
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Randy Dunlap, linux-kernel, amd-gfx, Pekka Paalanen, dri-devel,
kernel-dev, alexander.deucher, hwentlan, christian.koenig,
joshua
On Sunday, October 22nd, 2023 at 12:12, Michel Dänzer <michel.daenzer@mailbox.org> wrote:
> On 10/17/23 14:16, Simon Ser wrote:
>
> > After discussing with André it seems like we missed a plane type check
> > here. We need to make sure FB_ID changes are only allowed on primary
> > planes.
>
> Can you elaborate why that's needed?
Current drivers are in general not prepared to perform async page-flips
on planes other than primary. For instance I don't think i915 has logic
to perform async page-flip on an overlay plane FB_ID change.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-23 8:27 ` Simon Ser
@ 2023-10-23 8:42 ` Michel Dänzer
2023-10-23 8:44 ` Simon Ser
0 siblings, 1 reply; 15+ messages in thread
From: Michel Dänzer @ 2023-10-23 8:42 UTC (permalink / raw)
To: Simon Ser
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Randy Dunlap, linux-kernel, amd-gfx, Pekka Paalanen, dri-devel,
kernel-dev, alexander.deucher, hwentlan, christian.koenig,
joshua
On 10/23/23 10:27, Simon Ser wrote:
> On Sunday, October 22nd, 2023 at 12:12, Michel Dänzer <michel.daenzer@mailbox.org> wrote:
>> On 10/17/23 14:16, Simon Ser wrote:
>>
>>> After discussing with André it seems like we missed a plane type check
>>> here. We need to make sure FB_ID changes are only allowed on primary
>>> planes.
>>
>> Can you elaborate why that's needed?
>
> Current drivers are in general not prepared to perform async page-flips
> on planes other than primary. For instance I don't think i915 has logic
> to perform async page-flip on an overlay plane FB_ID change.
That should be handled in the driver's atomic_check then?
Async flips of overlay planes would be useful e.g. for presenting a windowed application with tearing, while the rest of the desktop is tear-free.
--
Earthling Michel Dänzer | https://redhat.com
Libre software enthusiast | Mesa and Xwayland developer
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes
2023-10-23 8:42 ` Michel Dänzer
@ 2023-10-23 8:44 ` Simon Ser
0 siblings, 0 replies; 15+ messages in thread
From: Simon Ser @ 2023-10-23 8:44 UTC (permalink / raw)
To: Michel Dänzer
Cc: pierre-eric.pelloux-prayer, André Almeida,
'Marek Olšák',
Randy Dunlap, linux-kernel, amd-gfx, Pekka Paalanen, dri-devel,
kernel-dev, alexander.deucher, hwentlan, christian.koenig,
joshua
On Monday, October 23rd, 2023 at 10:42, Michel Dänzer <michel.daenzer@mailbox.org> wrote:
> On 10/23/23 10:27, Simon Ser wrote:
>
> > On Sunday, October 22nd, 2023 at 12:12, Michel Dänzer michel.daenzer@mailbox.org wrote:
> >
> > > On 10/17/23 14:16, Simon Ser wrote:
> > >
> > > > After discussing with André it seems like we missed a plane type check
> > > > here. We need to make sure FB_ID changes are only allowed on primary
> > > > planes.
> > >
> > > Can you elaborate why that's needed?
> >
> > Current drivers are in general not prepared to perform async page-flips
> > on planes other than primary. For instance I don't think i915 has logic
> > to perform async page-flip on an overlay plane FB_ID change.
>
>
> That should be handled in the driver's atomic_check then?
>
> Async flips of overlay planes would be useful e.g. for presenting a windowed application with tearing, while the rest of the desktop is tear-free.
Yes, that would be useful, but requires more work. Small steps: first
expose what the legacy uAPI can do in atomic, then later extend that in
some drivers.
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2023-10-23 8:45 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-17 9:28 [PATCH v7 0/6] drm: Add support for atomic async page-flip André Almeida
2023-10-17 9:28 ` [PATCH v7 1/6] drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits André Almeida
2023-10-17 9:28 ` [PATCH v7 2/6] drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP André Almeida
2023-10-17 9:28 ` [PATCH v7 3/6] drm: introduce drm_mode_config.atomic_async_page_flip_not_supported André Almeida
2023-10-17 9:28 ` [PATCH v7 4/6] drm: Refuse to async flip with atomic prop changes André Almeida
2023-10-17 10:18 ` Simon Ser
2023-10-17 12:16 ` Simon Ser
2023-10-22 10:12 ` Michel Dänzer
2023-10-23 8:27 ` Simon Ser
2023-10-23 8:42 ` Michel Dänzer
2023-10-23 8:44 ` Simon Ser
2023-10-17 15:55 ` kernel test robot
2023-10-17 9:28 ` [PATCH v7 5/6] drm/doc: Define KMS atomic state set André Almeida
2023-10-17 9:28 ` [PATCH v7 6/6] amd/display: indicate support for atomic async page-flips on DC André Almeida
2023-10-17 13:47 ` [PATCH v7 0/6] drm: Add support for atomic async page-flip Helen Koike
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).