xserver: Branch 'server-1.20-branch' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 20 18:51:39 UTC 2019


 Xext/panoramiXprocs.c         |   10 ++++++++++
 Xext/shm.c                    |    9 +++++++++
 dix/dispatch.c                |    5 ++++-
 dix/pixmap.c                  |    3 ++-
 doc/Xserver-spec.xml          |    4 ++--
 glx/glxdriswrast.c            |    1 +
 hw/xfree86/modes/xf86Rotate.c |    4 ++--
 hw/xnest/Screen.c             |    1 -
 mi/mi.h                       |    4 ++++
 mi/miscrinit.c                |    8 +++++++-
 render/render.c               |    5 +++++
 11 files changed, 46 insertions(+), 8 deletions(-)

New commits:
commit 68cfee97bc59580724d594c82f5ee55a980dadf0
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Oct 9 11:57:18 2019 -0400

    dix: Call SourceValidate before GetImage
    
    This ensures that any prep work for the drawable we're about to read
    from is already done before we call down to GetImage. This should be no
    functional change as most of the callers with a non-trivial
    SourceValidate are already wrapping GetImage and doing the equivalent
    thing, but we'll be simplifying that shortly.
    
    More importantly this ensures that if any of that prep work would
    generate events - like automatic compositing flushing rendering to a
    parent pixmap which then triggers damage - then it happens entirely
    before we start writing the GetImage reply header.
    
    Note that we do not do the same for GetSpans, but that's okay. The only
    way to get to GetSpans is through miCopyArea or miCopyPlane - where the
    callers must already call SourceValidate - or miGetImage - which this
    commit now protects with SourceValidate.
    
    Fixes: xorg/xserver#902
    Reviewed-by: Michel Dänzer <mdaenzer at redhat.com>
    (cherry picked from commit 516e75dbb6bbf97c7af9c2226242ffd9259fec11)

diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
index f31b1e054..32424fcbd 100644
--- a/Xext/panoramiXprocs.c
+++ b/Xext/panoramiXprocs.c
@@ -1105,6 +1105,10 @@ PanoramiXCopyArea(ClientPtr client)
                                    DixGetAttrAccess);
             if (rc != Success)
                 return rc;
+            drawables[j]->pScreen->SourceValidate(drawables[j], 0, 0,
+                                                  drawables[j]->width,
+                                                  drawables[j]->height,
+                                                  IncludeInferiors);
         }
 
         pitch = PixmapBytePad(width, drawables[0]->depth);
@@ -2007,6 +2011,12 @@ PanoramiXGetImage(ClientPtr client)
         if (rc != Success)
             return rc;
     }
+    FOR_NSCREENS_FORWARD(i) {
+        drawables[i]->pScreen->SourceValidate(drawables[i], 0, 0,
+                                              drawables[i]->width,
+                                              drawables[i]->height,
+                                              IncludeInferiors);
+    }
 
     xgi = (xGetImageReply) {
         .type = X_Reply,
diff --git a/Xext/shm.c b/Xext/shm.c
index 506fd4df1..24c6b1087 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -655,6 +655,9 @@ ProcShmGetImage(ClientPtr client)
         visual = wVisual(((WindowPtr) pDraw));
         if (pDraw->type == DRAWABLE_WINDOW)
             pVisibleRegion = &((WindowPtr) pDraw)->borderClip;
+        pDraw->pScreen->SourceValidate(pDraw, stuff->x, stuff->y,
+                                       stuff->width, stuff->height,
+                                       IncludeInferiors);
     }
     else {
         if (stuff->x < 0 ||
@@ -863,6 +866,12 @@ ProcPanoramiXShmGetImage(ClientPtr client)
             return rc;
         }
     }
