[xf86-video-mach64] crash on sparc64 w/ xserver 1.14.1

Michel Dänzer michel at daenzer.net
Wed Jun 5 01:21:29 PDT 2013


On Die, 2013-06-04 at 18:22 -0400, Matthieu Herrb wrote:
> On Tue, Jun 04, 2013 at 06:26:50PM +0200, Michel Dänzer wrote:
> > On Die, 2013-06-04 at 10:40 -0400, Matthieu Herrb wrote:
> > > On Tue, Jun 04, 2013 at 12:39:11PM +0200, Michel Dänzer wrote:
> > > > On Mon, 2013-06-03 at 15:41 -0400, Matthieu Herrb wrote:
> > > > > 
> > > > > I've implemented that (see previous message). Now the X server doesn't
> > > > > crash anymore but experiences corruption in the Xft fonts, like shown
> > > > > on the attached screenshot.
> > > > > 
> > > > > Any more clues ? 
> > > > 
> > > > Hmm... Looks like some of the glyphs are getting corrupted in the glyph
> > > > cache. Maybe there's a problem with the UploadToScreen hook, or
> > > > something like that.
> > > > 
> > > 
> > > The mach64 driver has no UploadToScreen hook. So either it's the
> > > fallback code that's behaving on sparc64 or something else. How could
> > > I check that ?
> > 
> > I'm afraid you'll have to start digging from exaGlyphCacheUploadGlyph().
> > E.g. maybe try forcing a software fallback for the composite fallback
> > path, e.g. by calling ExaCheckComposite instead of CompositePicture, and
> > see if that makes any difference for the problem.
> 
> Thanks for the help so far. Switching to ExaCheckComposite() makes the
> issue go away.

Does the patch below fix the problem by any chance?


diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
index 791fd72..9a74689 100644
--- a/exa/exa_glyphs.c
+++ b/exa/exa_glyphs.c
@@ -309,6 +309,10 @@ exaGlyphCacheUploadGlyph(ScreenPtr pScreen,
     if (pExaScr->do_migration) {
         ExaMigrationRec pixmaps[1];
 
+        /* The cache pixmap isn't a window, so no need to offset coordinates. */
+        exaPixmapDirty(pCachePixmap,
+                       x, y, x + cache->glyphWidth, y + cache->glyphHeight);
+
         /* cache pixmap must have a gpu copy. */
         pixmaps[0].as_dst = TRUE;
         pixmaps[0].as_src = FALSE;
@@ -338,9 +342,8 @@ exaGlyphCacheUploadGlyph(ScreenPtr pScreen,
                      0, 0, 0, 0, x, y, pGlyph->info.width, pGlyph->info.height);
 
  damage:
-    /* The cache pixmap isn't a window, so no need to offset coordinates. */
-    exaPixmapDirty(pCachePixmap,
-                   x, y, x + cache->glyphWidth, y + cache->glyphHeight);
+    if (pExaScr->do_migration)
+        DamageRegionProcessPending(&pCachePixmap->drawable);
 }
 
 static _X_INLINE ExaGlyphCacheResult

-- 
Earthling Michel Dänzer           |                   http://www.amd.com
Libre software enthusiast         |          Debian, X and DRI developer


More information about the xorg-devel mailing list