Skip to content
  • Martin Flöser's avatar
    [platforms/drm] Use a shared pointer for gbm_surface · 47343fb8
    Martin Flöser authored
    Summary:
    The gbm_surface is owned by the EglGbmBackend, but it's not the only one
    using it. The DrmSurfaceBuffer is also using it and needs it to destroy
    the gbm_bo. Now this can become a problem in the following situation:
    
    * a page flip is still pending
    * the EglGbmBackend destroys the gbm_surface
    
    -> when the page flip happens the DrmSurfaceBuffer will try to destroy
    the gbm_bo and crash as the gbm_surface is no longer valid. This
    situation can happen when switching screens or when switching compositing
    backend (OpenGL 2 -> OpenGL 3).
    
    To address this problem a class GbmSurface is added which wrapps the
    gbm_surface pointer. The EglGbmBackend creates and holds a shared pointer
    to the GbmSurface and passes that one to the DrmSurfaceBuffer. So when
    cleaning up the gbm_surface only the shared pointer is reset and in case
    the DrmSurfaceBuffer still needs it, it can access it without problems.
    
    BUG: 385372
    FIXED-IN: 5.11.0
    
    Test Plan: Not yet
    
    Reviewers: #kwin, #plasma, subdiff
    
    Subscribers: plasma-devel, kwin
    
    Tags: #kwin
    
    Differential Revision: https://phabricator.kde.org/D8152
    47343fb8