+    FOR_NSCREENS_FORWARD(i) {
+        drawables[i]->pScreen->SourceValidate(drawables[i], 0, 0,
+                                              drawables[i]->width,
+                                              drawables[i]->height,
+                                              IncludeInferiors);
+    }
 
     xgi = (xShmGetImageReply) {
         .type = X_Reply,
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 176c7a0dd..a33bfaa9e 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -2196,8 +2196,11 @@ DoGetImage(ClientPtr client, int format, Drawable drawable,
         return BadAlloc;
     WriteReplyToClient(client, sizeof(xGetImageReply), &xgi);
 
-    if (pDraw->type == DRAWABLE_WINDOW)
+    if (pDraw->type == DRAWABLE_WINDOW) {
         pVisibleRegion = &((WindowPtr) pDraw)->borderClip;
+        pDraw->pScreen->SourceValidate(pDraw, x, y, width, height,
+                                       IncludeInferiors);
+    }
 
     if (linesPerBuf == 0) {
         /* nothing to do */
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 2858312de..c57d80db7 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -324,6 +324,7 @@ swrastGetImage(__DRIdrawable * draw,
     ScreenPtr pScreen = pDraw->pScreen;
     __GLXcontext *cx = lastGLContext;
 
+    pScreen->SourceValidate(pDraw, x, y, w, h, IncludeInferiors);
     pScreen->GetImage(pDraw, x, y, w, h, ZPixmap, ~0L, data);
     if (cx != lastGLContext) {
         lastGLContext = cx;
diff --git a/render/render.c b/render/render.c
index 7d94bd5ff..c376090ca 100644
--- a/render/render.c
+++ b/render/render.c
@@ -1492,6 +1492,11 @@ ProcRenderCreateCursor(ClientPtr client)
         return BadAlloc;
     }
 
+    /* what kind of maniac creates a cursor from a window picture though */
+    if (pSrc->pDrawable->type == DRAWABLE_WINDOW)
+        pScreen->SourceValidate(pSrc->pDrawable, 0, 0, width, height,
+                                IncludeInferiors);
+
     if (pSrc->format == PICT_a8r8g8b8) {
         (*pScreen->GetImage) (pSrc->pDrawable,
                               0, 0, width, height, ZPixmap,
commit 2320fd4b52a60411714170d516fc58e6ec516353
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Oct 9 11:27:12 2019 -0400

    mi: Add a default no-op miSourceValidate
    
    Slightly simplifies the callers since they don't need to check for
    non-NULL anymore.
    
    I do extremely hate the workarounds here to suppress misprite taking the
    cursor down though. Surely there's a better way.
    
    [1.20: Do not in fact simplify the callers as above, since it would
    change the ABI. - ajax]
    
    Reviewed-by: Michel Dänzer <mdaenzer at redhat.com>
    (cherry picked from commit ff310903f34ac34c916ad74e919d1ac12aea4715)

diff --git a/dix/pixmap.c b/dix/pixmap.c
index 81ac5e2d8..6923e7e7b 100644
--- a/dix/pixmap.c
+++ b/dix/pixmap.c
@@ -32,6 +32,7 @@ from The Open Group.
 
 #include <X11/X.h>
 #include "scrnintstr.h"
+#include "mi.h"
 #include "misc.h"
 #include "os.h"
 #include "windowstr.h"
@@ -395,7 +396,7 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty)
      * leaves the software cursor in place
      */
     SourceValidate = pScreen->SourceValidate;
-    pScreen->SourceValidate = NULL;
+    pScreen->SourceValidate = miSourceValidate;
 
     RegionTranslate(&pixregion, dirty->x, dirty->y);
     RegionIntersect(&pixregion, &pixregion, region);
diff --git a/doc/Xserver-spec.xml b/doc/Xserver-spec.xml
index 3dde65178..0ac2224e9 100644
--- a/doc/Xserver-spec.xml
+++ b/doc/Xserver-spec.xml
@@ -2930,8 +2930,8 @@ The sample server implementation is in Xserver/fb/fbscreen.c.</para>
 		unsigned int subWindowMode;
 
 </programlisting></blockquote>
-SourceValidate should be called by CopyArea/CopyPlane primitives when
-the SourceValidate function pointer in the screen is non-null.  If you know that
+SourceValidate should be called by any primitive that reads from pDrawable.
+If you know that
 you will never need SourceValidate, you can avoid this check.  Currently,
 SourceValidate is used by the mi software cursor code to remove the cursor
 from the screen when the source rectangle overlaps the cursor position.
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
index 85ab9b8c7..a8f1e615c 100644
--- a/hw/xfree86/modes/xf86Rotate.c
+++ b/hw/xfree86/modes/xf86Rotate.c
@@ -28,7 +28,7 @@
 #include <stddef.h>
 #include <string.h>
 #include <stdio.h>
-
+#include "mi.h"
 #include "xf86.h"
 #include "xf86DDC.h"
 #include "windowstr.h"
@@ -191,7 +191,7 @@ xf86RotateRedisplay(ScreenPtr pScreen)
          * leaves the software cursor in place
          */
         SourceValidate = pScreen->SourceValidate;
-        pScreen->SourceValidate = NULL;
+        pScreen->SourceValidate = miSourceValidate;
 
         for (c = 0; c < xf86_config->num_crtc; c++) {
             xf86CrtcPtr crtc = xf86_config->crtc[c];
diff --git a/hw/xnest/Screen.c b/hw/xnest/Screen.c
index 30c6a4623..ac01c248c 100644
--- a/hw/xnest/Screen.c
+++ b/hw/xnest/Screen.c
@@ -263,7 +263,6 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
     pScreen->SaveScreen = xnestSaveScreen;
     pScreen->GetImage = xnestGetImage;
     pScreen->GetSpans = xnestGetSpans;
-    pScreen->SourceValidate = NULL;
 
     /* Window Procedures */
 
diff --git a/mi/mi.h b/mi/mi.h
index db62c9166..2cd3066c1 100644
--- a/mi/mi.h
+++ b/mi/mi.h
@@ -360,6 +360,10 @@ extern _X_EXPORT void miPushPixels(GCPtr /*pGC */ ,
 
 /* miscrinit.c */
 
+extern _X_EXPORT void
+miSourceValidate(DrawablePtr pDrawable, int x, int y, int w, int h,
+                 unsigned int subWindowMode);
+
 extern _X_EXPORT Bool miModifyPixmapHeader(PixmapPtr pPixmap,
                                            int width,
                                            int height,
diff --git a/mi/miscrinit.c b/mi/miscrinit.c
index 9c6af0dc7..264622df1 100644
--- a/mi/miscrinit.c
+++ b/mi/miscrinit.c
@@ -124,6 +124,12 @@ miCloseScreen(ScreenPtr pScreen)
     return ((*pScreen->DestroyPixmap) ((PixmapPtr) pScreen->devPrivate));
 }
 
+void
+miSourceValidate(DrawablePtr pDrawable, int x, int y, int w, int h,
+                 unsigned int subWindowMode)
+{
+}
+
 /* With the introduction of pixmap privates, the "screen pixmap" can no
  * longer be created in miScreenInit, since all the modules that could
  * possibly ask for pixmap private space have not been initialized at
@@ -243,7 +249,7 @@ miScreenInit(ScreenPtr pScreen, void *pbits,  /* pointer to screen bits */
     }
     /* else CloseScreen */
     /* QueryBestSize, SaveScreen, GetImage, GetSpans */
-    pScreen->SourceValidate = (SourceValidateProcPtr) 0;
+    pScreen->SourceValidate = miSourceValidate;
     /* CreateWindow, DestroyWindow, PositionWindow, ChangeWindowAttributes */
     /* RealizeWindow, UnrealizeWindow */
     pScreen->ValidateTree = miValidateTree;


More information about the xorg-commit mailing list