From: Frank Huang <[email protected]>

Signed-off-by: Frank Huang <[email protected]>
---
 src/lx_exa.c |   70 +++++++++++++++++++++++++++++++++++++++++++++++++--------
I use the pure SW rendering method instead of HW method. Now the glyph 
rendering(PICT_a8 source and dest, PictOpAdd operation) is 23700/s, 4 times 
than before. 

 1 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/src/lx_exa.c b/src/lx_exa.c
index 74327ef..df7fc0e 100644
--- a/src/lx_exa.c
+++ b/src/lx_exa.c
@@ -65,7 +65,8 @@ static const struct exa_format_t
     PICT_b5g6r5, 16, CIMGP_SOURCE_FMT_16BPP_BGR, 0}, {
     PICT_x1r5g5b5, 16, CIMGP_SOURCE_FMT_1_5_5_5, 0}, {
     PICT_x1b5g5r5, 16, CIMGP_SOURCE_FMT_15BPP_BGR, 0}, {
-    PICT_r3g3b2, 8, CIMGP_SOURCE_FMT_3_3_2, 0}
+    PICT_r3g3b2, 8, CIMGP_SOURCE_FMT_3_3_2, 0}, {
+    PICT_a8, 32, CIMGP_SOURCE_FMT_8_8_8_8, 8}
 };
 
 /* This is a chunk of memory we use for scratch space */
@@ -457,16 +458,9 @@ lx_get_format(PicturePtr p)
     int i;
     unsigned int format = p->format;
 
-    for (i = 0; i < ARRAY_SIZE(lx_exa_formats); i++) {
-
-       if (lx_exa_formats[i].bpp < PICT_FORMAT_BPP(format))
-           break;
-       else if (lx_exa_formats[i].bpp != PICT_FORMAT_BPP(format))
-           continue;
-
+    for (i = 0; i < ARRAY_SIZE(lx_exa_formats); i++)
        if (lx_exa_formats[i].exa == format)
            return (&lx_exa_formats[i]);
-    }
 
     return NULL;
 }
@@ -543,6 +537,10 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr 
pMsk, PicturePtr pDst)
     if (op > PictOpAdd)
        return FALSE;
 
+    if (op == PictOpAdd && pSrc->format == PICT_a8r8g8b8 &&
+       pDst->format == PICT_a8 && !pMsk)
+       return TRUE;
+
     /* We need the off-screen buffer to do the multipass work */
 
     if (usesPasses(op)) {
@@ -586,7 +584,11 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr 
pMsk, PicturePtr pDst)
 
     /* XXX - I don't understand PICT_a8 enough - so I'm punting */
 
-    if (pSrc->format == PICT_a8 || pDst->format == PICT_a8)
+    if ((op != PictOpAdd) && (pSrc->format == PICT_a8 ||
+       pDst->format == PICT_a8))
+       return FALSE;
+
+    if  ((op == PictOpAdd) && (pSrc->format != pDst->format))
        return FALSE;
 
     if (pMsk && op != PictOpClear) {
@@ -795,6 +797,50 @@ get_op_type(struct exa_format_t *src, struct exa_format_t 
*dst, int type)
                              ((_x) * exaScratch.srcBpp))
 
 static void
+lx_composite_onepass_pict_a8(PixmapPtr pxDst, unsigned long dstOffset,
+    unsigned long srcOffset, int width, int height, int opX, int opY,
+    int srcX, int srcY)
+{
+    struct blend_ops_t *opPtr;
+    int apply, type;
+    int optempX, optempY;
+    int i, j;
+/*
+    opPtr = &lx_alpha_ops[exaScratch.op * 2];
+    apply = CIMGP_APPLY_BLEND_TO_ALL;
+    gp_declare_blt(0);
+    gp_set_bpp(32);
+    gp_set_strides(exaGetPixmapPitch(pxDst), exaScratch.srcPitch);
+    gp_set_source_format(8);
+    type = opPtr->type;
+    gp_set_alpha_operation(opPtr->operation, type, opPtr->channel, apply, 0);
+    gp_screen_to_screen_convert(dstOffset, srcOffset, width / 4 , height, 0);
+
+    for (j = srcY; j < srcY + height; j++)
+       for (i = srcX + (width / 4) * 4; i < srcX + width; i++) {
+           srcOffset = GetSrcOffset(i, j);
+           optempX = opX + i - srcX;
+           optempY = opY + j - srcY;
+           dstOffset = GetPixmapOffset(pxDst, optempX, optempY);
+           *(cim_fb_ptr + dstOffset) = (*(cim_fb_ptr + srcOffset)
+               + *(cim_fb_ptr + dstOffset) <= 0xff) ?
+               *(cim_fb_ptr + srcOffset) + *(cim_fb_ptr + dstOffset) : 0xff;
+       }
+*/
+
+    for (j = srcY; j < srcY + height; j++)
+       for (i = srcX; i < srcX + width; i++) {
+           srcOffset = GetSrcOffset(i, j);
+           optempX = opX + i - srcX;
+           optempY = opY + j - srcY;
+           dstOffset = GetPixmapOffset(pxDst, optempX, optempY);
+           *(cim_fb_ptr + dstOffset) = (*(cim_fb_ptr + srcOffset) +
+               *(cim_fb_ptr + dstOffset) <= 0xff) ?
+               *(cim_fb_ptr + srcOffset) + *(cim_fb_ptr + dstOffset) : 0xff;
+       }
+}
+
+static void
 lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset,
     unsigned long srcOffset, int width, int height)
 {
@@ -1268,6 +1314,10 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int 
maskX,
                == 1))
                lx_composite_onepass_special(pxDst, dstOffset, srcOffset,
                    opWidth, opHeight, opX, opY, srcX, srcY);
+           else if ((exaScratch.op == PictOpAdd) && (exaScratch.srcFormat->exa
+               == PICT_a8) && (exaScratch.dstFormat->exa == PICT_a8))
+               lx_composite_onepass_pict_a8(pxDst, dstOffset, srcOffset,
+                   opWidth, opHeight, opX, opY, srcX, srcY);
            else
                lx_composite_onepass(pxDst, dstOffset, srcOffset, opWidth,
                    opHeight);
-- 
1.7.1


_______________________________________________
Xorg-driver-geode mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-geode

Reply via email to