=== Adaptive sync and variable refresh rate ===

Adaptive sync is part of the DisplayPort spec and allows for graphics adapters 
to drive displays with varying frame timings.

Variable refresh rate (VRR) is essentially the same, but defined for HDMI.

=== Use cases for variable refresh rate ===

Variable frame (flip) timings don't align well with fixed refresh rate 
displays. This results in stuttering, tearing and/or input lag. By adjusting 
the display refresh rate dynamically these issues can be reduced or eliminated.

However, not all content is suitable for dynamic refresh adaptation. Content 
that is flipped infrequently or at random intervals tends to fair poorly. 
Multiple clients trying to flip under the same screen can similarly interfere 
with prediction.

Userland needs a way to let the driver know when the content on the screen is 
suitable for variable refresh rate and if the user wishes to have the feature 
enabled.

=== DRM API to support variable refresh rates ===

This patch introduces a new API via atomic properties on the DRM connector and 
CRTC.

The connector has two new optional properties:

* bool variable_refresh_capable - set by the driver if the hardware is capable 
of supporting variable refresh tech

* bool variable_refresh_enabled - set by the user to enable variable refresh 
adjustment over the connector

The CRTC has one additional default property:

* bool variable_refresh - a content hint to the driver specifying that the CRTC 
contents are suitable for variable refresh adjustment

== Overview for DRM driver developers ===

Driver developers can attach the optional connector properties via 
drm_connector_attach_variable_refresh_properties on connectors that support 
variable refresh (typically DP or HDMI).

The variable_refresh_capable property should be managed as the output on the 
connector changes. The property is read only from userspace.

The variable_refresh_enabled property is intended to be a property controlled 
by userland as a global on/off switch for variable refresh technology. It 
should be checked before enabling variable refresh rate.

=== Overview for Userland developers ==

The variable_refresh property on the CRTC should be set to true when the CRTCs 
are suitable for variable refresh rate. In practice this is probably an 
application like a game - a single window that covers the whole CRTC surface 
and is the only client issuing flips.

To demonstrate the suitability of the API for variable refresh and dynamic 
adaptation there are additional patches using this API that implement adaptive 
variable refresh across kernel and userland projects:

- DRM (dri-devel)
- amdgpu DRM kernel driver (amd-gfx)
- xf86-video-amdgpu (amd-gfx)
- mesa (mesa-dev)

These patches enable adaptive variable refresh on X for AMD hardware provided 
that the user sets the variable_refresh_enabled property to true on supported 
connectors (ie. using xrandr --set-prop).

They have been tested on upstream userland under GNOME/KDE desktop environments 
under single and multi-monitor setups for a number of GL applications. Most 
games and benchmarks should work as expected provided that the compositor 
correctly unredirects the application's surface. KDE seems to have the best 
support for this with an explicit option to disable tearing support.

Full implementation details for these changes can be reviewed in their 
respective mailing lists.

=== Previous discussions ===

These patches are based upon feedback from patches and feedback from two 
previous threads on the subject which are linked below for reference:

https://lists.freedesktop.org/archives/amd-gfx/2018-April/021047.html
https://lists.freedesktop.org/archives/dri-devel/2017-October/155207.html

Nicholas Kazlauskas

Anthony Koo (1):
  drm/amd/display: Refactor FreeSync module

Harry Wentland (3):
  drm/amdgpu: fill in amdgpu_dm_remove_sink_from_freesync_module
  drm/amdgpu/display: add freesync drm properties
  drm/amdgpu: add freesync ioctl

Nicholas Kazlauskas (5):
  drm: Add variable refresh rate properties to DRM connector
  drm: Add variable refresh property to DRM CRTC
  drm/amd/display: Replace FreeSync props with DRM VRR props
  drm/amd/display: Drop FreeSync ioctl notification support
  drm/amdgpu: Drop unneeded freesync properties from amdpgu

 drivers/gpu/drm/amd/amdgpu/amdgpu.h           |    3 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c   |   16 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c       |    3 +-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  240 +--
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |   17 +-
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   |   10 +-
 drivers/gpu/drm/amd/display/dc/core/dc.c      |   60 +-
 .../gpu/drm/amd/display/dc/core/dc_link_dp.c  |    3 +
 .../gpu/drm/amd/display/dc/core/dc_resource.c |  110 +-
 drivers/gpu/drm/amd/display/dc/dc_hw_types.h  |    6 -
 drivers/gpu/drm/amd/display/dc/dc_stream.h    |   29 +-
 drivers/gpu/drm/amd/display/dc/dc_types.h     |   22 +-
 .../display/dc/dce110/dce110_hw_sequencer.c   |   34 +-
 .../amd/display/dc/dcn10/dcn10_hw_sequencer.c |   27 +-
 .../drm/amd/display/include/set_mode_types.h  |   12 -
 .../amd/display/modules/freesync/freesync.c   | 1837 ++++++-----------
 .../amd/display/modules/inc/mod_freesync.h    |  144 +-
 drivers/gpu/drm/drm_atomic.c                  |   15 +
 drivers/gpu/drm/drm_atomic_helper.c           |    1 +
 drivers/gpu/drm/drm_connector.c               |   35 +
 drivers/gpu/drm/drm_crtc.c                    |    2 +
 drivers/gpu/drm/drm_mode_config.c             |    6 +
 include/drm/drm_connector.h                   |   27 +
 include/drm/drm_crtc.h                        |   13 +
 include/drm/drm_mode_config.h                 |    8 +
 include/uapi/drm/amdgpu_drm.h                 |   16 +
 26 files changed, 1026 insertions(+), 1670 deletions(-)

-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to