]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
drm/atomic: Filter out redundant DPMS calls
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 19 Feb 2025 16:02:39 +0000 (18:02 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 10 Mar 2025 16:18:37 +0000 (18:18 +0200)
Video players (eg. mpv) do periodic XResetScreenSaver() calls to
keep the screen on while the video playing. The modesetting ddx
plumbs these straight through into the kernel as DPMS setproperty
ioctls, without any filtering whatsoever. When implemented via
atomic these end up as empty commits on the crtc (which will
nonetheless take one full frame), which leads to a dropped
frame every time XResetScreenSaver() is called.

Let's just filter out redundant DPMS property changes in the
kernel to avoid this issue.

v2: Explain the resulting commits a bit better (Sima)
    Document the behaviour in uapi docs (Sima)

Cc: stable@vger.kernel.org
Testcase: igt/kms_flip/flip-vs-dpms-on-nop
Reviewed-by: Simona Vetter <simona.vetter@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250219160239.17502-1-ville.syrjala@linux.intel.com
drivers/gpu/drm/drm_atomic_uapi.c
drivers/gpu/drm/drm_connector.c

index 370dc676e3aa543c9827b50df20df78f02b738c9..fd36b8fd54e9e17545f9bb64caf76921dac8c138 100644 (file)
@@ -956,6 +956,10 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_state *state,
 
        if (mode != DRM_MODE_DPMS_ON)
                mode = DRM_MODE_DPMS_OFF;
+
+       if (connector->dpms == mode)
+               goto out;
+
        connector->dpms = mode;
 
        crtc = connector->state->crtc;
index 5f24d6b41cc6d2fc54b085b2c39f31d9f0e6c3c5..48b08c9611a7bc70e4d849ff33ecf1c9de3cf0ae 100644 (file)
@@ -1427,6 +1427,10 @@ EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
  *     callback. For atomic drivers the remapping to the "ACTIVE" property is
  *     implemented in the DRM core.
  *
+ *     On atomic drivers any DPMS setproperty ioctl where the value does not
+ *     change is completely skipped, otherwise a full atomic commit will occur.
+ *     On legacy drivers the exact behavior is driver specific.
+ *
  *     Note that this property cannot be set through the MODE_ATOMIC ioctl,
  *     userspace must use "ACTIVE" on the CRTC instead.
  *