[PATCH:xf86-video-mach64] Mach64PixelARGB should use exaGetPixmapFirstPixel when EXA is in use

Alan Coopersmith alan.coopersmith at oracle.com
Thu Dec 6 16:57:43 PST 2012


Fixes crash attempting to read a pixel from a NULL pPixmap->devPrivate.ptr

Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
---
 src/atimach64render.c |   33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

Mostly just cut-and-paste and guess-and-hope, but it seems to work and stops
the crash for me.

diff --git a/src/atimach64render.c b/src/atimach64render.c
index 4862cd4..1328cca 100644
--- a/src/atimach64render.c
+++ b/src/atimach64render.c
@@ -208,22 +208,31 @@ Mach64PixelARGB(PixmapPtr pPixmap, CARD32 format, CARD32 *argb)
     CARD32 pixel;
     CARD8  comp;
     int    bits, shift;
+#ifdef USE_EXA
+    ScrnInfoPtr pScreenInfo = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+    ATIPtr pATI = ATIPTR(pScreenInfo);
+#endif
 
     /* Ensure that texture drawing has completed. */
     exaWaitSync(pPixmap->drawable.pScreen);
 
-    /* exaGetPixmapFirstPixel() */
-
-    switch (pPixmap->drawable.bitsPerPixel) {
-    case 32:
-        pixel = *(CARD32 *)(pPixmap->devPrivate.ptr);
-        break;
-    case 16:
-        pixel = *(CARD16 *)(pPixmap->devPrivate.ptr);
-        break;
-    default:
-        pixel = *(CARD8 *)(pPixmap->devPrivate.ptr);
-        break;
+#ifdef USE_EXA
+    if (pATI->useEXA)
+        pixel = exaGetPixmapFirstPixel(pPixmap);
+    else
+#endif
+    {
+        switch (pPixmap->drawable.bitsPerPixel) {
+        case 32:
+            pixel = *(CARD32 *)(pPixmap->devPrivate.ptr);
+            break;
+        case 16:
+            pixel = *(CARD16 *)(pPixmap->devPrivate.ptr);
+            break;
+        default:
+            pixel = *(CARD8 *)(pPixmap->devPrivate.ptr);
+            break;
+        }
     }
 
     /* exaGetRGBAFromPixel()/viaPixelARGB8888() */
-- 
1.7.9.2



More information about the xorg-devel mailing list