From: Michel Dänzer <michel.daenzer@xxxxxxx> This allows deferring shared pixmap updates between different drivers. Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> --- This change requires a corresponding xserver change adding the SyncSharedPixmap field. I'll only push it once the xserver change has landed. src/radeon_kms.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/radeon_kms.c b/src/radeon_kms.c index 0c8996d..f43c30f 100644 --- a/src/radeon_kms.c +++ b/src/radeon_kms.c @@ -485,6 +485,35 @@ radeon_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) } } + +#if HAS_SYNC_SHARED_PIXMAP + +static Bool +master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +{ + ScreenPtr master_screen = dirty->src->master_pixmap->drawable.pScreen; + + return master_screen->SyncSharedPixmap != NULL; +} + +static Bool +slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +{ + ScreenPtr slave_screen = dirty->slave_dst->drawable.pScreen; + + return slave_screen->SyncSharedPixmap != NULL; +} + +static void +call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) +{ + ScreenPtr master_screen = dirty->src->master_pixmap->drawable.pScreen; + + master_screen->SyncSharedPixmap(dirty); +} + +#else /* !HAS_SYNC_SHARED_PIXMAP */ + static Bool master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { @@ -501,6 +530,15 @@ slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) return slave_scrn->driverName == scrn->driverName; } +static void +call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) +{ + radeon_sync_shared_pixmap(dirty); +} + +#endif /* HAS_SYNC_SHARED_PIXMAPS */ + + void radeon_prime_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t usec, void *event_data) @@ -518,7 +556,7 @@ radeon_prime_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t u continue; if (master_has_sync_shared_pixmap(scrn, dirty)) - radeon_sync_shared_pixmap(dirty); + call_sync_shared_pixmap(dirty); region = dirty_region(dirty); redisplay_dirty(dirty, region); @@ -2128,6 +2166,9 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL) #ifdef RADEON_PIXMAP_SHARING pScreen->StartPixmapTracking = PixmapStartDirtyTracking; pScreen->StopPixmapTracking = PixmapStopDirtyTracking; +#if HAS_SYNC_SHARED_PIXMAP + pScreen->SyncSharedPixmap = radeon_sync_shared_pixmap; +#endif #endif if (!xf86CrtcScreenInit (pScreen)) -- 2.9.3