diff options
-rw-r--r-- | dix/pixmap.c | 13 | ||||
-rw-r--r-- | glamor/glamor.c | 9 | ||||
-rw-r--r-- | glamor/glamor.h | 1 | ||||
-rw-r--r-- | hw/xfree86/drivers/modesetting/driver.c | 11 | ||||
-rw-r--r-- | include/pixmap.h | 3 | ||||
-rw-r--r-- | include/scrnintstr.h | 4 |
6 files changed, 41 insertions, 0 deletions
diff --git a/dix/pixmap.c b/dix/pixmap.c index 11d83fe00..a696c92e4 100644 --- a/dix/pixmap.c +++ b/dix/pixmap.c @@ -392,3 +392,16 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty) pScreen->SourceValidate = SourceValidate; return TRUE; } + +void WaitSharedPixmap(PixmapPtr pSharedPix) +{ + ScreenPtr mscreen; + if (!pSharedPix->master_pixmap) + return; + + mscreen = pSharedPix->master_pixmap->drawable.pScreen; + if (!mscreen->WaitSharedPixmap) + return; + + mscreen->WaitSharedPixmap(pSharedPix->master_pixmap); +} diff --git a/glamor/glamor.c b/glamor/glamor.c index e9c1d9ed3..f356ab1d2 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -808,3 +808,12 @@ glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size) } return -1; } + +void +glamor_finish(ScreenPtr screen) +{ + glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); + + glamor_make_current(glamor_priv); + glFinish(); +} diff --git a/glamor/glamor.h b/glamor/glamor.h index a73e9eff0..e27033a84 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -336,6 +336,7 @@ extern _X_EXPORT void glamor_destroy_gc(GCPtr gc); extern Bool _X_EXPORT glamor_change_window_attributes(WindowPtr pWin, unsigned long mask); extern void _X_EXPORT glamor_copy_window(WindowPtr window, DDXPointRec old_origin, RegionPtr src_region); +extern _X_EXPORT void glamor_finish(ScreenPtr screen); #define HAS_GLAMOR_TEXT 1 #ifdef GLAMOR_FOR_XORG diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index 8f60eae57..f5ef17387 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -570,6 +570,7 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty) RegionRec pixregion; + WaitSharedPixmap(dirty->slave_dst); PixmapRegionInit(&pixregion, dirty->slave_dst); DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); PixmapSyncDirtyHelper(dirty); @@ -1098,6 +1099,15 @@ SetMaster(ScrnInfoPtr pScrn) return ret == 0; } +static void +msWaitSharedPixmap(PixmapPtr pPixmap) +{ + ScreenPtr pScreen = pPixmap->drawable.pScreen; +#ifdef GLAMOR_HAS_GBM + glamor_finish(pScreen); +#endif +} + static Bool ScreenInit(ScreenPtr pScreen, int argc, char **argv) { @@ -1217,6 +1227,7 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv) pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking; pScreen->StartPixmapTracking = PixmapStartDirtyTracking; pScreen->StopPixmapTracking = PixmapStopDirtyTracking; + pScreen->WaitSharedPixmap = msWaitSharedPixmap; if (!xf86CrtcScreenInit(pScreen)) return FALSE; diff --git a/include/pixmap.h b/include/pixmap.h index c6a773649..c1fc033c0 100644 --- a/include/pixmap.h +++ b/include/pixmap.h @@ -130,4 +130,7 @@ PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst); extern _X_EXPORT Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty); +extern _X_EXPORT void +WaitSharedPixmap(PixmapPtr pSharedPix); + #endif /* PIXMAP_H */ diff --git a/include/scrnintstr.h b/include/scrnintstr.h index 2e617c466..e8087357f 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -358,6 +358,8 @@ typedef WindowPtr (*XYToWindowProcPtr)(ScreenPtr pScreen, typedef int (*NameWindowPixmapProcPtr)(WindowPtr, PixmapPtr, CARD32); +typedef void (*WaitSharedPixmapProcPtr)(PixmapPtr); + /* Wrapping Screen procedures There are a few modules in the X server which dynamically add and @@ -610,6 +612,8 @@ typedef struct _Screen { ReplaceScanoutPixmapProcPtr ReplaceScanoutPixmap; XYToWindowProcPtr XYToWindow; + + WaitSharedPixmapProcPtr WaitSharedPixmap; } ScreenRec; static inline RegionPtr |