diff options
-rw-r--r-- | Xext/shm.c | 86 | ||||
-rw-r--r-- | Xext/shmint.h | 3 | ||||
-rw-r--r-- | exa/exa.c | 7 | ||||
-rw-r--r-- | exa/exa_accel.c | 88 | ||||
-rw-r--r-- | exa/exa_priv.h | 9 |
5 files changed, 23 insertions, 170 deletions
diff --git a/Xext/shm.c b/Xext/shm.c index 6465edb95..ba75263cc 100644 --- a/Xext/shm.c +++ b/Xext/shm.c @@ -101,7 +101,6 @@ typedef struct _ShmDesc { unsigned long size; } ShmDescRec, *ShmDescPtr; -static void miShmPutImage(XSHM_PUT_IMAGE_ARGS); static PixmapPtr fbShmCreatePixmap(XSHM_CREATE_PIXMAP_ARGS); static int ShmDetachSegment( pointer /* value */, @@ -143,8 +142,8 @@ static int shmPixFormat[MAXSCREENS]; static ShmFuncsPtr shmFuncs[MAXSCREENS]; static DestroyPixmapProcPtr destroyPixmap[MAXSCREENS]; static DevPrivateKey shmPixmapPrivate = &shmPixmapPrivate; -static ShmFuncs miFuncs = {NULL, miShmPutImage}; -static ShmFuncs fbFuncs = {fbShmCreatePixmap, fbShmPutImage}; +static ShmFuncs miFuncs = {NULL, NULL}; +static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL}; #define VERIFY_SHMSEG(shmseg,shmdesc,client) \ { \ @@ -506,66 +505,28 @@ ProcShmDetach(ClientPtr client) return(client->noClientException); } -static void -miShmPutImage(DrawablePtr dst, GCPtr pGC, +/* + * If the given request doesn't exactly match PutImage's constraints, + * wrap the image in a scratch pixmap header and let CopyArea sort it out. + */ +static oid +doShmPutImage(DrawablePtr dst, GCPtr pGC, int depth, unsigned int format, int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, char *data) { - PixmapPtr pmap; - GCPtr putGC; - - putGC = GetScratchGC(depth, dst->pScreen); - if (!putGC) - return; - pmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth, - CREATE_PIXMAP_USAGE_SCRATCH); - if (!pmap) - { - FreeScratchGC(putGC); + PixmapPtr pPixmap; + + pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth, + BitsPerPixel(depth), + PixmapBytePad(w, depth), + data); + if (!pPixmap) return; - } - ValidateGC((DrawablePtr)pmap, putGC); - (*putGC->ops->PutImage)((DrawablePtr)pmap, putGC, depth, -sx, -sy, w, h, 0, - (format == XYPixmap) ? XYPixmap : ZPixmap, data); - FreeScratchGC(putGC); - if (format == XYBitmap) - (void)(*pGC->ops->CopyPlane)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh, - dx, dy, 1L); - else - (void)(*pGC->ops->CopyArea)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh, - dx, dy); - (*pmap->drawable.pScreen->DestroyPixmap)(pmap); -} - -_X_EXPORT void -fbShmPutImage(DrawablePtr dst, GCPtr pGC, - int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data) -{ - if ((format == ZPixmap) || (depth == 1)) - { - PixmapPtr pPixmap; - - pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth, - BitsPerPixel(depth), PixmapBytePad(w, depth), (pointer)data); - if (!pPixmap) - return; - if (format == XYBitmap) - (void)(*pGC->ops->CopyPlane)((DrawablePtr)pPixmap, dst, pGC, - sx, sy, sw, sh, dx, dy, 1L); - else - (void)(*pGC->ops->CopyArea)((DrawablePtr)pPixmap, dst, pGC, - sx, sy, sw, sh, dx, dy); - FreeScratchPixmapHeader(pPixmap); - } - else - miShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, - data); + pGC->ops->CopyArea((DrawablePtr)pPixmap, dst, pGC, sx, sy, sw, sh, dx, dy); + FreeScratchPixmapHeader(pPixmap); } - #ifdef PANORAMIX static int ProcPanoramiXShmPutImage(ClientPtr client) @@ -918,13 +879,12 @@ ProcShmPutImage(ClientPtr client) shmdesc->addr + stuff->offset + (stuff->srcY * length)); else - (*shmFuncs[pDraw->pScreen->myNum]->PutImage)( - pDraw, pGC, stuff->depth, stuff->format, - stuff->totalWidth, stuff->totalHeight, - stuff->srcX, stuff->srcY, - stuff->srcWidth, stuff->srcHeight, - stuff->dstX, stuff->dstY, - shmdesc->addr + stuff->offset); + doShmPutImage(pDraw, pGC, stuff->depth, stuff->format, + stuff->totalWidth, stuff->totalHeight, + stuff->srcX, stuff->srcY, + stuff->srcWidth, stuff->srcHeight, + stuff->dstX, stuff->dstY, + shmdesc->addr + stuff->offset); if (stuff->sendEvent) { diff --git a/Xext/shmint.h b/Xext/shmint.h index 33ab6a428..fc056bc72 100644 --- a/Xext/shmint.h +++ b/Xext/shmint.h @@ -37,9 +37,6 @@ void ShmSetPixmapFormat(ScreenPtr pScreen, int format); void -fbShmPutImage(XSHM_PUT_IMAGE_ARGS); - -void ShmRegisterFbFuncs(ScreenPtr pScreen); #endif /* _SHMINT_H_ */ @@ -936,13 +936,6 @@ exaDriverInit (ScreenPtr pScreen, } #endif -#ifdef MITSHM - /* Re-register with the MI funcs, which don't allow shared pixmaps. - * Shared pixmaps are almost always a performance loss for us, but this - * still allows for SHM PutImage. - */ - ShmRegisterFuncs(pScreen, &exaShmFuncs); -#endif /* * Hookup offscreen pixmaps */ diff --git a/exa/exa_accel.c b/exa/exa_accel.c index c3cf36541..1c07a0b36 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -249,100 +249,12 @@ exaDoPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, return TRUE; } -#ifdef MITSHM - -static Bool -exaDoShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, - unsigned int format, int w, int h, int sx, int sy, int sw, - int sh, int dx, int dy, char *data) -{ - int src_stride = PixmapBytePad(w, depth); - - if (exaDoPutImage(pDrawable, pGC, depth, dx, dy, sw, sh, format, data + - sy * src_stride + sx * BitsPerPixel(depth) / 8, - src_stride)) - return TRUE; - - if (format == ZPixmap) - { - PixmapPtr pPixmap = - GetScratchPixmapHeader(pDrawable->pScreen, w, h, depth, - BitsPerPixel(depth), PixmapBytePad(w, depth), - (pointer)data); - - if (!pPixmap) - return FALSE; - - pGC->ops->CopyArea(&pPixmap->drawable, pDrawable, pGC, sx, sy, sw, sh, - dx, dy); - - FreeScratchPixmapHeader(pPixmap); - - return TRUE; - } - - return FALSE; -} - -/* The actual ShmPutImage isn't wrapped by the damage layer, so we need to - * inform any interested parties of the damage incurred to the drawable. - * - * We also need to set the pending damage to ensure correct migration in all - * cases. - */ -void -exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data) -{ - PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable); - ExaPixmapPriv(pPixmap); - BoxRec box = { .x1 = pDrawable->x + dx, .y1 = pDrawable->y + dy, - .x2 = pDrawable->x + dx + sw, .y2 = pDrawable->y + dy + sh }; - RegionRec region; - RegionPtr pending_damage = NULL; - - if (pExaPixmap->pDamage) - pending_damage = DamagePendingRegion(pExaPixmap->pDamage); - - if (pending_damage) { - REGION_INIT(pScreen, ®ion, &box, 1); - exaDamageDestForMigration(pDrawable, pPixmap, ®ion); - } - - if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, - dx, dy, data)) { - if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle, - pGC->alu)) - exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); - else - exaPrepareAccessReg (pDrawable, EXA_PREPARE_DEST, ®ion); - fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, - data); - exaFinishAccess(pDrawable, EXA_PREPARE_DEST); - } - - if (pending_damage) { - DamageDamageRegion(pDrawable, ®ion); - REGION_UNINIT(pScreen, ®ion); - } -} - -ShmFuncs exaShmFuncs = { NULL, exaShmPutImage }; - -#endif - static void exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, char *bits) { -#ifdef MITSHM - if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, 0, 0, w, h, x, y, - bits)) -#else if (!exaDoPutImage(pDrawable, pGC, depth, x, y, w, h, format, bits, PixmapBytePad(w, pDrawable->depth))) -#endif ExaCheckPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); } diff --git a/exa/exa_priv.h b/exa/exa_priv.h index ca7122be9..0ebe07bd5 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -351,20 +351,11 @@ exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile, DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu); void -exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data); - -void exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h, unsigned int format, unsigned long planeMask, char *d); extern const GCOps exaOps; -#ifdef MITSHM -extern ShmFuncs exaShmFuncs; -#endif - #ifdef RENDER void ExaCheckComposite (CARD8 op, |