From: Dave Airlie <airl...@redhat.com> Just add the interfaces to attach/detach output slaves, and a linked list to keep track of them. Hook up the randr providers list to include these slaves.
v1.1: add another assert to the add path. Signed-off-by: Dave Airlie <airl...@redhat.com> --- dix/dispatch.c | 17 +++++++++++++++++ include/screenint.h | 6 ++++++ include/scrnintstr.h | 3 +++ randr/rrprovider.c | 7 +++++++ 4 files changed, 33 insertions(+) diff --git a/dix/dispatch.c b/dix/dispatch.c index 9e84621..29ac5a4 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -3743,6 +3743,7 @@ static int init_screen(ScreenPtr pScreen, int i, Bool gpu) pScreen->CreateScreenResources = 0; xorg_list_init(&pScreen->unattached_list); + xorg_list_init(&pScreen->output_slave_list); /* * This loop gets run once for every Screen that gets added, @@ -3909,3 +3910,19 @@ DetachUnboundGPU(ScreenPtr slave) slave->current_master = NULL; } +void +AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new) +{ + assert(new->isGPU); + assert(!new->current_master); + xorg_list_add(&new->output_head, &pScreen->output_slave_list); + new->current_master = pScreen; +} + +void +DetachOutputGPU(ScreenPtr slave) +{ + assert(slave->isGPU); + xorg_list_del(&slave->output_head); + slave->current_master = NULL; +} diff --git a/include/screenint.h b/include/screenint.h index c0c60ef..b992cc2 100644 --- a/include/screenint.h +++ b/include/screenint.h @@ -76,6 +76,12 @@ AttachUnboundGPU(ScreenPtr pScreen, ScreenPtr new); extern _X_EXPORT void DetachUnboundGPU(ScreenPtr unbound); +extern _X_EXPORT void +AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new); + +extern _X_EXPORT void +DetachOutputGPU(ScreenPtr output); + typedef struct _ColormapRec *ColormapPtr; #endif /* SCREENINT_H */ diff --git a/include/scrnintstr.h b/include/scrnintstr.h index 6b738de..7efc5c3 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -485,6 +485,9 @@ typedef struct _Screen { ScreenPtr current_master; + struct xorg_list output_slave_list; + struct xorg_list output_head; + } ScreenRec; static inline RegionPtr diff --git a/randr/rrprovider.c b/randr/rrprovider.c index 0a801d4..33cb77d 100644 --- a/randr/rrprovider.c +++ b/randr/rrprovider.c @@ -72,6 +72,10 @@ ProcRRGetProviders (ClientPtr client) if (pScrPriv->provider) total_providers++; + xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) { + pScrPriv = rrGetScrPriv(iter); + total_providers += pScrPriv->provider ? 1 : 0; + } xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) { pScrPriv = rrGetScrPriv(iter); total_providers += pScrPriv->provider ? 1 : 0; @@ -105,6 +109,9 @@ ProcRRGetProviders (ClientPtr client) providers = (RRProvider *)extra; ADD_PROVIDER(pScreen); + xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) { + ADD_PROVIDER(iter); + } xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) { ADD_PROVIDER(iter); } -- 1.7.10.2 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel