fixes for multi-monitor reverse optimus
This commit is contained in:
parent
b89d79702f
commit
7d6636ec81
@ -0,0 +1,99 @@
|
|||||||
|
From 4b281c11423b7bac8f0265e650a3e7ff890081bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dave Airlie <airlied@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@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
|
||||||
|
|
42
0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch
Normal file
42
0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
From dd0c31d6b7559bb0dda6283a5d345d537f1d6b42 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dave Airlie <airlied@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@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
|
||||||
|
|
@ -42,7 +42,7 @@
|
|||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.14.2
|
Version: 1.14.2
|
||||||
Release: 7%{?gitdate:.%{gitdate}}%{dist}
|
Release: 8%{?gitdate:.%{gitdate}}%{dist}
|
||||||
URL: http://www.x.org
|
URL: http://www.x.org
|
||||||
License: MIT
|
License: MIT
|
||||||
Group: User Interface/X
|
Group: User Interface/X
|
||||||
@ -157,6 +157,9 @@ Patch8038: 0001-ephyr-Add-resizeable-option.patch
|
|||||||
# Fix cursor jumps in gimp
|
# Fix cursor jumps in gimp
|
||||||
Patch8039: 0001-dix-set-the-valuator-mask-to-ensure-XI-1.x-events-ha.patch
|
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
|
# upstream in -next for 1.15, e21e183059df5975e7086850d1931edb2c1bbd06
|
||||||
%if !0%{?rhel}
|
%if !0%{?rhel}
|
||||||
Patch7071: 0001-os-use-libunwind-to-generate-backtraces.patch
|
Patch7071: 0001-os-use-libunwind-to-generate-backtraces.patch
|
||||||
@ -634,6 +637,9 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{xserver_source_dir}
|
%{xserver_source_dir}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jul 30 2013 Dave Airlie <airlied@redhat.com> 1.14.2-8
|
||||||
|
- fixes for multi-monitor reverse optimus
|
||||||
|
|
||||||
* Mon Jul 22 2013 Peter Hutterer <peter.hutterer@redhat.com> 1.14.2-7
|
* Mon Jul 22 2013 Peter Hutterer <peter.hutterer@redhat.com> 1.14.2-7
|
||||||
- Fix erroneous valuator 1 coordinate when an absolute device in relative
|
- Fix erroneous valuator 1 coordinate when an absolute device in relative
|
||||||
mode doesn't send y coordinates.
|
mode doesn't send y coordinates.
|
||||||
|
Loading…
Reference in New Issue
Block a user