summaryrefslogtreecommitdiff
path: root/randr
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2016-05-13 15:58:10 +0200
committerHans de Goede <hdegoede@redhat.com>2016-06-17 11:35:58 +0200
commit5c7af02b103790ac1fb6a71822788892c70290b6 (patch)
tree461aac3e1d7caacda49b58c5226319e0b74ffa77 /randr
parentbab0f450a719a11799491043b82c2f293fed27fe (diff)
xrandrprovider: Do not use separate lists for unbound / source / offload slaves
A single provider can be both a offload and source slave at the same time, the use of seperate lists breaks in this case e.g. : xrandr --listproviders Providers: number : 2 Provider 0: id: 0x7b cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 2 associated providers: 0 name:modesetting Provider 1: id: 0x46 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 2 outputs: 5 associated providers: 0 name:modesetting xrandr --setprovideroutputsource 1 0x7b xrandr --listproviders Providers: number : 2 Provider 0: id: 0x7b cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 2 associated providers: 1 name:modesetting Provider 1: id: 0x46 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 2 outputs: 5 associated providers: 1 name:modesetting xrandr --setprovideroffloadsink 1 0x7b xrandr --listproviders Providers: number : 3 Provider 0: id: 0x7b cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 2 associated providers: 2 name:modesetting Provider 1: id: 0x46 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 2 outputs: 5 associated providers: 2 name:modesetting Provider 2: id: 0x46 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 2 outputs: 5 associated providers: 2 name:modesetting Not good. The problem is that the provider with id 0x46 now is on both the output_slave_list and the offload_slave_list of the master screen. This commit fixes this by unifying all 3 lists into a single slaves list. Note that this does change the struct _Screen definition, so this is an ABI break. I do not expect any of the drivers to actually use the removed / changed fields so a recompile should suffice. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'randr')
-rw-r--r--randr/randr.c42
-rw-r--r--randr/rrcrtc.c16
-rw-r--r--randr/rrmonitor.c17
-rw-r--r--randr/rroutput.c10
-rw-r--r--randr/rrprovider.c50
-rw-r--r--randr/rrscreen.c12
6 files changed, 72 insertions, 75 deletions
diff --git a/randr/randr.c b/randr/randr.c
index 3aabb1981..95ed7e5e6 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -483,7 +483,10 @@ TellChanged(WindowPtr pWin, void *value)
RRDeliverCrtcEvent(client, pWin, crtc);
}
- xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_head) {
+ if (!iter->is_output_slave)
+ continue;
+
pSlaveScrPriv = rrGetScrPriv(iter);
for (i = 0; i < pSlaveScrPriv->numCrtcs; i++) {
RRCrtcPtr crtc = pSlaveScrPriv->crtcs[i];
@@ -502,7 +505,10 @@ TellChanged(WindowPtr pWin, void *value)
RRDeliverOutputEvent(client, pWin, output);
}
- xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_head) {
+ if (!iter->is_output_slave)
+ continue;
+
pSlaveScrPriv = rrGetScrPriv(iter);
for (i = 0; i < pSlaveScrPriv->numOutputs; i++) {
RROutputPtr output = pSlaveScrPriv->outputs[i];
@@ -514,17 +520,7 @@ TellChanged(WindowPtr pWin, void *value)
}
if (pRREvent->mask & RRProviderChangeNotifyMask) {
- xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
- pSlaveScrPriv = rrGetScrPriv(iter);
- if (pSlaveScrPriv->provider->changed)
- RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
- }
- xorg_list_for_each_entry(iter, &pScreen->offload_slave_list, offload_head) {
- pSlaveScrPriv = rrGetScrPriv(iter);
- if (pSlaveScrPriv->provider->changed)
- RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
- }
- xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
+ xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
if (pSlaveScrPriv->provider->changed)
RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
@@ -602,21 +598,15 @@ RRTellChanged(ScreenPtr pScreen)
for (i = 0; i < pScrPriv->numCrtcs; i++)
pScrPriv->crtcs[i]->changed = FALSE;
- xorg_list_for_each_entry(iter, &master->output_slave_list, output_head) {
- pSlaveScrPriv = rrGetScrPriv(iter);
- pSlaveScrPriv->provider->changed = FALSE;
- for (i = 0; i < pSlaveScrPriv->numOutputs; i++)
- pSlaveScrPriv->outputs[i]->changed = FALSE;
- for (i = 0; i < pSlaveScrPriv->numCrtcs; i++)
- pSlaveScrPriv->crtcs[i]->changed = FALSE;
- }
- xorg_list_for_each_entry(iter, &master->offload_slave_list, offload_head) {
- pSlaveScrPriv = rrGetScrPriv(iter);
- pSlaveScrPriv->provider->changed = FALSE;
- }
- xorg_list_for_each_entry(iter, &master->unattached_list, unattached_head) {
+ xorg_list_for_each_entry(iter, &master->slave_list, slave_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
pSlaveScrPriv->provider->changed = FALSE;
+ if (iter->is_output_slave) {
+ for (i = 0; i < pSlaveScrPriv->numOutputs; i++)
+ pSlaveScrPriv->outputs[i]->changed = FALSE;
+ for (i = 0; i < pSlaveScrPriv->numCrtcs; i++)
+ pSlaveScrPriv->crtcs[i]->changed = FALSE;
+ }
}
if (mastersp->layoutChanged) {
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 54471332d..ea91ab703 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -526,8 +526,12 @@ rrCheckPixmapBounding(ScreenPtr pScreen,
RegionUnion(&total_region, &total_region, &new_crtc_region);
}
- xorg_list_for_each_entry(slave, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(slave, &pScreen->slave_list, slave_head) {
rrScrPrivPtr slave_priv = rrGetScrPriv(slave);
+
+ if (!slave->is_output_slave)
+ continue;
+
for (c = 0; c < slave_priv->numCrtcs; c++) {
RRCrtcPtr slave_crtc = slave_priv->crtcs[c];
@@ -1700,7 +1704,10 @@ RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode, int *x,
if (ret == TRUE)
return;
- xorg_list_for_each_entry(slave, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(slave, &pScreen->slave_list, slave_head) {
+ if (!slave->is_output_slave)
+ continue;
+
ret = check_all_screen_crtcs(slave, x, y);
if (ret == TRUE)
return;
@@ -1711,7 +1718,10 @@ RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode, int *x,
if (ret == TRUE)
return;
- xorg_list_for_each_entry(slave, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(slave, &pScreen->slave_list, slave_head) {
+ if (!slave->is_output_slave)
+ continue;
+
ret = constrain_all_screen_crtcs(pDev, slave, x, y);
if (ret == TRUE)
return;
diff --git a/randr/rrmonitor.c b/randr/rrmonitor.c
index ba310eaa4..3f6e03e7d 100644
--- a/randr/rrmonitor.c
+++ b/randr/rrmonitor.c
@@ -202,8 +202,12 @@ RRMonitorInitList(ScreenPtr screen, RRMonitorListPtr mon_list, Bool get_active)
/* Count the number of crtcs in this and any slave screens */
numCrtcs = pScrPriv->numCrtcs;
- xorg_list_for_each_entry(slave, &screen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(slave, &screen->slave_list, slave_head) {
rrScrPrivPtr pSlavePriv;
+
+ if (!slave->is_output_slave)
+ continue;
+
pSlavePriv = rrGetScrPriv(slave);
numCrtcs += pSlavePriv->numCrtcs;
}
@@ -220,8 +224,12 @@ RRMonitorInitList(ScreenPtr screen, RRMonitorListPtr mon_list, Bool get_active)
mon_list->server_crtc[c] = pScrPriv->crtcs[sc];
}
- xorg_list_for_each_entry(slave, &screen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(slave, &screen->slave_list, slave_head) {
rrScrPrivPtr pSlavePriv;
+
+ if (!slave->is_output_slave)
+ continue;
+
pSlavePriv = rrGetScrPriv(slave);
for (sc = 0; sc < pSlavePriv->numCrtcs; sc++, c++) {
if (pSlavePriv->crtcs[sc]->mode != NULL)
@@ -471,7 +479,10 @@ RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor)
return BadValue;
}
- xorg_list_for_each_entry(slave, &screen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(slave, &screen->slave_list, slave_head) {
+ if (!slave->is_output_slave)
+ continue;
+
if (RRMonitorMatchesOutputName(slave, monitor->name)) {
client->errorValue = monitor->name;
return BadValue;
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 686ae49a6..a8efec409 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -570,12 +570,10 @@ ProcRRSetOutputPrimary(ClientPtr client)
RRSetPrimaryOutput(pWin->drawable.pScreen, pScrPriv, output);
xorg_list_for_each_entry(slave,
- &pWin->drawable.pScreen->output_slave_list,
- output_head) {
- rrScrPrivPtr pSlavePriv;
- pSlavePriv = rrGetScrPriv(slave);
-
- RRSetPrimaryOutput(slave, pSlavePriv, output);
+ &pWin->drawable.pScreen->slave_list,
+ slave_head) {
+ if (slave->is_output_slave)
+ RRSetPrimaryOutput(slave, rrGetScrPriv(slave), output);
}
}
diff --git a/randr/rrprovider.c b/randr/rrprovider.c
index 5329f410b..8ef47260c 100644
--- a/randr/rrprovider.c
+++ b/randr/rrprovider.c
@@ -72,15 +72,7 @@ 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->offload_slave_list, offload_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->slave_list, slave_head) {
pScrPriv = rrGetScrPriv(iter);
total_providers += pScrPriv->provider ? 1 : 0;
}
@@ -116,13 +108,7 @@ 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->offload_slave_list, offload_head) {
- ADD_PROVIDER(iter);
- }
- xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
+ xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_head) {
ADD_PROVIDER(iter);
}
}
@@ -182,12 +168,13 @@ ProcRRGetProviderInfo (ClientPtr client)
/* count associated providers */
if (provider->offload_sink)
rep.nAssociatedProviders++;
- if (provider->output_source)
- rep.nAssociatedProviders++;
- xorg_list_for_each_entry(provscreen, &pScreen->output_slave_list, output_head)
- rep.nAssociatedProviders++;
- xorg_list_for_each_entry(provscreen, &pScreen->offload_slave_list, offload_head)
+ if (provider->output_source &&
+ provider->output_source != provider->offload_sink)
rep.nAssociatedProviders++;
+ xorg_list_for_each_entry(provscreen, &pScreen->slave_list, slave_head) {
+ if (provscreen->is_output_slave || provscreen->is_offload_slave)
+ rep.nAssociatedProviders++;
+ }
rep.length = (pScrPriv->numCrtcs + pScrPriv->numOutputs +
(rep.nAssociatedProviders * 2) + bytes_to_int32(rep.nameLength));
@@ -237,27 +224,22 @@ ProcRRGetProviderInfo (ClientPtr client)
swapl(&prov_cap[i]);
i++;
}
- xorg_list_for_each_entry(provscreen, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(provscreen, &pScreen->slave_list, slave_head) {
+ if (!provscreen->is_output_slave && !provscreen->is_offload_slave)
+ continue;
pScrProvPriv = rrGetScrPriv(provscreen);
providers[i] = pScrProvPriv->provider->id;
if (client->swapped)
swapl(&providers[i]);
- prov_cap[i] = RR_Capability_SinkOutput;
+ prov_cap[i] = 0;
+ if (provscreen->is_output_slave)
+ prov_cap[i] |= RR_Capability_SinkOutput;
+ if (provscreen->is_offload_slave)
+ prov_cap[i] |= RR_Capability_SourceOffload;
if (client->swapped)
swapl(&prov_cap[i]);
i++;
}
- xorg_list_for_each_entry(provscreen, &pScreen->offload_slave_list, offload_head) {
- pScrProvPriv = rrGetScrPriv(provscreen);
- providers[i] = pScrProvPriv->provider->id;
- if (client->swapped)
- swapl(&providers[i]);
- prov_cap[i] = RR_Capability_SourceOffload;
- if (client->swapped)
- swapl(&prov_cap[i]);
- i++;
- }
-
memcpy(name, provider->name, rep.nameLength);
if (client->swapped) {
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index b5e2090d9..d6c499580 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -394,7 +394,10 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
update_totals(pScreen, pScrPriv);
- xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_head) {
+ if (!iter->is_output_slave)
+ continue;
+
pScrPriv = rrGetScrPriv(iter);
if (query)
@@ -450,7 +453,10 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
}
update_arrays(pScreen, pScrPriv, primary_crtc, has_primary);
- xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
+ xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_head) {
+ if (!iter->is_output_slave)
+ continue;
+
pScrPriv = rrGetScrPriv(iter);
update_arrays(iter, pScrPriv, primary_crtc, has_primary);
@@ -503,7 +509,7 @@ rrGetScreenResources(ClientPtr client, Bool query)
if (!RRGetInfo(pScreen, query))
return BadAlloc;
- if (!xorg_list_is_empty(&pScreen->output_slave_list))
+ if (pScreen->output_slaves)
return rrGetMultiScreenResources(client, query, pScreen);
if (!pScrPriv) {