Export exaPrepare/FinishGC to the rest of EXA, and use it in the ImageGlyph

implementation to avoid unprepared access to the tile. Also, relocate
    the fbGetDrawable to avoid using a stale dest pointer after
    exaSolidBoxClipped() may have migrated it. Revealed by xtest.
This commit is contained in:
Eric Anholt 2006-04-01 22:35:16 +00:00
parent c720ffe875
commit 5f95146fcf
4 changed files with 23 additions and 4 deletions

View File

@ -1,3 +1,13 @@
2006-04-01 Eric Anholt <anholt@FreeBSD.org>
* exa/exa_accel.c: (exaImageGlyphBlt):
* exa/exa_priv.h:
* exa/exa_unaccel.c:
Export exaPrepare/FinishGC to the rest of EXA, and use it in the
ImageGlyph implementation to avoid unprepared access to the tile. Also,
relocate the fbGetDrawable to avoid using a stale dest pointer after
exaSolidBoxClipped() may have migrated it. Revealed by xtest.
2006-04-01 Eric Anholt <anholt@FreeBSD.org> 2006-04-01 Eric Anholt <anholt@FreeBSD.org>
* exa/exa_priv.h: * exa/exa_priv.h:

View File

@ -695,8 +695,7 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
return; return;
} }
glyph = NULL; glyph = NULL;
fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff); switch (pDrawable->bitsPerPixel) {
switch (dstBpp) {
case 8: glyph = fbGlyph8; break; case 8: glyph = fbGlyph8; break;
case 16: glyph = fbGlyph16; break; case 16: glyph = fbGlyph16; break;
case 24: glyph = fbGlyph24; break; case 24: glyph = fbGlyph24; break;
@ -742,6 +741,9 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
EXA_FALLBACK(("to 0x%lx\n", (long)pDrawable)); EXA_FALLBACK(("to 0x%lx\n", (long)pDrawable));
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
exaPrepareAccessGC (pGC);
fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
ppci = ppciInit; ppci = ppciInit;
while (nglyph--) while (nglyph--)
@ -787,6 +789,7 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
} }
x += pci->metrics.characterWidth; x += pci->metrics.characterWidth;
} }
exaFinishAccessGC (pGC);
exaFinishAccess (pDrawable, EXA_PREPARE_DEST); exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
} }

View File

@ -188,6 +188,12 @@ typedef struct _ExaMigrationRec {
void exaDDXDriverInit (ScreenPtr pScreen); void exaDDXDriverInit (ScreenPtr pScreen);
/* exa_unaccel.c */ /* exa_unaccel.c */
void
exaPrepareAccessGC(GCPtr pGC);
void
exaFinishAccessGC(GCPtr pGC);
void void
ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans, ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
DDXPointPtr ppt, int *pwidth, int fSorted); DDXPointPtr ppt, int *pwidth, int fSorted);

View File

@ -36,7 +36,7 @@
* Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are
* 1bpp and never in fb, so we don't worry about them. * 1bpp and never in fb, so we don't worry about them.
*/ */
static void void
exaPrepareAccessGC(GCPtr pGC) exaPrepareAccessGC(GCPtr pGC)
{ {
if (pGC->fillStyle == FillTiled) if (pGC->fillStyle == FillTiled)
@ -46,7 +46,7 @@ exaPrepareAccessGC(GCPtr pGC)
/** /**
* Finishes access to the tile in the GC, if used. * Finishes access to the tile in the GC, if used.
*/ */
static void void
exaFinishAccessGC(GCPtr pGC) exaFinishAccessGC(GCPtr pGC)
{ {
if (pGC->fillStyle == FillTiled) if (pGC->fillStyle == FillTiled)