Reviewed-by: Aaron Plattner <[email protected]>

Thanks for doing this, it was bugging me that we couldn't wrap these
functions at this level.

Only somewhat related, but what do you think of the idea of creating RENDER
path objects to allow clients to shove entire path descriptions over to the
server for evaluation server-side (possibly on the GPU)?  E.g., like
http://www.youtube.com/watch?v=bCrohG6PJQE but happening server-side.

On Sun, Sep 04, 2011 at 09:34:08AM -0700, Chris Wilson wrote:
> 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
> 
_______________________________________________
[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