render: export TriStrip and TriFan to the drivers

Rather than perform an intermediate copy and expand the strip and the
fan into a triangle list (thereby tripling the number of edges that the
driver needs to process), allow the backend to hook directly into the
appropriate Composite function.

In order to extend the PictureScreen, without needlessly bumping the
ABI, we move the existing copy implementations to mipict.c and assign
those by default. To notify the ddx that the new entry points are
available, we introduce PICTURE_SCREEN_VERSION.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Aaron Plattner <aplattner@nvidia.com>
This commit is contained in:
Chris Wilson 2011-09-04 09:34:08 -07:00 committed by Aaron Plattner
parent 9b26e6bc8d
commit 525d4172b2
4 changed files with 114 additions and 32 deletions

View File

@ -569,6 +569,64 @@ miRenderPixelToColor (PictFormatPtr format,
}
}
void
miTriStrip (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoints,
xPointFixed *points)
{
xTriangle *tris, *tri;
int ntri;
ntri = npoints - 2;
tris = malloc(ntri * sizeof (xTriangle));
if (!tris)
return;
for (tri = tris; npoints >= 3; npoints--, points++, tri++)
{
tri->p1 = points[0];
tri->p2 = points[1];
tri->p3 = points[2];
}
CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
free(tris);
}
void
miTriFan (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoints,
xPointFixed *points)
{
xTriangle *tris, *tri;
xPointFixed *first;
int ntri;
ntri = npoints - 2;
tris = malloc(ntri * sizeof (xTriangle));
if (!tris)
return;
first = points++;
for (tri = tris; npoints >= 3; npoints--, points++, tri++)
{
tri->p1 = *first;
tri->p2 = points[0];
tri->p3 = points[1];
}
CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
free(tris);
}
Bool
miPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
{
@ -602,5 +660,8 @@ miPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
ps->AddTraps = 0; /* requires DDX support */
ps->AddTriangles = 0; /* requires DDX support */
ps->TriStrip = miTriStrip; /* converts call to CompositeTriangles */
ps->TriFan = miTriFan;
return TRUE;
}

View File

@ -139,6 +139,26 @@ miCompositeRects (CARD8 op,
int nRect,
xRectangle *rects);
extern _X_EXPORT void
miTriStrip (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoints,
xPointFixed *points);
extern _X_EXPORT void
miTriFan (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoints,
xPointFixed *points);
extern _X_EXPORT void
miTrapezoidBounds (int ntrap, xTrapezoid *traps, BoxPtr box);

View File

@ -1715,23 +1715,14 @@ CompositeTriStrip (CARD8 op,
int npoints,
xPointFixed *points)
{
xTriangle *tris, *tri;
int ntri;
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
if (npoints < 3)
return;
ntri = npoints - 2;
tris = malloc(ntri * sizeof (xTriangle));
if (!tris)
return;
for (tri = tris; npoints >= 3; npoints--, points++, tri++)
{
tri->p1 = points[0];
tri->p2 = points[1];
tri->p3 = points[2];
}
CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
free(tris);
ValidatePicture (pSrc);
ValidatePicture (pDst);
(*ps->TriStrip) (op, pSrc, pDst, maskFormat, xSrc, ySrc, npoints, points);
}
void
@ -1744,25 +1735,14 @@ CompositeTriFan (CARD8 op,
int npoints,
xPointFixed *points)
{
xTriangle *tris, *tri;
xPointFixed *first;
int ntri;
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
if (npoints < 3)
return;
ntri = npoints - 2;
tris = malloc(ntri * sizeof (xTriangle));
if (!tris)
return;
first = points++;
for (tri = tris; npoints >= 3; npoints--, points++, tri++)
{
tri->p1 = *first;
tri->p2 = points[0];
tri->p3 = points[1];
}
CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
free(tris);
ValidatePicture (pSrc);
ValidatePicture (pDst);
(*ps->TriFan) (op, pSrc, pDst, maskFormat, xSrc, ySrc, npoints, points);
}
void

View File

@ -260,6 +260,24 @@ typedef void (*TrianglesProcPtr) (CARD8 op,
int ntri,
xTriangle *tris);
typedef void (*TriStripProcPtr) (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoint,
xPointFixed *points);
typedef void (*TriFanProcPtr) (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoint,
xPointFixed *points);
typedef Bool (*InitIndexedProcPtr) (ScreenPtr pScreen,
PictFormatPtr pFormat);
@ -348,6 +366,9 @@ typedef struct _PictureScreen {
RealizeGlyphProcPtr RealizeGlyph;
UnrealizeGlyphProcPtr UnrealizeGlyph;
#define PICTURE_SCREEN_VERSION 2
TriStripProcPtr TriStrip;
TriFanProcPtr TriFan;
} PictureScreenRec, *PictureScreenPtr;
extern _X_EXPORT DevPrivateKeyRec PictureScreenPrivateKeyRec;