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 <[email protected]>
---
 render/mipict.c     |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++
 render/mipict.h     |   20 ++++++++++++++++
 render/picture.c    |   44 ++++++++++--------------------------
 render/picturestr.h |   21 +++++++++++++++++
 4 files changed, 114 insertions(+), 32 deletions(-)

diff --git a/render/mipict.c b/render/mipict.c
index 08b2fa7..36128e3 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -573,6 +573,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)
 {
@@ -606,5 +664,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;
 }
diff --git a/render/mipict.h b/render/mipict.h
index f6d9dee..4399a6f 100644
--- a/render/mipict.h
+++ b/render/mipict.h
@@ -140,6 +140,26 @@ miCompositeRects (CARD8            op,
                  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);
 
 extern _X_EXPORT void
diff --git a/render/picture.c b/render/picture.c
index 5640c4d..f134596 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -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
diff --git a/render/picturestr.h b/render/picturestr.h
index 7b7f911..1f3f5a4 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -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;
-- 
1.7.5.4

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to