xf86-video-intel: src/sna/fb src/sna/sna_accel.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Sep 7 14:31:09 PDT 2012
src/sna/fb/fb.h | 4 +++-
src/sna/fb/fbpoint.c | 42 +++++++++++++++++++++++++++++++-----------
src/sna/fb/fbpointbits.h | 38 ++++++++++++++++++++++++++++++++++++++
src/sna/sna_accel.c | 2 +-
4 files changed, 73 insertions(+), 13 deletions(-)
New commits:
commit ed7b8db24921dc0bb6ea59dacf35ea41a61d59bf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Sep 7 22:12:17 2012 +0100
sna: Pass the hints down to the PolyPoint fallback
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/fb/fb.h b/src/sna/fb/fb.h
index 215aec9..adefaa1 100644
--- a/src/sna/fb/fb.h
+++ b/src/sna/fb/fb.h
@@ -515,7 +515,9 @@ extern RegionPtr
fbBitmapToRegion(PixmapPtr pixmap);
extern void
-fbPolyPoint(DrawablePtr drawable, GCPtr gc, int mode, int n, xPoint *pt);
+fbPolyPoint(DrawablePtr drawable, GCPtr gc,
+ int mode, int n, xPoint *pt,
+ unsigned flags);
extern void
fbPushImage(DrawablePtr drawable, GCPtr gc,
diff --git a/src/sna/fb/fbpoint.c b/src/sna/fb/fbpoint.c
index e3974fc..3df79a2 100644
--- a/src/sna/fb/fbpoint.c
+++ b/src/sna/fb/fbpoint.c
@@ -25,21 +25,27 @@
#include <micoord.h>
#define DOTS fbDots8
+#define DOTS__SIMPLE fbDots8__simple
#define BITS BYTE
#include "fbpointbits.h"
#undef BITS
+#undef DOTS__SIMPLE
#undef DOTS
#define DOTS fbDots16
+#define DOTS__SIMPLE fbDots16__simple
#define BITS CARD16
#include "fbpointbits.h"
#undef BITS
+#undef DOTS__SIMPLE
#undef DOTS
#define DOTS fbDots32
+#define DOTS__SIMPLE fbDots32__simple
#define BITS CARD32
#include "fbpointbits.h"
#undef BITS
+#undef DOTS__SIMPLE
#undef DOTS
static void
@@ -74,7 +80,7 @@ fbDots(FbBits *dstOrig, FbStride dstStride, int dstBpp,
void
fbPolyPoint(DrawablePtr drawable, GCPtr gc,
- int mode, int n, xPoint *pt)
+ int mode, int n, xPoint *pt, unsigned flags)
{
FbBits *dst;
FbStride dstStride;
@@ -97,16 +103,30 @@ fbPolyPoint(DrawablePtr drawable, GCPtr gc,
fbGetDrawable(drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
dots = fbDots;
- switch (dstBpp) {
- case 8:
- dots = fbDots8;
- break;
- case 16:
- dots = fbDots16;
- break;
- case 32:
- dots = fbDots32;
- break;
+ if ((flags & 2) == 0 && fb_gc(gc)->and == 0) {
+ switch (dstBpp) {
+ case 8:
+ dots = fbDots8__simple;
+ break;
+ case 16:
+ dots = fbDots16__simple;
+ break;
+ case 32:
+ dots = fbDots32__simple;
+ break;
+ }
+ } else {
+ switch (dstBpp) {
+ case 8:
+ dots = fbDots8;
+ break;
+ case 16:
+ dots = fbDots16;
+ break;
+ case 32:
+ dots = fbDots32;
+ break;
+ }
}
dots(dst, dstStride, dstBpp, gc->pCompositeClip, pt, n,
drawable->x, drawable->y, dstXoff, dstYoff,
diff --git a/src/sna/fb/fbpointbits.h b/src/sna/fb/fbpointbits.h
index 2d71c1d..60bf488 100644
--- a/src/sna/fb/fbpointbits.h
+++ b/src/sna/fb/fbpointbits.h
@@ -106,5 +106,43 @@ DOTS(FbBits * dst,
}
}
+static void
+DOTS__SIMPLE(FbBits * dst,
+ FbStride dstStride,
+ int dstBpp,
+ RegionPtr region,
+ xPoint * ptsOrig,
+ int npt, int xorg, int yorg, int xoff, int yoff,
+ FbBits and, FbBits xor)
+{
+ uint32_t *pts = (uint32_t *) ptsOrig;
+ BITS *bits = (BITS *) dst, *p;
+ BITS bxor = (BITS) xor;
+ FbStride bitsStride = dstStride * (sizeof(FbBits) / sizeof(BITS));
+
+ bits += bitsStride * (yorg + yoff) + (xorg + xoff);
+ while (npt >= 2) {
+ union {
+ uint32_t pt32[2];
+ uint64_t pt64;
+ } pt;
+ pt.pt64 = *(uint64_t *)pts;
+
+ p = bits + intToY(pt.pt32[0]) * bitsStride + intToX(pt.pt32[0]);
+ WRITE(p, bxor);
+
+ p = bits + intToY(pt.pt32[1]) * bitsStride + intToX(pt.pt32[1]);
+ WRITE(p, bxor);
+
+ pts += 2;
+ npt -= 2;
+ }
+ if (npt) {
+ uint32_t pt = *pts;
+ p = bits + intToY(pt) * bitsStride + intToX(pt);
+ WRITE(p, bxor);
+ }
+}
+
#undef RROP
#undef isClipped
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 792d007..9881050 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -6696,7 +6696,7 @@ fallback:
goto out_gc;
DBG(("%s: fbPolyPoint\n", __FUNCTION__));
- fbPolyPoint(drawable, gc, mode, n, pt);
+ fbPolyPoint(drawable, gc, mode, n, pt, flags);
FALLBACK_FLUSH(drawable);
out_gc:
sna_gc_move_to_gpu(gc);
More information about the xorg-commit
mailing list