[Intel-gfx] [PATCH] uxa/glamor: Route some missing drawing function to glamor.
zhigang.gong at linux.intel.com
zhigang.gong at linux.intel.com
Sat Dec 31 14:18:15 CET 2011
From: Zhigang Gong <zhigang.gong at linux.intel.com>
We have to route all the drawing function to glamor at first
if glamor is enabled. The previous commit missed some function.
Now add them in.
Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
---
uxa/uxa-accel.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
uxa/uxa-glamor.h | 8 +++
2 files changed, 146 insertions(+), 4 deletions(-)
diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 00948b7..d67c1a6 100644
--- a/uxa/uxa-accel.c
+++ b/uxa/uxa-accel.c
@@ -558,6 +558,18 @@ uxa_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
{
int i;
xRectangle *prect;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ ok = glamor_poly_point_nf(pDrawable, pGC, mode, npt, ppt);
+ uxa_finish_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+
+ if (ok)
+ return;
+ }
/* If we can't reuse the current GC as is, don't bother accelerating the
* points.
@@ -596,6 +608,18 @@ uxa_poly_lines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
xRectangle *prect;
int x1, x2, y1, y2;
int i;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ ok = glamor_poly_lines_nf(pDrawable, pGC, mode, npt, ppt);
+ uxa_finish_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+
+ if (ok)
+ return;
+ }
/* Don't try to do wide lines or non-solid fill style. */
if (pGC->lineWidth != 0 || pGC->lineStyle != LineSolid ||
@@ -657,6 +681,18 @@ uxa_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pSeg)
{
xRectangle *prect;
int i;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ ok = glamor_poly_segment_nf(pDrawable, pGC, nseg, pSeg);
+ uxa_finish_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+
+ if (ok)
+ return;
+ }
/* Don't try to do wide lines or non-solid fill style. */
if (pGC->lineWidth != 0 || pGC->lineStyle != LineSolid ||
@@ -889,12 +925,110 @@ fallback:
uxa_check_set_spans(pDrawable, gc, src, points, widths, n, sorted);
}
+static RegionPtr
+uxa_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane)
+{
+ ScreenPtr screen = pDst->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+ RegionPtr region;
+
+ uxa_prepare_access(pDst, UXA_GLAMOR_ACCESS_RW);
+ uxa_prepare_access(pSrc, UXA_GLAMOR_ACCESS_RO);
+ ok = glamor_copy_plane_nf(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, bitPlane, ®ion);
+ uxa_finish_access(pSrc, UXA_GLAMOR_ACCESS_RO);
+ uxa_finish_access(pDst, UXA_GLAMOR_ACCESS_RW);
+ if (!ok)
+ goto fallback;
+ return region;
+ }
+
+fallback:
+ return uxa_check_copy_plane(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, bitPlane);
+}
+
+static void
+uxa_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr * ppci, pointer pglyphBase)
+{
+ ScreenPtr screen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ ok = glamor_image_glyph_blt_nf(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+ uxa_finish_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ if (!ok)
+ goto fallback;
+ return;
+ }
+
+fallback:
+ uxa_check_image_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+}
+
+static void
+uxa_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr * ppci, pointer pglyphBase)
+{
+ ScreenPtr screen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ ok = glamor_poly_glyph_blt_nf(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+ uxa_finish_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ if (!ok)
+ goto fallback;
+ return;
+ }
+
+fallback:
+ uxa_check_poly_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+}
+
+static void
+uxa_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
+ DrawablePtr pDrawable, int w, int h, int x, int y)
+{
+ ScreenPtr screen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+
+ if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ int ok;
+
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ uxa_prepare_access(&pBitmap->drawable, UXA_GLAMOR_ACCESS_RO);
+ ok = glamor_push_pixels_nf(pGC, pBitmap, pDrawable, w, h, x, y);
+ uxa_finish_access(&pBitmap->drawable, UXA_GLAMOR_ACCESS_RO);
+ uxa_prepare_access(pDrawable, UXA_GLAMOR_ACCESS_RW);
+ if (!ok)
+ goto fallback;
+ return;
+ }
+
+fallback:
+ uxa_check_push_pixels(pGC, pBitmap, pDrawable, w, h, x, y);
+}
+
const GCOps uxa_ops = {
uxa_fill_spans,
uxa_set_spans,
uxa_put_image,
uxa_copy_area,
- uxa_check_copy_plane,
+ uxa_copy_plane,
uxa_poly_point,
uxa_poly_lines,
uxa_poly_segment,
@@ -907,9 +1041,9 @@ const GCOps uxa_ops = {
miPolyText16,
miImageText8,
miImageText16,
- uxa_check_image_glyph_blt,
- uxa_check_poly_glyph_blt,
- uxa_check_push_pixels,
+ uxa_image_glyph_blt,
+ uxa_poly_glyph_blt,
+ uxa_push_pixels,
};
void uxa_copy_window(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
diff --git a/uxa/uxa-glamor.h b/uxa/uxa-glamor.h
index 2b4b452..8f90d9a 100644
--- a/uxa/uxa-glamor.h
+++ b/uxa/uxa-glamor.h
@@ -52,6 +52,14 @@
#define glamor_triangles_nf(...) FALSE
#define glamor_add_traps_nf(...) FALSE
#define glamor_create_gc(...) FALSE
+#define glamor_poly_point_nf(...) FALSE
+#define glamor_poly_segment_nf(...) FALSE
+#define glamor_poly_lines_nf(...) FALSE
+#define glamor_push_pixels_nf(...) FALSE
+#define glamor_copy_plane_nf(...) FALSE
+#define glamor_image_glyph_blt_nf(...) FALSE
+#define glamor_poly_glyph_blt_nf(...) FALSE
+#define glamor_validate_gc(...) ;
#endif
#endif /* UXA_GLAMOR_H */
--
1.7.4.4
More information about the Intel-gfx
mailing list