Fix a few problems in Xgl
This commit is contained in:
parent
04ccba4d40
commit
7109ae147c
|
@ -38,45 +38,25 @@ xglCopy (DrawablePtr pSrc,
|
||||||
int srcXoff, srcYoff;
|
int srcXoff, srcYoff;
|
||||||
int dstXoff, dstYoff;
|
int dstXoff, dstYoff;
|
||||||
|
|
||||||
|
XGL_SCREEN_PRIV (pDst->pScreen);
|
||||||
XGL_DRAWABLE_PIXMAP_PRIV (pSrc);
|
XGL_DRAWABLE_PIXMAP_PRIV (pSrc);
|
||||||
|
|
||||||
if (!nBox)
|
if (!nBox)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* source is all in software and damaged, fall-back is probably more
|
if (!xglPrepareTarget (pDst))
|
||||||
efficient */
|
|
||||||
if (pPixmapPriv->allBits &&
|
|
||||||
pPixmapPriv->pDamage &&
|
|
||||||
REGION_NOTEMPTY (pDrawable->pScreen,
|
|
||||||
DamageRegion (pPixmapPriv->pDamage)))
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (xglPrepareTarget (pDst))
|
if (!xglSyncSurface (pSrc))
|
||||||
{
|
return FALSE;
|
||||||
XGL_SCREEN_PRIV (pDst->pScreen);
|
|
||||||
|
|
||||||
if (!xglSyncSurface (pSrc))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
XGL_GET_DRAWABLE (pDst, dst, dstXoff, dstYoff);
|
|
||||||
|
|
||||||
/* blit to screen */
|
|
||||||
if (dst == pScreenPriv->surface)
|
|
||||||
XGL_INCREMENT_PIXMAP_SCORE (pPixmapPriv, 5000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!xglPrepareTarget (pSrc))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (!xglSyncSurface (pDst))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
XGL_GET_DRAWABLE (pDst, dst, dstXoff, dstYoff);
|
|
||||||
}
|
|
||||||
|
|
||||||
XGL_GET_DRAWABLE (pSrc, src, srcXoff, srcYoff);
|
XGL_GET_DRAWABLE (pSrc, src, srcXoff, srcYoff);
|
||||||
|
XGL_GET_DRAWABLE (pDst, dst, dstXoff, dstYoff);
|
||||||
|
|
||||||
|
/* blit to screen */
|
||||||
|
if (dst == pScreenPriv->surface)
|
||||||
|
XGL_INCREMENT_PIXMAP_SCORE (pPixmapPriv, 5000);
|
||||||
|
|
||||||
glitz_surface_set_clip_region (dst,
|
glitz_surface_set_clip_region (dst,
|
||||||
dstXoff, dstYoff,
|
dstXoff, dstYoff,
|
||||||
(glitz_box_t *) pBox, nBox);
|
(glitz_box_t *) pBox, nBox);
|
||||||
|
|
|
@ -188,10 +188,13 @@ xglFillRect (DrawablePtr pDrawable,
|
||||||
pExtent->x2 - pExtent->x1, pExtent->y2 - pExtent->y1,
|
pExtent->x2 - pExtent->x1, pExtent->y2 - pExtent->y1,
|
||||||
pBox, nBox))
|
pBox, nBox))
|
||||||
{
|
{
|
||||||
RegionRec region;
|
RegionRec region;
|
||||||
Bool overlap;
|
RegionPtr pDamageRegion;
|
||||||
|
glitz_surface_t *surface;
|
||||||
|
int xOff, yOff;
|
||||||
|
|
||||||
XGL_DRAWABLE_PIXMAP (pDrawable);
|
XGL_DRAWABLE_PIXMAP (pDrawable);
|
||||||
|
XGL_PIXMAP_PRIV (pPixmap);
|
||||||
|
|
||||||
if (!xglMapPixmapBits (pPixmap))
|
if (!xglMapPixmapBits (pPixmap))
|
||||||
FatalError (XGL_SW_FAILURE_STRING);
|
FatalError (XGL_SW_FAILURE_STRING);
|
||||||
|
@ -209,21 +212,34 @@ xglFillRect (DrawablePtr pDrawable,
|
||||||
FatalError (XGL_SW_FAILURE_STRING);
|
FatalError (XGL_SW_FAILURE_STRING);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pDamageRegion = DamageRegion (pPixmapPriv->pDamage);
|
||||||
|
|
||||||
REGION_INIT (pGC->pScreen, ®ion, pBox, nBox);
|
XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
|
||||||
|
|
||||||
|
pPixmapPriv->damageBox = miEmptyBox;
|
||||||
|
|
||||||
while (nBox--)
|
while (nBox--)
|
||||||
{
|
{
|
||||||
fbFill (pDrawable, pGC,
|
fbFill (pDrawable, pGC,
|
||||||
pBox->x1, pBox->y1,
|
pBox->x1, pBox->y1,
|
||||||
pBox->x2 - pBox->x1, pBox->y2 - pBox->y1);
|
pBox->x2 - pBox->x1, pBox->y2 - pBox->y1);
|
||||||
|
|
||||||
|
if (pPixmapPriv->format)
|
||||||
|
{
|
||||||
|
part.x1 = pBox->x1 + xOff;
|
||||||
|
part.y1 = pBox->y1 + yOff;
|
||||||
|
part.x2 = pBox->x2 + xOff;
|
||||||
|
part.y2 = pBox->y2 + yOff;
|
||||||
|
|
||||||
|
REGION_INIT (pDrawable->pScreen, ®ion, &part, 1);
|
||||||
|
REGION_UNION (pDrawable->pScreen,
|
||||||
|
pDamageRegion, pDamageRegion, ®ion);
|
||||||
|
REGION_UNINIT (pDrawable->pScreen, ®ion);
|
||||||
|
}
|
||||||
|
|
||||||
pBox++;
|
pBox++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hmm, overlap can't be good, don't know what to do about that */
|
|
||||||
REGION_VALIDATE (pGC->pScreen, ®ion, &overlap);
|
|
||||||
xglAddSurfaceDamage (pDrawable, ®ion);
|
|
||||||
REGION_UNINIT (pGC->pScreen, ®ion);
|
|
||||||
} else
|
} else
|
||||||
xglAddCurrentBitDamage (pDrawable);
|
xglAddCurrentBitDamage (pDrawable);
|
||||||
|
|
||||||
|
@ -241,6 +257,9 @@ xglFillSpan (DrawablePtr pDrawable,
|
||||||
BoxPtr pExtent;
|
BoxPtr pExtent;
|
||||||
xglGeometryPtr pGeometry;
|
xglGeometryPtr pGeometry;
|
||||||
|
|
||||||
|
if (n < 1)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
||||||
|
|
||||||
pGeometry = xglGetScratchVertexGeometry (pGC->pScreen, 2 * n);
|
pGeometry = xglGetScratchVertexGeometry (pGC->pScreen, 2 * n);
|
||||||
|
@ -272,6 +291,9 @@ xglFillLine (DrawablePtr pDrawable,
|
||||||
xglGeometryPtr pGeometry;
|
xglGeometryPtr pGeometry;
|
||||||
Bool coincident_endpoints;
|
Bool coincident_endpoints;
|
||||||
|
|
||||||
|
if (npt < 2)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
||||||
|
|
||||||
coincident_endpoints = FALSE;
|
coincident_endpoints = FALSE;
|
||||||
|
@ -342,6 +364,9 @@ xglFillSegment (DrawablePtr pDrawable,
|
||||||
BoxPtr pExtent;
|
BoxPtr pExtent;
|
||||||
xglGeometryPtr pGeometry;
|
xglGeometryPtr pGeometry;
|
||||||
|
|
||||||
|
if (nsegInit < 1)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
||||||
|
|
||||||
pGeometry = xglGetScratchVertexGeometry (pGC->pScreen, 2 * nsegInit);
|
pGeometry = xglGetScratchVertexGeometry (pGC->pScreen, 2 * nsegInit);
|
||||||
|
@ -376,6 +401,9 @@ xglFillGlyph (DrawablePtr pDrawable,
|
||||||
BoxPtr pExtent;
|
BoxPtr pExtent;
|
||||||
xglGeometryRec geometry;
|
xglGeometryRec geometry;
|
||||||
|
|
||||||
|
if (nGlyph < 1)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
pExtent = REGION_EXTENTS (pDrawable->pScreen, pGC->pCompositeClip);
|
||||||
|
|
||||||
x += pDrawable->x;
|
x += pDrawable->x;
|
||||||
|
|
|
@ -206,7 +206,7 @@ xglCopyArea (DrawablePtr pSrc,
|
||||||
box.x2 = box.x1 + w;
|
box.x2 = box.x1 + w;
|
||||||
box.y2 = box.y1 + h;
|
box.y2 = box.y1 + h;
|
||||||
|
|
||||||
if (pGCPriv->flags &= ~xglGCReadOnlyDrawableFlag)
|
if (pGC->alu != GXcopy || (pGCPriv->flags &= ~xglGCReadOnlyDrawableFlag))
|
||||||
{
|
{
|
||||||
if (!xglSyncBits (pSrc, &box))
|
if (!xglSyncBits (pSrc, &box))
|
||||||
FatalError (XGL_SW_FAILURE_STRING);
|
FatalError (XGL_SW_FAILURE_STRING);
|
||||||
|
|
|
@ -46,6 +46,9 @@ xglShmPutImage (DrawablePtr pDrawable,
|
||||||
ScreenPtr pScreen = pDrawable->pScreen;
|
ScreenPtr pScreen = pDrawable->pScreen;
|
||||||
PixmapPtr pPixmapHeader = NULL;
|
PixmapPtr pPixmapHeader = NULL;
|
||||||
PixmapPtr pPixmap;
|
PixmapPtr pPixmap;
|
||||||
|
int saveTarget;
|
||||||
|
|
||||||
|
XGL_DRAWABLE_PIXMAP_PRIV (pDrawable);
|
||||||
|
|
||||||
if ((format == ZPixmap) || (depth == 1))
|
if ((format == ZPixmap) || (depth == 1))
|
||||||
{
|
{
|
||||||
|
@ -53,7 +56,9 @@ xglShmPutImage (DrawablePtr pDrawable,
|
||||||
GetScratchPixmapHeader (pScreen, w, h, depth,
|
GetScratchPixmapHeader (pScreen, w, h, depth,
|
||||||
BitsPerPixel (depth),
|
BitsPerPixel (depth),
|
||||||
PixmapBytePad (w, depth),
|
PixmapBytePad (w, depth),
|
||||||
(pointer) data);
|
(pointer) data);
|
||||||
|
if (pPixmap)
|
||||||
|
XGL_GET_PIXMAP_PRIV (pPixmap)->format = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -95,6 +100,10 @@ xglShmPutImage (DrawablePtr pDrawable,
|
||||||
if (!pPixmap)
|
if (!pPixmap)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* CopyArea should always be done in software */
|
||||||
|
saveTarget = pPixmapPriv->target;
|
||||||
|
pPixmapPriv->target = xglPixmapTargetNo;
|
||||||
|
|
||||||
if (format == XYBitmap)
|
if (format == XYBitmap)
|
||||||
(*pGC->ops->CopyPlane) ((DrawablePtr) pPixmap, pDrawable, pGC,
|
(*pGC->ops->CopyPlane) ((DrawablePtr) pPixmap, pDrawable, pGC,
|
||||||
sx, sy, sw, sh, dx, dy, 1L);
|
sx, sy, sw, sh, dx, dy, 1L);
|
||||||
|
@ -102,6 +111,8 @@ xglShmPutImage (DrawablePtr pDrawable,
|
||||||
(*pGC->ops->CopyArea) ((DrawablePtr) pPixmap, pDrawable, pGC,
|
(*pGC->ops->CopyArea) ((DrawablePtr) pPixmap, pDrawable, pGC,
|
||||||
sx, sy, sw, sh, dx, dy);
|
sx, sy, sw, sh, dx, dy);
|
||||||
|
|
||||||
|
pPixmapPriv->target = saveTarget;
|
||||||
|
|
||||||
if (pPixmapHeader)
|
if (pPixmapHeader)
|
||||||
FreeScratchPixmapHeader (pPixmapHeader);
|
FreeScratchPixmapHeader (pPixmapHeader);
|
||||||
else
|
else
|
||||||
|
|
|
@ -237,9 +237,6 @@ xglSyncSurface (DrawablePtr pDrawable)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pPixmapPriv->pDamage)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
pRegion = DamageRegion (pPixmapPriv->pDamage);
|
pRegion = DamageRegion (pPixmapPriv->pDamage);
|
||||||
|
|
||||||
if (REGION_NOTEMPTY (pDrawable->pScreen, pRegion))
|
if (REGION_NOTEMPTY (pDrawable->pScreen, pRegion))
|
||||||
|
@ -375,14 +372,12 @@ xglAddCurrentBitDamage (DrawablePtr pDrawable)
|
||||||
{
|
{
|
||||||
XGL_DRAWABLE_PIXMAP_PRIV (pDrawable);
|
XGL_DRAWABLE_PIXMAP_PRIV (pDrawable);
|
||||||
|
|
||||||
if (BOX_NOTEMPTY (&pPixmapPriv->bitBox))
|
if (pPixmapPriv->target == xglPixmapTargetIn &&
|
||||||
|
pPixmapPriv->damageBox.x1 < pPixmapPriv->bitBox.x2 &&
|
||||||
|
pPixmapPriv->damageBox.y1 < pPixmapPriv->bitBox.y2 &&
|
||||||
|
pPixmapPriv->damageBox.x2 > pPixmapPriv->bitBox.x1 &&
|
||||||
|
pPixmapPriv->damageBox.y2 > pPixmapPriv->bitBox.y1)
|
||||||
{
|
{
|
||||||
if (pPixmapPriv->damageBox.x1 > pPixmapPriv->bitBox.x2 ||
|
|
||||||
pPixmapPriv->damageBox.y1 > pPixmapPriv->bitBox.y2 ||
|
|
||||||
pPixmapPriv->damageBox.x2 < pPixmapPriv->bitBox.x1 ||
|
|
||||||
pPixmapPriv->damageBox.y2 < pPixmapPriv->bitBox.y1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pPixmapPriv->bitBox = miEmptyBox;
|
pPixmapPriv->bitBox = miEmptyBox;
|
||||||
pPixmapPriv->allBits = FALSE;
|
pPixmapPriv->allBits = FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,9 +246,8 @@ xglTrapezoids (CARD8 op,
|
||||||
is likely to exceed the size of the mask. */
|
is likely to exceed the size of the mask. */
|
||||||
if ((SMOOTH_TRAPS_ESTIMATE_RECTS (nTrap) * 4) > (width * height))
|
if ((SMOOTH_TRAPS_ESTIMATE_RECTS (nTrap) * 4) > (width * height))
|
||||||
accelerate = FALSE;
|
accelerate = FALSE;
|
||||||
|
} else
|
||||||
accelerate = FALSE;
|
accelerate = FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
pMask = xglCreateMaskPicture (pScreen, pDst, maskFormat,
|
pMask = xglCreateMaskPicture (pScreen, pDst, maskFormat,
|
||||||
width, height, accelerate);
|
width, height, accelerate);
|
||||||
|
|
|
@ -107,10 +107,10 @@ xglCopyWindow (WindowPtr pWin,
|
||||||
|
|
||||||
pPixmap = XGL_GET_WINDOW_PIXMAP (pWin);
|
pPixmap = XGL_GET_WINDOW_PIXMAP (pWin);
|
||||||
|
|
||||||
box.x1 = pWin->drawable.x + pExtent->x1;
|
box.x1 = pExtent->x1;
|
||||||
box.y1 = pWin->drawable.y + pExtent->y1;
|
box.y1 = pExtent->y1;
|
||||||
box.x2 = pWin->drawable.x + pExtent->x2;
|
box.x2 = pExtent->x2;
|
||||||
box.y2 = pWin->drawable.y + pExtent->y2;
|
box.y2 = pExtent->y2;
|
||||||
|
|
||||||
dx = ptOldOrg.x - pWin->drawable.x;
|
dx = ptOldOrg.x - pWin->drawable.x;
|
||||||
dy = ptOldOrg.y - pWin->drawable.y;
|
dy = ptOldOrg.y - pWin->drawable.y;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user