xserver: Branch 'master' - 3 commits
Michel Daenzer
daenzer at kemper.freedesktop.org
Tue Dec 19 17:15:27 EET 2006
exa/exa.c | 11 +++++++++++
exa/exa_accel.c | 47 ++++++++++++++++++++++++-----------------------
exa/exa_render.c | 17 +++++++++++------
3 files changed, 46 insertions(+), 29 deletions(-)
New commits:
diff-tree fdcc22ca1704d3519156c66804528c21b04fea65 (from 67c2a86e59e915d9a5681e9d233478cfea3e51ed)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date: Tue Dec 19 16:11:17 2006 +0100
exaCopyNtoN: Fix usage of 'dx' and 'dy' instead of 'reverse' and 'upsidedown'.
diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index efae6db..098b27c 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -401,7 +401,8 @@ exaCopyNtoN (DrawablePtr pSrcDrawable
}
/* Mixed directions must be handled specially if the card is lame */
- if (pExaScr->info->flags & EXA_TWO_BITBLT_DIRECTIONS && (dx*dy) < 0) {
+ if (pExaScr->info->flags & EXA_TWO_BITBLT_DIRECTIONS &&
+ reverse != upsidedown) {
if (!exaCopyNtoNTwoDir(pSrcDrawable, pDstDrawable, pGC, pbox, nbox,
dx, dy))
goto fallback;
@@ -411,7 +412,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable
if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) &&
(pDstPixmap = exaGetOffscreenPixmap (pDstDrawable, &dst_off_x, &dst_off_y)) &&
(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap,
- dx, dy,
+ reverse ? -1 : 1, upsidedown ? -1 : 1,
pGC ? pGC->alu : GXcopy,
pGC ? pGC->planemask : FB_ALLONES))
{
diff-tree 67c2a86e59e915d9a5681e9d233478cfea3e51ed (from 6b1e354dbb6e8ed9f2c654bbe7f8bbf241843d1c)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date: Tue Dec 19 15:44:18 2006 +0100
EXA: Compare backing pixmaps instead of drawables against driver limits.
The driver operations are always contained within the backing pixmaps, it
doesn't matter if the drawables are bigger.
diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index bc77a40..efae6db 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -49,12 +49,12 @@ exaFillSpans(DrawablePtr pDrawable, GCPt
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
- pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
+ pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
if (pExaScr->swappedOut ||
pGC->fillStyle != FillSolid ||
- pDrawable->width > pExaScr->info->maxX ||
- pDrawable->height > pExaScr->info->maxY)
+ pPixmap->drawable.width > pExaScr->info->maxX ||
+ pPixmap->drawable.height > pExaScr->info->maxY)
{
exaDoMigration (pixmaps, 1, FALSE);
ExaCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted);
@@ -380,19 +380,19 @@ exaCopyNtoN (DrawablePtr pSrcDrawable
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
- pixmaps[0].pPix = exaGetDrawablePixmap (pDstDrawable);
+ pixmaps[0].pPix = pDstPixmap = exaGetDrawablePixmap (pDstDrawable);
pixmaps[1].as_dst = FALSE;
pixmaps[1].as_src = TRUE;
- pixmaps[1].pPix = exaGetDrawablePixmap (pSrcDrawable);
+ pixmaps[1].pPix = pSrcPixmap = exaGetDrawablePixmap (pSrcDrawable);
/* Respect maxX/maxY in a trivial way: don't set up drawing when we might
* violate the limits. The proper solution would be a temporary pixmap
* adjusted so that the drawing happened within limits.
*/
- if (pSrcDrawable->width > pExaScr->info->maxX ||
- pSrcDrawable->height > pExaScr->info->maxY ||
- pDstDrawable->width > pExaScr->info->maxX ||
- pDstDrawable->height > pExaScr->info->maxY)
+ if (pSrcPixmap->drawable.width > pExaScr->info->maxX ||
+ pSrcPixmap->drawable.height > pExaScr->info->maxY ||
+ pDstPixmap->drawable.width > pExaScr->info->maxX ||
+ pDstPixmap->drawable.height > pExaScr->info->maxY)
{
exaDoMigration (pixmaps, 2, FALSE);
goto fallback;
@@ -621,12 +621,12 @@ exaPolyFillRect(DrawablePtr pDrawable,
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
- pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
+ pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
if (pExaScr->swappedOut ||
pGC->fillStyle != FillSolid ||
- pDrawable->width > pExaScr->info->maxX ||
- pDrawable->height > pExaScr->info->maxY)
+ pPixmap->drawable.width > pExaScr->info->maxX ||
+ pPixmap->drawable.height > pExaScr->info->maxY)
{
exaDoMigration (pixmaps, 1, FALSE);
ExaCheckPolyFillRect (pDrawable, pGC, nrect, prect);
@@ -738,11 +738,11 @@ exaSolidBoxClipped (DrawablePtr pDrawabl
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
- pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
+ pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
if (pExaScr->swappedOut ||
- pDrawable->width > pExaScr->info->maxX ||
- pDrawable->height > pExaScr->info->maxY)
+ pPixmap->drawable.width > pExaScr->info->maxX ||
+ pPixmap->drawable.height > pExaScr->info->maxY)
{
exaDoMigration (pixmaps, 1, FALSE);
goto fallback;
@@ -997,10 +997,10 @@ exaFillRegionSolid (DrawablePtr pDrawabl
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
- pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
+ pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
- if (pDrawable->width > pExaScr->info->maxX ||
- pDrawable->height > pExaScr->info->maxY)
+ if (pPixmap->drawable.width > pExaScr->info->maxX ||
+ pPixmap->drawable.height > pExaScr->info->maxY)
{
exaDoMigration (pixmaps, 1, FALSE);
goto fallback;
@@ -1064,13 +1064,13 @@ exaFillRegionTiled (DrawablePtr pDrawabl
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
- pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
+ pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
pixmaps[1].as_dst = FALSE;
pixmaps[1].as_src = TRUE;
pixmaps[1].pPix = pTile;
- if (pDrawable->width > pExaScr->info->maxX ||
- pDrawable->height > pExaScr->info->maxY ||
+ if (pPixmap->drawable.width > pExaScr->info->maxX ||
+ pPixmap->drawable.height > pExaScr->info->maxY ||
tileWidth > pExaScr->info->maxX ||
tileHeight > pExaScr->info->maxY)
{
diff --git a/exa/exa_render.c b/exa/exa_render.c
index 9affb9f..fd3d87f 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -336,16 +336,21 @@ exaTryDriverComposite(CARD8 op,
struct _Pixmap scratch;
ExaMigrationRec pixmaps[3];
+ pSrcPix = exaGetDrawablePixmap(pSrc->pDrawable);
+ pDstPix = exaGetDrawablePixmap(pDst->pDrawable);
+ if (pMask)
+ pMaskPix = exaGetDrawablePixmap(pMask->pDrawable);
+
/* Bail if we might exceed coord limits by rendering from/to these. We
* should really be making some scratch pixmaps with offsets and coords
* adjusted to deal with this, but it hasn't been done yet.
*/
- if (pSrc->pDrawable->width > pExaScr->info->maxX ||
- pSrc->pDrawable->height > pExaScr->info->maxY ||
- pDst->pDrawable->width > pExaScr->info->maxX ||
- pDst->pDrawable->height > pExaScr->info->maxY ||
- (pMask && (pMask->pDrawable->width > pExaScr->info->maxX ||
- pMask->pDrawable->height > pExaScr->info->maxY)))
+ if (pSrcPix->drawable.width > pExaScr->info->maxX ||
+ pSrcPix->drawable.height > pExaScr->info->maxY ||
+ pDstPix->drawable.width > pExaScr->info->maxX ||
+ pDstPix->drawable.height > pExaScr->info->maxY ||
+ (pMask && (pMaskPix->drawable.width > pExaScr->info->maxX ||
+ pMaskPix->drawable.height > pExaScr->info->maxY)))
{
return -1;
}
diff-tree 6b1e354dbb6e8ed9f2c654bbe7f8bbf241843d1c (from 1b029fd896b76096905c516925ce0214fe14632c)
Author: Eric Anholt <eric at anholt.net>
Date: Tue Dec 19 15:24:19 2006 +0100
EXA: Disable SHM pixmaps.
See https://bugs.freedesktop.org/show_bug.cgi?id=6772 .
diff --git a/exa/exa.c b/exa/exa.c
index b490653..bf94114 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -32,6 +32,10 @@
#include <dix-config.h>
#endif
+#ifdef MITSHM
+#include "shmint.h"
+#endif
+
#include <stdlib.h>
#include "exa_priv.h"
@@ -610,6 +614,13 @@ exaDriverInit (ScreenPtr pScreen,
miDisableCompositeWrapper(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, NULL);
+#endif
/*
* Hookup offscreen pixmaps
*/
More information about the xorg-commit
mailing list