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>
This commit is contained in:
parent
ea0e4d752b
commit
a79fbfd707
|
@ -531,6 +531,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
|
static void
|
||||||
msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask)
|
msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask)
|
||||||
{
|
{
|
||||||
|
@ -544,6 +576,8 @@ msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask)
|
||||||
dispatch_slave_dirty(pScreen);
|
dispatch_slave_dirty(pScreen);
|
||||||
else if (ms->dirty_enabled)
|
else if (ms->dirty_enabled)
|
||||||
dispatch_dirty(pScreen);
|
dispatch_dirty(pScreen);
|
||||||
|
|
||||||
|
ms_dirty_update(pScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -727,6 +761,10 @@ PreInit(ScrnInfoPtr pScrn, int flags)
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
if (value & DRM_PRIME_CAP_IMPORT)
|
if (value & DRM_PRIME_CAP_IMPORT)
|
||||||
pScrn->capabilities |= RR_Capability_SinkOutput;
|
pScrn->capabilities |= RR_Capability_SinkOutput;
|
||||||
|
#if GLAMOR_HAS_GBM_LINEAR
|
||||||
|
if (value & DRM_PRIME_CAP_EXPORT)
|
||||||
|
pScrn->capabilities |= RR_Capability_SourceOutput;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
drmmode_get_default_bpp(pScrn, &ms->drmmode, &defaultdepth, &defaultbpp);
|
drmmode_get_default_bpp(pScrn, &ms->drmmode, &defaultdepth, &defaultbpp);
|
||||||
|
@ -937,6 +975,23 @@ msShadowInit(ScreenPtr pScreen)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static Bool
|
||||||
msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
|
msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
|
||||||
{
|
{
|
||||||
|
@ -1089,7 +1144,10 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
|
||||||
ms->BlockHandler = pScreen->BlockHandler;
|
ms->BlockHandler = pScreen->BlockHandler;
|
||||||
pScreen->BlockHandler = msBlockHandler;
|
pScreen->BlockHandler = msBlockHandler;
|
||||||
|
|
||||||
|
pScreen->SharePixmapBacking = msSharePixmapBacking;
|
||||||
pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking;
|
pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking;
|
||||||
|
pScreen->StartPixmapTracking = PixmapStartDirtyTracking;
|
||||||
|
pScreen->StopPixmapTracking = PixmapStopDirtyTracking;
|
||||||
|
|
||||||
if (!xf86CrtcScreenInit(pScreen))
|
if (!xf86CrtcScreenInit(pScreen))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user