Merge remote-tracking branch 'hans/for-master'

This commit is contained in:
Adam Jackson 2016-06-20 11:21:40 -04:00
commit 266cf39a8f
15 changed files with 176 additions and 149 deletions

View File

@ -3789,9 +3789,7 @@ static int init_screen(ScreenPtr pScreen, int i, Bool gpu)
pScreen->CreateScreenResources = 0; pScreen->CreateScreenResources = 0;
xorg_list_init(&pScreen->pixmap_dirty_list); xorg_list_init(&pScreen->pixmap_dirty_list);
xorg_list_init(&pScreen->unattached_list); xorg_list_init(&pScreen->slave_list);
xorg_list_init(&pScreen->output_slave_list);
xorg_list_init(&pScreen->offload_slave_list);
/* /*
* This loop gets run once for every Screen that gets added, * This loop gets run once for every Screen that gets added,
@ -3950,7 +3948,7 @@ AttachUnboundGPU(ScreenPtr pScreen, ScreenPtr new)
{ {
assert(new->isGPU); assert(new->isGPU);
assert(!new->current_master); assert(!new->current_master);
xorg_list_add(&new->unattached_head, &pScreen->unattached_list); xorg_list_add(&new->slave_head, &pScreen->slave_list);
new->current_master = pScreen; new->current_master = pScreen;
} }
@ -3958,7 +3956,9 @@ void
DetachUnboundGPU(ScreenPtr slave) DetachUnboundGPU(ScreenPtr slave)
{ {
assert(slave->isGPU); assert(slave->isGPU);
xorg_list_del(&slave->unattached_head); assert(!slave->is_output_slave);
assert(!slave->is_offload_slave);
xorg_list_del(&slave->slave_head);
slave->current_master = NULL; slave->current_master = NULL;
} }
@ -3966,31 +3966,35 @@ void
AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new) AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new)
{ {
assert(new->isGPU); assert(new->isGPU);
xorg_list_add(&new->output_head, &pScreen->output_slave_list); assert(!new->is_output_slave);
new->current_master = pScreen; assert(new->current_master == pScreen);
new->is_output_slave = TRUE;
new->current_master->output_slaves++;
} }
void void
DetachOutputGPU(ScreenPtr slave) DetachOutputGPU(ScreenPtr slave)
{ {
assert(slave->isGPU); assert(slave->isGPU);
xorg_list_del(&slave->output_head); assert(slave->is_output_slave);
slave->current_master = NULL; slave->current_master->output_slaves--;
slave->is_output_slave = FALSE;
} }
void void
AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new) AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new)
{ {
assert(new->isGPU); assert(new->isGPU);
xorg_list_add(&new->offload_head, &pScreen->offload_slave_list); assert(!new->is_offload_slave);
new->current_master = pScreen; assert(new->current_master == pScreen);
new->is_offload_slave = TRUE;
} }
void void
DetachOffloadGPU(ScreenPtr slave) DetachOffloadGPU(ScreenPtr slave)
{ {
assert(slave->isGPU); assert(slave->isGPU);
xorg_list_del(&slave->offload_head); assert(slave->is_offload_slave);
slave->current_master = NULL; slave->is_offload_slave = FALSE;
} }

View File

@ -1141,7 +1141,8 @@ exaTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST); exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
for (; ntrap; ntrap--, traps++) for (; ntrap; ntrap--, traps++)
(*ps->RasterizeTrapezoid) (pPicture, traps, -bounds.x1, -bounds.y1); if (xTrapezoidValid(traps))
(*ps->RasterizeTrapezoid) (pPicture, traps, -bounds.x1, -bounds.y1);
exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST); exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
xRel = bounds.x1 + xSrc - xDst; xRel = bounds.x1 + xSrc - xDst;

View File

@ -186,12 +186,15 @@ static ScreenPtr
GetScreenPrime(ScreenPtr master, int prime_id) GetScreenPrime(ScreenPtr master, int prime_id)
{ {
ScreenPtr slave; ScreenPtr slave;
if (prime_id == 0 || xorg_list_is_empty(&master->offload_slave_list)) { if (prime_id == 0) {
return master; return master;
} }
xorg_list_for_each_entry(slave, &master->offload_slave_list, offload_head) { xorg_list_for_each_entry(slave, &master->slave_list, slave_head) {
DRI2ScreenPtr ds; DRI2ScreenPtr ds;
if (!slave->is_offload_slave)
continue;
ds = DRI2GetScreen(slave); ds = DRI2GetScreen(slave);
if (ds == NULL) if (ds == NULL)
continue; continue;

View File

@ -408,24 +408,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
int output_count = 0; int output_count = 0;
Bool ret = TRUE; Bool ret = TRUE;
int i; int i;
uint32_t fb_id; uint32_t fb_id = 0;
drmModeModeInfo kmode; drmModeModeInfo kmode;
int height;
height = pScrn->virtualY;
if (drmmode->fb_id == 0) {
ret = drmModeAddFB(drmmode->fd,
pScrn->virtualX, height,
pScrn->depth, pScrn->bitsPerPixel,
drmmode_bo_get_pitch(&drmmode->front_bo),
drmmode_bo_get_handle(&drmmode->front_bo),
&drmmode->fb_id);
if (ret < 0) {
ErrorF("failed to add fb %d\n", ret);
return FALSE;
}
}
saved_mode = crtc->mode; saved_mode = crtc->mode;
saved_x = crtc->x; saved_x = crtc->x;
@ -484,6 +468,22 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
fb_id = drmmode_crtc->rotate_fb_id; fb_id = drmmode_crtc->rotate_fb_id;
x = y = 0; x = y = 0;
} }
if (fb_id == 0) {
ret = drmModeAddFB(drmmode->fd,
pScrn->virtualX, pScrn->virtualY,
pScrn->depth, pScrn->bitsPerPixel,
drmmode_bo_get_pitch(&drmmode->front_bo),
drmmode_bo_get_handle(&drmmode->front_bo),
&drmmode->fb_id);
if (ret < 0) {
ErrorF("failed to add fb %d\n", ret);
ret = FALSE;
goto done;
}
fb_id = drmmode->fb_id;
}
if (drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, if (drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
fb_id, x, y, output_ids, output_count, &kmode)) { fb_id, x, y, output_ids, output_count, &kmode)) {
xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
@ -635,11 +635,17 @@ drmmode_set_scanout_pixmap_gpu(xf86CrtcPtr crtc, PixmapPtr ppix)
PixmapPtr screenpix = screen->GetScreenPixmap(screen); PixmapPtr screenpix = screen->GetScreenPixmap(screen);
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
int c, total_width = 0, max_height = 0, this_x = 0; int c, total_width = 0, max_height = 0, this_x = 0;
if (!ppix) { if (!ppix) {
if (crtc->randr_crtc->scanout_pixmap) if (crtc->randr_crtc->scanout_pixmap) {
PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap, screenpix); PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap, screenpix);
if (drmmode->fb_id) {
drmModeRmFB(drmmode->fd, drmmode->fb_id);
drmmode->fb_id = 0;
}
}
drmmode_crtc->prime_pixmap_x = 0; drmmode_crtc->prime_pixmap_x = 0;
return TRUE; return TRUE;
} }
@ -687,6 +693,7 @@ drmmode_set_scanout_pixmap_cpu(xf86CrtcPtr crtc, PixmapPtr ppix)
if (crtc->randr_crtc->scanout_pixmap) { if (crtc->randr_crtc->scanout_pixmap) {
ppriv = msGetPixmapPriv(drmmode, crtc->randr_crtc->scanout_pixmap); ppriv = msGetPixmapPriv(drmmode, crtc->randr_crtc->scanout_pixmap);
drmModeRmFB(drmmode->fd, ppriv->fb_id); drmModeRmFB(drmmode->fd, ppriv->fb_id);
ppriv->fb_id = 0;
} }
if (drmmode_crtc->slave_damage) { if (drmmode_crtc->slave_damage) {
DamageUnregister(drmmode_crtc->slave_damage); DamageUnregister(drmmode_crtc->slave_damage);
@ -1690,7 +1697,6 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
drmmode_crtc = xf86_config->crtc[0]->driver_private; drmmode_crtc = xf86_config->crtc[0]->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode; drmmode_ptr drmmode = drmmode_crtc->drmmode;
drmmode_bo old_front; drmmode_bo old_front;
Bool ret;
ScreenPtr screen = xf86ScrnToScreen(scrn); ScreenPtr screen = xf86ScrnToScreen(scrn);
uint32_t old_fb_id; uint32_t old_fb_id;
int i, pitch, old_width, old_height, old_pitch; int i, pitch, old_width, old_height, old_pitch;
@ -1712,8 +1718,9 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
old_width = scrn->virtualX; old_width = scrn->virtualX;
old_height = scrn->virtualY; old_height = scrn->virtualY;
old_pitch = drmmode_bo_get_pitch(&drmmode->front_bo); old_pitch = drmmode_bo_get_pitch(&drmmode->front_bo);
old_fb_id = drmmode->fb_id;
old_front = drmmode->front_bo; old_front = drmmode->front_bo;
old_fb_id = drmmode->fb_id;
drmmode->fb_id = 0;
if (!drmmode_create_bo(drmmode, &drmmode->front_bo, if (!drmmode_create_bo(drmmode, &drmmode->front_bo,
width, height, scrn->bitsPerPixel)) width, height, scrn->bitsPerPixel))
@ -1725,13 +1732,6 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
scrn->virtualY = height; scrn->virtualY = height;
scrn->displayWidth = pitch / cpp; scrn->displayWidth = pitch / cpp;
ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth,
scrn->bitsPerPixel, pitch,
drmmode_bo_get_handle(&drmmode->front_bo),
&drmmode->fb_id);
if (ret)
goto fail;
if (!drmmode->gbm) { if (!drmmode->gbm) {
new_pixels = drmmode_map_front_bo(drmmode); new_pixels = drmmode_map_front_bo(drmmode);
if (!new_pixels) if (!new_pixels)

View File

@ -626,6 +626,15 @@ ms_present_unflip(ScreenPtr screen, uint64_t event_id)
if (!crtc->enabled) if (!crtc->enabled)
continue; continue;
/* info->drmmode.fb_id still points to the FB for the last flipped BO.
* Clear it, drmmode_set_mode_major will re-create it
*/
if (drmmode_crtc->drmmode->fb_id) {
drmModeRmFB(drmmode_crtc->drmmode->fd,
drmmode_crtc->drmmode->fb_id);
drmmode_crtc->drmmode->fb_id = 0;
}
if (drmmode_crtc->dpms_mode == DPMSModeOn) if (drmmode_crtc->dpms_mode == DPMSModeOn)
crtc->funcs->set_mode_major(crtc, &crtc->mode, crtc->rotation, crtc->funcs->set_mode_major(crtc, &crtc->mode, crtc->rotation,
crtc->x, crtc->y); crtc->x, crtc->y);

