[xorg-x11-server/f19] fixes for multi-monitor reverse optimus
Dave Airlie
airlied at fedoraproject.org
Tue Jul 30 04:46:47 UTC 2013
commit 7d6636ec8146cf581c8a0dab3d7f6e9ecd5c73da
Author: Dave Airlie <airlied at redhat.com>
Date: Tue Jul 30 14:46:16 2013 +1000
fixes for multi-monitor reverse optimus
...reverse-optimus-support-with-multiple-hea.patch | 99 ++++++++++++++++++++
...rrcrtc-brackets-are-hard-lets-go-shopping.patch | 42 ++++++++
xorg-x11-server.spec | 8 ++-
3 files changed, 148 insertions(+), 1 deletions(-)
---
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 <airlied at gmail.com>
+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 <airlied at redhat.com>
+---
+ 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 <airlied at gmail.com>
+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 <airlied at redhat.com>
+---
+ 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 <airlied at redhat.com> 1.14.2-8
+- fixes for multi-monitor reverse optimus
+
* Mon Jul 22 2013 Peter Hutterer <peter.hutterer at redhat.com> 1.14.2-7
- Fix erroneous valuator 1 coordinate when an absolute device in relative
mode doesn't send y coordinates.
More information about the scm-commits
mailing list