dix: add ability to link output slave gpus to the current gpu (v1.1)

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.

Reviewed-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2012-05-24 15:39:05 +01:00
parent 05d2472cd2
commit 382dd45bb8
4 changed files with 33 additions and 0 deletions

View File

@ -3743,6 +3743,7 @@ static int init_screen(ScreenPtr pScreen, int i, Bool gpu)
pScreen->CreateScreenResources = 0; pScreen->CreateScreenResources = 0;
xorg_list_init(&pScreen->unattached_list); xorg_list_init(&pScreen->unattached_list);
xorg_list_init(&pScreen->output_slave_list);
/* /*
* This loop gets run once for every Screen that gets added, * This loop gets run once for every Screen that gets added,
@ -3909,3 +3910,19 @@ DetachUnboundGPU(ScreenPtr slave)
slave->current_master = NULL; 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;
}

View File

@ -76,6 +76,12 @@ AttachUnboundGPU(ScreenPtr pScreen, ScreenPtr new);
extern _X_EXPORT void extern _X_EXPORT void
DetachUnboundGPU(ScreenPtr unbound); DetachUnboundGPU(ScreenPtr unbound);
extern _X_EXPORT void
AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new);
extern _X_EXPORT void
DetachOutputGPU(ScreenPtr output);
typedef struct _ColormapRec *ColormapPtr; typedef struct _ColormapRec *ColormapPtr;
#endif /* SCREENINT_H */ #endif /* SCREENINT_H */

View File

@ -485,6 +485,9 @@ typedef struct _Screen {
ScreenPtr current_master; ScreenPtr current_master;
struct xorg_list output_slave_list;
struct xorg_list output_head;
} ScreenRec; } ScreenRec;
static inline RegionPtr static inline RegionPtr

View File

@ -72,6 +72,10 @@ ProcRRGetProviders (ClientPtr client)
if (pScrPriv->provider) if (pScrPriv->provider)
total_providers++; 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) { xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
pScrPriv = rrGetScrPriv(iter); pScrPriv = rrGetScrPriv(iter);
total_providers += pScrPriv->provider ? 1 : 0; total_providers += pScrPriv->provider ? 1 : 0;
@ -105,6 +109,9 @@ ProcRRGetProviders (ClientPtr client)
providers = (RRProvider *)extra; providers = (RRProvider *)extra;
ADD_PROVIDER(pScreen); 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) { xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
ADD_PROVIDER(iter); ADD_PROVIDER(iter);
} }