diff --git a/0001-pixmap-fix-reverse-optimus-support-with-multiple-hea.patch b/0001-pixmap-fix-reverse-optimus-support-with-multiple-hea.patch new file mode 100644 index 0000000..366cc2d --- /dev/null +++ b/0001-pixmap-fix-reverse-optimus-support-with-multiple-hea.patch @@ -0,0 +1,99 @@ +From 4b281c11423b7bac8f0265e650a3e7ff890081bc Mon Sep 17 00:00:00 2001 +From: Dave Airlie +Date: Tue, 30 Jul 2013 13:48:04 +1000 +Subject: [PATCH] pixmap: fix reverse optimus support with multiple heads + +For doing reverese optimus to multiple outputs on a secondary GPU +the GPU can store the blits into a large screen pixmap, unfortunately +this means we need a destination offset into the dirty code, so +add a new API that just adds this interface. + +Signed-off-by: Dave Airlie +--- + dix/pixmap.c | 18 ++++++++++++++---- + include/pixmap.h | 6 ++++++ + include/pixmapstr.h | 1 + + 3 files changed, 21 insertions(+), 4 deletions(-) + +diff --git a/dix/pixmap.c b/dix/pixmap.c +index fe92147..e01d961 100644 +--- a/dix/pixmap.c ++++ b/dix/pixmap.c +@@ -164,9 +164,9 @@ PixmapPtr PixmapShareToSlave(PixmapPtr pixmap, ScreenPtr slave) + } + + Bool +-PixmapStartDirtyTracking(PixmapPtr src, +- PixmapPtr slave_dst, +- int x, int y) ++PixmapStartDirtyTracking2(PixmapPtr src, ++ PixmapPtr slave_dst, ++ int x, int y, int dst_x, int dst_y) + { + ScreenPtr screen = src->drawable.pScreen; + PixmapDirtyUpdatePtr dirty_update; +@@ -179,6 +179,8 @@ PixmapStartDirtyTracking(PixmapPtr src, + dirty_update->slave_dst = slave_dst; + dirty_update->x = x; + dirty_update->y = y; ++ dirty_update->dst_x = dst_x; ++ dirty_update->dst_y = dst_y; + + dirty_update->damage = DamageCreate(NULL, NULL, + DamageReportNone, +@@ -195,6 +197,14 @@ PixmapStartDirtyTracking(PixmapPtr src, + } + + Bool ++PixmapStartDirtyTracking(PixmapPtr src, ++ PixmapPtr slave_dst, ++ int x, int y) ++{ ++ return PixmapStartDirtyTracking2(src, slave_dst, x, y, 0, 0); ++} ++ ++Bool + PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst) + { + ScreenPtr screen = src->drawable.pScreen; +@@ -262,7 +272,7 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty, RegionPtr dirty_region) + h = dst_box.y2 - dst_box.y1; + + pGC->ops->CopyArea(&dirty->src->drawable, &dst->drawable, pGC, +- dirty->x + dst_box.x1, dirty->y + dst_box.y1, w, h, dst_box.x1, dst_box.y1); ++ dirty->x + dst_box.x1, dirty->y + dst_box.y1, w, h, dirty->dst_x + dst_box.x1, dirty->dst_y + dst_box.y1); + b++; + } + FreeScratchGC(pGC); +diff --git a/include/pixmap.h b/include/pixmap.h +index 921a94d..d7d0a5e 100644 +--- a/include/pixmap.h ++++ b/include/pixmap.h +@@ -120,6 +120,12 @@ PixmapStartDirtyTracking(PixmapPtr src, + PixmapPtr slave_dst, + int x, int y); + ++#define HAS_DIRTYTRACKING2 1 ++extern _X_EXPORT Bool ++PixmapStartDirtyTracking2(PixmapPtr src, ++ PixmapPtr slave_dst, ++ int x, int y, int dst_x, int dst_y); ++ + extern _X_EXPORT Bool + PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst); + +diff --git a/include/pixmapstr.h b/include/pixmapstr.h +index 2a1ef9b..2bdff98 100644 +--- a/include/pixmapstr.h ++++ b/include/pixmapstr.h +@@ -90,6 +90,7 @@ typedef struct _PixmapDirtyUpdate { + int x, y; + DamagePtr damage; + struct xorg_list ent; ++ int dst_x, dst_y; + } PixmapDirtyUpdateRec; + + static inline void +-- +1.8.2.1 + diff --git a/0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch b/0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch new file mode 100644 index 0000000..6605162 --- /dev/null +++ b/0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch @@ -0,0 +1,42 @@ +From dd0c31d6b7559bb0dda6283a5d345d537f1d6b42 Mon Sep 17 00:00:00 2001 +From: Dave Airlie +Date: Tue, 30 Jul 2013 13:17:45 +1000 +Subject: [PATCH] rrcrtc: brackets are hard, lets go shopping. + +Slaving two outputs on a secondary GPU to a primary GPU testing +picked this up, in that we'd try to resize to the totally the +wrong thing, then as usual segfault in the rotation code. + +Signed-off-by: Dave Airlie +--- + randr/rrcrtc.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c +index 2f76b62..40b01f0 100644 +--- a/randr/rrcrtc.c ++++ b/randr/rrcrtc.c +@@ -474,7 +474,7 @@ rrCheckPixmapBounding(ScreenPtr pScreen, + + xorg_list_for_each_entry(slave, &pScreen->output_slave_list, output_head) { + rrScrPriv(slave); +- for (c = 0; c < pScrPriv->numCrtcs; c++) ++ for (c = 0; c < pScrPriv->numCrtcs; c++) { + if (pScrPriv->crtcs[c] == rr_crtc) { + newbox.x1 = x; + newbox.x2 = x + w; +@@ -489,8 +489,9 @@ rrCheckPixmapBounding(ScreenPtr pScreen, + newbox.y1 = pScrPriv->crtcs[c]->y; + newbox.y2 = pScrPriv->crtcs[c]->y + pScrPriv->crtcs[c]->mode->mode.height; + } +- RegionInit(&new_crtc_region, &newbox, 1); +- RegionUnion(&total_region, &total_region, &new_crtc_region); ++ RegionInit(&new_crtc_region, &newbox, 1); ++ RegionUnion(&total_region, &total_region, &new_crtc_region); ++ } + } + + newsize = RegionExtents(&total_region); +-- +1.8.2.1 + diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 691f0b3..037d237 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -42,7 +42,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.14.2 -Release: 7%{?gitdate:.%{gitdate}}%{dist} +Release: 8%{?gitdate:.%{gitdate}}%{dist} URL: http://www.x.org License: MIT Group: User Interface/X @@ -157,6 +157,9 @@ Patch8038: 0001-ephyr-Add-resizeable-option.patch # Fix cursor jumps in gimp Patch8039: 0001-dix-set-the-valuator-mask-to-ensure-XI-1.x-events-ha.patch +# Fix multiple monitors in reverse optimus configurations +Patch8040: 0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch +Patch8041: 0001-pixmap-fix-reverse-optimus-support-with-multiple-hea.patch # upstream in -next for 1.15, e21e183059df5975e7086850d1931edb2c1bbd06 %if !0%{?rhel} Patch7071: 0001-os-use-libunwind-to-generate-backtraces.patch @@ -634,6 +637,9 @@ rm -rf $RPM_BUILD_ROOT %{xserver_source_dir} %changelog +* Tue Jul 30 2013 Dave Airlie 1.14.2-8 +- fixes for multi-monitor reverse optimus + * Mon Jul 22 2013 Peter Hutterer 1.14.2-7 - Fix erroneous valuator 1 coordinate when an absolute device in relative mode doesn't send y coordinates.