diff options
author | Dave Airlie <airlied@gmail.com> | 2015-06-09 17:15:44 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-06-30 12:17:55 +1000 |
commit | a79fbfd707e1d745b670def08287241c87e11c28 (patch) | |
tree | 60aa0ae80a1b32fd4708c53d5f8d871e07303068 | |
parent | ea0e4d752b778c1f2132f8d29542f7dabc296415 (diff) |
modesetting: add output master support
This allows a glamor enabled master device to have
slave USB devices attached.
Tested with modesetting on SNB + USB.
It relies on the previous patch to export linear
buffers from glamor.
Acked-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | hw/xfree86/drivers/modesetting/driver.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index e90e4b842..092cc5307 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -532,6 +532,38 @@ dispatch_slave_dirty(ScreenPtr pScreen) } static void +redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty) +{ + + RegionRec pixregion; + + PixmapRegionInit(&pixregion, dirty->slave_dst); + DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); + PixmapSyncDirtyHelper(dirty, &pixregion); + + DamageRegionProcessPending(&dirty->slave_dst->drawable); + RegionUninit(&pixregion); +} + +static void +ms_dirty_update(ScreenPtr screen) +{ + RegionPtr region; + PixmapDirtyUpdatePtr ent; + + if (xorg_list_is_empty(&screen->pixmap_dirty_list)) + return; + + xorg_list_for_each_entry(ent, &screen->pixmap_dirty_list, ent) { + region = DamageRegion(ent->damage); + if (RegionNotEmpty(region)) { + redisplay_dirty(screen, ent); + DamageEmpty(ent->damage); + } + } +} + +static void msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask) { modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen)); @@ -544,6 +576,8 @@ msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask) dispatch_slave_dirty(pScreen); else if (ms->dirty_enabled) dispatch_dirty(pScreen); + + ms_dirty_update(pScreen); } static void @@ -727,6 +761,10 @@ PreInit(ScrnInfoPtr pScrn, int flags) if (ret == 0) { if (value & DRM_PRIME_CAP_IMPORT) pScrn->capabilities |= RR_Capability_SinkOutput; +#if GLAMOR_HAS_GBM_LINEAR + if (value & DRM_PRIME_CAP_EXPORT) + pScrn->capabilities |= RR_Capability_SourceOutput; +#endif } #endif drmmode_get_default_bpp(pScrn, &ms->drmmode, &defaultdepth, &defaultbpp); @@ -938,6 +976,23 @@ msShadowInit(ScreenPtr pScreen) } static Bool +msSharePixmapBacking(PixmapPtr ppix, ScreenPtr screen, void **handle) +{ +#ifdef GLAMOR_HAS_GBM + int ret; + CARD16 stride; + CARD32 size; + ret = glamor_fd_from_pixmap(ppix->drawable.pScreen, ppix, &stride, &size); + if (ret == -1) + return FALSE; + + *handle = (void *)(long)(ret); + return TRUE; +#endif + return FALSE; +} + +static Bool msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle) { ScreenPtr screen = ppix->drawable.pScreen; @@ -1089,7 +1144,10 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv) ms->BlockHandler = pScreen->BlockHandler; pScreen->BlockHandler = msBlockHandler; + pScreen->SharePixmapBacking = msSharePixmapBacking; pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking; + pScreen->StartPixmapTracking = PixmapStartDirtyTracking; + pScreen->StopPixmapTracking = PixmapStopDirtyTracking; if (!xf86CrtcScreenInit(pScreen)) return FALSE; |