Skip to content
  • Roman Gilg's avatar
    [DRM plugin] Remember static kernel objects, amplify use of DrmCrtc · a0571ccf
    Roman Gilg authored
    To get an image from KWin to the screen in the DRM pipeline we combine a CRTC,
    an encoder and a connector. These objects are static in the sense, that they
    represent real hardware on the graphics card, which doesn't change in a
    session. See here for more details:
    https://01.org/linuxgraphics/gfx-docs/drm/gpu/drm-kms.html
    
    Until now we used DrmOutput as the main representation for such an active
    rendering pipeline. I.e. it gets created and destroyed on hot plug events of
    displays. On the other side we had no fixed representation of the static kernel
    objects throughout the lifetime of KWin. This has several disadvantages:
    * We always need to query all available static objects on an hot plug event.
    * We can't manipulate the frame buffer of a CRTC after an output has been
      disconnected
    * Adding functionality for driving multiple displays on a single CRTC (i.e.
      cloning) would be difficult
    * We can't destroy the last frame buffer on display disconnect because the CRTC
      still accesses it and have therefore a memory leak on every display disconnect
    
    This patch  solves these issues by storing representations of all available CRTC
    and Connector objects in DrmBackend on init via DrmCrtc and DrmConnector
    instances. On an hotplug event these vectors are looped for a fitting CRTC and
    Connector combinations. Buffer handling is moved to the respective CRTC
    instance. All changes in overview:
    * Query all available CRTCs and Connectors and save for subsequent hotplug
      events
    * Fix logic errors in `queryResources()`
    * Move framebuffers, buffer flip and blank logic in DrmCrtc
    * Remove `restoreSaved()`. It isn't necessary and is dangerous if the old
      framebuffer was deleted in the meantime. Also could reveal sensitive user
      info from old session.
    
    Test Plan:
    Login, logout, VT switching, connect and disconnect external monitor, energy
    saving mode.
    
    Reviewers: #kwin
    
    Subscribers: kwin, #kwin
    
    Tags: #kwin
    
    Differential Revision: https://phabricator.kde.org/D5118
    a0571ccf