View File

@ -1836,10 +1836,7 @@ xf86RandR14ProviderSetOutputSource(ScreenPtr pScreen,
{ {
if (!source_provider) { if (!source_provider) {
if (provider->output_source) { if (provider->output_source) {
ScreenPtr cmScreen = pScreen->current_master;
xf86DetachOutputGPU(pScreen); xf86DetachOutputGPU(pScreen);
AttachUnboundGPU(cmScreen, pScreen);
} }
provider->output_source = NULL; provider->output_source = NULL;
return TRUE; return TRUE;
@ -1850,7 +1847,6 @@ xf86RandR14ProviderSetOutputSource(ScreenPtr pScreen,
SetRootClip(source_provider->pScreen, ROOT_CLIP_NONE); SetRootClip(source_provider->pScreen, ROOT_CLIP_NONE);
DetachUnboundGPU(pScreen);
AttachOutputGPU(source_provider->pScreen, pScreen); AttachOutputGPU(source_provider->pScreen, pScreen);
provider->output_source = source_provider; provider->output_source = source_provider;
@ -1865,9 +1861,7 @@ xf86RandR14ProviderSetOffloadSink(ScreenPtr pScreen,
{ {
if (!sink_provider) { if (!sink_provider) {
if (provider->offload_sink) { if (provider->offload_sink) {
ScreenPtr cmScreen = pScreen->current_master;
xf86DetachOutputGPU(pScreen); xf86DetachOutputGPU(pScreen);
AttachUnboundGPU(cmScreen, pScreen);
} }
provider->offload_sink = NULL; provider->offload_sink = NULL;
@ -1877,7 +1871,6 @@ xf86RandR14ProviderSetOffloadSink(ScreenPtr pScreen,
if (provider->offload_sink == sink_provider) if (provider->offload_sink == sink_provider)
return TRUE; return TRUE;
DetachUnboundGPU(pScreen);
AttachOffloadGPU(sink_provider->pScreen, pScreen); AttachOffloadGPU(sink_provider->pScreen, pScreen);
provider->offload_sink = sink_provider; provider->offload_sink = sink_provider;
@ -1956,12 +1949,12 @@ xf86RandR14ProviderDestroy(ScreenPtr screen, RRProviderPtr provider)
config->randr_provider->offload_sink = NULL; config->randr_provider->offload_sink = NULL;
RRSetChanged(screen); RRSetChanged(screen);
} }
else if (config->randr_provider->output_source) { if (config->randr_provider->output_source) {
xf86DetachOutputGPU(screen); xf86DetachOutputGPU(screen);
config->randr_provider->output_source = NULL; config->randr_provider->output_source = NULL;
RRSetChanged(screen); RRSetChanged(screen);
} }
else if (screen->current_master) if (screen->current_master)
DetachUnboundGPU(screen); DetachUnboundGPU(screen);
} }
config->randr_provider = NULL; config->randr_provider = NULL;

View File

@ -590,13 +590,14 @@ typedef struct _Screen {
Bool isGPU; Bool isGPU;
struct xorg_list unattached_list; /* Info on this screen's slaves (if any) */
struct xorg_list unattached_head; struct xorg_list slave_list;
struct xorg_list slave_head;
int output_slaves;
/* Info for when this screen is a slave */
ScreenPtr current_master; ScreenPtr current_master;
Bool is_output_slave;
struct xorg_list output_slave_list; Bool is_offload_slave;
struct xorg_list output_head;
SharePixmapBackingProcPtr SharePixmapBacking; SharePixmapBackingProcPtr SharePixmapBacking;
SetSharedPixmapBackingProcPtr SetSharedPixmapBacking; SetSharedPixmapBackingProcPtr SetSharedPixmapBacking;
@ -605,8 +606,6 @@ typedef struct _Screen {
StopPixmapTrackingProcPtr StopPixmapTracking; StopPixmapTrackingProcPtr StopPixmapTracking;
struct xorg_list pixmap_dirty_list; struct xorg_list pixmap_dirty_list;
struct xorg_list offload_slave_list;
struct xorg_list offload_head;
ReplaceScanoutPixmapProcPtr ReplaceScanoutPixmap; ReplaceScanoutPixmapProcPtr ReplaceScanoutPixmap;
XYToWindowProcPtr XYToWindow; XYToWindowProcPtr XYToWindow;

View File

@ -145,7 +145,7 @@ present_check_flip(RRCrtcPtr crtc,
return FALSE; return FALSE;
/* Fail to flip if we have slave outputs */ /* Fail to flip if we have slave outputs */
if (!xorg_list_is_empty(&screen->output_slave_list)) if (screen->output_slaves)
return FALSE; return FALSE;
/* Make sure the window hasn't been redirected with Composite */ /* Make sure the window hasn't been redirected with Composite */
@ -353,10 +353,10 @@ present_re_execute(present_vblank_ptr vblank)
static void static void
present_flip_try_ready(ScreenPtr screen) present_flip_try_ready(ScreenPtr screen)
{ {
present_vblank_ptr vblank, tmp; present_vblank_ptr vblank;
xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) { xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
if (vblank->flip_ready) { if (vblank->queued) {
present_re_execute(vblank); present_re_execute(vblank);
return; return;
} }
@ -517,19 +517,22 @@ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
void void
present_event_notify(uint64_t event_id, uint64_t ust, uint64_t msc) present_event_notify(uint64_t event_id, uint64_t ust, uint64_t msc)
{ {
present_vblank_ptr vblank, tmp; present_vblank_ptr vblank;
int s; int s;
if (!event_id) if (!event_id)
return; return;
DebugPresent(("\te %lld ust %lld msc %lld\n", event_id, ust, msc)); DebugPresent(("\te %lld ust %lld msc %lld\n", event_id, ust, msc));
xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) { xorg_list_for_each_entry(vblank, &present_exec_queue, event_queue) {
if (vblank->event_id == event_id) { int64_t match = event_id - vblank->event_id;
if (match == 0) {
present_execute(vblank, ust, msc); present_execute(vblank, ust, msc);
return; return;
} }
if (match < 0)
break;
} }
xorg_list_for_each_entry_safe(vblank, tmp, &present_flip_queue, event_queue) { xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
if (vblank->event_id == event_id) { if (vblank->event_id == event_id) {
present_flip_notify(vblank, ust, msc); present_flip_notify(vblank, ust, msc);
return; return;
@ -653,6 +656,8 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
DebugPresent(("\tr %lld %p (pending %p unflip %lld)\n", DebugPresent(("\tr %lld %p (pending %p unflip %lld)\n",
vblank->event_id, vblank, vblank->event_id, vblank,
screen_priv->flip_pending, screen_priv->unflip_event_id)); screen_priv->flip_pending, screen_priv->unflip_event_id));
xorg_list_del(&vblank->event_queue);
xorg_list_append(&vblank->event_queue, &present_flip_queue);
vblank->flip_ready = TRUE; vblank->flip_ready = TRUE;
return; return;
} }
@ -943,7 +948,7 @@ present_pixmap(WindowPtr window,
vblank->pixmap->drawable.id, vblank->window->drawable.id, vblank->pixmap->drawable.id, vblank->window->drawable.id,
target_crtc, vblank->flip, vblank->sync_flip, vblank->serial)); target_crtc, vblank->flip, vblank->sync_flip, vblank->serial));
xorg_list_add(&vblank->event_queue, &present_exec_queue); xorg_list_append(&vblank->event_queue, &present_exec_queue);
vblank->queued = TRUE; vblank->queued = TRUE;
if (msc_is_after(target_msc, crtc_msc)) { if (msc_is_after(target_msc, crtc_msc)) {
ret = present_queue_vblank(screen, target_crtc, vblank->event_id, target_msc); ret = present_queue_vblank(screen, target_crtc, vblank->event_id, target_msc);
@ -967,7 +972,7 @@ no_mem:
void void
present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc) present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
{ {
present_vblank_ptr vblank, tmp; present_vblank_ptr vblank;
if (crtc == NULL) if (crtc == NULL)
present_fake_abort_vblank(screen, event_id, msc); present_fake_abort_vblank(screen, event_id, msc);
@ -978,16 +983,20 @@ present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64
(*screen_priv->info->abort_vblank) (crtc, event_id, msc); (*screen_priv->info->abort_vblank) (crtc, event_id, msc);
} }
xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) { xorg_list_for_each_entry(vblank, &present_exec_queue, event_queue) {
if (vblank->event_id == event_id) { int64_t match = event_id - vblank->event_id;
if (match == 0) {
xorg_list_del(&vblank->event_queue); xorg_list_del(&vblank->event_queue);
vblank->queued = FALSE; vblank->queued = FALSE;
return; return;
} }
if (match < 0)
break;
} }
xorg_list_for_each_entry_safe(vblank, tmp, &present_flip_queue, event_queue) { xorg_list_for_each_entry(vblank, &present_flip_queue, event_queue) {
if (vblank->event_id == event_id) { if (vblank->event_id == event_id) {
xorg_list_del(&vblank->event_queue); xorg_list_del(&vblank->event_queue);
vblank->queued = FALSE;
return; return;
} }
} }

View File

@ -483,7 +483,10 @@ TellChanged(WindowPtr pWin, void *value)
RRDeliverCrtcEvent(client, pWin, crtc); 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); pSlaveScrPriv = rrGetScrPriv(iter);
for (i = 0; i < pSlaveScrPriv->numCrtcs; i++) { for (i = 0; i < pSlaveScrPriv->numCrtcs; i++) {
RRCrtcPtr crtc = pSlaveScrPriv->crtcs[i]; RRCrtcPtr crtc = pSlaveScrPriv->crtcs[i];
@ -502,7 +505,10 @@ TellChanged(WindowPtr pWin, void *value)
RRDeliverOutputEvent(client, pWin, output); 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); pSlaveScrPriv = rrGetScrPriv(iter);
for (i = 0; i < pSlaveScrPriv->numOutputs; i++) { for (i = 0; i < pSlaveScrPriv->numOutputs; i++) {
RROutputPtr output = pSlaveScrPriv->outputs[i]; RROutputPtr output = pSlaveScrPriv->outputs[i];
@ -514,17 +520,7 @@ TellChanged(WindowPtr pWin, void *value)
} }
if (pRREvent->mask & RRProviderChangeNotifyMask) { if (pRREvent->mask & RRProviderChangeNotifyMask) {
xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) { xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_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) {
pSlaveScrPriv = rrGetScrPriv(iter); pSlaveScrPriv = rrGetScrPriv(iter);
if (pSlaveScrPriv->provider->changed) if (pSlaveScrPriv->provider->changed)
RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider); RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
@ -584,6 +580,18 @@ RRTellChanged(ScreenPtr pScreen)
mastersp = pScrPriv; mastersp = pScrPriv;
} }
xorg_list_for_each_entry(iter, &master->slave_list, slave_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
if (!iter->is_output_slave)
continue;
if (CompareTimeStamps(mastersp->lastSetTime,
pSlaveScrPriv->lastSetTime) == EARLIER) {
mastersp->lastSetTime = pSlaveScrPriv->lastSetTime;
}
}
if (mastersp->changed) { if (mastersp->changed) {
UpdateCurrentTimeIf(); UpdateCurrentTimeIf();
if (mastersp->configChanged) { if (mastersp->configChanged) {
@ -602,21 +610,15 @@ RRTellChanged(ScreenPtr pScreen)
for (i = 0; i < pScrPriv->numCrtcs; i++) for (i = 0; i < pScrPriv->numCrtcs; i++)
pScrPriv->crtcs[i]->changed = FALSE; pScrPriv->crtcs[i]->changed = FALSE;
xorg_list_for_each_entry(iter, &master->output_slave_list, output_head) { xorg_list_for_each_entry(iter, &master->slave_list, slave_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) {
pSlaveScrPriv = rrGetScrPriv(iter); pSlaveScrPriv = rrGetScrPriv(iter);
pSlaveScrPriv->provider->changed = FALSE; 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) { if (mastersp->layoutChanged) {

View File

@ -526,8 +526,12 @@ rrCheckPixmapBounding(ScreenPtr pScreen,
RegionUnion(&total_region, &total_region, &new_crtc_region); 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); rrScrPrivPtr slave_priv = rrGetScrPriv(slave);
if (!slave->is_output_slave)
continue;
for (c = 0; c < slave_priv->numCrtcs; c++) { for (c = 0; c < slave_priv->numCrtcs; c++) {
RRCrtcPtr slave_crtc = slave_priv->crtcs[c]; RRCrtcPtr slave_crtc = slave_priv->crtcs[c];
@ -1700,7 +1704,10 @@ RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode, int *x,
if (ret == TRUE) if (ret == TRUE)
return; 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); ret = check_all_screen_crtcs(slave, x, y);
if (ret == TRUE) if (ret == TRUE)
return; return;
@ -1711,7 +1718,10 @@ RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode, int *x,
if (ret == TRUE) if (ret == TRUE)
return; 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); ret = constrain_all_screen_crtcs(pDev, slave, x, y);
if (ret == TRUE) if (ret == TRUE)
return; return;

View File

@ -202,8 +202,12 @@ RRMonitorInitList(ScreenPtr screen, RRMonitorListPtr mon_list, Bool get_active)
/* Count the number of crtcs in this and any slave screens */ /* Count the number of crtcs in this and any slave screens */
numCrtcs = pScrPriv->numCrtcs; 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; rrScrPrivPtr pSlavePriv;
if (!slave->is_output_slave)
continue;
pSlavePriv = rrGetScrPriv(slave); pSlavePriv = rrGetScrPriv(slave);
numCrtcs += pSlavePriv->numCrtcs; numCrtcs += pSlavePriv->numCrtcs;
} }
@ -220,8 +224,12 @@ RRMonitorInitList(ScreenPtr screen, RRMonitorListPtr mon_list, Bool get_active)
mon_list->server_crtc[c] = pScrPriv->crtcs[sc]; 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; rrScrPrivPtr pSlavePriv;
if (!slave->is_output_slave)
continue;
pSlavePriv = rrGetScrPriv(slave); pSlavePriv = rrGetScrPriv(slave);
for (sc = 0; sc < pSlavePriv->numCrtcs; sc++, c++) { for (sc = 0; sc < pSlavePriv->numCrtcs; sc++, c++) {
if (pSlavePriv->crtcs[sc]->mode != NULL) if (pSlavePriv->crtcs[sc]->mode != NULL)
@ -471,7 +479,10 @@ RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor)
return BadValue; 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)) { if (RRMonitorMatchesOutputName(slave, monitor->name)) {
client->errorValue = monitor->name; client->errorValue = monitor->name;
return BadValue; return BadValue;

View File

@ -570,12 +570,10 @@ ProcRRSetOutputPrimary(ClientPtr client)
RRSetPrimaryOutput(pWin->drawable.pScreen, pScrPriv, output); RRSetPrimaryOutput(pWin->drawable.pScreen, pScrPriv, output);
xorg_list_for_each_entry(slave, xorg_list_for_each_entry(slave,
&pWin->drawable.pScreen->output_slave_list, &pWin->drawable.pScreen->slave_list,
output_head) { slave_head) {
rrScrPrivPtr pSlavePriv; if (slave->is_output_slave)
pSlavePriv = rrGetScrPriv(slave); RRSetPrimaryOutput(slave, rrGetScrPriv(slave), output);
RRSetPrimaryOutput(slave, pSlavePriv, output);
} }
} }

View File

@ -72,15 +72,7 @@ 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) { xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_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) {
pScrPriv = rrGetScrPriv(iter); pScrPriv = rrGetScrPriv(iter);
total_providers += pScrPriv->provider ? 1 : 0; total_providers += pScrPriv->provider ? 1 : 0;
} }
@ -116,13 +108,7 @@ 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) { xorg_list_for_each_entry(iter, &pScreen->slave_list, slave_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) {
ADD_PROVIDER(iter); ADD_PROVIDER(iter);
} }
} }
@ -182,12 +168,13 @@ ProcRRGetProviderInfo (ClientPtr client)
/* count associated providers */ /* count associated providers */
if (provider->offload_sink) if (provider->offload_sink)
rep.nAssociatedProviders++; rep.nAssociatedProviders++;
if (provider->output_source) if (provider->output_source &&
rep.nAssociatedProviders++; provider->output_source != provider->offload_sink)
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)
rep.nAssociatedProviders++; 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.length = (pScrPriv->numCrtcs + pScrPriv->numOutputs +
(rep.nAssociatedProviders * 2) + bytes_to_int32(rep.nameLength)); (rep.nAssociatedProviders * 2) + bytes_to_int32(rep.nameLength));
@ -237,27 +224,22 @@ ProcRRGetProviderInfo (ClientPtr client)
swapl(&prov_cap[i]); swapl(&prov_cap[i]);
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); pScrProvPriv = rrGetScrPriv(provscreen);
providers[i] = pScrProvPriv->provider->id; providers[i] = pScrProvPriv->provider->id;
if (client->swapped) if (client->swapped)
swapl(&providers[i]); 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) if (client->swapped)
swapl(&prov_cap[i]); swapl(&prov_cap[i]);
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); memcpy(name, provider->name, rep.nameLength);
if (client->swapped) { if (client->swapped) {

View File

@ -394,7 +394,10 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
update_totals(pScreen, pScrPriv); 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); pScrPriv = rrGetScrPriv(iter);
if (query) if (query)
@ -450,7 +453,10 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
} }
update_arrays(pScreen, pScrPriv, primary_crtc, has_primary); 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); pScrPriv = rrGetScrPriv(iter);
update_arrays(iter, pScrPriv, primary_crtc, has_primary); update_arrays(iter, pScrPriv, primary_crtc, has_primary);
@ -503,7 +509,7 @@ rrGetScreenResources(ClientPtr client, Bool query)
if (!RRGetInfo(pScreen, query)) if (!RRGetInfo(pScreen, query))
return BadAlloc; return BadAlloc;
if (!xorg_list_is_empty(&pScreen->output_slave_list)) if (pScreen->output_slaves)
return rrGetMultiScreenResources(client, query, pScreen); return rrGetMultiScreenResources(client, query, pScreen);
if (!pScrPriv) { if (!pScrPriv) {

View File

@ -211,7 +211,7 @@ typedef pixman_fixed_t xFixed;
/* whether 't' is a well defined not obviously empty trapezoid */ /* whether 't' is a well defined not obviously empty trapezoid */
#define xTrapezoidValid(t) ((t)->left.p1.y != (t)->left.p2.y && \ #define xTrapezoidValid(t) ((t)->left.p1.y != (t)->left.p2.y && \
(t)->right.p1.y != (t)->right.p2.y && \ (t)->right.p1.y != (t)->right.p2.y && \
(int) ((t)->bottom - (t)->top) > 0) ((t)->bottom > (t)->top))
/* /*
* Standard NTSC luminance conversions: * Standard NTSC luminance conversions: