From: Zhigang Gong <zhigang.g...@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.g...@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, &region);
+               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

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to