fix prime offload with DRI2 compositors
This commit is contained in:
parent
d62d1492fe
commit
57b5b3a9fa
124
0001-dri2-invalidate-drawable-after-sharing-pixmap.patch
Normal file
124
0001-dri2-invalidate-drawable-after-sharing-pixmap.patch
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
From e6ca9179443dcdd16d0cbfb2a571a7a9fde56a25 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dave Airlie <airlied@redhat.com>
|
||||||
|
Date: Thu, 6 Sep 2012 16:33:54 +1000
|
||||||
|
Subject: [PATCH] dri2: invalidate drawable after sharing pixmap
|
||||||
|
|
||||||
|
After we share the pixmap, the backing storage may have changed,
|
||||||
|
and we need to invalidate and buffers pointing at it.
|
||||||
|
|
||||||
|
This fixes GL compositors and prime windows lacking contents initially.
|
||||||
|
|
||||||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||||
|
---
|
||||||
|
hw/xfree86/dri2/dri2.c | 74 ++++++++++++++++++++++++++++----------------------
|
||||||
|
1 file changed, 42 insertions(+), 32 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
|
||||||
|
index 23f589c..40963c3 100644
|
||||||
|
--- a/hw/xfree86/dri2/dri2.c
|
||||||
|
+++ b/hw/xfree86/dri2/dri2.c
|
||||||
|
@@ -766,6 +766,44 @@ static inline PixmapPtr GetDrawablePixmap(DrawablePtr drawable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * A TraverseTree callback to invalidate all windows using the same
|
||||||
|
+ * pixmap
|
||||||
|
+ */
|
||||||
|
+static int
|
||||||
|
+DRI2InvalidateWalk(WindowPtr pWin, pointer data)
|
||||||
|
+{
|
||||||
|
+ if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
|
||||||
|
+ return WT_DONTWALKCHILDREN;
|
||||||
|
+ DRI2InvalidateDrawable(&pWin->drawable);
|
||||||
|
+ return WT_WALKCHILDREN;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+DRI2InvalidateDrawableAll(DrawablePtr pDraw)
|
||||||
|
+{
|
||||||
|
+ if (pDraw->type == DRAWABLE_WINDOW) {
|
||||||
|
+ WindowPtr pWin = (WindowPtr) pDraw;
|
||||||
|
+ PixmapPtr pPixmap = pDraw->pScreen->GetWindowPixmap(pWin);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Find the top-most window using this pixmap
|
||||||
|
+ */
|
||||||
|
+ while (pWin->parent &&
|
||||||
|
+ pDraw->pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
|
||||||
|
+ pWin = pWin->parent;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Walk the sub-tree to invalidate all of the
|
||||||
|
+ * windows using the same pixmap
|
||||||
|
+ */
|
||||||
|
+ TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
|
||||||
|
+ DRI2InvalidateDrawable(&pPixmap->drawable);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ DRI2InvalidateDrawable(pDraw);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest)
|
||||||
|
{
|
||||||
|
DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
|
||||||
|
@@ -831,6 +869,8 @@ DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest)
|
||||||
|
spix->screen_x = mpix->screen_x;
|
||||||
|
spix->screen_y = mpix->screen_y;
|
||||||
|
#endif
|
||||||
|
+
|
||||||
|
+ DRI2InvalidateDrawableAll(pDraw);
|
||||||
|
return &spix->drawable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1048,18 +1088,7 @@ DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * A TraverseTree callback to invalidate all windows using the same
|
||||||
|
- * pixmap
|
||||||
|
- */
|
||||||
|
-static int
|
||||||
|
-DRI2InvalidateWalk(WindowPtr pWin, pointer data)
|
||||||
|
-{
|
||||||
|
- if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
|
||||||
|
- return WT_DONTWALKCHILDREN;
|
||||||
|
- DRI2InvalidateDrawable(&pWin->drawable);
|
||||||
|
- return WT_WALKCHILDREN;
|
||||||
|
-}
|
||||||
|
+
|
||||||
|
|
||||||
|
int
|
||||||
|
DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
|
||||||
|
@@ -1162,26 +1191,7 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
|
||||||
|
*/
|
||||||
|
*swap_target = pPriv->swap_count + pPriv->swapsPending;
|
||||||
|
|
||||||
|
- if (pDraw->type == DRAWABLE_WINDOW) {
|
||||||
|
- WindowPtr pWin = (WindowPtr) pDraw;
|
||||||
|
- PixmapPtr pPixmap = pScreen->GetWindowPixmap(pWin);
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Find the top-most window using this pixmap
|
||||||
|
- */
|
||||||
|
- while (pWin->parent &&
|
||||||
|
- pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
|
||||||
|
- pWin = pWin->parent;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Walk the sub-tree to invalidate all of the
|
||||||
|
- * windows using the same pixmap
|
||||||
|
- */
|
||||||
|
- TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
|
||||||
|
- DRI2InvalidateDrawable(&pPixmap->drawable);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- DRI2InvalidateDrawable(pDraw);
|
||||||
|
+ DRI2InvalidateDrawableAll(pDraw);
|
||||||
|
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.7.12
|
||||||
|
|
@ -43,7 +43,7 @@
|
|||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.12.99.905
|
Version: 1.12.99.905
|
||||||
Release: 4%{?gitdate:.%{gitdate}}%{dist}
|
Release: 5%{?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
|
||||||
@ -115,6 +115,9 @@ Patch7042: 0003-xf86-fix-multi-seat-video-device-support.patch
|
|||||||
# backport vt switch fix from list
|
# backport vt switch fix from list
|
||||||
Patch7050: 0001-xf86-call-enter-leave-VT-for-gpu-screens-as-well.patch
|
Patch7050: 0001-xf86-call-enter-leave-VT-for-gpu-screens-as-well.patch
|
||||||
|
|
||||||
|
# backport dri2 drawable fix
|
||||||
|
Patch7051: 0001-dri2-invalidate-drawable-after-sharing-pixmap.patch
|
||||||
|
|
||||||
%global moduledir %{_libdir}/xorg/modules
|
%global moduledir %{_libdir}/xorg/modules
|
||||||
%global drimoduledir %{_libdir}/dri
|
%global drimoduledir %{_libdir}/dri
|
||||||
%global sdkdir %{_includedir}/xorg
|
%global sdkdir %{_includedir}/xorg
|
||||||
@ -587,6 +590,9 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{xserver_source_dir}
|
%{xserver_source_dir}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Sep 07 2012 Dave Airlie <airlied@redhat.com> 1.12.99.905-5
|
||||||
|
- fix prime offload with DRI2 compositors
|
||||||
|
|
||||||
* Mon Sep 03 2012 Dave Airlie <airlied@redhat.com> 1.12.99.905-4
|
* Mon Sep 03 2012 Dave Airlie <airlied@redhat.com> 1.12.99.905-4
|
||||||
- fix multi-gpu after VT switch
|
- fix multi-gpu after VT switch
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user