XAA PixmapOps: Sync before accessing unwrapped callbacks.

When using any XAAPixmapOps, we call into unknown but freshly
unwrapped callbacks (like fb ones). Unlike the XAA*Fallback calls,
we did so without syncing first, exposing us to all kinds of
synchronisation issues.

I believe that the rendering errors appeared now because *PaintWindow
vanished (e4d11e58), and we just use miPaintWindow instead. This
takes a less direct route to the hw and ends up at
PolyFillRectPixmap, which very often left drawing artifacts.

We now sync accordingly, and no longer get the rendering artifacts i
was methodically reproducing on radeonhd, radeon, unichrome...

Also, in order to allow driver authors to remove extensive syncing
or flushing to hide this issue, create XAA_VERSION_ defines, put
them in xaa.h and bump the patchlevel.

(novell bug #435791)
This commit is contained in:
Luc Verhaegen 2008-11-07 19:11:11 +01:00
parent 991c88b754
commit 59f9fb4b8c
3 changed files with 9 additions and 3 deletions

View File

@ -2,6 +2,10 @@
#ifndef _XAA_H
#define _XAA_H
#define XAA_VERSION_MAJOR 1
#define XAA_VERSION_MINOR 2
#define XAA_VERSION_RELEASE 1
/*
******** OPERATION SPECIFIC FLAGS *********

View File

@ -100,7 +100,9 @@ static XF86ModuleVersionInfo xaaVersRec =
MODINFOSTRING1,
MODINFOSTRING2,
XORG_VERSION_CURRENT,
1, 2, 0,
XAA_VERSION_MAJOR,
XAA_VERSION_MINOR,
XAA_VERSION_RELEASE,
ABI_CLASS_VIDEODRV, /* requires the video driver ABI */
ABI_VIDEODRV_VERSION,
MOD_CLASS_NONE,

View File

@ -48,8 +48,8 @@
XAAPixmapPtr pixPriv = XAA_GET_PIXMAP_PRIVATE((PixmapPtr)(pDraw));\
GCFuncs *oldFuncs = pGC->funcs;\
pGC->funcs = pGCPriv->wrapFuncs;\
pGC->ops = pGCPriv->wrapOps
pGC->ops = pGCPriv->wrapOps; \
SYNC_CHECK(pGC)
#define XAA_PIXMAP_OP_EPILOGUE(pGC)\
pGCPriv->wrapOps = pGC->ops;\