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
 | 
			
		||||
msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -937,6 +975,23 @@ msShadowInit(ScreenPtr pScreen)
 | 
			
		|||
    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
 | 
			
		||||
msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue