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:
parent
05d2472cd2
commit
382dd45bb8
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue