[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