From: Michel Dänzer <michel.daen...@amd.com>

Preparation for following changes, no functional change intended yet.

Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> # v1
Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---

v2: Add drmmode_screen_damage_destroy to prevent use-after-free on
    server shutdown

 src/drmmode_display.c | 21 ++++++++++++++-------
 src/radeon_kms.c      |  2 +-
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 245a92fb0..309ccbd6d 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -529,11 +529,8 @@ drmmode_crtc_scanout_free(drmmode_crtc_private_ptr 
drmmode_crtc)
                                             &drmmode_crtc->scanout[1]);
        }
 
-       if (drmmode_crtc->scanout_damage) {
+       if (drmmode_crtc->scanout_damage)
                DamageDestroy(drmmode_crtc->scanout_damage);
-               drmmode_crtc->scanout_damage = NULL;
-               RegionUninit(&drmmode_crtc->scanout_last_region);
-       }
 }
 
 void
@@ -605,6 +602,15 @@ radeon_screen_damage_report(DamagePtr damage, RegionPtr 
region, void *closure)
        damage->damage.data = NULL;
 }
 
+static void
+drmmode_screen_damage_destroy(DamagePtr damage, void *closure)
+{
+       drmmode_crtc_private_ptr drmmode_crtc = closure;
+
+       drmmode_crtc->scanout_damage = NULL;
+       RegionUninit(&drmmode_crtc->scanout_last_region);
+}
+
 static Bool
 drmmode_can_use_hw_cursor(xf86CrtcPtr crtc)
 {
@@ -793,9 +799,10 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, 
DisplayModePtr mode,
                if (!drmmode_crtc->scanout_damage) {
                        drmmode_crtc->scanout_damage =
                                DamageCreate(radeon_screen_damage_report,
-                                            NULL, DamageReportRawRegion,
-                                            TRUE, screen, NULL);
-                       
DamageRegister(&screen->GetScreenPixmap(screen)->drawable,
+                                            drmmode_screen_damage_destroy,
+                                            DamageReportRawRegion,
+                                            TRUE, screen, drmmode_crtc);
+                       DamageRegister(&screen->root->drawable,
                                       drmmode_crtc->scanout_damage);
                }
 
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index b22c98406..f76d76a91 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -981,7 +981,7 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int 
scanout_id)
        GCPtr gc = GetScratchGC(pDraw->depth, pScreen);
 
        ValidateGC(pDraw, gc);
-       (*gc->ops->CopyArea)(&pScreen->GetScreenPixmap(pScreen)->drawable,
+       (*gc->ops->CopyArea)(&pScreen->GetWindowPixmap(pScreen->root)->drawable,
                             pDraw, gc,
                             xf86_crtc->x + extents.x1, xf86_crtc->y + 
extents.y1,
                             extents.x2 - extents.x1, extents.y2 - extents.y1,
-- 
2.13.3

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

Reply via email to