xserver: Branch 'master' - 46 commits

Eric Anholt anholt at kemper.freedesktop.org
Fri Jul 17 11:03:39 PDT 2015


 Xext/geext.c                                     |   10 
 Xext/geint.h                                     |    5 
 composite/compwindow.c                           |    2 
 configure.ac                                     |    2 
 dix/atom.c                                       |    6 
 dix/colormap.c                                   |  337 ++++----
 dix/dispatch.c                                   |    1 
 dix/dixfonts.c                                   |   12 
 dix/enterleave.c                                 |    2 
 dix/enterleave.h                                 |    2 
 dix/main.c                                       |    2 
 dix/window.c                                     |    9 
 dri3/dri3.c                                      |    3 
 dri3/dri3_event.c                                |  163 ----
 dri3/dri3_priv.h                                 |    2 
 fb/fb.h                                          |    5 
 glamor/glamor.c                                  |   69 -
 glamor/glamor.h                                  |    2 
 glamor/glamor_composite_glyphs.c                 |    4 
 glamor/glamor_core.c                             |    3 
 glamor/glamor_egl.c                              |   47 -
 glamor/glamor_fbo.c                              |   21 
 glamor/glamor_image.c                            |    4 
 glamor/glamor_picture.c                          |  885 +++++++++++++++++++++--
 glamor/glamor_pixmap.c                           |  870 ----------------------
 glamor/glamor_prepare.c                          |   20 
 glamor/glamor_priv.h                             |   63 -
 glamor/glamor_render.c                           |   41 -
 glamor/glamor_utils.h                            |   96 --
 glamor/glamor_window.c                           |   32 
 glamor/glamor_xv.c                               |   38 
 glx/createcontext.c                              |   15 
 glx/extension_string.c                           |    1 
 glx/extension_string.h                           |    3 
 glx/glxcmds.c                                    |   20 
 glx/glxcontext.h                                 |    5 
 glx/glxdri2.c                                    |    7 
 glx/glxdriswrast.c                               |   43 +
 hw/vfb/Makefile.am                               |    1 
 hw/xfree86/common/Makefile.am                    |    1 
 hw/xfree86/common/dgaproc.h                      |   62 -
 hw/xfree86/common/vidmodeproc.h                  |   77 --
 hw/xfree86/common/xf86.h                         |   11 
 hw/xfree86/common/xf86DGA.c                      |   36 
 hw/xfree86/common/xf86Mode.c                     |   11 
 hw/xfree86/common/xf86Module.h                   |    2 
 hw/xfree86/common/xf86VidMode.c                  |    2 
 hw/xfree86/doc/ddxDesign.xml                     |   75 -
 hw/xfree86/drivers/modesetting/dri2.c            |    4 
 hw/xfree86/drivers/modesetting/drmmode_display.c |    4 
 hw/xfree86/os-support/linux/Makefile.am          |    2 
 hw/xfree86/parser/InputClass.c                   |  152 +--
 hw/xfree86/parser/OutputClass.c                  |   52 -
 hw/xfree86/parser/Screen.c                       |   80 +-
 hw/xfree86/parser/Vendor.c                       |   32 
 hw/xfree86/parser/configProcs.h                  |    6 
 hw/xfree86/sdksyms.sh                            |   12 
 hw/xquartz/quartz.c                              |    4 
 hw/xwin/winrandr.c                               |    2 
 include/Makefile.am                              |    4 
 include/colormap.h                               |   12 
 include/dixfont.h                                |   35 
 include/dixstruct.h                              |   23 
 include/scrnintstr.h                             |    5 
 include/swaprep.h                                |  320 ++++----
 include/swapreq.h                                |    6 
 include/windowstr.h                              |    4 
 mi/miexpose.c                                    |   35 
 mi/miglblt.c                                     |    1 
 mi/mioverlay.c                                   |   12 
 mi/miscrinit.c                                   |    1 
 mi/miwindow.c                                    |   11 
 miext/Makefile.am                                |    9 
 miext/damage/damage.c                            |    1 
 miext/rootless/rootlessCommon.h                  |    1 
 miext/rootless/rootlessConfig.h                  |   19 
 miext/rootless/rootlessScreen.c                  |    3 
 miext/rootless/rootlessWindow.c                  |   31 
 miext/rootless/rootlessWindow.h                  |    1 
 os/utils.c                                       |    1 
 present/present_event.c                          |    2 
 present/present_priv.h                           |    2 
 present/present_request.c                        |    4 
 randr/randrstr.h                                 |   10 
 render/glyph.c                                   |   10 
 render/glyphstr.h                                |   36 
 render/mipict.c                                  |   16 
 render/mipict.h                                  |   36 
 render/picture.c                                 |   24 
 render/picture.h                                 |    6 
 render/picturestr.h                              |   50 -
 xfixes/Makefile.am                               |    4 
 xfixes/xfixes.h                                  |    6 
 93 files changed, 1816 insertions(+), 2405 deletions(-)

New commits:
commit a8a0f6464a33c12c1de495d74fd478c0d952643e
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Thu Jul 16 15:12:52 2015 -0700

    xfree86: Bump video driver ABI version to 20
    
    Commit 90db5edf119187f8b1b9207c8c384d6cd7ef9edc modified the signature of
    StartPixmapTrackingProcPtr, so drivers implementing that need to use the updated
    definition.
    
    Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index 66c2bb5..9e5dc6d 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -80,7 +80,7 @@ typedef enum {
  * mask is 0xFFFF0000.
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
-#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(19, 0)
+#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(20, 0)
 #define ABI_XINPUT_VERSION	SET_ABI_VERSION(22, 1)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(9, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
commit 2fcfa532532fbe4a7f668556808e6245ff4e36bc
Merge: cb695b0 7b0f940
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jul 17 10:15:01 2015 -0700

    Merge remote-tracking branch 'ajax/xserver-next' into master

commit cb695b0f3b8def4d1ac02458fe630b65f6a5a3e6
Author: Armin K <krejzi at email.com>
Date:   Thu Jul 16 14:54:48 2015 +0200

    xfree86/os-support/linux: Fix make distcheck
    
    Header was added in 1dba5a0b194653b0effb01a918bd7338b0c6bcb9
    but not in Makefile.am, resulting in missing header in the
    distribution tarball.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>

diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index 50fcd1f..d8cb177 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -23,7 +23,7 @@ LOGIND_SRCS = systemd-logind.c
 XORG_CFLAGS += $(DBUS_CFLAGS)
 endif
 
-liblinux_la_SOURCES = lnx_init.c lnx_video.c \
+liblinux_la_SOURCES = linux.h lnx_init.c lnx_video.c \
                      lnx_agp.c lnx_kmod.c lnx_bell.c lnx_platform.c \
 		     $(srcdir)/../shared/VTsw_usl.c \
 		     $(srcdir)/../shared/posix_tty.c \
commit 29efa905ec1e22d66b517378c6e5ad47a09d6977
Author: Robert Ancell <robert.ancell at canonical.com>
Date:   Thu Jul 16 12:26:05 2015 +1200

    modesetting: Use correct types for return values of glamor BO exports.
    
    glamor_name_from_pixmap and glamor_fd_from_pixmap return CARD16 and
    CARD32 values via pointers.  The current code uses uint16_t and
    uint32_t which will probably be the same but it's safer to use the
    datatypes as specified by the function.
    
    Signed-off-by: Robert Ancell <robert.ancell at canonical.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>

diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index 63cb065..0fe420c 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -138,8 +138,8 @@ ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     DRI2Buffer2Ptr buffer;
     PixmapPtr pixmap;
-    uint32_t size;
-    uint16_t pitch;
+    CARD32 size;
+    CARD16 pitch;
     ms_dri2_buffer_private_ptr private;
 
     buffer = calloc(1, sizeof *buffer);
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index ef5b087..6a13660 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -148,8 +148,8 @@ drmmode_bo_for_pixmap(drmmode_ptr drmmode, drmmode_bo *bo, PixmapPtr pixmap)
 {
 #ifdef GLAMOR
     ScreenPtr screen = xf86ScrnToScreen(drmmode->scrn);
-    uint16_t pitch;
-    uint32_t size;
+    CARD16 pitch;
+    CARD32 size;
     int fd;
 
 #ifdef GLAMOR_HAS_GBM
commit db5337afb248edf81087cf8d74006fc496d70589
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jul 15 17:56:11 2015 +1000

    glamor: make current in prepare paths
    
    Lots of the accel paths only make current once they start
    doing someting, so a lot of them call the bail paths without
    make current, which means on PRIME systems for example
    we end up in the wrong context.
    
    Add a prepare pixmap in the prepare fallback path.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90667
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-and-Tested-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Eric Anholt <eric at anholt.net>

diff --git a/glamor/glamor_prepare.c b/glamor/glamor_prepare.c
index 833291c..5a73e6c 100644
--- a/glamor/glamor_prepare.c
+++ b/glamor/glamor_prepare.c
@@ -45,6 +45,8 @@ glamor_prep_pixmap_box(PixmapPtr pixmap, glamor_access_t access, BoxPtr box)
     if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(priv))
         return TRUE;
 
+    glamor_make_current(glamor_priv);
+
     RegionInit(&region, box, 1);
 
     /* See if it's already mapped */
commit 1a18513a4eb3fa22459dd9f7d8f0e275aff679ec
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Fri Jul 10 15:28:52 2015 +0900

    glamor: Use glamor_prepare_access_box() for PutImage/GetImage fallback
    
    Fixes slow text display in xdvi.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91260
    Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>
    Reviewed-by: Eric Anholt <eric at anholt.net>

diff --git a/glamor/glamor_image.c b/glamor/glamor_image.c
index a272d5e..3158749 100644
--- a/glamor/glamor_image.c
+++ b/glamor/glamor_image.c
@@ -88,7 +88,7 @@ static void
 glamor_put_image_bail(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
                       int w, int h, int leftPad, int format, char *bits)
 {
-    if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW))
+    if (glamor_prepare_access_box(drawable, GLAMOR_ACCESS_RW, x, y, w, h))
         fbPutImage(drawable, gc, depth, x, y, w, h, leftPad, format, bits);
     glamor_finish_access(drawable);
 }
@@ -137,7 +137,7 @@ static void
 glamor_get_image_bail(DrawablePtr drawable, int x, int y, int w, int h,
                       unsigned int format, unsigned long plane_mask, char *d)
 {
-    if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RO))
+    if (glamor_prepare_access_box(drawable, GLAMOR_ACCESS_RO, x, y, w, h))
         fbGetImage(drawable, x, y, w, h, format, plane_mask, d);
     glamor_finish_access(drawable);
 }
commit fde13565c1b2462ee38f2a446ad3c9157261afa2
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 13:57:05 2015 -0700

    glamor: Drop unused box translation/bounds code.
    
    These are dead since the glamor_copy.c replacement.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 8a96c61..e648af2 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -697,45 +697,6 @@
         (c)[1] = (float)y;				\
     } while(0)
 
-inline static void
-glamor_calculate_boxes_bound(BoxPtr bound, BoxPtr boxes, int nbox)
-{
-    int x_min, y_min;
-    int x_max, y_max;
-    int i;
-
-    x_min = y_min = MAXSHORT;
-    x_max = y_max = MINSHORT;
-    for (i = 0; i < nbox; i++) {
-        if (x_min > boxes[i].x1)
-            x_min = boxes[i].x1;
-        if (y_min > boxes[i].y1)
-            y_min = boxes[i].y1;
-
-        if (x_max < boxes[i].x2)
-            x_max = boxes[i].x2;
-        if (y_max < boxes[i].y2)
-            y_max = boxes[i].y2;
-    }
-    bound->x1 = x_min;
-    bound->y1 = y_min;
-    bound->x2 = x_max;
-    bound->y2 = y_max;
-}
-
-inline static void
-glamor_translate_boxes(BoxPtr boxes, int nbox, int dx, int dy)
-{
-    int i;
-
-    for (i = 0; i < nbox; i++) {
-        boxes[i].x1 += dx;
-        boxes[i].y1 += dy;
-        boxes[i].x2 += dx;
-        boxes[i].y2 += dy;
-    }
-}
-
 #ifndef ARRAY_SIZE
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
 #endif
commit ab5aa270c79d70f095bc7abadeef227b4062027c
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 13:52:05 2015 -0700

    glamor: Move cache_format to glamor_fbo.c, where it's used.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 1eee304..262033f 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -70,6 +70,21 @@ cache_hbucket(int size)
     return order;
 }
 
+static int
+cache_format(GLenum format)
+{
+    switch (format) {
+    case GL_ALPHA:
+        return 2;
+    case GL_RGB:
+        return 1;
+    case GL_RGBA:
+        return 0;
+    default:
+        return -1;
+    }
+}
+
 static glamor_pixmap_fbo *
 glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv,
                             int w, int h, GLenum format)
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index e22bbc1..8a96c61 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -824,21 +824,6 @@ format_for_pixmap(PixmapPtr pixmap)
 #define SWAP_UPLOADING	  	2
 #define SWAP_NONE_UPLOADING	3
 
-inline static int
-cache_format(GLenum format)
-{
-    switch (format) {
-    case GL_ALPHA:
-        return 2;
-    case GL_RGB:
-        return 1;
-    case GL_RGBA:
-        return 0;
-    default:
-        return -1;
-    }
-}
-
 /* borrowed from uxa */
 static inline Bool
 glamor_get_rgba_from_pixel(CARD32 pixel,
commit 0ca783e8ee5dfb086fbfa64d26173bcca78b4010
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 13:50:42 2015 -0700

    glamor: Drop another dead function.
    
    This hasn't been used since the format swap/revert stuff for pictures
    was added back in 2012.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 59e6b64..e22bbc1 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -936,13 +936,6 @@ glamor_is_large_pixmap(PixmapPtr pixmap)
     return (glamor_pixmap_priv_is_large(priv));
 }
 
-inline static Bool
-glamor_tex_format_is_readable(GLenum format)
-{
-    return ((format == GL_RGBA || format == GL_RGB || format == GL_ALPHA));
-
-}
-
 static inline void
 _glamor_dump_pixmap_bits(PixmapPtr pixmap, int x, int y, int w, int h)
 {
commit c1111710628cc2a9dfaee0d74ea9fceee990095b
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 13:33:01 2015 -0700

    glamor: Take transforms into account when preparing for a fallback.
    
    This function takes the start x/y and the destination's width/height,
    so it only works if there's no transform.  We could potentially
    transform this box and take its bounds with some rounding, but this at
    least gets us to read out enough data.
    
    Note that this does the same overshoot on destination pictures with a
    transform attached, but that seems unlikely to be used anyway.
    
    v2: Add XXX comment for the commit message note (Suggested by Michel).
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com> (v1)
    Reviewed-by: Dave Airlie <airlied at redhat.com> (v1)

diff --git a/glamor/glamor_prepare.c b/glamor/glamor_prepare.c
index 9bfc557..833291c 100644
--- a/glamor/glamor_prepare.c
+++ b/glamor/glamor_prepare.c
@@ -220,8 +220,22 @@ glamor_prepare_access_picture_box(PicturePtr picture, glamor_access_t access,
 {
     if (!picture || !picture->pDrawable)
         return TRUE;
-    return glamor_prepare_access_box(picture->pDrawable, access,
-                                    x, y, w, h);
+
+    /* If a transform is set, we don't know what the bounds is on the
+     * source, so just prepare the whole pixmap.  XXX: We could
+     * potentially work out where in the source would be sampled based
+     * on the transform, and we don't need do do this for destination
+     * pixmaps at all.
+     */
+    if (picture->transform) {
+        return glamor_prepare_access_box(picture->pDrawable, access,
+                                         0, 0,
+                                         picture->pDrawable->width,
+                                         picture->pDrawable->height);
+    } else {
+        return glamor_prepare_access_box(picture->pDrawable, access,
+                                         x, y, w, h);
+    }
 }
 
 void
commit c16e086dace81151f399485e5c686617a43d5b94
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 13:25:40 2015 -0700

    glamor: Drop dead drm_stride field.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 5989dc4..f3950f1 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -350,7 +350,6 @@ typedef struct glamor_pixmap_private {
     glamor_pixmap_fbo *fbo;
     /** current fbo's coords in the whole pixmap. */
     BoxRec box;
-    int drm_stride;
     GLuint pbo;
     RegionRec prepare_region;
     Bool prepared;
commit 8097c887023b72744cb2cb943c2deca7ca0c404a
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 13:11:20 2015 -0700

    glamor: Drop tracking of the last picture attached to pixmaps.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Acked-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 04c548d..6dcc259 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -649,15 +649,6 @@ glamor_init(ScreenPtr screen, unsigned int flags)
     glamor_priv->saved_procs.glyphs = ps->Glyphs;
     ps->Glyphs = glamor_composite_glyphs;
 
-    glamor_priv->saved_procs.create_picture = ps->CreatePicture;
-    ps->CreatePicture = glamor_create_picture;
-
-    glamor_priv->saved_procs.destroy_picture = ps->DestroyPicture;
-    ps->DestroyPicture = glamor_destroy_picture;
-
-    glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
-    screen->SetWindowPixmap = glamor_set_window_pixmap;
-
     glamor_init_vbo(screen);
     glamor_init_pixmap_fbo(screen);
     glamor_init_finish_access_shaders(screen);
@@ -719,10 +710,8 @@ glamor_close_screen(ScreenPtr screen)
     ps->Composite = glamor_priv->saved_procs.composite;
     ps->Trapezoids = glamor_priv->saved_procs.trapezoids;
     ps->Triangles = glamor_priv->saved_procs.triangles;
-    ps->CreatePicture = glamor_priv->saved_procs.create_picture;
     ps->CompositeRects = glamor_priv->saved_procs.composite_rects;
     ps->Glyphs = glamor_priv->saved_procs.glyphs;
-    screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
 
     screen_pixmap = screen->GetScreenPixmap(screen);
     glamor_pixmap_destroy_fbo(screen_pixmap);
diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c
index c36d9d6..691f179 100644
--- a/glamor/glamor_picture.c
+++ b/glamor/glamor_picture.c
@@ -900,51 +900,3 @@ glamor_upload_picture_to_texture(PicturePtr picture)
     else
         return GLAMOR_UPLOAD_FAILED;
 }
-
-/*
- * We should already have drawable attached to it, if it has one.
- * Then set the attached pixmap to is_picture format, and set
- * the pict format.
- * */
-int
-glamor_create_picture(PicturePtr picture)
-{
-    PixmapPtr pixmap;
-    glamor_pixmap_private *pixmap_priv;
-
-    if (!picture || !picture->pDrawable)
-        return 0;
-
-    pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    pixmap_priv->is_picture = 1;
-    pixmap_priv->picture = picture;
-
-    return miCreatePicture(picture);
-}
-
-void
-glamor_destroy_picture(PicturePtr picture)
-{
-    PixmapPtr pixmap;
-    glamor_pixmap_private *pixmap_priv;
-
-    if (!picture || !picture->pDrawable)
-        return;
-
-    pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-
-    if (pixmap_priv) {
-        pixmap_priv->is_picture = 0;
-        pixmap_priv->picture = NULL;
-    }
-    miDestroyPicture(picture);
-}
-
-void
-glamor_picture_format_fixup(PicturePtr picture,
-                            glamor_pixmap_private *pixmap_priv)
-{
-    pixmap_priv->picture = picture;
-}
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 2792afa..5989dc4 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -173,9 +173,6 @@ struct glamor_saved_procs {
     BitmapToRegionProcPtr bitmap_to_region;
     TrianglesProcPtr triangles;
     AddTrapsProcPtr addtraps;
-    CreatePictureProcPtr create_picture;
-    DestroyPictureProcPtr destroy_picture;
-    SetWindowPixmapProcPtr set_window_pixmap;
 #if XSYNC
     SyncScreenFuncsRec sync_screen_funcs;
 #endif
@@ -350,13 +347,10 @@ typedef struct glamor_pixmap_private {
      * that data on glamor_finish_access().
      */
     glamor_access_t map_access;
-    /** Set if the pixmap is currenty attached to a Picture. */
-    unsigned char is_picture:1;
     glamor_pixmap_fbo *fbo;
     /** current fbo's coords in the whole pixmap. */
     BoxRec box;
     int drm_stride;
-    PicturePtr picture;
     GLuint pbo;
     RegionRec prepare_region;
     Bool prepared;
@@ -734,15 +728,6 @@ Bool glamor_composite_largepixmap_region(CARD8 op,
  **/
 enum glamor_pixmap_status glamor_upload_picture_to_texture(PicturePtr picture);
 
-int glamor_create_picture(PicturePtr picture);
-
-void glamor_set_window_pixmap(WindowPtr pWindow, PixmapPtr pPixmap);
-
-void glamor_destroy_picture(PicturePtr picture);
-
-void glamor_picture_format_fixup(PicturePtr picture,
-                                 glamor_pixmap_private *pixmap_priv);
-
 void glamor_add_traps(PicturePtr pPicture,
                       INT16 x_off, INT16 y_off, int ntrap, xTrap *traps);
 
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 3048cd8..c3a8f17 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -936,9 +936,6 @@ glamor_composite_choose_shader(CARD8 op,
                 goto fail;
             }
 
-            if (source->format != saved_source_format) {
-                glamor_picture_format_fixup(source, source_pixmap_priv);
-            }
             /* XXX
              * By default, glamor_upload_picture_to_texture will wire alpha to 1
              * if one picture doesn't have alpha. So we don't do that again in
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 8182006..59e6b64 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -33,6 +33,7 @@
 #define __GLAMOR_UTILS_H__
 
 #include "glamor_prepare.h"
+#include "mipict.h"
 
 #define v_from_x_coord_x(_xscale_, _x_)          ( 2 * (_x_) * (_xscale_) - 1.0)
 #define v_from_x_coord_y(_yscale_, _y_)          (-2 * (_y_) * (_yscale_) + 1.0)
@@ -756,7 +757,6 @@ glamor_translate_boxes(BoxPtr boxes, int nbox, int dx, int dy)
 						|| _depth_ == 30	\
 						|| _depth_ == 32)
 
-#define GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv) (pixmap_priv->is_picture == 1)
 #define GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)    (pixmap_priv->gl_fbo == GLAMOR_FBO_NORMAL)
 
 /**
@@ -1287,9 +1287,9 @@ glamor_compare_pictures(ScreenPtr screen,
 
     if (fst_pixmap->drawable.depth != snd_pixmap->drawable.depth) {
         if (fst_generated)
-            glamor_destroy_picture(fst_picture);
+            miDestroyPicture(fst_picture);
         if (snd_generated)
-            glamor_destroy_picture(snd_picture);
+            miDestroyPicture(snd_picture);
 
         ErrorF("Different pixmap depth can not compare!\n");
         return;
@@ -1315,9 +1315,9 @@ glamor_compare_pictures(ScreenPtr screen,
     glamor_finish_access(&snd_pixmap->drawable);
 
     if (fst_generated)
-        glamor_destroy_picture(fst_picture);
+        miDestroyPicture(fst_picture);
     if (snd_generated)
-        glamor_destroy_picture(snd_picture);
+        miDestroyPicture(snd_picture);
 
     return;
 }
diff --git a/glamor/glamor_window.c b/glamor/glamor_window.c
index a39e723..5fd463b 100644
--- a/glamor/glamor_window.c
+++ b/glamor/glamor_window.c
@@ -65,35 +65,3 @@ glamor_change_window_attributes(WindowPtr pWin, unsigned long mask)
     }
     return TRUE;
 }
-
-void
-glamor_set_window_pixmap(WindowPtr win, PixmapPtr pPixmap)
-{
-    ScreenPtr screen = win->drawable.pScreen;
-    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
-    PixmapPtr old = screen->GetWindowPixmap(win);
-
-    if (pPixmap != old) {
-        glamor_pixmap_private *pixmap_priv;
-        PicturePtr pic = NULL;
-
-        pixmap_priv = glamor_get_pixmap_private(old);
-        if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv) &&
-            pixmap_priv->picture->pDrawable == (DrawablePtr) win) {
-            pic = pixmap_priv->picture;
-            pixmap_priv->is_picture = 0;
-            pixmap_priv->picture = NULL;
-        }
-
-        pixmap_priv = glamor_get_pixmap_private(pPixmap);
-        if (pixmap_priv) {
-            pixmap_priv->is_picture = ! !pic;
-            pixmap_priv->picture = pic;
-        }
-    }
-
-    screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
-    (screen->SetWindowPixmap) (win, pPixmap);
-    glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
-    screen->SetWindowPixmap = glamor_set_window_pixmap;
-}
commit 0dbdb83b0d0254ac67fb33da8bf9ebc0ef4e8081
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 12:55:27 2015 -0700

    glamor: Use the actual picture's format when uploading memory pixmaps.
    
    The pixmap->picture is just the *last* picture attached to the pixmap,
    so you'd potentially be looking at the wrong one when trying to
    temporarily upload to avoid a composite fallback.
    
    There's some trickiness in glamor_render.c when we're dealing with the
    upload of a GLAMOR_MEMORY pixmap as both the source and mask using
    different formats, where we smash the source's format to a new value
    so that the mask can use the same uploaded bits.  Dropping most of
    that should be safe, since it will be uploaded as the source first, so
    the smashed format will still be used.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Acked-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c
index 3b0b7c9..c36d9d6 100644
--- a/glamor/glamor_picture.c
+++ b/glamor/glamor_picture.c
@@ -307,22 +307,15 @@ glamor_get_tex_format_type_from_pictformat_gles2(PictFormatShort format,
 
 static int
 glamor_get_tex_format_type_from_pixmap(PixmapPtr pixmap,
+                                       PictFormatShort pict_format,
                                        GLenum *format,
                                        GLenum *type,
                                        int *no_alpha,
                                        int *revert, int *swap_rb, int is_upload)
 {
-    glamor_pixmap_private *pixmap_priv;
-    PictFormatShort pict_format;
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private(pixmap->drawable.pScreen);
 
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
-        pict_format = pixmap_priv->picture->format;
-    else
-        pict_format = format_for_depth(pixmap->drawable.depth);
-
     if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
         return glamor_get_tex_format_type_from_pictformat_gl(pict_format,
                                                              format, type,
@@ -774,7 +767,8 @@ glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits,
 
 static Bool
 glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
-                                    int h, int stride, void *bits, int pbo)
+                                    int h, int stride, void *bits, int pbo,
+                                    PictFormatShort pict_format)
 {
     ScreenPtr screen = pixmap->drawable.pScreen;
     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
@@ -784,6 +778,7 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
     Bool force_clip;
 
     if (glamor_get_tex_format_type_from_pixmap(pixmap,
+                                               pict_format,
                                                &format,
                                                &type,
                                                &no_alpha,
@@ -884,23 +879,6 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
                                                      pbo);
 }
 
-static enum glamor_pixmap_status
-glamor_upload_pixmap_to_texture(PixmapPtr pixmap)
-{
-    int ret;
-
-    if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
-                                            pixmap->drawable.width,
-                                            pixmap->drawable.height,
-                                            pixmap->devKind,
-                                            pixmap->devPrivate.ptr, 0))
-        ret = GLAMOR_UPLOAD_DONE;
-    else
-        ret = GLAMOR_UPLOAD_FAILED;
-
-    return ret;
-}
-
 /* Upload picture to texture.  We may need to flip the y axis or
  * wire alpha to 1. So we may conditional create fbo for the picture.
  * */
@@ -912,7 +890,15 @@ glamor_upload_picture_to_texture(PicturePtr picture)
     assert(picture->pDrawable);
     pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
 
-    return glamor_upload_pixmap_to_texture(pixmap);
+    if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
+                                            pixmap->drawable.width,
+                                            pixmap->drawable.height,
+                                            pixmap->devKind,
+                                            pixmap->devPrivate.ptr, 0,
+                                            picture->format))
+        return GLAMOR_UPLOAD_DONE;
+    else
+        return GLAMOR_UPLOAD_FAILED;
 }
 
 /*
commit 1fd11c46aa086e4b80cb1bafa87c6b19a8014fd1
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 12:49:36 2015 -0700

    glamor: Move glamor_render.c pict handling to glamor_picture.c
    
    These functions aren't used by anything else, and are specific to the
    temporary-upload-as-a-weird-format path of glamor_render.c, called
    through glamor_upload_picture_to_texture().
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c
index 20b9de2..3b0b7c9 100644
--- a/glamor/glamor_picture.c
+++ b/glamor/glamor_picture.c
@@ -31,6 +31,876 @@
 #include "glamor_priv.h"
 #include "mipict.h"
 
+/*
+ * Map picture's format to the correct gl texture format and type.
+ * no_alpha is used to indicate whehter we need to wire alpha to 1.
+ *
+ * Although opengl support A1/GL_BITMAP, we still don't use it
+ * here, it seems that mesa has bugs when uploading a A1 bitmap.
+ *
+ * Return 0 if find a matched texture type. Otherwise return -1.
+ **/
+static int
+glamor_get_tex_format_type_from_pictformat_gl(PictFormatShort format,
+                                              GLenum *tex_format,
+                                              GLenum *tex_type,
+                                              int *no_alpha,
+                                              int *revert,
+                                              int *swap_rb, int is_upload)
+{
+    *no_alpha = 0;
+    *revert = REVERT_NONE;
+    *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
+    switch (format) {
+    case PICT_a1:
+        *tex_format = GL_ALPHA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
+        break;
+    case PICT_b8g8r8x8:
+        *no_alpha = 1;
+    case PICT_b8g8r8a8:
+        *tex_format = GL_BGRA;
+        *tex_type = GL_UNSIGNED_INT_8_8_8_8;
+        break;
+
+    case PICT_x8r8g8b8:
+        *no_alpha = 1;
+    case PICT_a8r8g8b8:
+        *tex_format = GL_BGRA;
+        *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+        break;
+    case PICT_x8b8g8r8:
+        *no_alpha = 1;
+    case PICT_a8b8g8r8:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+        break;
+    case PICT_x2r10g10b10:
+        *no_alpha = 1;
+    case PICT_a2r10g10b10:
+        *tex_format = GL_BGRA;
+        *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
+        break;
+    case PICT_x2b10g10r10:
+        *no_alpha = 1;
+    case PICT_a2b10g10r10:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
+        break;
+
+    case PICT_r5g6b5:
+        *tex_format = GL_RGB;
+        *tex_type = GL_UNSIGNED_SHORT_5_6_5;
+        break;
+    case PICT_b5g6r5:
+        *tex_format = GL_RGB;
+        *tex_type = GL_UNSIGNED_SHORT_5_6_5_REV;
+        break;
+    case PICT_x1b5g5r5:
+        *no_alpha = 1;
+    case PICT_a1b5g5r5:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+        break;
+
+    case PICT_x1r5g5b5:
+        *no_alpha = 1;
+    case PICT_a1r5g5b5:
+        *tex_format = GL_BGRA;
+        *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+        break;
+    case PICT_a8:
+        *tex_format = GL_ALPHA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        break;
+    case PICT_x4r4g4b4:
+        *no_alpha = 1;
+    case PICT_a4r4g4b4:
+        *tex_format = GL_BGRA;
+        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+        break;
+
+    case PICT_x4b4g4r4:
+        *no_alpha = 1;
+    case PICT_a4b4g4r4:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+        break;
+
+    default:
+        return -1;
+    }
+    return 0;
+}
+
+#define IS_LITTLE_ENDIAN  (IMAGE_BYTE_ORDER == LSBFirst)
+
+static int
+glamor_get_tex_format_type_from_pictformat_gles2(PictFormatShort format,
+                                                 GLenum *tex_format,
+                                                 GLenum *tex_type,
+                                                 int *no_alpha,
+                                                 int *revert,
+                                                 int *swap_rb, int is_upload)
+{
+    int need_swap_rb = 0;
+
+    *no_alpha = 0;
+    *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
+
+    switch (format) {
+    case PICT_b8g8r8x8:
+        *no_alpha = 1;
+    case PICT_b8g8r8a8:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        need_swap_rb = 1;
+        *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
+        break;
+
+    case PICT_x8r8g8b8:
+        *no_alpha = 1;
+    case PICT_a8r8g8b8:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        need_swap_rb = 1;
+        break;
+
+    case PICT_x8b8g8r8:
+        *no_alpha = 1;
+    case PICT_a8b8g8r8:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        break;
+
+    case PICT_x2r10g10b10:
+        *no_alpha = 1;
+    case PICT_a2r10g10b10:
+        *tex_format = GL_RGBA;
+        /* glReadPixmap doesn't support GL_UNSIGNED_INT_10_10_10_2.
+         * we have to use GL_UNSIGNED_BYTE and do the conversion in
+         * shader latter.*/
+        *tex_type = GL_UNSIGNED_BYTE;
+        if (is_upload == 1) {
+            if (!IS_LITTLE_ENDIAN)
+                *revert = REVERT_UPLOADING_10_10_10_2;
+            else
+                *revert = REVERT_UPLOADING_2_10_10_10;
+        }
+        else {
+            if (!IS_LITTLE_ENDIAN) {
+                *revert = REVERT_DOWNLOADING_10_10_10_2;
+            }
+            else {
+                *revert = REVERT_DOWNLOADING_2_10_10_10;
+            }
+        }
+        need_swap_rb = 1;
+
+        break;
+
+    case PICT_x2b10g10r10:
+        *no_alpha = 1;
+    case PICT_a2b10g10r10:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        if (is_upload == 1) {
+            if (!IS_LITTLE_ENDIAN)
+                *revert = REVERT_UPLOADING_10_10_10_2;
+            else
+                *revert = REVERT_UPLOADING_2_10_10_10;
+        }
+        else {
+            if (!IS_LITTLE_ENDIAN) {
+                *revert = REVERT_DOWNLOADING_10_10_10_2;
+            }
+            else {
+                *revert = REVERT_DOWNLOADING_2_10_10_10;
+            }
+        }
+        break;
+
+    case PICT_r5g6b5:
+        *tex_format = GL_RGB;
+        *tex_type = GL_UNSIGNED_SHORT_5_6_5;
+        *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
+
+        break;
+
+    case PICT_b5g6r5:
+        *tex_format = GL_RGB;
+        *tex_type = GL_UNSIGNED_SHORT_5_6_5;
+        need_swap_rb = IS_LITTLE_ENDIAN ? 1 : 0;;
+        break;
+
+    case PICT_x1b5g5r5:
+        *no_alpha = 1;
+    case PICT_a1b5g5r5:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
+        if (IS_LITTLE_ENDIAN) {
+            *revert =
+                is_upload ? REVERT_UPLOADING_1_5_5_5 :
+                REVERT_DOWNLOADING_1_5_5_5;
+        }
+        else
+            *revert = REVERT_NONE;
+        break;
+
+    case PICT_x1r5g5b5:
+        *no_alpha = 1;
+    case PICT_a1r5g5b5:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
+        if (IS_LITTLE_ENDIAN) {
+            *revert =
+                is_upload ? REVERT_UPLOADING_1_5_5_5 :
+                REVERT_DOWNLOADING_1_5_5_5;
+        }
+        else
+            *revert = REVERT_NONE;
+        need_swap_rb = 1;
+        break;
+
+    case PICT_a1:
+        *tex_format = GL_ALPHA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
+        break;
+
+    case PICT_a8:
+        *tex_format = GL_ALPHA;
+        *tex_type = GL_UNSIGNED_BYTE;
+        *revert = REVERT_NONE;
+        break;
+
+    case PICT_x4r4g4b4:
+        *no_alpha = 1;
+    case PICT_a4r4g4b4:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
+        *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
+        need_swap_rb = 1;
+        break;
+
+    case PICT_x4b4g4r4:
+        *no_alpha = 1;
+    case PICT_a4b4g4r4:
+        *tex_format = GL_RGBA;
+        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
+        *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
+        break;
+
+    default:
+        LogMessageVerb(X_INFO, 0,
+                       "fail to get matched format for %x \n", format);
+        return -1;
+    }
+
+    if (need_swap_rb)
+        *swap_rb = is_upload ? SWAP_UPLOADING : SWAP_DOWNLOADING;
+    else
+        *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
+    return 0;
+}
+
+static int
+glamor_get_tex_format_type_from_pixmap(PixmapPtr pixmap,
+                                       GLenum *format,
+                                       GLenum *type,
+                                       int *no_alpha,
+                                       int *revert, int *swap_rb, int is_upload)
+{
+    glamor_pixmap_private *pixmap_priv;
+    PictFormatShort pict_format;
+    glamor_screen_private *glamor_priv =
+        glamor_get_screen_private(pixmap->drawable.pScreen);
+
+    pixmap_priv = glamor_get_pixmap_private(pixmap);
+    if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
+        pict_format = pixmap_priv->picture->format;
+    else
+        pict_format = format_for_depth(pixmap->drawable.depth);
+
+    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+        return glamor_get_tex_format_type_from_pictformat_gl(pict_format,
+                                                             format, type,
+                                                             no_alpha,
+                                                             revert,
+                                                             swap_rb,
+                                                             is_upload);
+    } else {
+        return glamor_get_tex_format_type_from_pictformat_gles2(pict_format,
+                                                                format, type,
+                                                                no_alpha,
+                                                                revert,
+                                                                swap_rb,
+                                                                is_upload);
+    }
+}
+
+static void *
+_glamor_color_convert_a1_a8(void *src_bits, void *dst_bits, int w, int h,
+                            int stride, int revert)
+{
+    PictFormatShort dst_format, src_format;
+    pixman_image_t *dst_image;
+    pixman_image_t *src_image;
+    int src_stride;
+
+    if (revert == REVERT_UPLOADING_A1) {
+        src_format = PICT_a1;
+        dst_format = PICT_a8;
+        src_stride = PixmapBytePad(w, 1);
+    }
+    else {
+        dst_format = PICT_a1;
+        src_format = PICT_a8;
+        src_stride = (((w * 8 + 7) / 8) + 3) & ~3;
+    }
+
+    dst_image = pixman_image_create_bits(dst_format, w, h, dst_bits, stride);
+    if (dst_image == NULL) {
+        return NULL;
+    }
+
+    src_image = pixman_image_create_bits(src_format,
+                                         w, h, src_bits, src_stride);
+
+    if (src_image == NULL) {
+        pixman_image_unref(dst_image);
+        return NULL;
+    }
+
+    pixman_image_composite(PictOpSrc, src_image, NULL, dst_image,
+                           0, 0, 0, 0, 0, 0, w, h);
+
+    pixman_image_unref(src_image);
+    pixman_image_unref(dst_image);
+    return dst_bits;
+}
+
+#define ADJUST_BITS(d, src_bits, dst_bits)	(((dst_bits) == (src_bits)) ? (d) : 				\
+							(((dst_bits) > (src_bits)) ? 				\
+							  (((d) << ((dst_bits) - (src_bits))) 			\
+								   + (( 1 << ((dst_bits) - (src_bits))) >> 1))	\
+								:  ((d) >> ((src_bits) - (dst_bits)))))
+
+#define GLAMOR_DO_CONVERT(src, dst, no_alpha, swap,		\
+			  a_shift_src, a_bits_src,		\
+			  b_shift_src, b_bits_src,		\
+			  g_shift_src, g_bits_src,		\
+			  r_shift_src, r_bits_src,		\
+			  a_shift, a_bits,			\
+			  b_shift, b_bits,			\
+			  g_shift, g_bits,			\
+			  r_shift, r_bits)			\
+	do {								\
+		typeof(src) a,b,g,r;					\
+		typeof(src) a_mask_src, b_mask_src, g_mask_src, r_mask_src;\
+		a_mask_src = (((1 << (a_bits_src)) - 1) << a_shift_src);\
+		b_mask_src = (((1 << (b_bits_src)) - 1) << b_shift_src);\
+		g_mask_src = (((1 << (g_bits_src)) - 1) << g_shift_src);\
+		r_mask_src = (((1 << (r_bits_src)) - 1) << r_shift_src);\
+		if (no_alpha)						\
+			a = (a_mask_src) >> (a_shift_src);			\
+		else							\
+			a = ((src) & (a_mask_src)) >> (a_shift_src);	\
+		b = ((src) & (b_mask_src)) >> (b_shift_src);		\
+		g = ((src) & (g_mask_src)) >> (g_shift_src);		\
+		r = ((src) & (r_mask_src)) >> (r_shift_src);		\
+		a = ADJUST_BITS(a, a_bits_src, a_bits);			\
+		b = ADJUST_BITS(b, b_bits_src, b_bits);			\
+		g = ADJUST_BITS(g, g_bits_src, g_bits);			\
+		r = ADJUST_BITS(r, r_bits_src, r_bits);			\
+		if (swap == 0)						\
+			(*dst) = ((a) << (a_shift)) | ((b) << (b_shift)) | ((g) << (g_shift)) | ((r) << (r_shift)); \
+		else 												    \
+			(*dst) = ((a) << (a_shift)) | ((r) << (b_shift)) | ((g) << (g_shift)) | ((b) << (r_shift)); \
+	} while (0)
+
+static void *
+_glamor_color_revert_x2b10g10r10(void *src_bits, void *dst_bits, int w, int h,
+                                 int stride, int no_alpha, int revert,
+                                 int swap_rb)
+{
+    int x, y;
+    unsigned int *words, *saved_words, *source_words;
+    int swap = !(swap_rb == SWAP_NONE_DOWNLOADING ||
+                 swap_rb == SWAP_NONE_UPLOADING);
+
+    source_words = src_bits;
+    words = dst_bits;
+    saved_words = words;
+
+    for (y = 0; y < h; y++) {
+        DEBUGF("Line %d :  ", y);
+        for (x = 0; x < w; x++) {
+            unsigned int pixel = source_words[x];
+
+            if (revert == REVERT_DOWNLOADING_2_10_10_10)
+                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+                                  24, 8, 16, 8, 8, 8, 0, 8,
+                                  30, 2, 20, 10, 10, 10, 0, 10);
+            else
+                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+                                  30, 2, 20, 10, 10, 10, 0, 10,
+                                  24, 8, 16, 8, 8, 8, 0, 8);
+            DEBUGF("%x:%x ", pixel, words[x]);
+        }
+        DEBUGF("\n");
+        words += stride / sizeof(*words);
+        source_words += stride / sizeof(*words);
+    }
+    DEBUGF("\n");
+    return saved_words;
+
+}
+
+static void *
+_glamor_color_revert_x1b5g5r5(void *src_bits, void *dst_bits, int w, int h,
+                              int stride, int no_alpha, int revert, int swap_rb)
+{
+    int x, y;
+    unsigned short *words, *saved_words, *source_words;
+    int swap = !(swap_rb == SWAP_NONE_DOWNLOADING ||
+                 swap_rb == SWAP_NONE_UPLOADING);
+
+    words = dst_bits;
+    source_words = src_bits;
+    saved_words = words;
+
+    for (y = 0; y < h; y++) {
+        DEBUGF("Line %d :  ", y);
+        for (x = 0; x < w; x++) {
+            unsigned short pixel = source_words[x];
+
+            if (revert == REVERT_DOWNLOADING_1_5_5_5)
+                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+                                  0, 1, 1, 5, 6, 5, 11, 5,
+                                  15, 1, 10, 5, 5, 5, 0, 5);
+            else
+                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+                                  15, 1, 10, 5, 5, 5, 0, 5,
+                                  0, 1, 1, 5, 6, 5, 11, 5);
+            DEBUGF("%04x:%04x ", pixel, words[x]);
+        }
+        DEBUGF("\n");
+        words += stride / sizeof(*words);
+        source_words += stride / sizeof(*words);
+    }
+    DEBUGF("\n");
+    return saved_words;
+}
+
+/*
+ * This function is to convert an unsupported color format to/from a
+ * supported GL format.
+ * Here are the current scenarios:
+ *
+ * @no_alpha:
+ * 	If it is set, then we need to wire the alpha value to 1.
+ * @revert:
+	REVERT_DOWNLOADING_A1		: convert an Alpha8 buffer to a A1 buffer.
+	REVERT_UPLOADING_A1		: convert an A1 buffer to an Alpha8 buffer
+	REVERT_DOWNLOADING_2_10_10_10 	: convert r10G10b10X2 to X2B10G10R10
+	REVERT_UPLOADING_2_10_10_10 	: convert X2B10G10R10 to R10G10B10X2
+	REVERT_DOWNLOADING_1_5_5_5  	: convert B5G5R5X1 to X1R5G5B5
+	REVERT_UPLOADING_1_5_5_5    	: convert X1R5G5B5 to B5G5R5X1
+   @swap_rb: if we have the swap_rb set, then we need to swap the R and B's position.
+ *
+ */
+
+static void *
+glamor_color_convert_to_bits(void *src_bits, void *dst_bits, int w, int h,
+                             int stride, int no_alpha, int revert, int swap_rb)
+{
+    if (revert == REVERT_DOWNLOADING_A1 || revert == REVERT_UPLOADING_A1) {
+        return _glamor_color_convert_a1_a8(src_bits, dst_bits, w, h, stride,
+                                           revert);
+    }
+    else if (revert == REVERT_DOWNLOADING_2_10_10_10 ||
+             revert == REVERT_UPLOADING_2_10_10_10) {
+        return _glamor_color_revert_x2b10g10r10(src_bits, dst_bits, w, h,
+                                                stride, no_alpha, revert,
+                                                swap_rb);
+    }
+    else if (revert == REVERT_DOWNLOADING_1_5_5_5 ||
+             revert == REVERT_UPLOADING_1_5_5_5) {
+        return _glamor_color_revert_x1b5g5r5(src_bits, dst_bits, w, h, stride,
+                                             no_alpha, revert, swap_rb);
+    }
+    else
+        ErrorF("convert a non-supported mode %x.\n", revert);
+
+    return NULL;
+}
+
+/**
+ * Upload pixmap to a specified texture.
+ * This texture may not be the one attached to it.
+ **/
+static void
+__glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex,
+                                  GLenum format,
+                                  GLenum type,
+                                  int x, int y, int w, int h,
+                                  void *bits, int pbo)
+{
+    glamor_screen_private *glamor_priv =
+        glamor_get_screen_private(pixmap->drawable.pScreen);
+    int non_sub = 0;
+    unsigned int iformat = 0;
+
+    glamor_make_current(glamor_priv);
+    if (*tex == 0) {
+        glGenTextures(1, tex);
+        if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+            iformat = gl_iformat_for_pixmap(pixmap);
+        else
+            iformat = format;
+        non_sub = 1;
+        assert(x == 0 && y == 0);
+    }
+
+    glBindTexture(GL_TEXTURE_2D, *tex);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+
+    assert(pbo || bits != 0);
+    if (bits == NULL) {
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+        glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
+    }
+    if (non_sub)
+        glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0, format, type, bits);
+    else
+        glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, format, type, bits);
+
+    if (bits == NULL)
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+}
+
+static Bool
+_glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format,
+                                      GLenum type, int no_alpha, int revert,
+                                      int swap_rb, int x, int y, int w, int h,
+                                      int stride, void *bits, int pbo)
+{
+    ScreenPtr screen = pixmap->drawable.pScreen;
+    glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+    glamor_screen_private *glamor_priv =
+        glamor_get_screen_private(pixmap->drawable.pScreen);
+    static float vertices[8];
+
+    static float texcoords_inv[8] = { 0, 0,
+        1, 0,
+        1, 1,
+        0, 1
+    };
+    float *ptexcoords;
+    float dst_xscale, dst_yscale;
+    GLuint tex = 0;
+    int need_free_bits = 0;
+
+    if (bits == NULL)
+        goto ready_to_upload;
+
+    if (revert > REVERT_NORMAL) {
+        /* XXX if we are restoring the pixmap, then we may not need to allocate
+         * new buffer */
+        void *converted_bits;
+
+        if (pixmap->drawable.depth == 1)
+            stride = (((w * 8 + 7) / 8) + 3) & ~3;
+
+        converted_bits = xallocarray(h, stride);
+
+        if (converted_bits == NULL)
+            return FALSE;
+        bits = glamor_color_convert_to_bits(bits, converted_bits, w, h,
+                                            stride, no_alpha, revert, swap_rb);
+        if (bits == NULL) {
+            free(converted_bits);
+            ErrorF("Failed to convert pixmap no_alpha %d,"
+                   "revert mode %d, swap mode %d\n", no_alpha, revert, swap_rb);
+            return FALSE;
+        }
+        no_alpha = 0;
+        revert = REVERT_NONE;
+        swap_rb = SWAP_NONE_UPLOADING;
+        need_free_bits = TRUE;
+    }
+
+ ready_to_upload:
+
+    /* Try fast path firstly, upload the pixmap to the texture attached
+     * to the fbo directly. */
+    if (no_alpha == 0
+        && revert == REVERT_NONE && swap_rb == SWAP_NONE_UPLOADING
+#ifdef WALKAROUND_LARGE_TEXTURE_MAP
+        && glamor_pixmap_priv_is_small(pixmap_priv)
+#endif
+        ) {
+        int fbo_x_off, fbo_y_off;
+
+        assert(pixmap_priv->fbo->tex);
+        pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off);
+
+        assert(x + fbo_x_off >= 0 && y + fbo_y_off >= 0);
+        assert(x + fbo_x_off + w <= pixmap_priv->fbo->width);
+        assert(y + fbo_y_off + h <= pixmap_priv->fbo->height);
+        __glamor_upload_pixmap_to_texture(pixmap, &pixmap_priv->fbo->tex,
+                                          format, type,
+                                          x + fbo_x_off, y + fbo_y_off, w, h,
+                                          bits, pbo);
+    } else {
+        ptexcoords = texcoords_inv;
+
+        pixmap_priv_get_dest_scale(pixmap, pixmap_priv, &dst_xscale, &dst_yscale);
+        glamor_set_normalize_vcoords(pixmap_priv, dst_xscale,
+                                     dst_yscale,
+                                     x, y,
+                                     x + w, y + h,
+                                     vertices);
+        /* Slow path, we need to flip y or wire alpha to 1. */
+        glamor_make_current(glamor_priv);
+        glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+                              GL_FALSE, 2 * sizeof(float), vertices);
+        glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+        glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
+                              GL_FALSE, 2 * sizeof(float), ptexcoords);
+        glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+        glamor_set_destination_pixmap_priv_nc(glamor_priv, pixmap, pixmap_priv);
+        glamor_set_alu(screen, GXcopy);
+        __glamor_upload_pixmap_to_texture(pixmap, &tex,
+                                          format, type, 0, 0, w, h, bits, pbo);
+        glActiveTexture(GL_TEXTURE0);
+        glBindTexture(GL_TEXTURE_2D, tex);
+
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glUseProgram(glamor_priv->finish_access_prog[no_alpha]);
+        glUniform1i(glamor_priv->finish_access_revert[no_alpha], revert);
+        glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha], swap_rb);
+
+        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+        glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+        glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+        glDeleteTextures(1, &tex);
+        glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    }
+
+    if (need_free_bits)
+        free(bits);
+    return TRUE;
+}
+
+/*
+ * Prepare to upload a pixmap to texture memory.
+ * no_alpha equals 1 means the format needs to wire alpha to 1.
+ */
+static int
+glamor_pixmap_upload_prepare(PixmapPtr pixmap, GLenum format, int no_alpha,
+                             int revert, int swap_rb)
+{
+    int flag = 0;
+    glamor_pixmap_private *pixmap_priv;
+    glamor_screen_private *glamor_priv;
+    glamor_pixmap_fbo *fbo;
+    GLenum iformat;
+
+    pixmap_priv = glamor_get_pixmap_private(pixmap);
+    glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
+
+    if (pixmap_priv->gl_fbo != GLAMOR_FBO_UNATTACHED)
+        return 0;
+
+    if (pixmap_priv->fbo
+        && (pixmap_priv->fbo->width < pixmap->drawable.width
+            || pixmap_priv->fbo->height < pixmap->drawable.height)) {
+        fbo = glamor_pixmap_detach_fbo(pixmap_priv);
+        glamor_destroy_fbo(glamor_priv, fbo);
+    }
+
+    if (pixmap_priv->fbo && pixmap_priv->fbo->fb)
+        return 0;
+
+    if (!(no_alpha || (revert == REVERT_NORMAL)
+          || (swap_rb != SWAP_NONE_UPLOADING))) {
+        /* We don't need a fbo, a simple texture uploading should work. */
+
+        flag = GLAMOR_CREATE_FBO_NO_FBO;
+    }
+
+    if ((flag == GLAMOR_CREATE_FBO_NO_FBO
+         && pixmap_priv->fbo && pixmap_priv->fbo->tex))
+        return 0;
+
+    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+        iformat = gl_iformat_for_pixmap(pixmap);
+    else
+        iformat = format;
+
+    if (!glamor_pixmap_ensure_fbo(pixmap, iformat, flag))
+        return -1;
+
+    return 0;
+}
+
+/*
+ * upload sub region to a large region.
+ * */
+static void
+glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits,
+                int src_stride, int bpp, int x, int y, int w, int h)
+{
+    int j;
+    int byte_per_pixel;
+
+    byte_per_pixel = bpp / 8;
+    src_bits += y * src_stride + (x * byte_per_pixel);
+
+    for (j = y; j < y + h; j++) {
+        memcpy(dst_bits, src_bits, w * byte_per_pixel);
+        src_bits += src_stride;
+        dst_bits += dst_stride;
+    }
+}
+
+static Bool
+glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
+                                    int h, int stride, void *bits, int pbo)
+{
+    ScreenPtr screen = pixmap->drawable.pScreen;
+    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+    GLenum format, type;
+    int no_alpha, revert, swap_rb;
+    glamor_pixmap_private *pixmap_priv;
+    Bool force_clip;
+
+    if (glamor_get_tex_format_type_from_pixmap(pixmap,
+                                               &format,
+                                               &type,
+                                               &no_alpha,
+                                               &revert, &swap_rb, 1)) {
+        glamor_fallback("Unknown pixmap depth %d.\n", pixmap->drawable.depth);
+        return FALSE;
+    }
+    if (glamor_pixmap_upload_prepare(pixmap, format, no_alpha, revert, swap_rb))
+        return FALSE;
+
+    pixmap_priv = glamor_get_pixmap_private(pixmap);
+    force_clip = glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
+        && !glamor_check_fbo_size(glamor_priv, w, h);
+
+    if (glamor_pixmap_priv_is_large(pixmap_priv) || force_clip) {
+        RegionRec region;
+        BoxRec box;
+        int n_region;
+        glamor_pixmap_clipped_regions *clipped_regions;
+        void *sub_bits;
+        int i, j;
+
+        sub_bits = xallocarray(h, stride);
+        if (sub_bits == NULL)
+            return FALSE;
+        box.x1 = x;
+        box.y1 = y;
+        box.x2 = x + w;
+        box.y2 = y + h;
+        RegionInitBoxes(&region, &box, 1);
+        if (!force_clip)
+            clipped_regions =
+                glamor_compute_clipped_regions(pixmap, &region, &n_region,
+                                               0, 0, 0);
+        else
+            clipped_regions =
+                glamor_compute_clipped_regions_ext(pixmap, &region,
+                                                   &n_region,
+                                                   pixmap_priv->block_w,
+                                                   pixmap_priv->block_h,
+                                                   0,
+                                                   0);
+        DEBUGF("prepare upload %dx%d to a large pixmap %p\n", w, h, pixmap);
+        for (i = 0; i < n_region; i++) {
+            BoxPtr boxes;
+            int nbox;
+            int temp_stride;
+            void *temp_bits;
+
+            assert(pbo == 0);
+
+            glamor_set_pixmap_fbo_current(pixmap_priv, clipped_regions[i].block_idx);
+
+            boxes = RegionRects(clipped_regions[i].region);
+            nbox = RegionNumRects(clipped_regions[i].region);
+            DEBUGF("split to %d boxes\n", nbox);
+            for (j = 0; j < nbox; j++) {
+                temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
+                                            pixmap->drawable.depth);
+
+                if (boxes[j].x1 == x && temp_stride == stride) {
+                    temp_bits = (char *) bits + (boxes[j].y1 - y) * stride;
+                }
+                else {
+                    temp_bits = sub_bits;
+                    glamor_put_bits(temp_bits, temp_stride, bits, stride,
+                                    pixmap->drawable.bitsPerPixel,
+                                    boxes[j].x1 - x, boxes[j].y1 - y,
+                                    boxes[j].x2 - boxes[j].x1,
+                                    boxes[j].y2 - boxes[j].y1);
+                }
+                DEBUGF("upload x %d y %d w %d h %d temp stride %d \n",
+                       boxes[j].x1 - x, boxes[j].y1 - y,
+                       boxes[j].x2 - boxes[j].x1,
+                       boxes[j].y2 - boxes[j].y1, temp_stride);
+                if (_glamor_upload_bits_to_pixmap_texture
+                    (pixmap, format, type, no_alpha, revert, swap_rb,
+                     boxes[j].x1, boxes[j].y1, boxes[j].x2 - boxes[j].x1,
+                     boxes[j].y2 - boxes[j].y1, temp_stride, temp_bits,
+                     pbo) == FALSE) {
+                    RegionUninit(&region);
+                    free(sub_bits);
+                    assert(0);
+                    return FALSE;
+                }
+            }
+            RegionDestroy(clipped_regions[i].region);
+        }
+        free(sub_bits);
+        free(clipped_regions);
+        RegionUninit(&region);
+        return TRUE;
+    }
+    else
+        return _glamor_upload_bits_to_pixmap_texture(pixmap, format, type,
+                                                     no_alpha, revert, swap_rb,
+                                                     x, y, w, h, stride, bits,
+                                                     pbo);
+}
+
+static enum glamor_pixmap_status
+glamor_upload_pixmap_to_texture(PixmapPtr pixmap)
+{
+    int ret;
+
+    if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
+                                            pixmap->drawable.width,
+                                            pixmap->drawable.height,
+                                            pixmap->devKind,
+                                            pixmap->devPrivate.ptr, 0))
+        ret = GLAMOR_UPLOAD_DONE;
+    else
+        ret = GLAMOR_UPLOAD_FAILED;
+
+    return ret;
+}
+
 /* Upload picture to texture.  We may need to flip the y axis or
  * wire alpha to 1. So we may conditional create fbo for the picture.
  * */
diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index 5a09d32..166bde5 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -189,873 +189,3 @@ glamor_set_alu(ScreenPtr screen, unsigned char alu)
 
     return TRUE;
 }
-
-/*
- * Map picture's format to the correct gl texture format and type.
- * no_alpha is used to indicate whehter we need to wire alpha to 1.
- *
- * Although opengl support A1/GL_BITMAP, we still don't use it
- * here, it seems that mesa has bugs when uploading a A1 bitmap.
- *
- * Return 0 if find a matched texture type. Otherwise return -1.
- **/
-static int
-glamor_get_tex_format_type_from_pictformat_gl(PictFormatShort format,
-                                              GLenum *tex_format,
-                                              GLenum *tex_type,
-                                              int *no_alpha,
-                                              int *revert,
-                                              int *swap_rb, int is_upload)
-{
-    *no_alpha = 0;
-    *revert = REVERT_NONE;
-    *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
-    switch (format) {
-    case PICT_a1:
-        *tex_format = GL_ALPHA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
-        break;
-    case PICT_b8g8r8x8:
-        *no_alpha = 1;
-    case PICT_b8g8r8a8:
-        *tex_format = GL_BGRA;
-        *tex_type = GL_UNSIGNED_INT_8_8_8_8;
-        break;
-
-    case PICT_x8r8g8b8:
-        *no_alpha = 1;
-    case PICT_a8r8g8b8:
-        *tex_format = GL_BGRA;
-        *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
-        break;
-    case PICT_x8b8g8r8:
-        *no_alpha = 1;
-    case PICT_a8b8g8r8:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
-        break;
-    case PICT_x2r10g10b10:
-        *no_alpha = 1;
-    case PICT_a2r10g10b10:
-        *tex_format = GL_BGRA;
-        *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
-        break;
-    case PICT_x2b10g10r10:
-        *no_alpha = 1;
-    case PICT_a2b10g10r10:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
-        break;
-
-    case PICT_r5g6b5:
-        *tex_format = GL_RGB;
-        *tex_type = GL_UNSIGNED_SHORT_5_6_5;
-        break;
-    case PICT_b5g6r5:
-        *tex_format = GL_RGB;
-        *tex_type = GL_UNSIGNED_SHORT_5_6_5_REV;
-        break;
-    case PICT_x1b5g5r5:
-        *no_alpha = 1;
-    case PICT_a1b5g5r5:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
-        break;
-
-    case PICT_x1r5g5b5:
-        *no_alpha = 1;
-    case PICT_a1r5g5b5:
-        *tex_format = GL_BGRA;
-        *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
-        break;
-    case PICT_a8:
-        *tex_format = GL_ALPHA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        break;
-    case PICT_x4r4g4b4:
-        *no_alpha = 1;
-    case PICT_a4r4g4b4:
-        *tex_format = GL_BGRA;
-        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
-        break;
-
-    case PICT_x4b4g4r4:
-        *no_alpha = 1;
-    case PICT_a4b4g4r4:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
-        break;
-
-    default:
-        return -1;
-    }
-    return 0;
-}
-
-#define IS_LITTLE_ENDIAN  (IMAGE_BYTE_ORDER == LSBFirst)
-
-static int
-glamor_get_tex_format_type_from_pictformat_gles2(PictFormatShort format,
-                                                 GLenum *tex_format,
-                                                 GLenum *tex_type,
-                                                 int *no_alpha,
-                                                 int *revert,
-                                                 int *swap_rb, int is_upload)
-{
-    int need_swap_rb = 0;
-
-    *no_alpha = 0;
-    *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
-
-    switch (format) {
-    case PICT_b8g8r8x8:
-        *no_alpha = 1;
-    case PICT_b8g8r8a8:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        need_swap_rb = 1;
-        *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
-        break;
-
-    case PICT_x8r8g8b8:
-        *no_alpha = 1;
-    case PICT_a8r8g8b8:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        need_swap_rb = 1;
-        break;
-
-    case PICT_x8b8g8r8:
-        *no_alpha = 1;
-    case PICT_a8b8g8r8:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        break;
-
-    case PICT_x2r10g10b10:
-        *no_alpha = 1;
-    case PICT_a2r10g10b10:
-        *tex_format = GL_RGBA;
-        /* glReadPixmap doesn't support GL_UNSIGNED_INT_10_10_10_2.
-         * we have to use GL_UNSIGNED_BYTE and do the conversion in
-         * shader latter.*/
-        *tex_type = GL_UNSIGNED_BYTE;
-        if (is_upload == 1) {
-            if (!IS_LITTLE_ENDIAN)
-                *revert = REVERT_UPLOADING_10_10_10_2;
-            else
-                *revert = REVERT_UPLOADING_2_10_10_10;
-        }
-        else {
-            if (!IS_LITTLE_ENDIAN) {
-                *revert = REVERT_DOWNLOADING_10_10_10_2;
-            }
-            else {
-                *revert = REVERT_DOWNLOADING_2_10_10_10;
-            }
-        }
-        need_swap_rb = 1;
-
-        break;
-
-    case PICT_x2b10g10r10:
-        *no_alpha = 1;
-    case PICT_a2b10g10r10:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        if (is_upload == 1) {
-            if (!IS_LITTLE_ENDIAN)
-                *revert = REVERT_UPLOADING_10_10_10_2;
-            else
-                *revert = REVERT_UPLOADING_2_10_10_10;
-        }
-        else {
-            if (!IS_LITTLE_ENDIAN) {
-                *revert = REVERT_DOWNLOADING_10_10_10_2;
-            }
-            else {
-                *revert = REVERT_DOWNLOADING_2_10_10_10;
-            }
-        }
-        break;
-
-    case PICT_r5g6b5:
-        *tex_format = GL_RGB;
-        *tex_type = GL_UNSIGNED_SHORT_5_6_5;
-        *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
-
-        break;
-
-    case PICT_b5g6r5:
-        *tex_format = GL_RGB;
-        *tex_type = GL_UNSIGNED_SHORT_5_6_5;
-        need_swap_rb = IS_LITTLE_ENDIAN ? 1 : 0;;
-        break;
-
-    case PICT_x1b5g5r5:
-        *no_alpha = 1;
-    case PICT_a1b5g5r5:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
-        if (IS_LITTLE_ENDIAN) {
-            *revert =
-                is_upload ? REVERT_UPLOADING_1_5_5_5 :
-                REVERT_DOWNLOADING_1_5_5_5;
-        }
-        else
-            *revert = REVERT_NONE;
-        break;
-
-    case PICT_x1r5g5b5:
-        *no_alpha = 1;
-    case PICT_a1r5g5b5:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
-        if (IS_LITTLE_ENDIAN) {
-            *revert =
-                is_upload ? REVERT_UPLOADING_1_5_5_5 :
-                REVERT_DOWNLOADING_1_5_5_5;
-        }
-        else
-            *revert = REVERT_NONE;
-        need_swap_rb = 1;
-        break;
-
-    case PICT_a1:
-        *tex_format = GL_ALPHA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
-        break;
-
-    case PICT_a8:
-        *tex_format = GL_ALPHA;
-        *tex_type = GL_UNSIGNED_BYTE;
-        *revert = REVERT_NONE;
-        break;
-
-    case PICT_x4r4g4b4:
-        *no_alpha = 1;
-    case PICT_a4r4g4b4:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
-        *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
-        need_swap_rb = 1;
-        break;
-
-    case PICT_x4b4g4r4:
-        *no_alpha = 1;
-    case PICT_a4b4g4r4:
-        *tex_format = GL_RGBA;
-        *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
-        *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
-        break;
-
-    default:
-        LogMessageVerb(X_INFO, 0,
-                       "fail to get matched format for %x \n", format);
-        return -1;
-    }
-
-    if (need_swap_rb)
-        *swap_rb = is_upload ? SWAP_UPLOADING : SWAP_DOWNLOADING;
-    else
-        *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
-    return 0;
-}
-
-static int
-glamor_get_tex_format_type_from_pixmap(PixmapPtr pixmap,
-                                       GLenum *format,
-                                       GLenum *type,
-                                       int *no_alpha,
-                                       int *revert, int *swap_rb, int is_upload)
-{
-    glamor_pixmap_private *pixmap_priv;
-    PictFormatShort pict_format;
-    glamor_screen_private *glamor_priv =
-        glamor_get_screen_private(pixmap->drawable.pScreen);
-
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
-        pict_format = pixmap_priv->picture->format;
-    else
-        pict_format = format_for_depth(pixmap->drawable.depth);
-
-    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
-        return glamor_get_tex_format_type_from_pictformat_gl(pict_format,
-                                                             format, type,
-                                                             no_alpha,
-                                                             revert,
-                                                             swap_rb,
-                                                             is_upload);
-    } else {
-        return glamor_get_tex_format_type_from_pictformat_gles2(pict_format,
-                                                                format, type,
-                                                                no_alpha,
-                                                                revert,
-                                                                swap_rb,
-                                                                is_upload);
-    }
-}
-
-static void *
-_glamor_color_convert_a1_a8(void *src_bits, void *dst_bits, int w, int h,
-                            int stride, int revert)
-{
-    PictFormatShort dst_format, src_format;
-    pixman_image_t *dst_image;
-    pixman_image_t *src_image;
-    int src_stride;
-
-    if (revert == REVERT_UPLOADING_A1) {
-        src_format = PICT_a1;
-        dst_format = PICT_a8;
-        src_stride = PixmapBytePad(w, 1);
-    }
-    else {
-        dst_format = PICT_a1;
-        src_format = PICT_a8;
-        src_stride = (((w * 8 + 7) / 8) + 3) & ~3;
-    }
-
-    dst_image = pixman_image_create_bits(dst_format, w, h, dst_bits, stride);
-    if (dst_image == NULL) {
-        return NULL;
-    }
-
-    src_image = pixman_image_create_bits(src_format,
-                                         w, h, src_bits, src_stride);
-
-    if (src_image == NULL) {
-        pixman_image_unref(dst_image);
-        return NULL;
-    }
-
-    pixman_image_composite(PictOpSrc, src_image, NULL, dst_image,
-                           0, 0, 0, 0, 0, 0, w, h);
-
-    pixman_image_unref(src_image);
-    pixman_image_unref(dst_image);
-    return dst_bits;
-}
-
-#define ADJUST_BITS(d, src_bits, dst_bits)	(((dst_bits) == (src_bits)) ? (d) : 				\
-							(((dst_bits) > (src_bits)) ? 				\
-							  (((d) << ((dst_bits) - (src_bits))) 			\
-								   + (( 1 << ((dst_bits) - (src_bits))) >> 1))	\
-								:  ((d) >> ((src_bits) - (dst_bits)))))
-
-#define GLAMOR_DO_CONVERT(src, dst, no_alpha, swap,		\
-			  a_shift_src, a_bits_src,		\
-			  b_shift_src, b_bits_src,		\
-			  g_shift_src, g_bits_src,		\
-			  r_shift_src, r_bits_src,		\
-			  a_shift, a_bits,			\
-			  b_shift, b_bits,			\
-			  g_shift, g_bits,			\
-			  r_shift, r_bits)			\
-	do {								\
-		typeof(src) a,b,g,r;					\
-		typeof(src) a_mask_src, b_mask_src, g_mask_src, r_mask_src;\
-		a_mask_src = (((1 << (a_bits_src)) - 1) << a_shift_src);\
-		b_mask_src = (((1 << (b_bits_src)) - 1) << b_shift_src);\
-		g_mask_src = (((1 << (g_bits_src)) - 1) << g_shift_src);\
-		r_mask_src = (((1 << (r_bits_src)) - 1) << r_shift_src);\
-		if (no_alpha)						\
-			a = (a_mask_src) >> (a_shift_src);			\
-		else							\
-			a = ((src) & (a_mask_src)) >> (a_shift_src);	\
-		b = ((src) & (b_mask_src)) >> (b_shift_src);		\
-		g = ((src) & (g_mask_src)) >> (g_shift_src);		\
-		r = ((src) & (r_mask_src)) >> (r_shift_src);		\
-		a = ADJUST_BITS(a, a_bits_src, a_bits);			\
-		b = ADJUST_BITS(b, b_bits_src, b_bits);			\
-		g = ADJUST_BITS(g, g_bits_src, g_bits);			\
-		r = ADJUST_BITS(r, r_bits_src, r_bits);			\
-		if (swap == 0)						\
-			(*dst) = ((a) << (a_shift)) | ((b) << (b_shift)) | ((g) << (g_shift)) | ((r) << (r_shift)); \
-		else 												    \
-			(*dst) = ((a) << (a_shift)) | ((r) << (b_shift)) | ((g) << (g_shift)) | ((b) << (r_shift)); \
-	} while (0)
-
-static void *
-_glamor_color_revert_x2b10g10r10(void *src_bits, void *dst_bits, int w, int h,
-                                 int stride, int no_alpha, int revert,
-                                 int swap_rb)
-{
-    int x, y;
-    unsigned int *words, *saved_words, *source_words;
-    int swap = !(swap_rb == SWAP_NONE_DOWNLOADING ||
-                 swap_rb == SWAP_NONE_UPLOADING);
-
-    source_words = src_bits;
-    words = dst_bits;
-    saved_words = words;
-
-    for (y = 0; y < h; y++) {
-        DEBUGF("Line %d :  ", y);
-        for (x = 0; x < w; x++) {
-            unsigned int pixel = source_words[x];
-
-            if (revert == REVERT_DOWNLOADING_2_10_10_10)
-                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
-                                  24, 8, 16, 8, 8, 8, 0, 8,
-                                  30, 2, 20, 10, 10, 10, 0, 10);
-            else
-                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
-                                  30, 2, 20, 10, 10, 10, 0, 10,
-                                  24, 8, 16, 8, 8, 8, 0, 8);
-            DEBUGF("%x:%x ", pixel, words[x]);
-        }
-        DEBUGF("\n");
-        words += stride / sizeof(*words);
-        source_words += stride / sizeof(*words);
-    }
-    DEBUGF("\n");
-    return saved_words;
-
-}
-
-static void *
-_glamor_color_revert_x1b5g5r5(void *src_bits, void *dst_bits, int w, int h,
-                              int stride, int no_alpha, int revert, int swap_rb)
-{
-    int x, y;
-    unsigned short *words, *saved_words, *source_words;
-    int swap = !(swap_rb == SWAP_NONE_DOWNLOADING ||
-                 swap_rb == SWAP_NONE_UPLOADING);
-
-    words = dst_bits;
-    source_words = src_bits;
-    saved_words = words;
-
-    for (y = 0; y < h; y++) {
-        DEBUGF("Line %d :  ", y);
-        for (x = 0; x < w; x++) {
-            unsigned short pixel = source_words[x];
-
-            if (revert == REVERT_DOWNLOADING_1_5_5_5)
-                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
-                                  0, 1, 1, 5, 6, 5, 11, 5,
-                                  15, 1, 10, 5, 5, 5, 0, 5);
-            else
-                GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
-                                  15, 1, 10, 5, 5, 5, 0, 5,
-                                  0, 1, 1, 5, 6, 5, 11, 5);
-            DEBUGF("%04x:%04x ", pixel, words[x]);
-        }
-        DEBUGF("\n");
-        words += stride / sizeof(*words);
-        source_words += stride / sizeof(*words);
-    }
-    DEBUGF("\n");
-    return saved_words;
-}
-
-/*
- * This function is to convert an unsupported color format to/from a
- * supported GL format.
- * Here are the current scenarios:
- *
- * @no_alpha:
- * 	If it is set, then we need to wire the alpha value to 1.
- * @revert:
-	REVERT_DOWNLOADING_A1		: convert an Alpha8 buffer to a A1 buffer.
-	REVERT_UPLOADING_A1		: convert an A1 buffer to an Alpha8 buffer
-	REVERT_DOWNLOADING_2_10_10_10 	: convert r10G10b10X2 to X2B10G10R10
-	REVERT_UPLOADING_2_10_10_10 	: convert X2B10G10R10 to R10G10B10X2
-	REVERT_DOWNLOADING_1_5_5_5  	: convert B5G5R5X1 to X1R5G5B5
-	REVERT_UPLOADING_1_5_5_5    	: convert X1R5G5B5 to B5G5R5X1
-   @swap_rb: if we have the swap_rb set, then we need to swap the R and B's position.
- *
- */
-
-static void *
-glamor_color_convert_to_bits(void *src_bits, void *dst_bits, int w, int h,
-                             int stride, int no_alpha, int revert, int swap_rb)
-{
-    if (revert == REVERT_DOWNLOADING_A1 || revert == REVERT_UPLOADING_A1) {
-        return _glamor_color_convert_a1_a8(src_bits, dst_bits, w, h, stride,
-                                           revert);
-    }
-    else if (revert == REVERT_DOWNLOADING_2_10_10_10 ||
-             revert == REVERT_UPLOADING_2_10_10_10) {
-        return _glamor_color_revert_x2b10g10r10(src_bits, dst_bits, w, h,
-                                                stride, no_alpha, revert,
-                                                swap_rb);
-    }
-    else if (revert == REVERT_DOWNLOADING_1_5_5_5 ||
-             revert == REVERT_UPLOADING_1_5_5_5) {
-        return _glamor_color_revert_x1b5g5r5(src_bits, dst_bits, w, h, stride,
-                                             no_alpha, revert, swap_rb);
-    }
-    else
-        ErrorF("convert a non-supported mode %x.\n", revert);
-
-    return NULL;
-}
-
-/**
- * Upload pixmap to a specified texture.
- * This texture may not be the one attached to it.
- **/
-static void
-__glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex,
-                                  GLenum format,
-                                  GLenum type,
-                                  int x, int y, int w, int h,
-                                  void *bits, int pbo)
-{
-    glamor_screen_private *glamor_priv =
-        glamor_get_screen_private(pixmap->drawable.pScreen);
-    int non_sub = 0;
-    unsigned int iformat = 0;
-
-    glamor_make_current(glamor_priv);
-    if (*tex == 0) {
-        glGenTextures(1, tex);
-        if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
-            iformat = gl_iformat_for_pixmap(pixmap);
-        else
-            iformat = format;
-        non_sub = 1;
-        assert(x == 0 && y == 0);
-    }
-
-    glBindTexture(GL_TEXTURE_2D, *tex);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
-
-    assert(pbo || bits != 0);
-    if (bits == NULL) {
-        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
-        glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
-    }
-    if (non_sub)
-        glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0, format, type, bits);
-    else
-        glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, format, type, bits);
-
-    if (bits == NULL)
-        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
-}
-
-static Bool
-_glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format,
-                                      GLenum type, int no_alpha, int revert,
-                                      int swap_rb, int x, int y, int w, int h,
-                                      int stride, void *bits, int pbo)
-{
-    ScreenPtr screen = pixmap->drawable.pScreen;
-    glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
-    glamor_screen_private *glamor_priv =
-        glamor_get_screen_private(pixmap->drawable.pScreen);
-    static float vertices[8];
-
-    static float texcoords_inv[8] = { 0, 0,
-        1, 0,
-        1, 1,
-        0, 1
-    };
-    float *ptexcoords;
-    float dst_xscale, dst_yscale;
-    GLuint tex = 0;
-    int need_free_bits = 0;
-
-    if (bits == NULL)
-        goto ready_to_upload;
-
-    if (revert > REVERT_NORMAL) {
-        /* XXX if we are restoring the pixmap, then we may not need to allocate
-         * new buffer */
-        void *converted_bits;
-
-        if (pixmap->drawable.depth == 1)
-            stride = (((w * 8 + 7) / 8) + 3) & ~3;
-
-        converted_bits = xallocarray(h, stride);
-
-        if (converted_bits == NULL)
-            return FALSE;
-        bits = glamor_color_convert_to_bits(bits, converted_bits, w, h,
-                                            stride, no_alpha, revert, swap_rb);
-        if (bits == NULL) {
-            free(converted_bits);
-            ErrorF("Failed to convert pixmap no_alpha %d,"
-                   "revert mode %d, swap mode %d\n", no_alpha, revert, swap_rb);
-            return FALSE;
-        }
-        no_alpha = 0;
-        revert = REVERT_NONE;
-        swap_rb = SWAP_NONE_UPLOADING;
-        need_free_bits = TRUE;
-    }
-
- ready_to_upload:
-
-    /* Try fast path firstly, upload the pixmap to the texture attached
-     * to the fbo directly. */
-    if (no_alpha == 0
-        && revert == REVERT_NONE && swap_rb == SWAP_NONE_UPLOADING
-#ifdef WALKAROUND_LARGE_TEXTURE_MAP
-        && glamor_pixmap_priv_is_small(pixmap_priv)
-#endif
-        ) {
-        int fbo_x_off, fbo_y_off;
-
-        assert(pixmap_priv->fbo->tex);
-        pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off);
-
-        assert(x + fbo_x_off >= 0 && y + fbo_y_off >= 0);
-        assert(x + fbo_x_off + w <= pixmap_priv->fbo->width);
-        assert(y + fbo_y_off + h <= pixmap_priv->fbo->height);
-        __glamor_upload_pixmap_to_texture(pixmap, &pixmap_priv->fbo->tex,
-                                          format, type,
-                                          x + fbo_x_off, y + fbo_y_off, w, h,
-                                          bits, pbo);
-    } else {
-        ptexcoords = texcoords_inv;
-
-        pixmap_priv_get_dest_scale(pixmap, pixmap_priv, &dst_xscale, &dst_yscale);
-        glamor_set_normalize_vcoords(pixmap_priv, dst_xscale,
-                                     dst_yscale,
-                                     x, y,
-                                     x + w, y + h,
-                                     vertices);
-        /* Slow path, we need to flip y or wire alpha to 1. */
-        glamor_make_current(glamor_priv);
-        glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
-                              GL_FALSE, 2 * sizeof(float), vertices);
-        glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-        glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
-                              GL_FALSE, 2 * sizeof(float), ptexcoords);
-        glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
-        glamor_set_destination_pixmap_priv_nc(glamor_priv, pixmap, pixmap_priv);
-        glamor_set_alu(screen, GXcopy);
-        __glamor_upload_pixmap_to_texture(pixmap, &tex,
-                                          format, type, 0, 0, w, h, bits, pbo);
-        glActiveTexture(GL_TEXTURE0);
-        glBindTexture(GL_TEXTURE_2D, tex);
-
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        glUseProgram(glamor_priv->finish_access_prog[no_alpha]);
-        glUniform1i(glamor_priv->finish_access_revert[no_alpha], revert);
-        glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha], swap_rb);
-
-        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
-        glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
-        glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-        glDeleteTextures(1, &tex);
-        glBindFramebuffer(GL_FRAMEBUFFER, 0);
-    }
-
-    if (need_free_bits)
-        free(bits);
-    return TRUE;
-}
-
-/*
- * Prepare to upload a pixmap to texture memory.
- * no_alpha equals 1 means the format needs to wire alpha to 1.
- */
-static int
-glamor_pixmap_upload_prepare(PixmapPtr pixmap, GLenum format, int no_alpha,
-                             int revert, int swap_rb)
-{
-    int flag = 0;
-    glamor_pixmap_private *pixmap_priv;
-    glamor_screen_private *glamor_priv;
-    glamor_pixmap_fbo *fbo;
-    GLenum iformat;
-
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
-
-    if (pixmap_priv->gl_fbo != GLAMOR_FBO_UNATTACHED)
-        return 0;
-
-    if (pixmap_priv->fbo
-        && (pixmap_priv->fbo->width < pixmap->drawable.width
-            || pixmap_priv->fbo->height < pixmap->drawable.height)) {
-        fbo = glamor_pixmap_detach_fbo(pixmap_priv);
-        glamor_destroy_fbo(glamor_priv, fbo);
-    }
-
-    if (pixmap_priv->fbo && pixmap_priv->fbo->fb)
-        return 0;
-
-    if (!(no_alpha || (revert == REVERT_NORMAL)
-          || (swap_rb != SWAP_NONE_UPLOADING))) {
-        /* We don't need a fbo, a simple texture uploading should work. */
-
-        flag = GLAMOR_CREATE_FBO_NO_FBO;
-    }
-
-    if ((flag == GLAMOR_CREATE_FBO_NO_FBO
-         && pixmap_priv->fbo && pixmap_priv->fbo->tex))
-        return 0;
-
-    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
-        iformat = gl_iformat_for_pixmap(pixmap);
-    else
-        iformat = format;
-
-    if (!glamor_pixmap_ensure_fbo(pixmap, iformat, flag))
-        return -1;
-
-    return 0;
-}
-
-/*
- * upload sub region to a large region.
- * */
-static void
-glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits,
-                int src_stride, int bpp, int x, int y, int w, int h)
-{
-    int j;
-    int byte_per_pixel;
-
-    byte_per_pixel = bpp / 8;
-    src_bits += y * src_stride + (x * byte_per_pixel);
-
-    for (j = y; j < y + h; j++) {
-        memcpy(dst_bits, src_bits, w * byte_per_pixel);
-        src_bits += src_stride;
-        dst_bits += dst_stride;
-    }
-}
-
-static Bool
-glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
-                                    int h, int stride, void *bits, int pbo)
-{
-    ScreenPtr screen = pixmap->drawable.pScreen;
-    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
-    GLenum format, type;
-    int no_alpha, revert, swap_rb;
-    glamor_pixmap_private *pixmap_priv;
-    Bool force_clip;
-
-    if (glamor_get_tex_format_type_from_pixmap(pixmap,
-                                               &format,
-                                               &type,
-                                               &no_alpha,
-                                               &revert, &swap_rb, 1)) {
-        glamor_fallback("Unknown pixmap depth %d.\n", pixmap->drawable.depth);
-        return FALSE;
-    }
-    if (glamor_pixmap_upload_prepare(pixmap, format, no_alpha, revert, swap_rb))
-        return FALSE;
-
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    force_clip = glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
-        && !glamor_check_fbo_size(glamor_priv, w, h);
-
-    if (glamor_pixmap_priv_is_large(pixmap_priv) || force_clip) {
-        RegionRec region;
-        BoxRec box;
-        int n_region;
-        glamor_pixmap_clipped_regions *clipped_regions;
-        void *sub_bits;
-        int i, j;
-
-        sub_bits = xallocarray(h, stride);
-        if (sub_bits == NULL)
-            return FALSE;
-        box.x1 = x;
-        box.y1 = y;
-        box.x2 = x + w;
-        box.y2 = y + h;
-        RegionInitBoxes(&region, &box, 1);
-        if (!force_clip)
-            clipped_regions =
-                glamor_compute_clipped_regions(pixmap, &region, &n_region,
-                                               0, 0, 0);
-        else
-            clipped_regions =
-                glamor_compute_clipped_regions_ext(pixmap, &region,
-                                                   &n_region,
-                                                   pixmap_priv->block_w,
-                                                   pixmap_priv->block_h,
-                                                   0,
-                                                   0);
-        DEBUGF("prepare upload %dx%d to a large pixmap %p\n", w, h, pixmap);
-        for (i = 0; i < n_region; i++) {
-            BoxPtr boxes;
-            int nbox;
-            int temp_stride;
-            void *temp_bits;
-
-            assert(pbo == 0);
-
-            glamor_set_pixmap_fbo_current(pixmap_priv, clipped_regions[i].block_idx);
-
-            boxes = RegionRects(clipped_regions[i].region);
-            nbox = RegionNumRects(clipped_regions[i].region);
-            DEBUGF("split to %d boxes\n", nbox);
-            for (j = 0; j < nbox; j++) {
-                temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
-                                            pixmap->drawable.depth);
-
-                if (boxes[j].x1 == x && temp_stride == stride) {
-                    temp_bits = (char *) bits + (boxes[j].y1 - y) * stride;
-                }
-                else {
-                    temp_bits = sub_bits;
-                    glamor_put_bits(temp_bits, temp_stride, bits, stride,
-                                    pixmap->drawable.bitsPerPixel,
-                                    boxes[j].x1 - x, boxes[j].y1 - y,
-                                    boxes[j].x2 - boxes[j].x1,
-                                    boxes[j].y2 - boxes[j].y1);
-                }
-                DEBUGF("upload x %d y %d w %d h %d temp stride %d \n",
-                       boxes[j].x1 - x, boxes[j].y1 - y,
-                       boxes[j].x2 - boxes[j].x1,
-                       boxes[j].y2 - boxes[j].y1, temp_stride);
-                if (_glamor_upload_bits_to_pixmap_texture
-                    (pixmap, format, type, no_alpha, revert, swap_rb,
-                     boxes[j].x1, boxes[j].y1, boxes[j].x2 - boxes[j].x1,
-                     boxes[j].y2 - boxes[j].y1, temp_stride, temp_bits,
-                     pbo) == FALSE) {
-                    RegionUninit(&region);
-                    free(sub_bits);
-                    assert(0);
-                    return FALSE;
-                }
-            }
-            RegionDestroy(clipped_regions[i].region);
-        }
-        free(sub_bits);
-        free(clipped_regions);
-        RegionUninit(&region);
-        return TRUE;
-    }
-    else
-        return _glamor_upload_bits_to_pixmap_texture(pixmap, format, type,
-                                                     no_alpha, revert, swap_rb,
-                                                     x, y, w, h, stride, bits,
-                                                     pbo);
-}
-
-enum glamor_pixmap_status
-glamor_upload_pixmap_to_texture(PixmapPtr pixmap)
-{
-    int ret;
-
-    if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
-                                            pixmap->drawable.width,
-                                            pixmap->drawable.height,
-                                            pixmap->devKind,
-                                            pixmap->devPrivate.ptr, 0))
-        ret = GLAMOR_UPLOAD_DONE;
-    else
-        ret = GLAMOR_UPLOAD_FAILED;
-
-    return ret;
-}
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 508433a..2792afa 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -701,13 +701,6 @@ glamor_put_vbo_space(ScreenPtr screen);
  */
 Bool glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag);
 
-/**
- * Upload a pixmap to gl texture. Used by dynamic pixmap
- * uploading feature. The pixmap must be a software pixmap.
- * This function will change current FBO and current shaders.
- */
-enum glamor_pixmap_status glamor_upload_pixmap_to_texture(PixmapPtr pixmap);
-
 glamor_pixmap_clipped_regions *
 glamor_compute_clipped_regions(PixmapPtr pixmap,
                                RegionPtr region, int *clipped_nbox,
commit 53aed06fb45aed4145754cd622508563ad262c4a
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 12:48:01 2015 -0700

    glamor: Drop dead glamor_upload_bits_to_pixmap_texture() proto.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 1614b6f..508433a 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -741,15 +741,6 @@ Bool glamor_composite_largepixmap_region(CARD8 op,
  **/
 enum glamor_pixmap_status glamor_upload_picture_to_texture(PicturePtr picture);
 
-/**
- * Upload bits to a pixmap's texture. This function will
- * convert the bits to the specified format/type format
- * if the conversion is unavoidable.
- **/
-Bool glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format,
-                                          GLenum type, int no_alpha, int revert,
-                                          int swap_rb, void *bits);
-
 int glamor_create_picture(PicturePtr picture);
 
 void glamor_set_window_pixmap(WindowPtr pWindow, PixmapPtr pPixmap);
commit b51e079e1877411fde72372c3953d71e42ac1d6e
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 12:40:05 2015 -0700

    glamor: Use the new upload/download interface for XV uploads.
    
    We don't need any of its weird handling of picture formats, since our
    XV pixmaps don't have any pictures attached.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index 9a14527..5a09d32 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -931,7 +931,7 @@ glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits,
     }
 }
 
-Bool
+static Bool
 glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
                                     int h, int stride, void *bits, int pbo)
 {
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index d085ff2..1614b6f 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -708,10 +708,6 @@ Bool glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag);
  */
 enum glamor_pixmap_status glamor_upload_pixmap_to_texture(PixmapPtr pixmap);
 
-Bool glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
-                                         int h, int stride, void *bits,
-                                         int pbo);
-
 glamor_pixmap_clipped_regions *
 glamor_compute_clipped_regions(PixmapPtr pixmap,
                                RegionPtr region, int *clipped_nbox,
diff --git a/glamor/glamor_xv.c b/glamor/glamor_xv.c
index 364104d..85e6528 100644
--- a/glamor/glamor_xv.c
+++ b/glamor/glamor_xv.c
@@ -37,6 +37,7 @@
 #endif
 
 #include "glamor_priv.h"
+#include "glamor_transfer.h"
 
 #include <X11/extensions/Xv.h>
 #include "../hw/xfree86/common/fourcc.h"
@@ -410,6 +411,7 @@ glamor_xv_put_image(glamor_port_private *port_priv,
     int srcPitch, srcPitch2;
     int top, nlines;
     int s2offset, s3offset, tmp;
+    BoxRec full_box, half_box;
 
     s2offset = s3offset = srcPitch2 = 0;
 
@@ -452,20 +454,28 @@ glamor_xv_put_image(glamor_port_private *port_priv,
             s2offset = s3offset;
             s3offset = tmp;
         }
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[0],
-                                            0, 0, width, nlines,
-                                            srcPitch,
-                                            buf + (top * srcPitch), 0);
-
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[1],
-                                            0, 0, width >> 1, (nlines + 1) >> 1,
-                                            srcPitch2,
-                                            buf + s2offset, 0);
-
-        glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[2],
-                                            0, 0, width >> 1, (nlines + 1) >> 1,
-                                            srcPitch2,
-                                            buf + s3offset, 0);
+
+        full_box.x1 = 0;
+        full_box.y1 = 0;
+        full_box.x2 = width;
+        full_box.y2 = nlines;
+
+        half_box.x1 = 0;
+        half_box.y1 = 0;
+        half_box.x2 = width >> 1;
+        half_box.y2 = (nlines + 1) >> 1;
+
+        glamor_upload_boxes(port_priv->src_pix[0], &full_box, 1,
+                            0, 0, 0, 0,
+                            buf + (top * srcPitch), srcPitch);
+
+        glamor_upload_boxes(port_priv->src_pix[1], &half_box, 1,
+                            0, 0, 0, 0,
+                            buf + s2offset, srcPitch2);
+
+        glamor_upload_boxes(port_priv->src_pix[2], &half_box, 1,
+                            0, 0, 0, 0,
+                            buf + s3offset, srcPitch2);
         break;
     default:
         return BadMatch;
commit 1bd966d16d87ed908547144c68850f2cdee05469
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 12:21:41 2015 -0700

    glamor: Ignore picture formats when choosing color for core rendering.
    
    Attaching a picture to a pixmap doesn't change its GL format, so it
    doesn't change how core rendering should be assigning colors to it.
    
    (Imagine XCreatePixmap(), optional XCreatePicture(pixmap) with various
    formats, XFillRectangle, XGetImage().  If the XGetImage results
    changed, this would be wrong).
    
    Fixes all failures in "rendercheck -t fill" and, as a result, the
    remaining failures in "rendercheck -t blend -o src -f
    a8r8g8b8,x2r10g10b10"
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index a923b7a..8182006 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -805,16 +805,7 @@ gl_iformat_for_pixmap(PixmapPtr pixmap)
 static inline CARD32
 format_for_pixmap(PixmapPtr pixmap)
 {
-    glamor_pixmap_private *pixmap_priv;
-    PictFormatShort pict_format;
-
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
-        pict_format = pixmap_priv->picture->format;
-    else
-        pict_format = format_for_depth((pixmap)->drawable.depth);
-
-    return pict_format;
+    return format_for_depth((pixmap)->drawable.depth);
 }
 
 #define REVERT_NONE       		0
commit 5a81de8284f851751a8943aa6a905377be315c7b
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Jul 8 12:18:28 2015 -0700

    glamor: Don't try to do rendering with unsupported formats.
    
    I'm amazed we've made it as far as we have without these checks: if
    you made an unusual format picture that wasn't the normal a8r8g8b8 or
    x8r8g8b8 or a8, we'd go ahead and try to render with it, ignoring that
    the sampler would fetch totally wrong bits.
    
    Fixes 260 tests in rendercheck -t blend -o src -f a8r8g8b8,x2r10g10b10
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 488d1a7..3048cd8 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -753,6 +753,29 @@ glamor_set_normalize_tcoords_generic(PixmapPtr pixmap,
                                                             texcoords, stride);
 }
 
+/**
+ * Returns whether the general composite path supports this picture
+ * format for a pixmap that is permanently stored in an FBO (as
+ * opposed to the GLAMOR_PIXMAP_DYNAMIC_UPLOAD path).
+ *
+ * We could support many more formats by using GL_ARB_texture_view to
+ * parse the same bits as different formats.  For now, we only support
+ * tweaking whether we sample the alpha bits of an a8r8g8b8, or just
+ * force them to 1.
+ */
+static Bool
+glamor_render_format_is_supported(PictFormatShort format)
+{
+    switch (format) {
+    case PICT_a8r8g8b8:
+    case PICT_x8r8g8b8:
+    case PICT_a8:
+        return TRUE;
+    default:
+        return FALSE;
+    }
+}
+
 static Bool
 glamor_composite_choose_shader(CARD8 op,
                                PicturePtr source,
@@ -783,6 +806,11 @@ glamor_composite_choose_shader(CARD8 op,
         goto fail;
     }
 
+    if (!glamor_render_format_is_supported(dest->format)) {
+        glamor_fallback("Unsupported dest picture format.\n");
+        goto fail;
+    }
+
     memset(&key, 0, sizeof(key));
     if (!source) {
         key.source = SHADER_SOURCE_SOLID;
@@ -951,6 +979,11 @@ glamor_composite_choose_shader(CARD8 op,
                 glamor_fallback("Failed to upload source texture.\n");
                 goto fail;
             }
+        } else {
+            if (!glamor_render_format_is_supported(source->format)) {
+                glamor_fallback("Unsupported source picture format.\n");
+                goto fail;
+            }
         }
 
         if (mask_status == GLAMOR_UPLOAD_PENDING) {
@@ -959,6 +992,11 @@ glamor_composite_choose_shader(CARD8 op,
                 glamor_fallback("Failed to upload mask texture.\n");
                 goto fail;
             }
+        } else if (mask) {
+            if (!glamor_render_format_is_supported(mask->format)) {
+                glamor_fallback("Unsupported mask picture format.\n");
+                goto fail;
+            }
         }
     }
 #endif
commit 0d7cbd6f5a2b5c9c690979da9c1483e8f6133903
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Fri Jul 3 20:42:48 2015 +0200

    glamor_egl: Properly free resources on init-error and exit
    
    glamor_egl_init() was not undoing any of the init steps on init error,
    add an glamor_egl_cleanup() function and use this both on error and on exit
    to cleanup the various resources.
    
    Even on a clean exit eglTerminate() was not being called, causing the fd
    dup()-ed by eglInitialize() to stay open, call eglTerminate() from the new
    glamor_egl_cleanup() to fix this.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Eric Anholt <eric at anholt.net>

diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 753fb34..8ff1d03 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -766,6 +766,21 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
 #endif
 }
 
+static void glamor_egl_cleanup(struct glamor_egl_screen_private *glamor_egl)
+{
+    if (glamor_egl->display != EGL_NO_DISPLAY) {
+        eglMakeCurrent(glamor_egl->display,
+                       EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+        eglTerminate(glamor_egl->display);
+    }
+#ifdef GLAMOR_HAS_GBM
+    if (glamor_egl->gbm)
+        gbm_device_destroy(glamor_egl->gbm);
+#endif
+    free(glamor_egl->device_path);
+    free(glamor_egl);
+}
+
 static void
 glamor_egl_free_screen(ScrnInfoPtr scrn)
 {
@@ -773,17 +788,8 @@ glamor_egl_free_screen(ScrnInfoPtr scrn)
 
     glamor_egl = glamor_egl_get_screen_private(scrn);
     if (glamor_egl != NULL) {
-
-        eglMakeCurrent(glamor_egl->display,
-                       EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-#ifdef GLAMOR_HAS_GBM
-        if (glamor_egl->gbm)
-            gbm_device_destroy(glamor_egl->gbm);
-#endif
-        free(glamor_egl->device_path);
-
         scrn->FreeScreen = glamor_egl->saved_free_screen;
-        free(glamor_egl);
+        glamor_egl_cleanup(glamor_egl);
         scrn->FreeScreen(scrn);
     }
 }
@@ -814,7 +820,7 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
     glamor_egl->gbm = gbm_create_device(glamor_egl->fd);
     if (glamor_egl->gbm == NULL) {
         ErrorF("couldn't get display device\n");
-        return FALSE;
+        goto error;
     }
     glamor_egl->display = eglGetDisplay(glamor_egl->gbm);
 #else
@@ -831,7 +837,8 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
     if (!eglInitialize
         (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) {
         xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglInitialize() failed\n");
-        return FALSE;
+        glamor_egl->display = EGL_NO_DISPLAY;
+        goto error;
     }
 
     version = eglQueryString(glamor_egl->display, EGL_VERSION);
@@ -840,14 +847,14 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
 #define GLAMOR_CHECK_EGL_EXTENSION(EXT)  \
 	if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT)) {  \
 		ErrorF("EGL_" #EXT " required.\n");  \
-		return FALSE;  \
+		goto error;  \
 	}
 
 #define GLAMOR_CHECK_EGL_EXTENSIONS(EXT1, EXT2)	 \
 	if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT1) &&  \
 	    !epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT2)) {  \
 		ErrorF("EGL_" #EXT1 " or EGL_" #EXT2 " required.\n");  \
-		return FALSE;  \
+		goto error;  \
 	}
 
     GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
@@ -872,14 +879,14 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
                                            config_attribs);
     if (glamor_egl->context == EGL_NO_CONTEXT) {
         xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to create EGL context\n");
-        return FALSE;
+        goto error;
     }
 
     if (!eglMakeCurrent(glamor_egl->display,
                         EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
         xf86DrvMsg(scrn->scrnIndex, X_ERROR,
                    "Failed to make EGL context current\n");
-        return FALSE;
+        goto error;
     }
     glamor_egl->saved_free_screen = scrn->FreeScreen;
     scrn->FreeScreen = glamor_egl_free_screen;
@@ -890,6 +897,10 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
                "Indirect GLX may not work correctly.\n");
 #endif
     return TRUE;
+
+error:
+    glamor_egl_cleanup(glamor_egl);
+    return FALSE;
 }
 
 /** Stub to retain compatibility with pre-server-1.16 ABI. */
commit 80b6652c9fb9cdff91e92fa16c07e2cc63b06f44
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jul 7 17:21:55 2015 -0700

    glamor: Drop a bunch of glamor_priv == NULL checks.
    
    Now that it's always non-null when the pixmap is non-null, we don't
    need so much of this.  glamor_get_pixmap_private() itself still
    accepts a NULL pixmap and returns NULL, because of glamor_render.c
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 2470a8d..04c548d 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -207,13 +207,10 @@ void
 glamor_destroy_textured_pixmap(PixmapPtr pixmap)
 {
     if (pixmap->refcnt == 1) {
-        glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
-        if (pixmap_priv != NULL) {
 #if GLAMOR_HAS_GBM
-            glamor_egl_destroy_pixmap_image(pixmap);
+        glamor_egl_destroy_pixmap_image(pixmap);
 #endif
-            glamor_pixmap_destroy_fbo(pixmap);
-        }
+        glamor_pixmap_destroy_fbo(pixmap);
     }
 }
 
@@ -761,12 +758,11 @@ _X_EXPORT int
 glamor_fd_from_pixmap(ScreenPtr screen,
                       PixmapPtr pixmap, CARD16 *stride, CARD32 *size)
 {
-    glamor_pixmap_private *pixmap_priv;
+    glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private(pixmap->drawable.pScreen);
 
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
+    if (!glamor_priv->dri3_enabled)
         return -1;
     switch (pixmap_priv->type) {
     case GLAMOR_TEXTURE_DRM:
@@ -786,12 +782,11 @@ glamor_fd_from_pixmap(ScreenPtr screen,
 int
 glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size)
 {
-    glamor_pixmap_private *pixmap_priv;
+    glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private(pixmap->drawable.pScreen);
 
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
+    if (!glamor_priv->dri3_enabled)
         return -1;
     switch (pixmap_priv->type) {
     case GLAMOR_TEXTURE_DRM:
diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c
index 79f5981b..0104b88 100644
--- a/glamor/glamor_core.c
+++ b/glamor/glamor_core.c
@@ -42,8 +42,7 @@ glamor_get_drawable_location(const DrawablePtr drawable)
     glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private(drawable->pScreen);
-    if (pixmap_priv == NULL ||
-        pixmap_priv->gl_fbo == GLAMOR_FBO_UNATTACHED)
+    if (pixmap_priv->gl_fbo == GLAMOR_FBO_UNATTACHED)
         return 'm';
     if (pixmap_priv->fbo->fb == glamor_priv->screen_fbo)
         return 's';
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index e01f723..753fb34 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -452,7 +452,7 @@ glamor_gbm_bo_from_pixmap(ScreenPtr screen, PixmapPtr pixmap)
         glamor_get_pixmap_private(pixmap);
 
     pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
+    if (!glamor_priv->dri3_enabled)
         return NULL;
     switch (pixmap_priv->type) {
     case GLAMOR_TEXTURE_DRM:
@@ -604,7 +604,7 @@ glamor_egl_destroy_pixmap_image(PixmapPtr pixmap)
     struct glamor_pixmap_private *pixmap_priv =
         glamor_get_pixmap_private(pixmap);
 
-    if (pixmap_priv && pixmap_priv->image) {
+    if (pixmap_priv->image) {
         ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
         struct glamor_egl_screen_private *glamor_egl =
             glamor_egl_get_screen_private(scrn);
diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c
index 53b032c..20b9de2 100644
--- a/glamor/glamor_picture.c
+++ b/glamor/glamor_picture.c
@@ -61,15 +61,6 @@ glamor_create_picture(PicturePtr picture)
 
     pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
     pixmap_priv = glamor_get_pixmap_private(pixmap);
-    if (!pixmap_priv) {
-        /* We must create a pixmap priv to track the picture format even
-         * if the pixmap is a pure in memory pixmap. The reason is that
-         * we may need to upload this pixmap to a texture on the fly. During
-         * the uploading, we need to know the picture format. */
-        glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
-        pixmap_priv = glamor_get_pixmap_private(pixmap);
-    }
-
     pixmap_priv->is_picture = 1;
     pixmap_priv->picture = picture;
 
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index fe65d9b..d085ff2 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -419,7 +419,7 @@ glamor_pixmap_drm_only(PixmapPtr pixmap)
 {
     glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
 
-    return priv && priv->type == GLAMOR_DRM_ONLY;
+    return priv->type == GLAMOR_DRM_ONLY;
 }
 
 /*
@@ -430,7 +430,7 @@ glamor_pixmap_is_memory(PixmapPtr pixmap)
 {
     glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
 
-    return !priv || priv->type == GLAMOR_MEMORY;
+    return priv->type == GLAMOR_MEMORY;
 }
 
 /*
@@ -439,13 +439,13 @@ glamor_pixmap_is_memory(PixmapPtr pixmap)
 static inline Bool
 glamor_pixmap_priv_is_large(glamor_pixmap_private *priv)
 {
-    return priv && (priv->block_wcnt > 1 || priv->block_hcnt > 1);
+    return priv->block_wcnt > 1 || priv->block_hcnt > 1;
 }
 
 static inline Bool
 glamor_pixmap_priv_is_small(glamor_pixmap_private *priv)
 {
-    return priv && priv->block_wcnt <= 1 && priv->block_hcnt <= 1;
+    return priv->block_wcnt <= 1 && priv->block_hcnt <= 1;
 }
 
 static inline Bool
@@ -453,7 +453,7 @@ glamor_pixmap_is_large(PixmapPtr pixmap)
 {
     glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
 
-    return priv && glamor_pixmap_priv_is_large(priv);
+    return glamor_pixmap_priv_is_large(priv);
 }
 /*
  * Returns TRUE if pixmap has an FBO
@@ -463,7 +463,7 @@ glamor_pixmap_has_fbo(PixmapPtr pixmap)
 {
     glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
 
-    return priv && priv->gl_fbo == GLAMOR_FBO_NORMAL;
+    return priv->gl_fbo == GLAMOR_FBO_NORMAL;
 }
 
 static inline void
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 0a7de82..a923b7a 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -756,8 +756,8 @@ glamor_translate_boxes(BoxPtr boxes, int nbox, int dx, int dy)
 						|| _depth_ == 30	\
 						|| _depth_ == 32)
 
-#define GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv) (pixmap_priv && pixmap_priv->is_picture == 1)
-#define GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)    (pixmap_priv && pixmap_priv->gl_fbo == GLAMOR_FBO_NORMAL)
+#define GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv) (pixmap_priv->is_picture == 1)
+#define GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)    (pixmap_priv->gl_fbo == GLAMOR_FBO_NORMAL)
 
 /**
  * Borrow from uxa.
commit a2a2f6e34bd49e7ae31779274d52e800595660bc
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 16:20:18 2015 -0700

    glamor: Ask the server to always allocate our private.
    
    This avoids a lot of screwing around to attach our privates later.  It
    means that non-glamor pixmaps now gain 120 bytes of glamor privates on
    64-bit (which has quite a bit of fixable bloat), and glamor pixmaps
    take one less pointer of storage (not counting malloc overhead).
    
    Note that privates start out zero-filled, which matches the callocs we
    were doing when making our own privates, and in the case of an fb
    pixmap that has a priv where it didn't before, the type ends up being
    GLAMOR_MEMORY as we would want.
    
    v2: Clarify that the GLAMOR_MEMORY enum must be 0 (as it was
        previosuly), so that the new pixmap private behavior is as
        expected.  Suggested by keithp.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com> (v1)
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 50d85ff..2470a8d 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -80,12 +80,7 @@ glamor_set_pixmap_type(PixmapPtr pixmap, glamor_pixmap_type_t type)
 {
     glamor_pixmap_private *pixmap_priv;
 
-    pixmap_priv = dixLookupPrivate(&pixmap->devPrivates,
-                                   &glamor_pixmap_private_key);
-    if (pixmap_priv == NULL) {
-        pixmap_priv = calloc(sizeof(*pixmap_priv), 1);
-        glamor_set_pixmap_private(pixmap, pixmap_priv);
-    }
+    pixmap_priv = glamor_get_pixmap_private(pixmap);
     pixmap_priv->type = type;
     glamor_init_pixmap_private_small(pixmap, pixmap_priv);
 }
@@ -171,13 +166,7 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
     else
         pixmap = fbCreatePixmap(screen, 0, 0, depth, usage);
 
-    pixmap_priv = calloc(1, sizeof(*pixmap_priv));
-
-    if (!pixmap_priv) {
-        fbDestroyPixmap(pixmap);
-        return fbCreatePixmap(screen, w, h, depth, usage);
-    }
-    glamor_set_pixmap_private(pixmap, pixmap_priv);
+    pixmap_priv = glamor_get_pixmap_private(pixmap);
 
     format = gl_iformat_for_pixmap(pixmap);
 
@@ -223,7 +212,7 @@ glamor_destroy_textured_pixmap(PixmapPtr pixmap)
 #if GLAMOR_HAS_GBM
             glamor_egl_destroy_pixmap_image(pixmap);
 #endif
-            glamor_set_pixmap_private(pixmap, NULL);
+            glamor_pixmap_destroy_fbo(pixmap);
         }
     }
 }
@@ -455,7 +444,8 @@ glamor_init(ScreenPtr screen, unsigned int flags)
 
     glamor_set_screen_private(screen, glamor_priv);
 
-    if (!dixRegisterPrivateKey(&glamor_pixmap_private_key, PRIVATE_PIXMAP, 0)) {
+    if (!dixRegisterPrivateKey(&glamor_pixmap_private_key, PRIVATE_PIXMAP,
+                               sizeof(struct glamor_pixmap_private))) {
         LogMessage(X_WARNING,
                    "glamor%d: Failed to allocate pixmap private\n",
                    screen->myNum);
@@ -705,27 +695,6 @@ glamor_release_screen_priv(ScreenPtr screen)
     glamor_set_screen_private(screen, NULL);
 }
 
-_X_EXPORT void
-glamor_set_pixmap_private(PixmapPtr pixmap, glamor_pixmap_private *priv)
-{
-    glamor_pixmap_private *old_priv;
-
-    old_priv = dixGetPrivate(&pixmap->devPrivates, &glamor_pixmap_private_key);
-
-    if (priv) {
-        assert(old_priv == NULL);
-    }
-    else {
-        if (old_priv == NULL)
-            return;
-        glamor_pixmap_destroy_fbo(glamor_get_screen_private(pixmap->drawable.pScreen),
-                                  old_priv);
-        free(old_priv);
-    }
-
-    dixSetPrivate(&pixmap->devPrivates, &glamor_pixmap_private_key, priv);
-}
-
 Bool
 glamor_close_screen(ScreenPtr screen)
 {
@@ -759,7 +728,7 @@ glamor_close_screen(ScreenPtr screen)
     screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
 
     screen_pixmap = screen->GetScreenPixmap(screen);
-    glamor_set_pixmap_private(screen_pixmap, NULL);
+    glamor_pixmap_destroy_fbo(screen_pixmap);
 
     glamor_release_screen_priv(screen);
 
diff --git a/glamor/glamor.h b/glamor/glamor.h
index 0931bbc..4be8800 100644
--- a/glamor/glamor.h
+++ b/glamor/glamor.h
@@ -52,7 +52,7 @@ struct glamor_context;
  * @TEXTURE_ONLY: pixmap is in an internal texture.
  */
 typedef enum glamor_pixmap_type {
-    GLAMOR_MEMORY,
+    GLAMOR_MEMORY = 0, /* Newly calloc()ed pixmaps are memory. */
     GLAMOR_TEXTURE_DRM,
     GLAMOR_DRM_ONLY,
     GLAMOR_TEXTURE_ONLY,
diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 84f3b22..1eee304 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -471,9 +471,11 @@ glamor_pixmap_attach_fbo(PixmapPtr pixmap, glamor_pixmap_fbo *fbo)
 }
 
 void
-glamor_pixmap_destroy_fbo(glamor_screen_private *glamor_priv,
-                          glamor_pixmap_private *priv)
+glamor_pixmap_destroy_fbo(PixmapPtr pixmap)
 {
+    ScreenPtr screen = pixmap->drawable.pScreen;
+    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+    glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
     glamor_pixmap_fbo *fbo;
 
     if (glamor_pixmap_priv_is_large(priv)) {
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 66e5012..fe65d9b 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -405,22 +405,12 @@ extern DevPrivateKeyRec glamor_pixmap_private_key;
 static inline glamor_pixmap_private *
 glamor_get_pixmap_private(PixmapPtr pixmap)
 {
-    glamor_pixmap_private *priv;
-
     if (pixmap == NULL)
         return NULL;
 
-    priv = dixLookupPrivate(&pixmap->devPrivates, &glamor_pixmap_private_key);
-    if (!priv) {
-        glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
-        priv = dixLookupPrivate(&pixmap->devPrivates,
-                                &glamor_pixmap_private_key);
-    }
-    return priv;
+    return dixLookupPrivate(&pixmap->devPrivates, &glamor_pixmap_private_key);
 }
 
-void glamor_set_pixmap_private(PixmapPtr pixmap, glamor_pixmap_private *priv);
-
 /*
  * Returns TRUE if pixmap has no image object
  */
@@ -590,8 +580,7 @@ glamor_pixmap_fbo *glamor_create_fbo(glamor_screen_private *glamor_priv, int w,
                                      int h, GLenum format, int flag);
 void glamor_destroy_fbo(glamor_screen_private *glamor_priv,
                         glamor_pixmap_fbo *fbo);
-void glamor_pixmap_destroy_fbo(glamor_screen_private *glamor_priv,
-                               glamor_pixmap_private *priv);
+void glamor_pixmap_destroy_fbo(PixmapPtr pixmap);
 void glamor_init_pixmap_fbo(ScreenPtr screen);
 void glamor_fini_pixmap_fbo(ScreenPtr screen);
 Bool glamor_pixmap_fbo_fixup(ScreenPtr screen, PixmapPtr pixmap);
commit d278c30e68d79e86a3e2207b629d1e461856f907
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 20:35:59 2015 -0700

    glamor: Drop dead glamor_is_large_picture().
    
    It died as of keithp's new glyphs code.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index cef62c5..0a7de82 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -946,18 +946,6 @@ glamor_is_large_pixmap(PixmapPtr pixmap)
 }
 
 inline static Bool
-glamor_is_large_picture(PicturePtr picture)
-{
-    PixmapPtr pixmap;
-
-    if (picture->pDrawable) {
-        pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
-        return glamor_is_large_pixmap(pixmap);
-    }
-    return FALSE;
-}
-
-inline static Bool
 glamor_tex_format_is_readable(GLenum format)
 {
     return ((format == GL_RGBA || format == GL_RGB || format == GL_ALPHA));
commit cd608a516d2c59ebfb95fadfecf68227888c0e4e
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 20:25:06 2015 -0700

    glamor: Reuse the glamor_is_memory helper.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/glamor/glamor_composite_glyphs.c b/glamor/glamor_composite_glyphs.c
index cd88524..389c8f4 100644
--- a/glamor/glamor_composite_glyphs.c
+++ b/glamor/glamor_composite_glyphs.c
@@ -376,14 +376,12 @@ glamor_composite_glyphs(CARD8 op,
             if (glyph->info.width && glyph->info.height) {
                 PicturePtr glyph_pict = GlyphPicture(glyph)[screen_num];
                 DrawablePtr glyph_draw = glyph_pict->pDrawable;
-                glamor_pixmap_private *glyph_pix_priv =
-                    glamor_get_pixmap_private((PixmapPtr) glyph_draw);
 
                 /* Need to draw with slow path?
                  */
                 if (_X_UNLIKELY(glyph_draw->width > glyph_max_dim ||
                                 glyph_draw->height > glyph_max_dim ||
-                                (glyph_pix_priv != 0 && glyph_pix_priv->type != GLAMOR_MEMORY)))
+                                !glamor_pixmap_is_memory((PixmapPtr)glyph_draw)))
                 {
                     if (glyphs_queued) {
                         glamor_glyphs_flush(op, src, dst, prog, glyph_atlas, glyphs_queued);
commit 7b0f940625a0f6eee2ef91dfbfa4a206246940f5
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri Dec 19 13:46:37 2014 -0500

    atom: make FreeAtom static
    
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/dix/atom.c b/dix/atom.c
index a1e555e..da0adfe 100644
--- a/dix/atom.c
+++ b/dix/atom.c
@@ -70,8 +70,6 @@ static NodePtr atomRoot = NULL;
 static unsigned long tableLength;
 static NodePtr *nodeTable;
 
-void FreeAtom(NodePtr patom);
-
 Atom
 MakeAtom(const char *string, unsigned len, Bool makeit)
 {
@@ -166,7 +164,7 @@ AtomError(void)
     FatalError("initializing atoms");
 }
 
-void
+static void
 FreeAtom(NodePtr patom)
 {
     if (patom->left)
commit 2d2cf9e322a5ec3ead175edc136cdaeea00ec1b1
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri Dec 19 12:57:41 2014 -0500

    atom: Bump initial table size
    
    We're always creating ~230 atoms at startup, might as well tune it so we
    don't hit the realloc path before Dispatch.
    
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/dix/atom.c b/dix/atom.c
index 7de7fb0..a1e555e 100644
--- a/dix/atom.c
+++ b/dix/atom.c
@@ -56,7 +56,7 @@ SOFTWARE.
 #include "resource.h"
 #include "dix.h"
 
-#define InitialTableSize 100
+#define InitialTableSize 256
 
 typedef struct _Node {
     struct _Node *left, *right;
commit 995ff11422eb49160abfe276f471e412b16cab9d
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue May 19 11:31:25 2015 -0400

    glx: Implement GLX_ARB_context_flush_control
    
    This extension allows clients to opt out of the implicit glFlush on
    context release, which is quite nice for performance for clients using
    multiple contexts.  The server doesn't really need to be aware of the
    client's decision, at least for direct contexts, but it does need to not
    reject the context attribute out of hand.
    
    This patch won't do anything unless built against a Mesa that defines
    the __DRI2_FLUSH_CONTROL extension (and a new enough glxext.h, but
    that's been there since 10.3 at least).
    
    Reviewed-by: James Jones <jajones at nvidia.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/createcontext.c b/glx/createcontext.c
index cbeddec..d06bc1f 100644
--- a/glx/createcontext.c
+++ b/glx/createcontext.c
@@ -87,6 +87,9 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
     int minor_version = 0;
     uint32_t flags = 0;
     uint32_t render_type = GLX_RGBA_TYPE;
+#ifdef GLX_CONTEXT_RELEASE_BEHAVIOR_ARB
+    uint32_t flush = GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB;
+#endif
     __GLXcontext *ctx = NULL;
     __GLXcontext *shareCtx = NULL;
     __GLXscreen *glxScreen;
@@ -194,6 +197,15 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
 
             break;
 
+#ifdef GLX_CONTEXT_RELEASE_BEHAVIOR_ARB
+        case GLX_CONTEXT_RELEASE_BEHAVIOR_ARB:
+            flush = attribs[2 * i + 1];
+            if (flush != GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB
+                && flush != GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB)
+                return BadValue;
+            break;
+#endif
+
         default:
             return BadValue;
         }
@@ -333,6 +345,9 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
     ctx->drawPriv = NULL;
     ctx->readPriv = NULL;
     ctx->resetNotificationStrategy = reset;
+#ifdef GLX_CONTEXT_RELEASE_BEHAVIOR_ARB
+    ctx->releaseBehavior = flush;
+#endif
 
     /* Add the new context to the various global tables of GLX contexts.
      */
diff --git a/glx/extension_string.c b/glx/extension_string.c
index 4bef96f..e881d21 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -72,6 +72,7 @@ struct extension_info {
 static const struct extension_info known_glx_extensions[] = {
 /*   GLX_ARB_get_proc_address is implemented on the client. */
     /* *INDENT-OFF* */
+    { GLX(ARB_context_flush_control),   VER(0,0), N, },
     { GLX(ARB_create_context),          VER(0,0), N, },
     { GLX(ARB_create_context_profile),  VER(0,0), N, },
     { GLX(ARB_create_context_robustness), VER(0,0), N, },
diff --git a/glx/extension_string.h b/glx/extension_string.h
index e7d3932..bac7b06 100644
--- a/glx/extension_string.h
+++ b/glx/extension_string.h
@@ -36,7 +36,8 @@
 
 enum {
 /*   GLX_ARB_get_proc_address is implemented on the client. */
-    ARB_create_context_bit = 0,
+    ARB_context_flush_control_bit = 0,
+    ARB_create_context_bit,
     ARB_create_context_profile_bit,
     ARB_create_context_robustness_bit,
     ARB_fbconfig_float_bit,
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index f5f2bab..cbd4ede 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -334,6 +334,19 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId,
      */
     glxc->resetNotificationStrategy = GLX_NO_RESET_NOTIFICATION_ARB;
 
+#ifdef GLX_CONTEXT_RELEASE_BEHAVIOR_ARB
+    /* The GLX_ARB_context_flush_control spec says:
+     *
+     *     "The default value [for GLX_CONTEXT_RELEASE_BEHAVIOR] is
+     *     CONTEXT_RELEASE_BEHAVIOR_FLUSH, and may in some cases be changed
+     *     using platform-specific context creation extensions."
+     *
+     * Without using glXCreateContextAttribsARB, there is no way to specify a
+     * non-default release behavior.
+     */
+    glxc->releaseBehavior = GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB;
+#endif
+
     /* Add the new context to the various global tables of GLX contexts.
      */
     if (!__glXAddContext(glxc)) {
@@ -626,7 +639,12 @@ DoMakeCurrent(__GLXclientState * cl,
         /*
          ** Flush the previous context if needed.
          */
-        if (prevglxc->hasUnflushedCommands) {
+        Bool need_flush = GL_TRUE;
+#ifdef GLX_CONTEXT_RELEASE_BEHAVIOR_ARB
+        if (prevglxc->releaseBehavior == GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB)
+            need_flush = GL_FALSE;
+#endif
+        if (prevglxc->hasUnflushedCommands && need_flush) {
             if (__glXForceCurrent(cl, tag, (int *) &error)) {
                 glFlush();
                 prevglxc->hasUnflushedCommands = GL_FALSE;
diff --git a/glx/glxcontext.h b/glx/glxcontext.h
index 677898a..0733281 100644
--- a/glx/glxcontext.h
+++ b/glx/glxcontext.h
@@ -108,6 +108,11 @@ struct __GLXcontext {
      */
     GLenum resetNotificationStrategy;
 
+    /**
+     * Context release behavior
+     */
+    GLenum releaseBehavior;
+
     /*
      ** Buffers for feedback and selection.
      */
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index bcd57a4..6fb3d92 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -921,6 +921,13 @@ initializeExtensions(__GLXDRIscreen * screen)
                        "AIGLX: enabled GLX_ARB_create_context_robustness\n");
         }
 
+#ifdef __DRI2_FLUSH_CONTROL
+        if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) {
+            __glXEnableExtension(screen->glx_enable_bits,
+                                 "GLX_ARB_context_flush_control\n");
+        }
+#endif
+
         /* Ignore unknown extensions */
     }
 }
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index e25ca47..9add2a1 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -424,6 +424,14 @@ initializeExtensions(__GLXDRIscreen * screen)
             screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
             /* GLX_EXT_texture_from_pixmap is always enabled. */
         }
+
+#ifdef __DRI2_FLUSH_CONTROL
+        if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) {
+            __glXEnableExtension(screen->glx_enable_bits,
+                                 "GLX_ARB_context_flush_control\n");
+        }
+#endif
+
     }
 }
 
commit 2d7194334a9f84e417ec90e220b2fe476f704612
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 15 11:27:31 2015 -0400

    glx/swrast: Do more GLX extension setup
    
    This gets you nice things like core contexts when using Xvfb.
    
    Also, no, MESA_copy_sub_buffer is not enabled automatically.
    
    Reviewed-by: James Jones <jajones at nvidia.com>
    Reviewed-by: Jon Turney <jon.turney at dronecode.org.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 5d9aa04..e25ca47 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -71,6 +71,8 @@ struct __GLXDRIscreen {
     const __DRIcopySubBufferExtension *copySubBuffer;
     const __DRItexBufferExtension *texBuffer;
     const __DRIconfig **driConfigs;
+
+    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
 };
 
 struct __GLXDRIcontext {
@@ -394,21 +396,34 @@ initializeExtensions(__GLXDRIscreen * screen)
     const __DRIextension **extensions;
     int i;
 
+    if (screen->swrast->base.version >= 3) {
+        __glXEnableExtension(screen->glx_enable_bits,
+                             "GLX_ARB_create_context");
+        __glXEnableExtension(screen->glx_enable_bits,
+                             "GLX_ARB_create_context_profile");
+        __glXEnableExtension(screen->glx_enable_bits,
+                             "GLX_EXT_create_context_es2_profile");
+    }
+
+    /* these are harmless to enable unconditionally */
+    __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_framebuffer_sRGB");
+    __glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_fbconfig_float");
+    __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_make_current_read");
+
     extensions = screen->core->getExtensions(screen->driScreen);
 
     for (i = 0; extensions[i]; i++) {
         if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
             screen->copySubBuffer =
                 (const __DRIcopySubBufferExtension *) extensions[i];
-            /* GLX_MESA_copy_sub_buffer is always enabled. */
+            __glXEnableExtension(screen->glx_enable_bits,
+                                 "GLX_MESA_copy_sub_buffer");
         }
 
         if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
             screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
             /* GLX_EXT_texture_from_pixmap is always enabled. */
         }
-
-        /* Ignore unknown extensions */
     }
 }
 
@@ -420,6 +435,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 {
     const char *driverName = "swrast";
     __GLXDRIscreen *screen;
+    size_t buffer_size;
 
     screen = calloc(1, sizeof *screen);
     if (screen == NULL)
@@ -431,6 +447,8 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     screen->base.swapInterval = NULL;
     screen->base.pScreen = pScreen;
 
+    __glXInitExtensionEnableBits(screen->glx_enable_bits);
+
     screen->driver = glxProbeDriver(driverName,
                                     (void **) &screen->core,
                                     __DRI_CORE, 1,
@@ -459,6 +477,19 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     __glXScreenInit(&screen->base, pScreen);
 
+    /* The first call simply determines the length of the extension string.
+     * This allows us to allocate some memory to hold the extension string,
+     * but it requires that we call __glXGetExtensionString a second time.
+     */
+    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+    if (buffer_size > 0) {
+        free(screen->base.GLXextensions);
+
+        screen->base.GLXextensions = xnfalloc(buffer_size);
+        (void) __glXGetExtensionString(screen->glx_enable_bits,
+                                       screen->base.GLXextensions);
+    }
+
     screen->base.GLXmajor = 1;
     screen->base.GLXminor = 4;
 
commit cbd3cfbad3f07b20e90ea9498110f255813eb441
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:58:30 2015 -0400

    dix: Restore PaintWindow screen hook
    
    Removes the last cpp conditional on ROOTLESS from dix code.
    
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/composite/compwindow.c b/composite/compwindow.c
index 77bdfa2..344138a 100644
--- a/composite/compwindow.c
+++ b/composite/compwindow.c
@@ -104,7 +104,7 @@ compRepaintBorder(ClientPtr pClient, void *closure)
 
         RegionNull(&exposed);
         RegionSubtract(&exposed, &pWindow->borderClip, &pWindow->winSize);
-        miPaintWindow(pWindow, &exposed, PW_BORDER);
+        pWindow->drawable.pScreen->PaintWindow(pWindow, &exposed, PW_BORDER);
         RegionUninit(&exposed);
     }
     return TRUE;
diff --git a/dix/window.c b/dix/window.c
index 1b44305..d57f320 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -1467,7 +1467,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
 
         RegionNull(&exposed);
         RegionSubtract(&exposed, &pWin->borderClip, &pWin->winSize);
-        miPaintWindow(pWin, &exposed, PW_BORDER);
+        pWin->drawable.pScreen->PaintWindow(pWin, &exposed, PW_BORDER);
         RegionUninit(&exposed);
     }
     return error;
@@ -3034,7 +3034,7 @@ dixSaveScreens(ClientPtr client, int on, int mode)
 
                 /* make it look like screen saver is off, so that
                  * NotClippedByChildren will compute a clip list
-                 * for the root window, so miPaintWindow works
+                 * for the root window, so PaintWindow works
                  */
                 screenIsSaved = SCREEN_SAVER_OFF;
                 (*pWin->drawable.pScreen->MoveWindow) (pWin,
diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c
index 851ce48..d3ec133 100644
--- a/hw/xquartz/quartz.c
+++ b/hw/xquartz/quartz.c
@@ -300,8 +300,8 @@ QuartzUpdateScreens(void)
 
     quartzProcs->UpdateScreen(pScreen);
 
-    /* miPaintWindow needs to be called after RootlessUpdateScreenPixmap (from xprUpdateScreen) */
-    miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
+    /* PaintWindow needs to be called after RootlessUpdateScreenPixmap (from xprUpdateScreen) */
+    pScreen->PaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
 
     /* Tell RandR about the new size, so new connections get the correct info */
     RRScreenSizeNotify(pScreen);
diff --git a/hw/xwin/winrandr.c b/hw/xwin/winrandr.c
index 7392507..f4ba054 100644
--- a/hw/xwin/winrandr.c
+++ b/hw/xwin/winrandr.c
@@ -104,7 +104,7 @@ winDoRandRScreenSetSize(ScreenPtr pScreen,
     SetRootClip(pScreen, TRUE);
 
     // and arrange for it to be repainted
-    miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
+    pScreen->PaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
 
     /* Indicate that a screen size change took place */
     RRScreenSizeNotify(pScreen);
diff --git a/include/scrnintstr.h b/include/scrnintstr.h
index a627fe7..2e617c4 100644
--- a/include/scrnintstr.h
+++ b/include/scrnintstr.h
@@ -158,6 +158,10 @@ typedef void (*PostValidateTreeProcPtr) (WindowPtr /*pParent */ ,
 typedef void (*WindowExposuresProcPtr) (WindowPtr /*pWindow */ ,
                                         RegionPtr /*prgn */);
 
+typedef void (*PaintWindowProcPtr) (WindowPtr /*pWindow*/,
+                                    RegionPtr /*pRegion*/,
+                                    int /*what*/);
+
 typedef void (*CopyWindowProcPtr) (WindowPtr /*pWindow */ ,
                                    DDXPointRec /*ptOldOrg */ ,
                                    RegionPtr /*prgnSrc */ );
@@ -498,6 +502,7 @@ typedef struct _Screen {
     ClearToBackgroundProcPtr ClearToBackground;
     ClipNotifyProcPtr ClipNotify;
     RestackWindowProcPtr RestackWindow;
+    PaintWindowProcPtr PaintWindow;
 
     /* Pixmap procedures */
 
diff --git a/mi/miexpose.c b/mi/miexpose.c
index f4c6e89..148d1a6 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -268,10 +268,11 @@ miHandleExposures(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
         RegionTranslate(&rgnExposed, pDstDrawable->x, pDstDrawable->y);
 
         if (extents) {
-            /* miPaintWindow doesn't clip, so we have to */
+            /* PaintWindow doesn't clip, so we have to */
             RegionIntersect(&rgnExposed, &rgnExposed, &pWin->clipList);
         }
-        miPaintWindow((WindowPtr) pDstDrawable, &rgnExposed, PW_BACKGROUND);
+        pDstDrawable->pScreen->PaintWindow((WindowPtr) pDstDrawable,
+                                           &rgnExposed, PW_BACKGROUND);
 
         if (extents) {
             RegionReset(&rgnExposed, &expBox);
@@ -383,16 +384,14 @@ miWindowExposures(WindowPtr pWin, RegionPtr prgn)
              * work overall, on both client and server.  This is cheating, but
              * isn't prohibited by the protocol ("spontaneous combustion" :-).
              */
-            BoxRec box;
-
-            box = *RegionExtents(prgn);
+            BoxRec box = *RegionExtents(prgn);
             exposures = &expRec;
             RegionInit(exposures, &box, 1);
             RegionReset(prgn, &box);
             /* miPaintWindow doesn't clip, so we have to */
             RegionIntersect(prgn, prgn, &pWin->clipList);
         }
-        miPaintWindow(pWin, prgn, PW_BACKGROUND);
+        pWin->drawable.pScreen->PaintWindow(pWin, prgn, PW_BACKGROUND);
         if (clientInterested)
             miSendExposures(pWin, exposures,
                             pWin->drawable.x, pWin->drawable.y);
@@ -402,14 +401,6 @@ miWindowExposures(WindowPtr pWin, RegionPtr prgn)
     }
 }
 
-#ifdef ROOTLESS
-/* Ugly, ugly, but we lost our hooks into miPaintWindow... =/ */
-void RootlessSetPixmapOfAncestors(WindowPtr pWin);
-void RootlessStartDrawing(WindowPtr pWin);
-void RootlessDamageRegion(WindowPtr pWin, RegionPtr prgn);
-Bool IsFramedWindow(WindowPtr pWin);
-#endif
-
 void
 miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
 {
@@ -437,19 +428,6 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
     Bool solid = TRUE;
     DrawablePtr drawable = &pWin->drawable;
 
-#ifdef ROOTLESS
-    if (IsFramedWindow(pWin)) {
-        RootlessStartDrawing(pWin);
-        RootlessDamageRegion(pWin, prgn);
-
-        if (pWin->backgroundState == ParentRelative) {
-            if ((what == PW_BACKGROUND) ||
-                (what == PW_BORDER && !pWin->borderIsPixel))
-                RootlessSetPixmapOfAncestors(pWin);
-        }
-    }
-#endif
-
     if (what == PW_BACKGROUND) {
         while (pWin->backgroundState == ParentRelative)
             pWin = pWin->parent;
diff --git a/mi/mioverlay.c b/mi/mioverlay.c
index 2b20fd7..9f3ef07 100644
--- a/mi/mioverlay.c
+++ b/mi/mioverlay.c
@@ -844,8 +844,8 @@ miOverlayHandleExposures(WindowPtr pWin)
             if ((mival = pTree->valdata)) {
                 if (!((*pPriv->InOverlay) (pTree->pWin))) {
                     if (RegionNotEmpty(&mival->borderExposed)) {
-                        miPaintWindow(pTree->pWin, &mival->borderExposed,
-                                      PW_BORDER);
+                        pScreen->PaintWindow(pTree->pWin, &mival->borderExposed,
+                                             PW_BORDER);
                     }
                     RegionUninit(&mival->borderExposed);
 
@@ -883,7 +883,8 @@ miOverlayHandleExposures(WindowPtr pWin)
             }
             else {
                 if (RegionNotEmpty(&val->after.borderExposed)) {
-                    miPaintWindow(pChild, &val->after.borderExposed, PW_BORDER);
+                    pScreen->PaintWindow(pChild, &val->after.borderExposed,
+                                         PW_BORDER);
                 }
                 (*WindowExposures) (pChild, &val->after.exposed);
             }
@@ -982,6 +983,7 @@ static void
 miOverlayWindowExposures(WindowPtr pWin, RegionPtr prgn)
 {
     RegionPtr exposures = prgn;
+    ScreenPtr pScreen = pWin->drawable.pScreen;
 
     if (prgn && !RegionNil(prgn)) {
         RegionRec expRec;
@@ -1007,7 +1009,7 @@ miOverlayWindowExposures(WindowPtr pWin, RegionPtr prgn)
             else
                 RegionIntersect(prgn, prgn, &pWin->clipList);
         }
-        miPaintWindow(pWin, prgn, PW_BACKGROUND);
+        pScreen->PaintWindow(pWin, prgn, PW_BACKGROUND);
         if (clientInterested)
             miSendExposures(pWin, exposures,
                             pWin->drawable.x, pWin->drawable.y);
@@ -1606,7 +1608,7 @@ miOverlayClearToBackground(WindowPtr pWin,
     if (generateExposures)
         (*pScreen->WindowExposures) (pWin, &reg);
     else if (pWin->backgroundState != None)
-        miPaintWindow(pWin, &reg, PW_BACKGROUND);
+        pScreen->PaintWindow(pWin, &reg, PW_BACKGROUND);
     RegionUninit(&reg);
 }
 
diff --git a/mi/miscrinit.c b/mi/miscrinit.c
index b53c7e4..9c6af0d 100644
--- a/mi/miscrinit.c
+++ b/mi/miscrinit.c
@@ -253,6 +253,7 @@ miScreenInit(ScreenPtr pScreen, void *pbits,  /* pointer to screen bits */
     pScreen->ClearToBackground = miClearToBackground;
     pScreen->ClipNotify = (ClipNotifyProcPtr) 0;
     pScreen->RestackWindow = (RestackWindowProcPtr) 0;
+    pScreen->PaintWindow = miPaintWindow;
     /* CreatePixmap, DestroyPixmap */
     /* RealizeFont, UnrealizeFont */
     /* CreateGC */
diff --git a/mi/miwindow.c b/mi/miwindow.c
index 2fc7cfb..39c279e 100644
--- a/mi/miwindow.c
+++ b/mi/miwindow.c
@@ -113,7 +113,7 @@ miClearToBackground(WindowPtr pWin,
     if (generateExposures)
         (*pWin->drawable.pScreen->WindowExposures) (pWin, &reg);
     else if (pWin->backgroundState != None)
-        miPaintWindow(pWin, &reg, PW_BACKGROUND);
+        pWin->drawable.pScreen->PaintWindow(pWin, &reg, PW_BACKGROUND);
     RegionUninit(&reg);
 }
 
@@ -219,7 +219,9 @@ miHandleValidateExposures(WindowPtr pWin)
     while (1) {
         if ((val = pChild->valdata)) {
             if (RegionNotEmpty(&val->after.borderExposed))
-                miPaintWindow(pChild, &val->after.borderExposed, PW_BORDER);
+                pWin->drawable.pScreen->PaintWindow(pChild,
+                                                    &val->after.borderExposed,
+                                                    PW_BORDER);
             RegionUninit(&val->after.borderExposed);
             (*WindowExposures) (pChild, &val->after.exposed);
             RegionUninit(&val->after.exposed);
diff --git a/miext/rootless/rootlessCommon.h b/miext/rootless/rootlessCommon.h
index fd9c941..aa55579 100644
--- a/miext/rootless/rootlessCommon.h
+++ b/miext/rootless/rootlessCommon.h
@@ -94,6 +94,7 @@ typedef struct _RootlessScreenRec {
     ChangeBorderWidthProcPtr ChangeBorderWidth;
     PositionWindowProcPtr PositionWindow;
     ChangeWindowAttributesProcPtr ChangeWindowAttributes;
+    PaintWindowProcPtr PaintWindow;
 
     CreateGCProcPtr CreateGC;
     CopyWindowProcPtr CopyWindow;
diff --git a/miext/rootless/rootlessScreen.c b/miext/rootless/rootlessScreen.c
index 6226ee8..4716564 100644
--- a/miext/rootless/rootlessScreen.c
+++ b/miext/rootless/rootlessScreen.c
@@ -473,7 +473,7 @@ expose_1(WindowPtr pWin)
     if (!pWin->realized)
         return;
 
-    miPaintWindow(pWin, &pWin->borderClip, PW_BACKGROUND);
+    pWin->drawable.pScreen->PaintWindow(pWin, &pWin->borderClip, PW_BACKGROUND);
 
     /* FIXME: comments in windowstr.h indicate that borderClip doesn't
        include subwindow visibility. But I'm not so sure.. so we may
@@ -669,6 +669,7 @@ RootlessWrap(ScreenPtr pScreen)
     WRAP(CloseScreen);
     WRAP(CreateGC);
     WRAP(CopyWindow);
+    WRAP(PaintWindow);
     WRAP(GetImage);
     WRAP(SourceValidate);
     WRAP(CreateWindow);
diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c
index 3240acc..e304299 100644
--- a/miext/rootless/rootlessWindow.c
+++ b/miext/rootless/rootlessWindow.c
@@ -720,7 +720,7 @@ RootlessResizeCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
 /*
  * RootlessCopyWindow
  *  Update *new* location of window. Old location is redrawn with
- *  miPaintWindow. Cloned from fbCopyWindow.
+ *  PaintWindow. Cloned from fbCopyWindow.
  *  The original always draws on the root pixmap, which we don't have.
  *  Instead, draw on the parent window's pixmap.
  */
@@ -794,6 +794,27 @@ RootlessCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
     RL_DEBUG_MSG("copywindowFB end\n");
 }
 
+void
+RootlessPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
+{
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+
+    if (IsFramedWindow(pWin)) {
+        RootlessStartDrawing(pWin);
+        RootlessDamageRegion(pWin, prgn);
+
+        if (pWin->backgroundState == ParentRelative) {
+            if ((what == PW_BACKGROUND) ||
+                (what == PW_BORDER && !pWin->borderIsPixel))
+                RootlessSetPixmapOfAncestors(pWin);
+        }
+    }
+
+    SCREEN_UNWRAP(pScreen, PaintWindow);
+    pScreen->PaintWindow(pWin, prgn, what);
+    SCREEN_WRAP(pScreen, PaintWindow);
+}
+
 /*
  * Window resize procedures
  */
diff --git a/miext/rootless/rootlessWindow.h b/miext/rootless/rootlessWindow.h
index d3955fc..4fd34d5 100644
--- a/miext/rootless/rootlessWindow.h
+++ b/miext/rootless/rootlessWindow.h
@@ -48,6 +48,7 @@ Bool RootlessUnrealizeWindow(WindowPtr pWin);
 void RootlessRestackWindow(WindowPtr pWin, WindowPtr pOldNextSib);
 void RootlessCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
                         RegionPtr prgnSrc);
+void RootlessPaintWindow(WindowPtr pWin, RegionPtr prgn, int what);
 void RootlessMoveWindow(WindowPtr pWin, int x, int y, WindowPtr pSib,
                         VTKind kind);
 void RootlessResizeWindow(WindowPtr pWin, int x, int y, unsigned int w,
commit 74d64ceea02bffad1caf3d1a727edbd38d968059
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:58:30 2015 -0400

    mi: Remove questionable optimization from the rootless path
    
    This is effectively a revert of 7b506fdc840aebed6b5acb91437a2cb620b5bddc
    except the coding style reindent broke that.  The code makes no sense in
    any case.  drawable can never be null since it's the first member of
    WindowRec, and we're never called with a null window.  Neither can it be
    an UNDRAWABLE_WINDOW since those are InputOnly windows; the rootless
    code does not set the root window to either UNDRAWABLE or InputOnly, so.
    
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/mi/miexpose.c b/mi/miexpose.c
index 4124d67..f4c6e89 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -438,9 +438,6 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
     DrawablePtr drawable = &pWin->drawable;
 
 #ifdef ROOTLESS
-    if (!drawable || drawable->type == UNDRAWABLE_WINDOW)
-        return;
-
     if (IsFramedWindow(pWin)) {
         RootlessStartDrawing(pWin);
         RootlessDamageRegion(pWin, prgn);
commit 315661a425018a546f7bcc18ad3e5f4578473ca6
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:58:30 2015 -0400

    fb: Make rootless-agnostic
    
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/fb/fb.h b/fb/fb.h
index ab110f3..c687aa7 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -472,13 +472,8 @@ typedef struct {
 #define fbGetWindowPixmap(pWin)	((PixmapPtr)\
 				 dixLookupPrivate(&((WindowPtr)(pWin))->devPrivates, fbGetWinPrivateKey(pWin)))
 
-#ifdef ROOTLESS
 #define __fbPixDrawableX(pPix)	((pPix)->drawable.x)
 #define __fbPixDrawableY(pPix)	((pPix)->drawable.y)
-#else
-#define __fbPixDrawableX(pPix)	0
-#define __fbPixDrawableY(pPix)	0
-#endif
 
 #ifdef COMPOSITE
 #define __fbPixOffXWin(pPix)	(__fbPixDrawableX(pPix) - (pPix)->screen_x)
commit 1594fb912996e9776d9e36383bd1d9f5dd2877eb
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:58:30 2015 -0400

    rootless: Build unconditionally
    
    It's not a lot of code, and if you're doing things to the core that
    affect rootless you should be alerted early.
    
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/miext/Makefile.am b/miext/Makefile.am
index b84adc1..add4d18 100644
--- a/miext/Makefile.am
+++ b/miext/Makefile.am
@@ -1,8 +1 @@
-SUBDIRS = sync damage shadow
-if XQUARTZ
-SUBDIRS += rootless
-endif
-if XWIN_MULTIWINDOWEXTWM
-SUBDIRS += rootless
-endif
-DIST_SUBDIRS = sync damage shadow rootless
+SUBDIRS = sync damage shadow rootless
commit bdc917a41691250701ccc9a0b087448b50892fa9
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:58:30 2015 -0400

    rootless: Genericize the config header a bit
    
    ROOTLESS_RESIZE_GRAVITY is an optimization, so let's default it to off
    unless the backing window system is known to support it.
    
    ROOTLESS_PROTECT_ALPHA looks like it has different values for xquartz
    and win32, but hilariously rootlessGC.c merely checks if it is defined,
    not what the value is.  It's effectively the more conservative path
    anyway, so let's just turn it on.
    
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/miext/rootless/rootlessConfig.h b/miext/rootless/rootlessConfig.h
index d39ae63..4c464b9 100644
--- a/miext/rootless/rootlessConfig.h
+++ b/miext/rootless/rootlessConfig.h
@@ -35,28 +35,17 @@
 #define _ROOTLESSCONFIG_H
 
 #ifdef __APPLE__
+#define ROOTLESS_RESIZE_GRAVITY TRUE
+#endif
+
+/*# define ROOTLESSDEBUG*/
 
 #define ROOTLESS_PROTECT_ALPHA TRUE
 #define ROOTLESS_REDISPLAY_DELAY 10
-#define ROOTLESS_RESIZE_GRAVITY TRUE
-/*# define ROOTLESSDEBUG*/
 
 /* Bit mask for alpha channel with a particular number of bits per
    pixel. Note that we only care for 32bpp data. Mac OS X uses planar
    alpha for 16bpp. */
 #define RootlessAlphaMask(bpp) ((bpp) == 32 ? 0xFF000000 : 0)
 
-#endif                          /* __APPLE__ */
-
-#if defined(__CYGWIN__) || defined(WIN32)
-
-#define ROOTLESS_PROTECT_ALPHA NO
-#define ROOTLESS_REDISPLAY_DELAY 10
-#undef  ROOTLESS_RESIZE_GRAVITY
-/*# define ROOTLESSDEBUG*/
-
-#define RootlessAlphaMask(bpp) ((bpp) == 32 ? 0xFF000000 : 0)
-
-#endif                          /* __CYGWIN__ */
-
 #endif                          /* _ROOTLESSCONFIG_H */
commit 6f3332b9f411fd7ac9cab0085faa56f6c2ff3323
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:58:30 2015 -0400

    dix: unifdef pWin->rootlessUnhittable
    
    No reason to vary the dix ABI over this.
    
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/dix/window.c b/dix/window.c
index d49276c..1b44305 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -380,10 +380,7 @@ SetWindowToDefaults(WindowPtr pWin)
     pWin->forcedBS = FALSE;
     pWin->redirectDraw = RedirectDrawNone;
     pWin->forcedBG = FALSE;
-
-#ifdef ROOTLESS
-    pWin->rootlessUnhittable = FALSE;
-#endif
+    pWin->unhittable = FALSE;
 
 #ifdef COMPOSITE
     pWin->damagedDescendants = FALSE;
diff --git a/include/windowstr.h b/include/windowstr.h
index 53eef37..4383dab 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -162,9 +162,7 @@ typedef struct _Window {
     unsigned forcedBS:1;        /* system-supplied backingStore */
     unsigned redirectDraw:2;    /* COMPOSITE rendering redirect */
     unsigned forcedBG:1;        /* must have an opaque background */
-#ifdef ROOTLESS
-    unsigned rootlessUnhittable:1;      /* doesn't hit-test */
-#endif
+    unsigned unhittable:1;      /* doesn't hit-test, for rootless */
 #ifdef COMPOSITE
     unsigned damagedDescendants:1;      /* some descendants are damaged */
     unsigned inhibitBGPaint:1;  /* paint the background? */
diff --git a/mi/miwindow.c b/mi/miwindow.c
index 7574239..2fc7cfb 100644
--- a/mi/miwindow.c
+++ b/mi/miwindow.c
@@ -767,14 +767,11 @@ miSpriteTrace(SpritePtr pSprite, int x, int y)
                 RegionContainsPoint(wInputShape(pWin),
                                     x - pWin->drawable.x,
                                     y - pWin->drawable.y, &box))
-#ifdef ROOTLESS
             /* In rootless mode windows may be offscreen, even when
              * they're in X's stack. (E.g. if the native window system
              * implements some form of virtual desktop system).
              */
-            && !pWin->rootlessUnhittable
-#endif
-            ) {
+            && !pWin->unhittable) {
             if (pSprite->spriteTraceGood >= pSprite->spriteTraceSize) {
                 pSprite->spriteTraceSize += 10;
                 pSprite->spriteTrace = reallocarray(pSprite->spriteTrace,
diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c
index 1f78e3f..3240acc 100644
--- a/miext/rootless/rootlessWindow.c
+++ b/miext/rootless/rootlessWindow.c
@@ -92,7 +92,7 @@ RootlessNativeWindowStateChanged(WindowPtr pWin, unsigned int state)
 
     winRec->is_offscreen = ((state & XP_WINDOW_STATE_OFFSCREEN) != 0);
     winRec->is_obscured = ((state & XP_WINDOW_STATE_OBSCURED) != 0);
-    pWin->rootlessUnhittable = winRec->is_offscreen;
+    pWin->unhittable = winRec->is_offscreen;
 }
 
 void
@@ -569,7 +569,7 @@ RootlessReorderWindow(WindowPtr pWin)
         newPrevW = pWin->prevSib;
         while (newPrevW &&
                (WINREC(newPrevW) == NULL || !newPrevW->realized ||
-                newPrevW->rootlessUnhittable != pWin->rootlessUnhittable))
+                newPrevW->unhittable != pWin->unhittable))
             newPrevW = newPrevW->prevSib;
 
         newPrev = newPrevW != NULL ? WINREC(newPrevW) : NULL;
@@ -1365,7 +1365,7 @@ RootlessReparentWindow(WindowPtr pWin, WindowPtr pPriorParent)
     pTopWin = TopLevelParent(pWin);
     assert(pTopWin != pWin);
 
-    pWin->rootlessUnhittable = FALSE;
+    pWin->unhittable = FALSE;
 
     DeleteProperty(serverClient, pWin, xa_native_window_id());
 
@@ -1503,7 +1503,7 @@ RootlessOrderAllWindows(Bool include_unhitable)
                 continue;
             if (RootlessEnsureFrame(pWin) == NULL)
                 continue;
-            if (!include_unhitable && pWin->rootlessUnhittable)
+            if (!include_unhitable && pWin->unhittable)
                 continue;
             RootlessReorderWindow(pWin);
         }
commit 36fac0dd1a9a9cf41b631cf7e1ea015bcf920db7
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 23 13:23:20 2014 -0400

    xfixes: Unexport xfixes.h
    
    There's nothing a driver could want to use this for.
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/vfb/Makefile.am b/hw/vfb/Makefile.am
index f0f9fee..c9ac35e 100644
--- a/hw/vfb/Makefile.am
+++ b/hw/vfb/Makefile.am
@@ -21,7 +21,6 @@ XVFB_LIBS = \
 
 Xvfb_LDADD = $(XVFB_LIBS) $(XVFB_SYS_LIBS) $(XSERVER_SYS_LIBS)
 Xvfb_DEPENDENCIES = $(XVFB_LIBS)
-Xvfb_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
 
 relink:
 	$(AM_V_at)rm -f Xvfb$(EXEEXT) && $(MAKE) Xvfb$(EXEEXT)
diff --git a/xfixes/Makefile.am b/xfixes/Makefile.am
index a8425e8..2a95c06 100644
--- a/xfixes/Makefile.am
+++ b/xfixes/Makefile.am
@@ -2,10 +2,6 @@ noinst_LTLIBRARIES = libxfixes.la
 
 AM_CFLAGS = $(DIX_CFLAGS)
 
-if XORG
-sdk_HEADERS = xfixes.h
-endif
-
 libxfixes_la_SOURCES = 	\
 	cursor.c	\
 	region.c	\
diff --git a/xfixes/xfixes.h b/xfixes/xfixes.h
index fdcf44f..23f31cd 100644
--- a/xfixes/xfixes.h
+++ b/xfixes/xfixes.h
@@ -29,8 +29,8 @@
 
 #include "resource.h"
 
-extern _X_EXPORT RESTYPE RegionResType;
-extern _X_EXPORT int XFixesErrorBase;
+extern RESTYPE RegionResType;
+extern int XFixesErrorBase;
 
 #define VERIFY_REGION(pRegion, rid, client, mode)			\
     do {								\
@@ -48,7 +48,7 @@ extern _X_EXPORT int XFixesErrorBase;
     if (rid) VERIFY_REGION(pRegion, rid, client, mode); \
 }
 
-extern _X_EXPORT RegionPtr
+extern RegionPtr
  XFixesRegionCopy(RegionPtr pRegion);
 
 #include "xibarriers.h"
commit 4da66d9e0399141feffd5f002e4195a438fe5020
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jul 8 14:27:02 2014 -0400

    vidmode: Hide implementation details
    
    Also remove vidmodeproc.h from the SDK since no drivers are using it.
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index 54e7f4d..3bc0046 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -16,7 +16,6 @@ endif
 
 if XF86VIDMODE
 XF86VMODESOURCES = xf86vmode.c
-XF86VMODE_SDK = vidmodeproc.h
 endif
 
 if DGA
diff --git a/hw/xfree86/common/vidmodeproc.h b/hw/xfree86/common/vidmodeproc.h
index cff340c..59d714c 100644
--- a/hw/xfree86/common/vidmodeproc.h
+++ b/hw/xfree86/common/vidmodeproc.h
@@ -41,44 +41,43 @@ typedef union {
 
 extern Bool VidModeExtensionInit(ScreenPtr pScreen);
 
-extern _X_EXPORT Bool VidModeAvailable(int scrnIndex);
-extern _X_EXPORT Bool VidModeGetCurrentModeline(int scrnIndex, void **mode,
-                                                int *dotClock);
-extern _X_EXPORT Bool VidModeGetFirstModeline(int scrnIndex, void **mode,
-                                              int *dotClock);
-extern _X_EXPORT Bool VidModeGetNextModeline(int scrnIndex, void **mode,
-                                             int *dotClock);
-extern _X_EXPORT Bool VidModeDeleteModeline(int scrnIndex, void *mode);
-extern _X_EXPORT Bool VidModeZoomViewport(int scrnIndex, int zoom);
-extern _X_EXPORT Bool VidModeGetViewPort(int scrnIndex, int *x, int *y);
-extern _X_EXPORT Bool VidModeSetViewPort(int scrnIndex, int x, int y);
-extern _X_EXPORT Bool VidModeSwitchMode(int scrnIndex, void *mode);
-extern _X_EXPORT Bool VidModeLockZoom(int scrnIndex, Bool lock);
-extern _X_EXPORT Bool VidModeGetMonitor(int scrnIndex, void **monitor);
-extern _X_EXPORT int VidModeGetNumOfClocks(int scrnIndex, Bool *progClock);
-extern _X_EXPORT Bool VidModeGetClocks(int scrnIndex, int *Clocks);
-extern _X_EXPORT ModeStatus VidModeCheckModeForMonitor(int scrnIndex,
-                                                       void *mode);
-extern _X_EXPORT ModeStatus VidModeCheckModeForDriver(int scrnIndex,
-                                                      void *mode);
-extern _X_EXPORT void VidModeSetCrtcForMode(int scrnIndex, void *mode);
-extern _X_EXPORT Bool VidModeAddModeline(int scrnIndex, void *mode);
-extern _X_EXPORT int VidModeGetDotClock(int scrnIndex, int Clock);
-extern _X_EXPORT int VidModeGetNumOfModes(int scrnIndex);
-extern _X_EXPORT Bool VidModeSetGamma(int scrnIndex, float red, float green,
-                                      float blue);
-extern _X_EXPORT Bool VidModeGetGamma(int scrnIndex, float *red, float *green,
-                                      float *blue);
-extern _X_EXPORT void *VidModeCreateMode(void);
-extern _X_EXPORT void VidModeCopyMode(void *modefrom, void *modeto);
-extern _X_EXPORT int VidModeGetModeValue(void *mode, int valtyp);
-extern _X_EXPORT void VidModeSetModeValue(void *mode, int valtyp, int val);
-extern _X_EXPORT vidMonitorValue VidModeGetMonitorValue(void *monitor,
-                                                        int valtyp, int indx);
-extern _X_EXPORT Bool VidModeSetGammaRamp(int, int, CARD16 *, CARD16 *,
-                                          CARD16 *);
-extern _X_EXPORT Bool VidModeGetGammaRamp(int, int, CARD16 *, CARD16 *,
-                                          CARD16 *);
-extern _X_EXPORT int VidModeGetGammaRampSize(int scrnIndex);
+extern Bool VidModeGetCurrentModeline(int scrnIndex, void **mode,
+                                      int *dotClock);
+extern Bool VidModeGetFirstModeline(int scrnIndex, void **mode,
+                                    int *dotClock);
+extern Bool VidModeGetNextModeline(int scrnIndex, void **mode,
+                                   int *dotClock);
+extern Bool VidModeDeleteModeline(int scrnIndex, void *mode);
+extern Bool VidModeZoomViewport(int scrnIndex, int zoom);
+extern Bool VidModeGetViewPort(int scrnIndex, int *x, int *y);
+extern Bool VidModeSetViewPort(int scrnIndex, int x, int y);
+extern Bool VidModeSwitchMode(int scrnIndex, void *mode);
+extern Bool VidModeLockZoom(int scrnIndex, Bool lock);
+extern Bool VidModeGetMonitor(int scrnIndex, void **monitor);
+extern int VidModeGetNumOfClocks(int scrnIndex, Bool *progClock);
+extern Bool VidModeGetClocks(int scrnIndex, int *Clocks);
+extern ModeStatus VidModeCheckModeForMonitor(int scrnIndex,
+                                             void *mode);
+extern ModeStatus VidModeCheckModeForDriver(int scrnIndex,
+                                            void *mode);
+extern void VidModeSetCrtcForMode(int scrnIndex, void *mode);
+extern Bool VidModeAddModeline(int scrnIndex, void *mode);
+extern int VidModeGetDotClock(int scrnIndex, int Clock);
+extern int VidModeGetNumOfModes(int scrnIndex);
+extern Bool VidModeSetGamma(int scrnIndex, float red, float green,
+                            float blue);
+extern Bool VidModeGetGamma(int scrnIndex, float *red, float *green,
+                            float *blue);
+extern void *VidModeCreateMode(void);
+extern void VidModeCopyMode(void *modefrom, void *modeto);
+extern int VidModeGetModeValue(void *mode, int valtyp);
+extern void VidModeSetModeValue(void *mode, int valtyp, int val);
+extern vidMonitorValue VidModeGetMonitorValue(void *monitor,
+                                              int valtyp, int indx);
+extern Bool VidModeSetGammaRamp(int, int, CARD16 *, CARD16 *,
+                                CARD16 *);
+extern Bool VidModeGetGammaRamp(int, int, CARD16 *, CARD16 *,
+                                CARD16 *);
+extern int VidModeGetGammaRampSize(int scrnIndex);
 
 #endif
diff --git a/hw/xfree86/common/xf86VidMode.c b/hw/xfree86/common/xf86VidMode.c
index e708b27..10c7b4b 100644
--- a/hw/xfree86/common/xf86VidMode.c
+++ b/hw/xfree86/common/xf86VidMode.c
@@ -111,7 +111,7 @@ VidModeClose(ScreenPtr pScreen)
     return pScreen->CloseScreen(pScreen);
 }
 
-Bool
+static Bool
 VidModeAvailable(int scrnIndex)
 {
     ScrnInfoPtr pScrn;
diff --git a/hw/xfree86/sdksyms.sh b/hw/xfree86/sdksyms.sh
index ed55cbb..5391b72 100755
--- a/hw/xfree86/sdksyms.sh
+++ b/hw/xfree86/sdksyms.sh
@@ -136,9 +136,6 @@ cat > sdksyms.c << EOF
 # include "xf86xvmc.h"
 # include "xf86xvpriv.h"
 #endif
-#if XF86VIDMODE
-# include "vidmodeproc.h"
-#endif
 #include "xorgVersion.h"
 #if defined(__sparc__) || defined(__sparc)
 # include "xf86sbusBus.h"
commit 49d7bae7f4c6a93f92df828440e3478513f930f4
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jul 8 14:18:07 2014 -0400

    xge: Hide some implementation details
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/geext.c b/Xext/geext.c
index aee68c4..6285f69 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -90,9 +90,10 @@ ProcGEQueryVersion(ClientPtr client)
     return Success;
 }
 
-int (*ProcGEVector[GENumberRequests]) (ClientPtr) = {
+static int (*ProcGEVector[GENumberRequests]) (ClientPtr) = {
     /* Version 1.0 */
-ProcGEQueryVersion};
+    ProcGEQueryVersion,
+};
 
 /************************************************************/
 /*                swapped request handlers                  */
@@ -109,9 +110,10 @@ SProcGEQueryVersion(ClientPtr client)
     return (*ProcGEVector[stuff->ReqType]) (client);
 }
 
-int (*SProcGEVector[GENumberRequests]) (ClientPtr) = {
+static int (*SProcGEVector[GENumberRequests]) (ClientPtr) = {
     /* Version 1.0 */
-SProcGEQueryVersion};
+    SProcGEQueryVersion
+};
 
 /************************************************************/
 /*                callbacks                                 */
diff --git a/Xext/geint.h b/Xext/geint.h
index f76d148..0ee28e4 100644
--- a/Xext/geint.h
+++ b/Xext/geint.h
@@ -37,7 +37,7 @@
 #include "extnsionst.h"
 #include <X11/extensions/geproto.h>
 
-extern _X_EXPORT DevPrivateKeyRec GEClientPrivateKeyRec;
+extern DevPrivateKeyRec GEClientPrivateKeyRec;
 
 #define GEClientPrivateKey (&GEClientPrivateKeyRec)
 
@@ -48,7 +48,4 @@ typedef struct _GEClientInfo {
 
 #define GEGetClient(pClient)    ((GEClientInfoPtr)(dixLookupPrivate(&((pClient)->devPrivates), GEClientPrivateKey)))
 
-extern _X_EXPORT int (*ProcGEVector[ /*GENumRequests */ ]) (ClientPtr);
-extern _X_EXPORT int (*SProcGEVector[ /*GENumRequests */ ]) (ClientPtr);
-
 #endif                          /* _GEINT_H_ */
diff --git a/hw/xfree86/sdksyms.sh b/hw/xfree86/sdksyms.sh
index 334ed24..ed55cbb 100755
--- a/hw/xfree86/sdksyms.sh
+++ b/hw/xfree86/sdksyms.sh
@@ -54,7 +54,6 @@ cat > sdksyms.c << EOF
 #include "xvmcext.h"
 #endif
 #include "geext.h"
-#include "geint.h"
 #ifdef MITSHM
 #include "shmint.h"
 #endif
commit 2377690709de11087edc9d1116c9feaeb8f118ed
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jul 8 14:03:13 2014 -0400

    dga: Hide a bunch of implementation details
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Aaron Plattner <aplattner at nvidia.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/common/dgaproc.h b/hw/xfree86/common/dgaproc.h
index 87e923f..7925bd4 100644
--- a/hw/xfree86/common/dgaproc.h
+++ b/hw/xfree86/common/dgaproc.h
@@ -54,57 +54,15 @@ typedef struct {
 
 /* DDX interface */
 
-extern _X_EXPORT int
- DGASetMode(int Index, int num, XDGAModePtr mode, PixmapPtr *pPix);
-
-extern _X_EXPORT void
- DGASetInputMode(int Index, Bool keyboard, Bool mouse);
-
-extern _X_EXPORT void
- DGASelectInput(int Index, ClientPtr client, long mask);
-
-extern _X_EXPORT Bool DGAAvailable(int Index);
-extern _X_EXPORT Bool DGAScreenAvailable(ScreenPtr pScreen);
-extern _X_EXPORT Bool DGAActive(int Index);
-extern _X_EXPORT void DGAShutdown(void);
-extern _X_EXPORT void DGAInstallCmap(ColormapPtr cmap);
-extern _X_EXPORT int DGAGetViewportStatus(int Index);
-extern _X_EXPORT int DGASync(int Index);
-
-extern _X_EXPORT int
- DGAFillRect(int Index, int x, int y, int w, int h, unsigned long color);
-
-extern _X_EXPORT int
- DGABlitRect(int Index, int srcx, int srcy, int w, int h, int dstx, int dsty);
-
-extern _X_EXPORT int
-
-DGABlitTransRect(int Index,
-                 int srcx, int srcy,
-                 int w, int h, int dstx, int dsty, unsigned long color);
-
-extern _X_EXPORT int
- DGASetViewport(int Index, int x, int y, int mode);
-
-extern _X_EXPORT int DGAGetModes(int Index);
-extern _X_EXPORT int DGAGetOldDGAMode(int Index);
-
-extern _X_EXPORT int DGAGetModeInfo(int Index, XDGAModePtr mode, int num);
-
-extern _X_EXPORT Bool DGAVTSwitch(void);
-extern _X_EXPORT Bool DGAStealButtonEvent(DeviceIntPtr dev, int Index,
-                                          int button, int is_down);
-extern _X_EXPORT Bool DGAStealMotionEvent(DeviceIntPtr dev, int Index, int dx,
-                                          int dy);
-extern _X_EXPORT Bool DGAStealKeyEvent(DeviceIntPtr dev, int Index,
-                                       int key_code, int is_down);
-
-extern _X_EXPORT Bool DGAOpenFramebuffer(int Index, char **name,
-                                         unsigned char **mem, int *size,
-                                         int *offset, int *flags);
-extern _X_EXPORT void DGACloseFramebuffer(int Index);
-extern _X_EXPORT Bool DGAChangePixmapMode(int Index, int *x, int *y, int mode);
-extern _X_EXPORT int DGACreateColormap(int Index, ClientPtr client, int id,
-                                       int mode, int alloc);
+extern Bool DGAScreenAvailable(ScreenPtr pScreen);
+extern Bool DGAActive(int Index);
+extern void DGAShutdown(void);
+
+extern Bool DGAVTSwitch(void);
+extern Bool DGAStealButtonEvent(DeviceIntPtr dev, int Index,
+                                int button, int is_down);
+extern Bool DGAStealMotionEvent(DeviceIntPtr dev, int Index, int dx, int dy);
+extern Bool DGAStealKeyEvent(DeviceIntPtr dev, int Index,
+                             int key_code, int is_down);
 
 #endif                          /* __DGAPROC_H */
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 9533e1c..c689dcb 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -471,7 +471,7 @@ xf86SetDGAMode(ScrnInfoPtr pScrn, int num, DGADevicePtr devRet)
 
 /*********** exported ones ***************/
 
-void
+static void
 DGASetInputMode(int index, Bool keyboard, Bool mouse)
 {
     ScreenPtr pScreen = screenInfo.screens[index];
@@ -488,7 +488,7 @@ DGASetInputMode(int index, Bool keyboard, Bool mouse)
     }
 }
 
-Bool
+static Bool
 DGAChangePixmapMode(int index, int *x, int *y, int mode)
 {
     DGAScreenPtr pScreenPriv;
@@ -560,7 +560,7 @@ DGAScreenAvailable(ScreenPtr pScreen)
     return FALSE;
 }
 
-Bool
+static Bool
 DGAAvailable(int index)
 {
     ScreenPtr pScreen;
@@ -606,7 +606,7 @@ DGAShutdown(void)
 
 /* Called by the extension to initialize a mode */
 
-int
+static int
 DGASetMode(int index, int num, XDGAModePtr mode, PixmapPtr *pPix)
 {
     ScrnInfoPtr pScrn = xf86Screens[index];
@@ -626,7 +626,7 @@ DGASetMode(int index, int num, XDGAModePtr mode, PixmapPtr *pPix)
 
 /* Called from the extension to let the DDX know which events are requested */
 
-void
+static void
 DGASelectInput(int index, ClientPtr client, long mask)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -636,7 +636,7 @@ DGASelectInput(int index, ClientPtr client, long mask)
     pScreenPriv->input = mask;
 }
 
-int
+static int
 DGAGetViewportStatus(int index)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -649,7 +649,7 @@ DGAGetViewportStatus(int index)
     return (*pScreenPriv->funcs->GetViewport) (pScreenPriv->pScrn);
 }
 
-int
+static int
 DGASetViewport(int index, int x, int y, int mode)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -675,7 +675,7 @@ BitsClear(CARD32 data)
     return bits;
 }
 
-int
+static int
 DGACreateColormap(int index, ClientPtr client, int id, int mode, int alloc)
 {
     ScreenPtr pScreen = screenInfo.screens[index];
@@ -744,7 +744,7 @@ DGACreateColormap(int index, ClientPtr client, int id, int mode, int alloc)
 
 /*  Called by the extension to install a colormap on DGA active screens */
 
-void
+static void
 DGAInstallCmap(ColormapPtr cmap)
 {
     ScreenPtr pScreen = cmap->pScreen;
@@ -760,7 +760,7 @@ DGAInstallCmap(ColormapPtr cmap)
     (*pScreen->InstallColormap) (cmap);
 }
 
-int
+static int
 DGASync(int index)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -773,7 +773,7 @@ DGASync(int index)
     return Success;
 }
 
-int
+static int
 DGAFillRect(int index, int x, int y, int w, int h, unsigned long color)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -789,7 +789,7 @@ DGAFillRect(int index, int x, int y, int w, int h, unsigned long color)
     return BadMatch;
 }
 
-int
+static int
 DGABlitRect(int index, int srcx, int srcy, int w, int h, int dstx, int dsty)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -806,7 +806,7 @@ DGABlitRect(int index, int srcx, int srcy, int w, int h, int dstx, int dsty)
     return BadMatch;
 }
 
-int
+static int
 DGABlitTransRect(int index,
                  int srcx, int srcy,
                  int w, int h, int dstx, int dsty, unsigned long color)
@@ -826,7 +826,7 @@ DGABlitTransRect(int index,
     return BadMatch;
 }
 
-int
+static int
 DGAGetModes(int index)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -836,7 +836,7 @@ DGAGetModes(int index)
     return pScreenPriv->numModes;
 }
 
-int
+static int
 DGAGetModeInfo(int index, XDGAModePtr mode, int num)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -1126,7 +1126,7 @@ DGAProcessPointerEvent(ScreenPtr pScreen, DGAEvent * event, DeviceIntPtr mouse)
     }
 }
 
-Bool
+static Bool
 DGAOpenFramebuffer(int index,
                    char **name,
                    unsigned char **mem, int *size, int *offset, int *flags)
@@ -1140,7 +1140,7 @@ DGAOpenFramebuffer(int index,
                                                    flags);
 }
 
-void
+static void
 DGACloseFramebuffer(int index)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
@@ -1152,7 +1152,7 @@ DGACloseFramebuffer(int index)
 
 /*  For DGA 1.0 backwards compatibility only */
 
-int
+static int
 DGAGetOldDGAMode(int index)
 {
     DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
diff --git a/hw/xfree86/sdksyms.sh b/hw/xfree86/sdksyms.sh
index e141522..334ed24 100755
--- a/hw/xfree86/sdksyms.sh
+++ b/hw/xfree86/sdksyms.sh
@@ -180,12 +180,6 @@ cat > sdksyms.c << EOF
 #endif
 
 
-/* hw/xfree86/dixmods/extmod/Makefile.am -- module */
-#ifdef XFreeXDGA
-#include "dgaproc.h"
-#endif
-
-
 /* hw/xfree86/parser/Makefile.am */
 #include "xf86Parser.h"
 #include "xf86Optrec.h"
commit b5fbe9c6327fac88c09afce598238a7534521b69
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jul 8 13:37:34 2014 -0400

    xfree86: Hide some pre-randr mode validation details
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Aaron Plattner <aplattner at nvidia.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 49ff35b..1cde478 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -368,22 +368,11 @@ xf86GetBppFromDepth(ScrnInfoPtr pScrn, int depth);
 
 /* xf86Mode.c */
 
-extern _X_EXPORT int
-xf86GetNearestClock(ScrnInfoPtr scrp, int freq, Bool allowDiv2,
-                    int DivFactor, int MulFactor, int *divider);
 extern _X_EXPORT const char *
 xf86ModeStatusToString(ModeStatus status);
 extern _X_EXPORT ModeStatus
-xf86LookupMode(ScrnInfoPtr scrp, DisplayModePtr modep,
-               ClockRangePtr clockRanges, LookupModeFlags strategy);
-extern _X_EXPORT ModeStatus
 xf86CheckModeForMonitor(DisplayModePtr mode, MonPtr monitor);
 extern _X_EXPORT ModeStatus
-xf86InitialCheckModeForDriver(ScrnInfoPtr scrp, DisplayModePtr mode,
-                              ClockRangePtr clockRanges,
-                              LookupModeFlags strategy,
-                              int maxPitch, int virtualX, int virtualY);
-extern _X_EXPORT ModeStatus
 xf86CheckModeForDriver(ScrnInfoPtr scrp, DisplayModePtr mode, int flags);
 extern _X_EXPORT int
 xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes,
diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index 9a5550f..3f446ae 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -112,11 +112,10 @@ printModeRejectMessage(int index, DisplayModePtr p, int status)
 }
 
 /*
- * xf86GetNearestClock --
- *	Find closest clock to given frequency (in kHz).  This assumes the
- *	number of clocks is greater than zero.
+ * Find closest clock to given frequency (in kHz).  This assumes the
+ * number of clocks is greater than zero.
  */
-int
+static int
 xf86GetNearestClock(ScrnInfoPtr scrp, int freq, Bool allowDiv2,
                     int DivFactor, int MulFactor, int *divider)
 {
@@ -451,7 +450,7 @@ xf86HandleBuiltinMode(ScrnInfoPtr scrp,
  * reason.
  */
 
-ModeStatus
+static ModeStatus
 xf86LookupMode(ScrnInfoPtr scrp, DisplayModePtr modep,
                ClockRangePtr clockRanges, LookupModeFlags strategy)
 {
@@ -845,7 +844,7 @@ xf86CheckModeSize(ScrnInfoPtr scrp, int w, int x, int y)
  *    maxVValue    maximum vertical timing value
  */
 
-ModeStatus
+static ModeStatus
 xf86InitialCheckModeForDriver(ScrnInfoPtr scrp, DisplayModePtr mode,
                               ClockRangePtr clockRanges,
                               LookupModeFlags strategy,
diff --git a/hw/xfree86/doc/ddxDesign.xml b/hw/xfree86/doc/ddxDesign.xml
index 6a9de9e..aed77a9 100644
--- a/hw/xfree86/doc/ddxDesign.xml
+++ b/hw/xfree86/doc/ddxDesign.xml
@@ -6957,28 +6957,6 @@ use of some of these secondary mode helper functions.
 
       <blockquote><para>
 	  <programlisting>
-    int xf86GetNearestClock(ScrnInfoPtr scrp, int freq, Bool allowDiv2,
-                            int *divider);
-	  </programlisting>
-	  <blockquote><para>
-      This function returns the index of the closest clock to the
-      frequency <parameter>freq</parameter> given (in kHz).  It assumes that
-      the number of clocks is greater than zero.  It requires that the
-      <structfield>numClocks</structfield> and <structfield>clock</structfield> fields of the
-      <structname>ScrnInfoRec</structname> are initialised.  The
-      <structfield>allowDiv2</structfield> field determines if the clocks can be
-      halved.  The <parameter>*divider</parameter> return value indicates
-      whether clock division is used when determining the clock returned.
-	    </para>
-
-	    <para>
-      This function is only for non-programmable clocks.
-	    </para>
-
-	  </blockquote></para></blockquote>
-
-      <blockquote><para>
-	  <programlisting>
     const char *xf86ModeStatusToString(ModeStatus status);
 	  </programlisting>
 	  <blockquote><para>
@@ -6990,59 +6968,6 @@ use of some of these secondary mode helper functions.
 
       <blockquote><para>
 	  <programlisting>
-    ModeStatus xf86LookupMode(ScrnInfoPtr scrp, DisplayModePtr modep,
-                     ClockRangePtr clockRanges, LookupModeFlags strategy);
-	  </programlisting>
-	  <blockquote><para>
-      This function takes a pointer to a mode with the name filled in,
-      and looks for a mode in the <structfield>modePool</structfield> list which
-      matches.  The parameters of the matching mode are filled in to
-      <parameter>*modep</parameter>.  The <parameter>clockRanges</parameter> and
-      <parameter>strategy</parameter> parameters are as for the
-      <function>xf86ValidateModes()</function> function above.
-	    </para>
-
-	    <para>
-      This function requires the <structfield>modePool</structfield>,
-      <structfield>clock[]</structfield>, <structfield>numClocks</structfield> and
-      <structfield>progClock</structfield> fields of the <structname>ScrnInfoRec</structname>
-      to be initialised before being called.
-	    </para>
-
-	    <para>
-      The return value is <constant>MODE_OK</constant> if a mode was found.
-      Otherwise it indicates why a matching mode could not be found.
-	    </para>
-
-	  </blockquote></para></blockquote>
-
-      <blockquote><para>
-	  <programlisting>
-    ModeStatus xf86InitialCheckModeForDriver(ScrnInfoPtr scrp,
-                                DisplayModePtr mode, ClockRangePtr clockRanges,
-                                LookupModeFlags strategy, int maxPitch,
-                                int virtualX, int virtualY);
-	  </programlisting>
-	  <blockquote><para>
-      This function checks the passed mode against some basic driver
-      constraints.  Apart from the ones passed explicitly, the
-      <structfield>maxHValue</structfield> and <structfield>maxVValue</structfield> fields of
-      the <structname>ScrnInfoRec</structname> are also used.  If the
-      <structfield>ValidMode</structfield> field of the <structname>ScrnInfoRec</structname>
-      is set, that function is also called to check the mode.  Next, the
-      mode is checked against the monitor's constraints.
-	    </para>
-
-	    <para>
-      If the mode is consistent with all constraints, the return value
-      is <constant>MODE_OK</constant>.  Otherwise the return value indicates
-      which constraint wasn't met.
-	    </para>
-
-	  </blockquote></para></blockquote>
-
-      <blockquote><para>
-	  <programlisting>
     void xf86DeleteMode(DisplayModePtr *modeList, DisplayModePtr mode);
 	  </programlisting>
 	  <blockquote><para>
commit 70b402be2626d4f4afb02b6f5baa543262548bd7
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 30 16:19:08 2014 -0400

    render: Hide/unexport some implementation details
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Aaron Plattner <aplattner at nvidia.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/render/glyph.c b/render/glyph.c
index f3310db..ea865af 100644
--- a/render/glyph.c
+++ b/render/glyph.c
@@ -106,7 +106,7 @@ GlyphUninit(ScreenPtr pScreen)
     }
 }
 
-GlyphHashSetPtr
+static GlyphHashSetPtr
 FindGlyphHashSet(CARD32 filled)
 {
     int i;
@@ -117,7 +117,7 @@ FindGlyphHashSet(CARD32 filled)
     return 0;
 }
 
-GlyphRefPtr
+static GlyphRefPtr
 FindGlyphRef(GlyphHashPtr hash,
              CARD32 signature, Bool match, unsigned char sha1[20])
 {
@@ -245,7 +245,7 @@ FreeGlyphPicture(GlyphPtr glyph)
     }
 }
 
-void
+static void
 FreeGlyph(GlyphPtr glyph, int format)
 {
     CheckDuplicates(&globalGlyphs[format], "FreeGlyph");
@@ -383,7 +383,7 @@ AllocateGlyph(xGlyphInfo * gi, int fdepth)
     return 0;
 }
 
-Bool
+static Bool
 AllocateGlyphHash(GlyphHashPtr hash, GlyphHashSetPtr hashSet)
 {
     hash->table = calloc(hashSet->size, sizeof(GlyphRefRec));
@@ -394,7 +394,7 @@ AllocateGlyphHash(GlyphHashPtr hash, GlyphHashSetPtr hashSet)
     return TRUE;
 }
 
-Bool
+static Bool
 ResizeGlyphHash(GlyphHashPtr hash, CARD32 change, Bool global)
 {
     CARD32 tableEntries;
diff --git a/render/glyphstr.h b/render/glyphstr.h
index 2df055d..2f51bd2 100644
--- a/render/glyphstr.h
+++ b/render/glyphstr.h
@@ -90,47 +90,31 @@ typedef struct _GlyphList {
     PictFormatPtr format;
 } GlyphListRec, *GlyphListPtr;
 
-extern _X_EXPORT void
+extern void
  GlyphUninit(ScreenPtr pScreen);
 
-extern _X_EXPORT GlyphHashSetPtr FindGlyphHashSet(CARD32 filled);
-
-extern _X_EXPORT GlyphRefPtr
-FindGlyphRef(GlyphHashPtr hash,
-             CARD32 signature, Bool match, unsigned char sha1[20]);
-
-extern _X_EXPORT GlyphPtr FindGlyphByHash(unsigned char sha1[20], int format);
-
-extern _X_EXPORT int
+extern GlyphPtr FindGlyphByHash(unsigned char sha1[20], int format);
 
+extern int
 HashGlyph(xGlyphInfo * gi,
           CARD8 *bits, unsigned long size, unsigned char sha1[20]);
 
-extern _X_EXPORT void
- FreeGlyph(GlyphPtr glyph, int format);
-
-extern _X_EXPORT void
+extern void
  AddGlyph(GlyphSetPtr glyphSet, GlyphPtr glyph, Glyph id);
 
-extern _X_EXPORT Bool
+extern Bool
  DeleteGlyph(GlyphSetPtr glyphSet, Glyph id);
 
-extern _X_EXPORT GlyphPtr FindGlyph(GlyphSetPtr glyphSet, Glyph id);
-
-extern _X_EXPORT GlyphPtr AllocateGlyph(xGlyphInfo * gi, int format);
-
-extern _X_EXPORT Bool
- AllocateGlyphHash(GlyphHashPtr hash, GlyphHashSetPtr hashSet);
+extern GlyphPtr FindGlyph(GlyphSetPtr glyphSet, Glyph id);
 
-extern _X_EXPORT Bool
- ResizeGlyphHash(GlyphHashPtr hash, CARD32 change, Bool global);
+extern GlyphPtr AllocateGlyph(xGlyphInfo * gi, int format);
 
-extern _X_EXPORT Bool
+extern Bool
  ResizeGlyphSet(GlyphSetPtr glyphSet, CARD32 change);
 
-extern _X_EXPORT GlyphSetPtr AllocateGlyphSet(int fdepth, PictFormatPtr format);
+extern GlyphSetPtr AllocateGlyphSet(int fdepth, PictFormatPtr format);
 
-extern _X_EXPORT int
+extern int
  FreeGlyphSet(void *value, XID gid);
 
 #define GLYPH_HAS_GLYPH_PICTURE_ACCESSOR 1 /* used for api compat */
diff --git a/render/mipict.c b/render/mipict.c
index 2571fda..4b85512 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -46,7 +46,7 @@ miDestroyPicture(PicturePtr pPicture)
         RegionDestroy(pPicture->pCompositeClip);
 }
 
-void
+static void
 miDestroyPictureClip(PicturePtr pPicture)
 {
     if (pPicture->clientClip)
@@ -54,7 +54,7 @@ miDestroyPictureClip(PicturePtr pPicture)
     pPicture->clientClip = NULL;
 }
 
-int
+static int
 miChangePictureClip(PicturePtr pPicture, int type, void *value, int n)
 {
     ScreenPtr pScreen = pPicture->pDrawable->pScreen;
@@ -88,13 +88,13 @@ miChangePictureClip(PicturePtr pPicture, int type, void *value, int n)
     return Success;
 }
 
-void
+static void
 miChangePicture(PicturePtr pPicture, Mask mask)
 {
     return;
 }
 
-void
+static void
 miValidatePicture(PicturePtr pPicture, Mask mask)
 {
     DrawablePtr pDrawable = pPicture->pDrawable;
@@ -211,13 +211,13 @@ miValidatePicture(PicturePtr pPicture, Mask mask)
     }
 }
 
-int
+static int
 miChangePictureTransform(PicturePtr pPicture, PictTransform * transform)
 {
     return Success;
 }
 
-int
+static int
 miChangePictureFilter(PicturePtr pPicture,
                       int filter, xFixed * params, int nparams)
 {
@@ -499,7 +499,7 @@ miRenderPixelToColor(PictFormatPtr format, CARD32 pixel, xRenderColor * color)
     }
 }
 
-void
+static void
 miTriStrip(CARD8 op,
            PicturePtr pSrc,
            PicturePtr pDst,
@@ -523,7 +523,7 @@ miTriStrip(CARD8 op,
     free(tris);
 }
 
-void
+static void
 miTriFan(CARD8 op,
          PicturePtr pSrc,
          PicturePtr pDst,
diff --git a/render/mipict.h b/render/mipict.h
index 23ce9e8..3241be4 100644
--- a/render/mipict.h
+++ b/render/mipict.h
@@ -54,26 +54,6 @@ extern _X_EXPORT void
  miDestroyPicture(PicturePtr pPicture);
 
 extern _X_EXPORT void
- miDestroyPictureClip(PicturePtr pPicture);
-
-extern _X_EXPORT int
- miChangePictureClip(PicturePtr pPicture, int type, void *value, int n);
-
-extern _X_EXPORT void
- miChangePicture(PicturePtr pPicture, Mask mask);
-
-extern _X_EXPORT void
- miValidatePicture(PicturePtr pPicture, Mask mask);
-
-extern _X_EXPORT int
- miChangePictureTransform(PicturePtr pPicture, PictTransform * transform);
-
-extern _X_EXPORT int
-
-miChangePictureFilter(PicturePtr pPicture,
-                      int filter, xFixed * params, int nparams);
-
-extern _X_EXPORT void
  miCompositeSourceValidate(PicturePtr pPicture);
 
 extern _X_EXPORT Bool
@@ -122,22 +102,6 @@ miCompositeRects(CARD8 op,
                  xRenderColor * color, int nRect, 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 60517a4..506aec4 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -61,7 +61,7 @@ PictureWindowFormat(WindowPtr pWindow)
                               WindowGetVisual(pWindow));
 }
 
-Bool
+static Bool
 PictureDestroyWindow(WindowPtr pWindow)
 {
     ScreenPtr pScreen = pWindow->drawable.pScreen;
@@ -82,7 +82,7 @@ PictureDestroyWindow(WindowPtr pWindow)
     return ret;
 }
 
-Bool
+static Bool
 PictureCloseScreen(ScreenPtr pScreen)
 {
     PictureScreenPtr ps = GetPictureScreen(pScreen);
@@ -102,7 +102,7 @@ PictureCloseScreen(ScreenPtr pScreen)
     return ret;
 }
 
-void
+static void
 PictureStoreColors(ColormapPtr pColormap, int ndef, xColorItem * pdef)
 {
     ScreenPtr pScreen = pColormap->pScreen;
@@ -163,7 +163,7 @@ addFormat(FormatInitRec formats[256], int nformat, CARD32 format, CARD8 depth)
 
 #define Mask(n) ((1 << (n)) - 1)
 
-PictFormatPtr
+static PictFormatPtr
 PictureCreateDefaultFormats(ScreenPtr pScreen, int *nformatp)
 {
     int nformats, f;
@@ -439,7 +439,7 @@ PictureFindVisual(ScreenPtr pScreen, VisualID visual)
     return 0;
 }
 
-Bool
+static Bool
 PictureInitIndexedFormat(ScreenPtr pScreen, PictFormatPtr format)
 {
     PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
@@ -625,6 +625,12 @@ GetPictureBytes(void *value, XID id, ResourceSizePtr size)
     }
 }
 
+static int
+FreePictFormat(void *pPictFormat, XID pid)
+{
+    return Success;
+}
+
 Bool
 PictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
 {
@@ -724,7 +730,7 @@ PictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
     return TRUE;
 }
 
-void
+static void
 SetPictureToDefaults(PicturePtr pPicture)
 {
     pPicture->refcnt = 1;
@@ -1430,12 +1436,6 @@ FreePicture(void *value, XID pid)
     return Success;
 }
 
-int
-FreePictFormat(void *pPictFormat, XID pid)
-{
-    return Success;
-}
-
 /**
  * ReduceCompositeOp is used to choose simpler ops for cases where alpha
  * channels are always one and so math on the alpha channel per pixel becomes
diff --git a/render/picture.h b/render/picture.h
index 66c85c5..087e54d 100644
--- a/render/picture.h
+++ b/render/picture.h
@@ -169,11 +169,11 @@ typedef enum _PictFormatShort {
 #define PictureCmapPolicyColor	    3
 #define PictureCmapPolicyAll	    4
 
-extern _X_EXPORT int PictureCmapPolicy;
+extern int PictureCmapPolicy;
 
-extern _X_EXPORT int PictureParseCmapPolicy(const char *name);
+extern int PictureParseCmapPolicy(const char *name);
 
-extern _X_EXPORT int RenderErrBase;
+extern int RenderErrBase;
 
 /* Fixed point updates from Carl Worth, USC, Information Sciences Institute */
 
diff --git a/render/picturestr.h b/render/picturestr.h
index 177f87b..33baef9 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -344,16 +344,14 @@ typedef struct _PictureScreen {
 } PictureScreenRec, *PictureScreenPtr;
 
 extern _X_EXPORT DevPrivateKeyRec PictureScreenPrivateKeyRec;
-
 #define PictureScreenPrivateKey (&PictureScreenPrivateKeyRec)
 
 extern _X_EXPORT DevPrivateKeyRec PictureWindowPrivateKeyRec;
-
 #define	PictureWindowPrivateKey (&PictureWindowPrivateKeyRec)
 
-extern _X_EXPORT RESTYPE PictureType;
-extern _X_EXPORT RESTYPE PictFormatType;
-extern _X_EXPORT RESTYPE GlyphSetType;
+extern RESTYPE PictureType;
+extern RESTYPE PictFormatType;
+extern RESTYPE GlyphSetType;
 
 #define GetPictureScreen(s) ((PictureScreenPtr)dixLookupPrivate(&(s)->devPrivates, PictureScreenPrivateKey))
 #define GetPictureScreenIfSet(s) (dixPrivateKeyRegistered(PictureScreenPrivateKey) ? GetPictureScreen(s) : NULL)
@@ -380,27 +378,12 @@ extern _X_EXPORT PictFormatPtr
  PictureWindowFormat(WindowPtr pWindow);
 
 extern _X_EXPORT Bool
- PictureDestroyWindow(WindowPtr pWindow);
-
-extern _X_EXPORT Bool
- PictureCloseScreen(ScreenPtr pScreen);
-
-extern _X_EXPORT void
- PictureStoreColors(ColormapPtr pColormap, int ndef, xColorItem * pdef);
-
-extern _X_EXPORT Bool
- PictureInitIndexedFormat(ScreenPtr pScreen, PictFormatPtr format);
-
-extern _X_EXPORT Bool
  PictureSetSubpixelOrder(ScreenPtr pScreen, int subpixel);
 
 extern _X_EXPORT int
  PictureGetSubpixelOrder(ScreenPtr pScreen);
 
 extern _X_EXPORT PictFormatPtr
-PictureCreateDefaultFormats(ScreenPtr pScreen, int *nformatp);
-
-extern _X_EXPORT PictFormatPtr
 PictureMatchVisual(ScreenPtr pScreen, int depth, VisualPtr pVisual);
 
 extern _X_EXPORT PictFormatPtr
@@ -415,14 +398,12 @@ extern _X_EXPORT int
 extern _X_EXPORT char *PictureGetFilterName(int id);
 
 extern _X_EXPORT int
-
 PictureAddFilter(ScreenPtr pScreen,
                  const char *filter,
                  PictFilterValidateParamsProcPtr ValidateParams,
                  int width, int height);
 
 extern _X_EXPORT Bool
-
 PictureSetFilterAlias(ScreenPtr pScreen, const char *filter, const char *alias);
 
 extern _X_EXPORT Bool
@@ -435,21 +416,16 @@ extern _X_EXPORT PictFilterPtr
 PictureFindFilter(ScreenPtr pScreen, char *name, int len);
 
 extern _X_EXPORT int
-
 SetPicturePictFilter(PicturePtr pPicture, PictFilterPtr pFilter,
                      xFixed * params, int nparams);
 
 extern _X_EXPORT int
-
 SetPictureFilter(PicturePtr pPicture, char *name, int len,
                  xFixed * params, int nparams);
 
 extern _X_EXPORT Bool
  PictureFinishInit(void);
 
-extern _X_EXPORT void
- SetPictureToDefaults(PicturePtr pPicture);
-
 extern _X_EXPORT PicturePtr
 CreatePicture(Picture pid,
               DrawablePtr pDrawable,
@@ -457,7 +433,6 @@ CreatePicture(Picture pid,
               Mask mask, XID *list, ClientPtr client, int *error);
 
 extern _X_EXPORT int
-
 ChangePicture(PicturePtr pPicture,
               Mask vmask, XID *vlist, DevUnion *ulist, ClientPtr client);
 
@@ -467,7 +442,6 @@ SetPictureClipRects(PicturePtr pPicture,
                     int xOrigin, int yOrigin, int nRect, xRectangle *rects);
 
 extern _X_EXPORT int
-
 SetPictureClipRegion(PicturePtr pPicture,
                      int xOrigin, int yOrigin, RegionPtr pRegion);
 
@@ -480,11 +454,7 @@ extern _X_EXPORT void
 extern _X_EXPORT int
  FreePicture(void *pPicture, XID pid);
 
-extern _X_EXPORT int
- FreePictFormat(void *pPictFormat, XID pid);
-
 extern _X_EXPORT void
-
 CompositePicture(CARD8 op,
                  PicturePtr pSrc,
                  PicturePtr pMask,
@@ -496,7 +466,6 @@ CompositePicture(CARD8 op,
                  INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
 
 extern _X_EXPORT void
-
 CompositeGlyphs(CARD8 op,
                 PicturePtr pSrc,
                 PicturePtr pDst,
@@ -505,13 +474,11 @@ CompositeGlyphs(CARD8 op,
                 INT16 ySrc, int nlist, GlyphListPtr lists, GlyphPtr * glyphs);
 
 extern _X_EXPORT void
-
 CompositeRects(CARD8 op,
                PicturePtr pDst,
                xRenderColor * color, int nRect, xRectangle *rects);
 
 extern _X_EXPORT void
-
 CompositeTrapezoids(CARD8 op,
                     PicturePtr pSrc,
                     PicturePtr pDst,
@@ -519,7 +486,6 @@ CompositeTrapezoids(CARD8 op,
                     INT16 xSrc, INT16 ySrc, int ntrap, xTrapezoid * traps);
 
 extern _X_EXPORT void
-
 CompositeTriangles(CARD8 op,
                    PicturePtr pSrc,
                    PicturePtr pDst,
@@ -528,7 +494,6 @@ CompositeTriangles(CARD8 op,
                    INT16 ySrc, int ntriangles, xTriangle * triangles);
 
 extern _X_EXPORT void
-
 CompositeTriStrip(CARD8 op,
                   PicturePtr pSrc,
                   PicturePtr pDst,
@@ -536,7 +501,6 @@ CompositeTriStrip(CARD8 op,
                   INT16 xSrc, INT16 ySrc, int npoints, xPointFixed * points);
 
 extern _X_EXPORT void
-
 CompositeTriFan(CARD8 op,
                 PicturePtr pSrc,
                 PicturePtr pDst,
@@ -547,12 +511,10 @@ Bool
  AnimCurInit(ScreenPtr pScreen);
 
 int
-
 AnimCursorCreate(CursorPtr *cursors, CARD32 *deltas, int ncursor,
                  CursorPtr *ppCursor, ClientPtr client, XID cid);
 
 extern _X_EXPORT void
-
 AddTraps(PicturePtr pPicture,
          INT16 xOff, INT16 yOff, int ntraps, xTrap * traps);
 
@@ -583,8 +545,8 @@ CreateConicalGradientPicture(Picture pid,
                              xFixed * stops, xRenderColor * colors, int *error);
 
 #ifdef PANORAMIX
-extern _X_EXPORT void PanoramiXRenderInit(void);
-extern _X_EXPORT void PanoramiXRenderReset(void);
+extern void PanoramiXRenderInit(void);
+extern void PanoramiXRenderReset(void);
 #endif
 
 /*
@@ -592,12 +554,10 @@ extern _X_EXPORT void PanoramiXRenderReset(void);
  */
 
 extern _X_EXPORT void
-
 PictTransform_from_xRenderTransform(PictTransformPtr pict,
                                     xRenderTransform * render);
 
 extern _X_EXPORT void
-
 xRenderTransform_from_PictTransform(xRenderTransform * render,
                                     PictTransformPtr pict);
 
commit a1c80bb7d5871e1c5ee21fc650834858054103bf
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 30 15:49:38 2014 -0400

    randr: Unexport some implementation details
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/randr/randrstr.h b/randr/randrstr.h
index 03974fd..472721a 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -64,10 +64,10 @@ typedef XID RROutput;
 typedef XID RRCrtc;
 typedef XID RRProvider;
 
-extern _X_EXPORT int RREventBase, RRErrorBase;
+extern int RREventBase, RRErrorBase;
 
-extern _X_EXPORT int (*ProcRandrVector[RRNumberRequests]) (ClientPtr);
-extern _X_EXPORT int (*SProcRandrVector[RRNumberRequests]) (ClientPtr);
+extern int (*ProcRandrVector[RRNumberRequests]) (ClientPtr);
+extern int (*SProcRandrVector[RRNumberRequests]) (ClientPtr);
 
 /*
  * Modeline for a monitor. Name follows directly after this struct
@@ -397,8 +397,8 @@ typedef struct _RRClient {
 /*  RRTimesRec	times[0]; */
 } RRClientRec, *RRClientPtr;
 
-extern _X_EXPORT RESTYPE RRClientType, RREventType;     /* resource types for event masks */
-extern _X_EXPORT DevPrivateKeyRec RRClientPrivateKeyRec;
+extern RESTYPE RRClientType, RREventType;     /* resource types for event masks */
+extern DevPrivateKeyRec RRClientPrivateKeyRec;
 
 #define RRClientPrivateKey (&RRClientPrivateKeyRec)
 extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType, RRProviderType;
commit b51f7f8582ab6c3cc9fa56c8d9721d0f240915e7
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 23 13:37:41 2014 -0400

    dix: Unexport various implementation details
    
    Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/dix/colormap.c b/dix/colormap.c
index a3e5a2c..89a17c4 100644
--- a/dix/colormap.c
+++ b/dix/colormap.c
@@ -64,6 +64,9 @@ SOFTWARE.
 #include "privates.h"
 #include "xace.h"
 
+typedef int (*ColorCompareProcPtr) (EntryPtr /*pent */ ,
+                                    xrgb * /*prgb */ );
+
 static Pixel FindBestPixel(EntryPtr /*pentFirst */ ,
                            int /*size */ ,
                            xrgb * /*prgb */ ,
@@ -748,6 +751,173 @@ UpdateColors(ColormapPtr pmap)
     free(defs);
 }
 
+/* Tries to find a color in pmap that exactly matches the one requested in prgb
+ * if it can't it allocates one.
+ * Starts looking at pentFirst + *pPixel, so if you want a specific pixel,
+ * load *pPixel with that value, otherwise set it to 0
+ */
+static int
+FindColor(ColormapPtr pmap, EntryPtr pentFirst, int size, xrgb * prgb,
+          Pixel * pPixel, int channel, int client, ColorCompareProcPtr comp)
+{
+    EntryPtr pent;
+    Bool foundFree;
+    Pixel pixel, Free = 0;
+    int npix, count, *nump = NULL;
+    Pixel **pixp = NULL, *ppix;
+    xColorItem def;
+
+    foundFree = FALSE;
+
+    if ((pixel = *pPixel) >= size)
+        pixel = 0;
+    /* see if there is a match, and also look for a free entry */
+    for (pent = pentFirst + pixel, count = size; --count >= 0;) {
+        if (pent->refcnt > 0) {
+            if ((*comp) (pent, prgb)) {
+                if (client >= 0)
+                    pent->refcnt++;
+                *pPixel = pixel;
+                switch (channel) {
+                case REDMAP:
+                    *pPixel <<= pmap->pVisual->offsetRed;
+                case PSEUDOMAP:
+                    break;
+                case GREENMAP:
+                    *pPixel <<= pmap->pVisual->offsetGreen;
+                    break;
+                case BLUEMAP:
+                    *pPixel <<= pmap->pVisual->offsetBlue;
+                    break;
+                }
+                goto gotit;
+            }
+        }
+        else if (!foundFree && pent->refcnt == 0) {
+            Free = pixel;
+            foundFree = TRUE;
+            /* If we're initializing the colormap, then we are looking for
+             * the first free cell we can find, not to minimize the number
+             * of entries we use.  So don't look any further. */
+            if (pmap->flags & BeingCreated)
+                break;
+        }
+        pixel++;
+        if (pixel >= size) {
+            pent = pentFirst;
+            pixel = 0;
+        }
+        else
+            pent++;
+    }
+
+    /* If we got here, we didn't find a match.  If we also didn't find
+     * a free entry, we're out of luck.  Otherwise, we'll usurp a free
+     * entry and fill it in */
+    if (!foundFree)
+        return BadAlloc;
+    pent = pentFirst + Free;
+    pent->fShared = FALSE;
+    pent->refcnt = (client >= 0) ? 1 : AllocTemporary;
+
+    switch (channel) {
+    case PSEUDOMAP:
+        pent->co.local.red = prgb->red;
+        pent->co.local.green = prgb->green;
+        pent->co.local.blue = prgb->blue;
+        def.red = prgb->red;
+        def.green = prgb->green;
+        def.blue = prgb->blue;
+        def.flags = (DoRed | DoGreen | DoBlue);
+        if (client >= 0)
+            pmap->freeRed--;
+        def.pixel = Free;
+        break;
+
+    case REDMAP:
+        pent->co.local.red = prgb->red;
+        def.red = prgb->red;
+        def.green = pmap->green[0].co.local.green;
+        def.blue = pmap->blue[0].co.local.blue;
+        def.flags = DoRed;
+        if (client >= 0)
+            pmap->freeRed--;
+        def.pixel = Free << pmap->pVisual->offsetRed;
+        break;
+
+    case GREENMAP:
+        pent->co.local.green = prgb->green;
+        def.red = pmap->red[0].co.local.red;
+        def.green = prgb->green;
+        def.blue = pmap->blue[0].co.local.blue;
+        def.flags = DoGreen;
+        if (client >= 0)
+            pmap->freeGreen--;
+        def.pixel = Free << pmap->pVisual->offsetGreen;
+        break;
+
+    case BLUEMAP:
+        pent->co.local.blue = prgb->blue;
+        def.red = pmap->red[0].co.local.red;
+        def.green = pmap->green[0].co.local.green;
+        def.blue = prgb->blue;
+        def.flags = DoBlue;
+        if (client >= 0)
+            pmap->freeBlue--;
+        def.pixel = Free << pmap->pVisual->offsetBlue;
+        break;
+    }
+    (*pmap->pScreen->StoreColors) (pmap, 1, &def);
+    pixel = Free;
+    *pPixel = def.pixel;
+
+ gotit:
+    if (pmap->flags & BeingCreated || client == -1)
+        return Success;
+    /* Now remember the pixel, for freeing later */
+    switch (channel) {
+    case PSEUDOMAP:
+    case REDMAP:
+        nump = pmap->numPixelsRed;
+        pixp = pmap->clientPixelsRed;
+        break;
+
+    case GREENMAP:
+        nump = pmap->numPixelsGreen;
+        pixp = pmap->clientPixelsGreen;
+        break;
+
+    case BLUEMAP:
+        nump = pmap->numPixelsBlue;
+        pixp = pmap->clientPixelsBlue;
+        break;
+    }
+    npix = nump[client];
+    ppix = reallocarray(pixp[client], npix + 1, sizeof(Pixel));
+    if (!ppix) {
+        pent->refcnt--;
+        if (!pent->fShared)
+            switch (channel) {
+            case PSEUDOMAP:
+            case REDMAP:
+                pmap->freeRed++;
+                break;
+            case GREENMAP:
+                pmap->freeGreen++;
+                break;
+            case BLUEMAP:
+                pmap->freeBlue++;
+                break;
+            }
+        return BadAlloc;
+    }
+    ppix[npix] = pixel;
+    pixp[client] = ppix;
+    nump[client]++;
+
+    return Success;
+}
+
 /* Get a read-only color from a ColorMap (probably slow for large maps)
  * Returns by changing the value in pred, pgreen, pblue and pPix
  */
@@ -1137,173 +1307,6 @@ FindColorInRootCmap(ColormapPtr pmap, EntryPtr pentFirst, int size,
     }
 }
 
-/* Tries to find a color in pmap that exactly matches the one requested in prgb
- * if it can't it allocates one.
- * Starts looking at pentFirst + *pPixel, so if you want a specific pixel,
- * load *pPixel with that value, otherwise set it to 0
- */
-int
-FindColor(ColormapPtr pmap, EntryPtr pentFirst, int size, xrgb * prgb,
-          Pixel * pPixel, int channel, int client, ColorCompareProcPtr comp)
-{
-    EntryPtr pent;
-    Bool foundFree;
-    Pixel pixel, Free = 0;
-    int npix, count, *nump = NULL;
-    Pixel **pixp = NULL, *ppix;
-    xColorItem def;
-
-    foundFree = FALSE;
-
-    if ((pixel = *pPixel) >= size)
-        pixel = 0;
-    /* see if there is a match, and also look for a free entry */
-    for (pent = pentFirst + pixel, count = size; --count >= 0;) {
-        if (pent->refcnt > 0) {
-            if ((*comp) (pent, prgb)) {
-                if (client >= 0)
-                    pent->refcnt++;
-                *pPixel = pixel;
-                switch (channel) {
-                case REDMAP:
-                    *pPixel <<= pmap->pVisual->offsetRed;
-                case PSEUDOMAP:
-                    break;
-                case GREENMAP:
-                    *pPixel <<= pmap->pVisual->offsetGreen;
-                    break;
-                case BLUEMAP:
-                    *pPixel <<= pmap->pVisual->offsetBlue;
-                    break;
-                }
-                goto gotit;
-            }
-        }
-        else if (!foundFree && pent->refcnt == 0) {
-            Free = pixel;
-            foundFree = TRUE;
-            /* If we're initializing the colormap, then we are looking for
-             * the first free cell we can find, not to minimize the number
-             * of entries we use.  So don't look any further. */
-            if (pmap->flags & BeingCreated)
-                break;
-        }
-        pixel++;
-        if (pixel >= size) {
-            pent = pentFirst;
-            pixel = 0;
-        }
-        else
-            pent++;
-    }
-
-    /* If we got here, we didn't find a match.  If we also didn't find
-     * a free entry, we're out of luck.  Otherwise, we'll usurp a free
-     * entry and fill it in */
-    if (!foundFree)
-        return BadAlloc;
-    pent = pentFirst + Free;
-    pent->fShared = FALSE;
-    pent->refcnt = (client >= 0) ? 1 : AllocTemporary;
-
-    switch (channel) {
-    case PSEUDOMAP:
-        pent->co.local.red = prgb->red;
-        pent->co.local.green = prgb->green;
-        pent->co.local.blue = prgb->blue;
-        def.red = prgb->red;
-        def.green = prgb->green;
-        def.blue = prgb->blue;
-        def.flags = (DoRed | DoGreen | DoBlue);
-        if (client >= 0)
-            pmap->freeRed--;
-        def.pixel = Free;
-        break;
-
-    case REDMAP:
-        pent->co.local.red = prgb->red;
-        def.red = prgb->red;
-        def.green = pmap->green[0].co.local.green;
-        def.blue = pmap->blue[0].co.local.blue;
-        def.flags = DoRed;
-        if (client >= 0)
-            pmap->freeRed--;
-        def.pixel = Free << pmap->pVisual->offsetRed;
-        break;
-
-    case GREENMAP:
-        pent->co.local.green = prgb->green;
-        def.red = pmap->red[0].co.local.red;
-        def.green = prgb->green;
-        def.blue = pmap->blue[0].co.local.blue;
-        def.flags = DoGreen;
-        if (client >= 0)
-            pmap->freeGreen--;
-        def.pixel = Free << pmap->pVisual->offsetGreen;
-        break;
-
-    case BLUEMAP:
-        pent->co.local.blue = prgb->blue;
-        def.red = pmap->red[0].co.local.red;
-        def.green = pmap->green[0].co.local.green;
-        def.blue = prgb->blue;
-        def.flags = DoBlue;
-        if (client >= 0)
-            pmap->freeBlue--;
-        def.pixel = Free << pmap->pVisual->offsetBlue;
-        break;
-    }
-    (*pmap->pScreen->StoreColors) (pmap, 1, &def);
-    pixel = Free;
-    *pPixel = def.pixel;
-
- gotit:
-    if (pmap->flags & BeingCreated || client == -1)
-        return Success;
-    /* Now remember the pixel, for freeing later */
-    switch (channel) {
-    case PSEUDOMAP:
-    case REDMAP:
-        nump = pmap->numPixelsRed;
-        pixp = pmap->clientPixelsRed;
-        break;
-
-    case GREENMAP:
-        nump = pmap->numPixelsGreen;
-        pixp = pmap->clientPixelsGreen;
-        break;
-
-    case BLUEMAP:
-        nump = pmap->numPixelsBlue;
-        pixp = pmap->clientPixelsBlue;
-        break;
-    }
-    npix = nump[client];
-    ppix = reallocarray(pixp[client], npix + 1, sizeof(Pixel));
-    if (!ppix) {
-        pent->refcnt--;
-        if (!pent->fShared)
-            switch (channel) {
-            case PSEUDOMAP:
-            case REDMAP:
-                pmap->freeRed++;
-                break;
-            case GREENMAP:
-                pmap->freeGreen++;
-                break;
-            case BLUEMAP:
-                pmap->freeBlue++;
-                break;
-            }
-        return BadAlloc;
-    }
-    ppix[npix] = pixel;
-    pixp[client] = ppix;
-    nump[client]++;
-
-    return Success;
-}
-
 /* Comparison functions -- passed to FindColor to determine if an
  * entry is already the color we're looking for or not */
 static int
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 9208582..dbbac8b 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -108,6 +108,7 @@ int ProcInitialConnection();
 
 #include "windowstr.h"
 #include <X11/fonts/fontstruct.h>
+#include <X11/fonts/fontutil.h>
 #include "dixfontstr.h"
 #include "gcstruct.h"
 #include "selection.h"
diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index be389e8..968cee4 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -156,7 +156,7 @@ SetDefaultFont(const char *defaultfontname)
  * init_fpe() and free_fpe(), there shouldn't be any problem in using
  * freed data.
  */
-void
+static void
 QueueFontWakeup(FontPathElementPtr fpe)
 {
     int i;
@@ -179,7 +179,7 @@ QueueFontWakeup(FontPathElementPtr fpe)
     num_slept_fpes++;
 }
 
-void
+static void
 RemoveFontWakeup(FontPathElementPtr fpe)
 {
     int i, j;
@@ -195,7 +195,7 @@ RemoveFontWakeup(FontPathElementPtr fpe)
     }
 }
 
-void
+static void
 FontWakeup(void *data, int count, void *LastSelectMask)
 {
     int i;
@@ -849,7 +849,7 @@ ListFonts(ClientPtr client, unsigned char *pattern, unsigned length,
     return Success;
 }
 
-int
+static int
 doListFontsWithInfo(ClientPtr client, LFWIclosurePtr c)
 {
     FontPathElementPtr fpe;
@@ -1105,7 +1105,7 @@ static ChangeGCVal clearGC[] = { {.ptr = NullPixmap} };
 
 #define clearGCmask (GCClipMask)
 
-int
+static int
 doPolyText(ClientPtr client, PTclosurePtr c)
 {
     FontPtr pFont = c->pGC->font, oldpFont;
@@ -1389,7 +1389,7 @@ PolyText(ClientPtr client, DrawablePtr pDraw, GC * pGC, unsigned char *pElt,
 #undef TextEltHeader
 #undef FontShiftSize
 
-int
+static int
 doImageText(ClientPtr client, ITclosurePtr c)
 {
     int err = Success, lgerr;   /* err is in X error, not font error, space */
diff --git a/dix/enterleave.c b/dix/enterleave.c
index 7f1f941..f0b1572 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -212,7 +212,7 @@ SetFocusOut(DeviceIntPtr dev)
  * @return The window that is the first ancestor of both 'a' and 'b', or the
  *         NullWindow if they do not have a common ancestor.
  */
-WindowPtr
+static WindowPtr
 CommonAncestor(WindowPtr a, WindowPtr b)
 {
     for (b = b->parent; b; b = b->parent)
diff --git a/dix/enterleave.h b/dix/enterleave.h
index a59d057..4b833d8 100644
--- a/dix/enterleave.h
+++ b/dix/enterleave.h
@@ -41,8 +41,6 @@ extern void EnterLeaveEvent(DeviceIntPtr mouse,
                             int type,
                             int mode, int detail, WindowPtr pWin, Window child);
 
-extern WindowPtr CommonAncestor(WindowPtr a, WindowPtr b);
-
 extern void CoreEnterLeaveEvent(DeviceIntPtr mouse,
                                 int type,
                                 int mode,
diff --git a/dix/main.c b/dix/main.c
index 09f9504..db3b9c0 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -95,6 +95,8 @@ Equipment Corporation.
 #include "cursorstr.h"
 #include "selection.h"
 #include <X11/fonts/font.h>
+#include <X11/fonts/fontstruct.h>
+#include <X11/fonts/fontutil.h>
 #include "opaque.h"
 #include "servermd.h"
 #include "hotplug.h"
diff --git a/hw/xfree86/sdksyms.sh b/hw/xfree86/sdksyms.sh
index 05ac410..e141522 100755
--- a/hw/xfree86/sdksyms.sh
+++ b/hw/xfree86/sdksyms.sh
@@ -295,8 +295,6 @@ cat > sdksyms.c << EOF
 #include "selection.h"
 #include "servermd.h"
 #include "site.h"
-#include "swaprep.h"
-#include "swapreq.h"
 #include "validate.h"
 #include "window.h"
 #include "windowstr.h"
diff --git a/include/Makefile.am b/include/Makefile.am
index 738b582..70b83ff 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -52,8 +52,6 @@ sdk_HEADERS =		\
 	selection.h	\
 	servermd.h	\
 	site.h		\
-	swaprep.h	\
-	swapreq.h	\
 	validate.h	\
 	window.h	\
 	windowstr.h	\
@@ -74,5 +72,7 @@ EXTRA_DIST = 	\
 	dixfontstubs.h eventconvert.h eventstr.h inpututils.h \
 	probes.h \
 	protocol-versions.h \
+	swaprep.h \
+	swapreq.h \
 	systemd-logind.h \
 	xsha1.h
diff --git a/include/colormap.h b/include/colormap.h
index 5f6b97f..f3b18a6 100644
--- a/include/colormap.h
+++ b/include/colormap.h
@@ -108,18 +108,6 @@ extern _X_EXPORT void FakeAllocColor(ColormapPtr /*pmap */ ,
 extern _X_EXPORT void FakeFreeColor(ColormapPtr /*pmap */ ,
                                     Pixel /*pixel */ );
 
-typedef int (*ColorCompareProcPtr) (EntryPtr /*pent */ ,
-                                    xrgb * /*prgb */ );
-
-extern _X_EXPORT int FindColor(ColormapPtr /*pmap */ ,
-                               EntryPtr /*pentFirst */ ,
-                               int /*size */ ,
-                               xrgb * /*prgb */ ,
-                               Pixel * /*pPixel */ ,
-                               int /*channel */ ,
-                               int /*client */ ,
-                               ColorCompareProcPtr /*comp */ );
-
 extern _X_EXPORT int QueryColors(ColormapPtr /*pmap */ ,
                                  int /*count */ ,
                                  Pixel * /*ppixIn */ ,
diff --git a/include/dixfont.h b/include/dixfont.h
index 48c6305..1895509 100644
--- a/include/dixfont.h
+++ b/include/dixfont.h
@@ -36,14 +36,6 @@ typedef struct _DIXFontProp *DIXFontPropPtr;
 
 extern _X_EXPORT Bool SetDefaultFont(const char * /*defaultfontname */ );
 
-extern _X_EXPORT void QueueFontWakeup(FontPathElementPtr /*fpe */ );
-
-extern _X_EXPORT void RemoveFontWakeup(FontPathElementPtr /*fpe */ );
-
-extern _X_EXPORT void FontWakeup(void *data,
-                                 int count,
-                                 void *LastSelectMask);
-
 extern _X_EXPORT int OpenFont(ClientPtr /*client */ ,
                               XID /*fid */ ,
                               Mask /*flags */ ,
@@ -64,14 +56,6 @@ extern _X_EXPORT int ListFonts(ClientPtr /*client */ ,
                                unsigned int /*length */ ,
                                unsigned int /*max_names */ );
 
-extern _X_EXPORT int
- doListFontsWithInfo(ClientPtr /*client */ ,
-                     LFWIclosurePtr /*c */ );
-
-extern _X_EXPORT int doPolyText(ClientPtr /*client */ ,
-                                PTclosurePtr    /*c */
-    );
-
 extern _X_EXPORT int PolyText(ClientPtr /*client */ ,
                               DrawablePtr /*pDraw */ ,
                               GCPtr /*pGC */ ,
@@ -82,9 +66,6 @@ extern _X_EXPORT int PolyText(ClientPtr /*client */ ,
                               int /*reqType */ ,
                               XID /*did */ );
 
-extern _X_EXPORT int doImageText(ClientPtr /*client */ ,
-                                 ITclosurePtr /*c */ );
-
 extern _X_EXPORT int ImageText(ClientPtr /*client */ ,
                                DrawablePtr /*pDraw */ ,
                                GCPtr /*pGC */ ,
@@ -126,22 +107,6 @@ extern _X_EXPORT void dixGetGlyphs(FontPtr /*font */ ,
                                    unsigned long * /*glyphcount */ ,
                                    CharInfoPtr * /*glyphs */ );
 
-extern _X_EXPORT void QueryGlyphExtents(FontPtr /*pFont */ ,
-                                        CharInfoPtr * /*charinfo */ ,
-                                        unsigned long /*count */ ,
-                                        ExtentInfoPtr /*info */ );
-
-extern _X_EXPORT Bool QueryTextExtents(FontPtr /*pFont */ ,
-                                       unsigned long /*count */ ,
-                                       unsigned char * /*chars */ ,
-                                       ExtentInfoPtr /*info */ );
-
-extern _X_EXPORT Bool ParseGlyphCachingMode(char * /*str */ );
-
-extern _X_EXPORT void InitGlyphCaching(void);
-
-extern _X_EXPORT void SetGlyphCachingMode(int /*newmode */ );
-
 extern _X_EXPORT void register_fpe_functions(void);
 
 #endif                          /* DIXFONT_H */
diff --git a/include/dixstruct.h b/include/dixstruct.h
index 6c13895..7575066 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -126,21 +126,18 @@ SetReqFds(ClientPtr client, int req_fds) {
 /*
  * Scheduling interface
  */
-extern _X_EXPORT long SmartScheduleTime;
-extern _X_EXPORT long SmartScheduleInterval;
-extern _X_EXPORT long SmartScheduleSlice;
-extern _X_EXPORT long SmartScheduleMaxSlice;
-extern _X_EXPORT Bool SmartScheduleDisable;
-extern _X_EXPORT void
-SmartScheduleStartTimer(void);
-extern _X_EXPORT void
-SmartScheduleStopTimer(void);
+extern long SmartScheduleTime;
+extern long SmartScheduleInterval;
+extern long SmartScheduleSlice;
+extern long SmartScheduleMaxSlice;
+extern Bool SmartScheduleDisable;
+extern void SmartScheduleStartTimer(void);
+extern void SmartScheduleStopTimer(void);
 
 #define SMART_MAX_PRIORITY  (20)
 #define SMART_MIN_PRIORITY  (-20)
 
-extern _X_EXPORT void
-SmartScheduleInit(void);
+extern void SmartScheduleInit(void);
 
 /* This prototype is used pervasively in Xext, dix */
 #define DISPATCH_PROC(func) int func(ClientPtr /* client */)
@@ -179,13 +176,13 @@ typedef struct _CallbackList {
 
 /* proc vectors */
 
-extern _X_EXPORT int (*InitialVector[3]) (ClientPtr /*client */ );
+extern int (*InitialVector[3]) (ClientPtr /*client */ );
 
 extern _X_EXPORT int (*ProcVector[256]) (ClientPtr /*client */ );
 
 extern _X_EXPORT int (*SwappedProcVector[256]) (ClientPtr /*client */ );
 
-extern _X_EXPORT ReplySwapPtr ReplySwapVector[256];
+extern ReplySwapPtr ReplySwapVector[256];
 
 extern _X_EXPORT int
 ProcBadRequest(ClientPtr /*client */ );
diff --git a/include/swaprep.h b/include/swaprep.h
index 3fa2a09..63c54c7 100644
--- a/include/swaprep.h
+++ b/include/swaprep.h
@@ -26,207 +26,207 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #ifndef SWAPREP_H
 #define SWAPREP_H 1
 
-extern _X_EXPORT void Swap32Write(ClientPtr /* pClient */ ,
-                                  int /* size */ ,
-                                  CARD32 * /* pbuf */ );
+extern void Swap32Write(ClientPtr /* pClient */ ,
+                        int /* size */ ,
+                        CARD32 * /* pbuf */ );
 
-extern _X_EXPORT void CopySwap32Write(ClientPtr /* pClient */ ,
-                                      int /* size */ ,
-                                      CARD32 * /* pbuf */ );
+extern void CopySwap32Write(ClientPtr /* pClient */ ,
+                            int /* size */ ,
+                            CARD32 * /* pbuf */ );
+
+extern void CopySwap16Write(ClientPtr /* pClient */ ,
+                            int /* size */ ,
+                            short * /* pbuf */ );
+
+extern void SGenericReply(ClientPtr /* pClient */ ,
+                          int /* size */ ,
+                          xGenericReply * /* pRep */ );
 
-extern _X_EXPORT void CopySwap16Write(ClientPtr /* pClient */ ,
+extern void SGetWindowAttributesReply(ClientPtr /* pClient */ ,
                                       int /* size */ ,
-                                      short * /* pbuf */ );
+                                      xGetWindowAttributesReply *
+                                      /* pRep */ );
+
+extern void SGetGeometryReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xGetGeometryReply * /* pRep */ );
+
+extern void SQueryTreeReply(ClientPtr /* pClient */ ,
+                            int /* size */ ,
+                            xQueryTreeReply * /* pRep */ );
+
+extern void SInternAtomReply(ClientPtr /* pClient */ ,
+                             int /* size */ ,
+                             xInternAtomReply * /* pRep */ );
+
+extern void SGetAtomNameReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xGetAtomNameReply * /* pRep */ );
 
-extern _X_EXPORT void SGenericReply(ClientPtr /* pClient */ ,
+extern void SGetPropertyReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xGetPropertyReply * /* pRep */ );
+
+extern void SListPropertiesReply(ClientPtr /* pClient */ ,
+                                 int /* size */ ,
+                                 xListPropertiesReply * /* pRep */ );
+
+extern void SGetSelectionOwnerReply(ClientPtr /* pClient */ ,
                                     int /* size */ ,
-                                    xGenericReply * /* pRep */ );
+                                    xGetSelectionOwnerReply *
+                                    /* pRep */ );
 
-extern _X_EXPORT void SGetWindowAttributesReply(ClientPtr /* pClient */ ,
-                                                int /* size */ ,
-                                                xGetWindowAttributesReply *
-                                                /* pRep */ );
+extern void SQueryPointerReply(ClientPtr /* pClient */ ,
+                               int /* size */ ,
+                               xQueryPointerReply * /* pRep */ );
 
-extern _X_EXPORT void SGetGeometryReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xGetGeometryReply * /* pRep */ );
+extern void SwapTimeCoordWrite(ClientPtr /* pClient */ ,
+                               int /* size */ ,
+                               xTimecoord * /* pRep */ );
 
-extern _X_EXPORT void SQueryTreeReply(ClientPtr /* pClient */ ,
-                                      int /* size */ ,
-                                      xQueryTreeReply * /* pRep */ );
+extern void SGetMotionEventsReply(ClientPtr /* pClient */ ,
+                                  int /* size */ ,
+                                  xGetMotionEventsReply *       /* pRep */
+    );
 
-extern _X_EXPORT void SInternAtomReply(ClientPtr /* pClient */ ,
-                                       int /* size */ ,
-                                       xInternAtomReply * /* pRep */ );
+extern void STranslateCoordsReply(ClientPtr /* pClient */ ,
+                                  int /* size */ ,
+                                  xTranslateCoordsReply *       /* pRep */
+    );
 
-extern _X_EXPORT void SGetAtomNameReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xGetAtomNameReply * /* pRep */ );
+extern void SGetInputFocusReply(ClientPtr /* pClient */ ,
+                                int /* size */ ,
+                                xGetInputFocusReply * /* pRep */ );
 
-extern _X_EXPORT void SGetPropertyReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xGetPropertyReply * /* pRep */ );
+extern void SQueryKeymapReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xQueryKeymapReply * /* pRep */ );
 
-extern _X_EXPORT void SListPropertiesReply(ClientPtr /* pClient */ ,
-                                           int /* size */ ,
-                                           xListPropertiesReply * /* pRep */ );
+extern void SQueryFontReply(ClientPtr /* pClient */ ,
+                            int /* size */ ,
+                            xQueryFontReply * /* pRep */ );
 
-extern _X_EXPORT void SGetSelectionOwnerReply(ClientPtr /* pClient */ ,
-                                              int /* size */ ,
-                                              xGetSelectionOwnerReply *
-                                              /* pRep */ );
+extern void SQueryTextExtentsReply(ClientPtr /* pClient */ ,
+                                   int /* size */ ,
+                                   xQueryTextExtentsReply *     /* pRep */
+    );
 
-extern _X_EXPORT void SQueryPointerReply(ClientPtr /* pClient */ ,
-                                         int /* size */ ,
-                                         xQueryPointerReply * /* pRep */ );
+extern void SListFontsReply(ClientPtr /* pClient */ ,
+                            int /* size */ ,
+                            xListFontsReply * /* pRep */ );
 
-extern _X_EXPORT void SwapTimeCoordWrite(ClientPtr /* pClient */ ,
-                                         int /* size */ ,
-                                         xTimecoord * /* pRep */ );
+extern void SListFontsWithInfoReply(ClientPtr /* pClient */ ,
+                                    int /* size */ ,
+                                    xListFontsWithInfoReply *
+                                    /* pRep */ );
 
-extern _X_EXPORT void SGetMotionEventsReply(ClientPtr /* pClient */ ,
-                                            int /* size */ ,
-                                            xGetMotionEventsReply * /* pRep */
-                                            );
+extern void SGetFontPathReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xGetFontPathReply * /* pRep */ );
 
-extern _X_EXPORT void STranslateCoordsReply(ClientPtr /* pClient */ ,
-                                            int /* size */ ,
-                                            xTranslateCoordsReply * /* pRep */
-                                            );
+extern void SGetImageReply(ClientPtr /* pClient */ ,
+                           int /* size */ ,
+                           xGetImageReply * /* pRep */ );
 
-extern _X_EXPORT void SGetInputFocusReply(ClientPtr /* pClient */ ,
-                                          int /* size */ ,
-                                          xGetInputFocusReply * /* pRep */ );
+extern void SListInstalledColormapsReply(ClientPtr /* pClient */ ,
+                                         int /* size */ ,
+                                         xListInstalledColormapsReply
+                                         * /* pRep */ );
 
-extern _X_EXPORT void SQueryKeymapReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xQueryKeymapReply * /* pRep */ );
+extern void SAllocColorReply(ClientPtr /* pClient */ ,
+                             int /* size */ ,
+                             xAllocColorReply * /* pRep */ );
 
-extern _X_EXPORT void SQueryFontReply(ClientPtr /* pClient */ ,
-                                      int /* size */ ,
-                                      xQueryFontReply * /* pRep */ );
+extern void SAllocNamedColorReply(ClientPtr /* pClient */ ,
+                                  int /* size */ ,
+                                  xAllocNamedColorReply *       /* pRep */
+    );
 
-extern _X_EXPORT void SQueryTextExtentsReply(ClientPtr /* pClient */ ,
-                                             int /* size */ ,
-                                             xQueryTextExtentsReply * /* pRep */
-                                             );
+extern void SAllocColorCellsReply(ClientPtr /* pClient */ ,
+                                  int /* size */ ,
+                                  xAllocColorCellsReply *       /* pRep */
+    );
 
-extern _X_EXPORT void SListFontsReply(ClientPtr /* pClient */ ,
-                                      int /* size */ ,
-                                      xListFontsReply * /* pRep */ );
+extern void SAllocColorPlanesReply(ClientPtr /* pClient */ ,
+                                   int /* size */ ,
+                                   xAllocColorPlanesReply *     /* pRep */
+    );
 
-extern _X_EXPORT void SListFontsWithInfoReply(ClientPtr /* pClient */ ,
-                                              int /* size */ ,
-                                              xListFontsWithInfoReply *
-                                              /* pRep */ );
+extern void SQColorsExtend(ClientPtr /* pClient */ ,
+                           int /* size */ ,
+                           xrgb * /* prgb */ );
 
-extern _X_EXPORT void SGetFontPathReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xGetFontPathReply * /* pRep */ );
+extern void SQueryColorsReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xQueryColorsReply * /* pRep */ );
 
-extern _X_EXPORT void SGetImageReply(ClientPtr /* pClient */ ,
-                                     int /* size */ ,
-                                     xGetImageReply * /* pRep */ );
+extern void SLookupColorReply(ClientPtr /* pClient */ ,
+                              int /* size */ ,
+                              xLookupColorReply * /* pRep */ );
 
-extern _X_EXPORT void SListInstalledColormapsReply(ClientPtr /* pClient */ ,
-                                                   int /* size */ ,
-                                                   xListInstalledColormapsReply
-                                                   * /* pRep */ );
+extern void SQueryBestSizeReply(ClientPtr /* pClient */ ,
+                                int /* size */ ,
+                                xQueryBestSizeReply * /* pRep */ );
 
-extern _X_EXPORT void SAllocColorReply(ClientPtr /* pClient */ ,
-                                       int /* size */ ,
-                                       xAllocColorReply * /* pRep */ );
+extern void SListExtensionsReply(ClientPtr /* pClient */ ,
+                                 int /* size */ ,
+                                 xListExtensionsReply * /* pRep */ );
 
-extern _X_EXPORT void SAllocNamedColorReply(ClientPtr /* pClient */ ,
-                                            int /* size */ ,
-                                            xAllocNamedColorReply * /* pRep */
-                                            );
+extern void SGetKeyboardMappingReply(ClientPtr /* pClient */ ,
+                                     int /* size */ ,
+                                     xGetKeyboardMappingReply *
+                                     /* pRep */ );
 
-extern _X_EXPORT void SAllocColorCellsReply(ClientPtr /* pClient */ ,
-                                            int /* size */ ,
-                                            xAllocColorCellsReply * /* pRep */
-                                            );
+extern void SGetPointerMappingReply(ClientPtr /* pClient */ ,
+                                    int /* size */ ,
+                                    xGetPointerMappingReply *
+                                    /* pRep */ );
 
-extern _X_EXPORT void SAllocColorPlanesReply(ClientPtr /* pClient */ ,
-                                             int /* size */ ,
-                                             xAllocColorPlanesReply * /* pRep */
-                                             );
+extern void SGetModifierMappingReply(ClientPtr /* pClient */ ,
+                                     int /* size */ ,
+                                     xGetModifierMappingReply *
+                                     /* pRep */ );
 
-extern _X_EXPORT void SQColorsExtend(ClientPtr /* pClient */ ,
+extern void SGetKeyboardControlReply(ClientPtr /* pClient */ ,
                                      int /* size */ ,
-                                     xrgb * /* prgb */ );
-
-extern _X_EXPORT void SQueryColorsReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xQueryColorsReply * /* pRep */ );
-
-extern _X_EXPORT void SLookupColorReply(ClientPtr /* pClient */ ,
-                                        int /* size */ ,
-                                        xLookupColorReply * /* pRep */ );
-
-extern _X_EXPORT void SQueryBestSizeReply(ClientPtr /* pClient */ ,
-                                          int /* size */ ,
-                                          xQueryBestSizeReply * /* pRep */ );
-
-extern _X_EXPORT void SListExtensionsReply(ClientPtr /* pClient */ ,
-                                           int /* size */ ,
-                                           xListExtensionsReply * /* pRep */ );
-
-extern _X_EXPORT void SGetKeyboardMappingReply(ClientPtr /* pClient */ ,
-                                               int /* size */ ,
-                                               xGetKeyboardMappingReply *
-                                               /* pRep */ );
-
-extern _X_EXPORT void SGetPointerMappingReply(ClientPtr /* pClient */ ,
-                                              int /* size */ ,
-                                              xGetPointerMappingReply *
-                                              /* pRep */ );
-
-extern _X_EXPORT void SGetModifierMappingReply(ClientPtr /* pClient */ ,
-                                               int /* size */ ,
-                                               xGetModifierMappingReply *
-                                               /* pRep */ );
-
-extern _X_EXPORT void SGetKeyboardControlReply(ClientPtr /* pClient */ ,
-                                               int /* size */ ,
-                                               xGetKeyboardControlReply *
-                                               /* pRep */ );
-
-extern _X_EXPORT void SGetPointerControlReply(ClientPtr /* pClient */ ,
-                                              int /* size */ ,
-                                              xGetPointerControlReply *
-                                              /* pRep */ );
-
-extern _X_EXPORT void SGetScreenSaverReply(ClientPtr /* pClient */ ,
-                                           int /* size */ ,
-                                           xGetScreenSaverReply * /* pRep */ );
-
-extern _X_EXPORT void SLHostsExtend(ClientPtr /* pClient */ ,
+                                     xGetKeyboardControlReply *
+                                     /* pRep */ );
+
+extern void SGetPointerControlReply(ClientPtr /* pClient */ ,
                                     int /* size */ ,
-                                    char * /* buf */ );
+                                    xGetPointerControlReply *
+                                    /* pRep */ );
 
-extern _X_EXPORT void SListHostsReply(ClientPtr /* pClient */ ,
-                                      int /* size */ ,
-                                      xListHostsReply * /* pRep */ );
+extern void SGetScreenSaverReply(ClientPtr /* pClient */ ,
+                                 int /* size */ ,
+                                 xGetScreenSaverReply * /* pRep */ );
+
+extern void SLHostsExtend(ClientPtr /* pClient */ ,
+                          int /* size */ ,
+                          char * /* buf */ );
+
+extern void SListHostsReply(ClientPtr /* pClient */ ,
+                            int /* size */ ,
+                            xListHostsReply * /* pRep */ );
 
-extern _X_EXPORT void SErrorEvent(xError * /* from */ ,
-                                  xError * /* to */ );
+extern void SErrorEvent(xError * /* from */ ,
+                        xError * /* to */ );
 
-extern _X_EXPORT void SwapConnSetupInfo(char * /* pInfo */ ,
-                                        char * /* pInfoTBase */ );
+extern void SwapConnSetupInfo(char * /* pInfo */ ,
+                              char * /* pInfoTBase */ );
 
-extern _X_EXPORT void WriteSConnectionInfo(ClientPtr /* pClient */ ,
-                                           unsigned long /* size */ ,
-                                           char * /* pInfo */ );
+extern void WriteSConnectionInfo(ClientPtr /* pClient */ ,
+                                 unsigned long /* size */ ,
+                                 char * /* pInfo */ );
 
-extern _X_EXPORT void SwapConnSetupPrefix(xConnSetupPrefix * /* pcspFrom */ ,
-                                          xConnSetupPrefix * /* pcspTo */ );
+extern void SwapConnSetupPrefix(xConnSetupPrefix * /* pcspFrom */ ,
+                                xConnSetupPrefix * /* pcspTo */ );
 
-extern _X_EXPORT void WriteSConnSetupPrefix(ClientPtr /* pClient */ ,
-                                            xConnSetupPrefix * /* pcsp */ );
+extern void WriteSConnSetupPrefix(ClientPtr /* pClient */ ,
+                                  xConnSetupPrefix * /* pcsp */ );
 
 #undef SWAPREP_PROC
-#define SWAPREP_PROC(func) extern _X_EXPORT void func(xEvent * /* from */, xEvent * /* to */)
+#define SWAPREP_PROC(func) extern void func(xEvent * /* from */, xEvent * /* to */)
 
 SWAPREP_PROC(SCirculateEvent);
 SWAPREP_PROC(SClientMessageEvent);
diff --git a/include/swapreq.h b/include/swapreq.h
index 07eff80..d696aa0 100644
--- a/include/swapreq.h
+++ b/include/swapreq.h
@@ -26,13 +26,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #ifndef SWAPREQ_H
 #define SWAPREQ_H 1
 
-extern _X_EXPORT void SwapColorItem(xColorItem * /* pItem */ );
+extern void SwapColorItem(xColorItem * /* pItem */ );
 
-extern _X_EXPORT void SwapConnClientPrefix(xConnClientPrefix * /* pCCP */ );
+extern void SwapConnClientPrefix(xConnClientPrefix * /* pCCP */ );
 
 #undef SWAPREQ_PROC
 
-#define SWAPREQ_PROC(func) extern _X_EXPORT int func(ClientPtr /* client */)
+#define SWAPREQ_PROC(func) extern int func(ClientPtr /* client */)
 
 SWAPREQ_PROC(SProcAllocColor);
 SWAPREQ_PROC(SProcAllocColorCells);
diff --git a/mi/miglblt.c b/mi/miglblt.c
index e9d3a1a..46268ae 100644
--- a/mi/miglblt.c
+++ b/mi/miglblt.c
@@ -53,6 +53,7 @@ SOFTWARE.
 #include	<X11/Xproto.h>
 #include	"misc.h"
 #include	<X11/fonts/fontstruct.h>
+#include	<X11/fonts/fontutil.h>
 #include	"dixfontstr.h"
 #include	"gcstruct.h"
 #include	"windowstr.h"
diff --git a/miext/damage/damage.c b/miext/damage/damage.c
index ce20169..746e798 100644
--- a/miext/damage/damage.c
+++ b/miext/damage/damage.c
@@ -32,6 +32,7 @@
 #include    <X11/fonts/font.h>
 #include    "dixfontstr.h"
 #include    <X11/fonts/fontstruct.h>
+#include    <X11/fonts/fontutil.h>
 #include    "mi.h"
 #include    "regionstr.h"
 #include    "globals.h"
diff --git a/os/utils.c b/os/utils.c
index 7fd395b..d09ca79 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -81,6 +81,7 @@ __stdcall unsigned long GetTickCount(void);
 #include <X11/Xtrans/Xtrans.h>
 #include "input.h"
 #include "dixfont.h"
+#include <X11/fonts/fontutil.h>
 #include "osdep.h"
 #include "extension.h"
 #ifdef X_POSIX_C_SOURCE
commit c4a0d6c9139d2c0107b80420cc2342614bbe95ef
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Oct 22 10:47:03 2014 -0400

    dri3: static cleanup
    
    Also remove unused window private key.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/dri3/dri3.c b/dri3/dri3.c
index 385862a..d042b8b 100644
--- a/dri3/dri3.c
+++ b/dri3/dri3.c
@@ -26,9 +26,8 @@
 
 #include "dri3_priv.h"
 
-int dri3_request;
+static int dri3_request;
 DevPrivateKeyRec dri3_screen_private_key;
-DevPrivateKeyRec dri3_window_private_key;
 
 static int dri3_screen_generation;
 
diff --git a/dri3/dri3_priv.h b/dri3/dri3_priv.h
index e2fed83..e61ef22 100644
--- a/dri3/dri3_priv.h
+++ b/dri3/dri3_priv.h
@@ -32,8 +32,6 @@
 #include <randrstr.h>
 #include "dri3.h"
 
-extern int dri3_request;
-
 extern DevPrivateKeyRec dri3_screen_private_key;
 
 typedef struct dri3_screen_priv {
commit a69e9027e167a83281b96e13f3a77100876b72ae
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Oct 22 10:44:36 2014 -0400

    dri3: Remove unbuilt dri3_event.c
    
    The config notifies live in present, not dri3.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/dri3/dri3_event.c b/dri3/dri3_event.c
deleted file mode 100644
index cb509a2..0000000
--- a/dri3/dri3_event.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright © 2013 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "dri3_priv.h"
-
-RESTYPE dri3_event_type;
-
-static int
-dri3_free_event(void *data, XID id)
-{
-    dri3_event_ptr dri3_event = (dri3_event_ptr) data;
-    dri3_window_priv_ptr window_priv = dri3_window_priv(dri3_event->window);
-    dri3_event_ptr *previous, current;
-
-    for (previous = &window_priv->events; (current = *previous); previous = &current->next) {
-        if (current == dri3_event) {
-            *previous = dri3_event->next;
-            break;
-        }
-    }
-    free((void *) dri3_event);
-    return 1;
-
-}
-
-void
-dri3_free_events(WindowPtr window)
-{
-    dri3_window_priv_ptr window_priv = dri3_window_priv(window);
-    dri3_event_ptr event;
-
-    if (!window_priv)
-        return;
-
-    while ((event = window_priv->events))
-        FreeResource(event->id, RT_NONE);
-}
-
-static void
-dri3_event_swap(xGenericEvent *from, xGenericEvent *to)
-{
-    *to = *from;
-    swaps(&to->sequenceNumber);
-    swapl(&to->length);
-    swaps(&to->evtype);
-    switch (from->evtype) {
-    case DRI3_ConfigureNotify: {
-        xDRI3ConfigureNotify *c = (xDRI3ConfigureNotify *) to;
-
-        swapl(&c->eid);
-        swapl(&c->window);
-        swaps(&c->x);
-        swaps(&c->y);
-        swaps(&c->width);
-        swaps(&c->height);
-        swaps(&c->off_x);
-        swaps(&c->off_y);
-        swaps(&c->pixmap_width);
-        swaps(&c->pixmap_height);
-        swapl(&c->pixmap_flags);
-        break;
-    }
-    }
-}
-
-void
-dri3_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling)
-{
-    dri3_window_priv_ptr window_priv = dri3_window_priv(window);
-
-    if (window_priv) {
-        xDRI3ConfigureNotify cn = {
-            .type = GenericEvent,
-            .extension = dri3_request,
-            .length = (sizeof(xDRI3ConfigureNotify) - 32) >> 2,
-            .evtype = DRI3_ConfigureNotify,
-            .eid = 0,
-            .window = window->drawable.id,
-            .x = x,
-            .y = y,
-            .width = w,
-            .height = h,
-            .off_x = 0,
-            .off_y = 0,
-            .pixmap_width = w,
-            .pixmap_height = h,
-            .pixmap_flags = 0
-        };
-        dri3_event_ptr event;
-        dri3_screen_priv_ptr screen_priv = dri3_screen_priv(window->drawable.pScreen);
-
-        if (screen_priv->info && screen_priv->info->driver_config)
-            screen_priv->info->driver_config(window, &cn);
-
-        for (event = window_priv->events; event; event = event->next) {
-            if (event->mask & (1 << DRI3ConfigureNotify)) {
-                cn.eid = event->id;
-                WriteEventsToClient(event->client, 1, (xEvent *) &cn);
-            }
-        }
-    }
-}
-
-int
-dri3_select_input(ClientPtr client, XID eid, WindowPtr window, CARD32 mask)
-{
-    dri3_window_priv_ptr window_priv = dri3_window_priv(window);
-    dri3_event_ptr event;
-
-    if (!window_priv)
-        return BadAlloc;
-
-    event = calloc (1, sizeof (dri3_event_rec));
-    if (!event)
-        return BadAlloc;
-
-    event->client = client;
-    event->window = window;
-    event->id = eid;
-    event->mask = mask;
-
-    event->next = window_priv->events;
-    window_priv->events = event;
-
-    if (!AddResource(event->id, dri3_event_type, (void *) event))
-        return BadAlloc;
-
-    return Success;
-}
-
-Bool
-dri3_event_init(void)
-{
-    dri3_event_type = CreateNewResourceType(dri3_free_event, "DRI3Event");
-    if (!dri3_event_type)
-        return FALSE;
-
-    GERegisterExtension(dri3_request, dri3_event_swap);
-    return TRUE;
-}
commit 91f0d71c18254746e1d519f0d19d11f756a9588c
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Oct 22 10:38:11 2014 -0400

    parser: static cleanup
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/parser/InputClass.c b/hw/xfree86/parser/InputClass.c
index c2fbd22..29bd9fa 100644
--- a/hw/xfree86/parser/InputClass.c
+++ b/hw/xfree86/parser/InputClass.c
@@ -58,6 +58,82 @@ xf86ConfigSymTabRec InputClassTab[] = {
     {-1, ""},
 };
 
+static void
+xf86freeInputClassList(XF86ConfInputClassPtr ptr)
+{
+    XF86ConfInputClassPtr prev;
+
+    while (ptr) {
+        xf86MatchGroup *group, *next;
+        char **list;
+
+        TestFree(ptr->identifier);
+        TestFree(ptr->driver);
+
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_product, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_vendor, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_device, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_os, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_pnpid, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_usbid, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_tag, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_layout, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+
+        TestFree(ptr->comment);
+        xf86optionListFree(ptr->option_lst);
+
+        prev = ptr;
+        ptr = ptr->list.next;
+        free(prev);
+    }
+}
+
 #define CLEANUP xf86freeInputClassList
 
 #define TOKEN_SEP "|"
@@ -354,79 +430,3 @@ xf86printInputClassSection(FILE * cf, XF86ConfInputClassPtr ptr)
         ptr = ptr->list.next;
     }
 }
-
-void
-xf86freeInputClassList(XF86ConfInputClassPtr ptr)
-{
-    XF86ConfInputClassPtr prev;
-
-    while (ptr) {
-        xf86MatchGroup *group, *next;
-        char **list;
-
-        TestFree(ptr->identifier);
-        TestFree(ptr->driver);
-
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_product, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_vendor, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_device, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_os, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_pnpid, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_usbid, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_tag, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_layout, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-
-        TestFree(ptr->comment);
-        xf86optionListFree(ptr->option_lst);
-
-        prev = ptr;
-        ptr = ptr->list.next;
-        free(prev);
-    }
-}
diff --git a/hw/xfree86/parser/OutputClass.c b/hw/xfree86/parser/OutputClass.c
index 7e9a8ac..3f2082e 100644
--- a/hw/xfree86/parser/OutputClass.c
+++ b/hw/xfree86/parser/OutputClass.c
@@ -41,6 +41,32 @@ xf86ConfigSymTabRec OutputClassTab[] = {
     {-1, ""},
 };
 
+static void
+xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
+{
+    XF86ConfOutputClassPtr prev;
+
+    while (ptr) {
+        xf86MatchGroup *group, *next;
+        char **list;
+
+        TestFree(ptr->identifier);
+        TestFree(ptr->comment);
+        TestFree(ptr->driver);
+
+        xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
+            xorg_list_del(&group->entry);
+            for (list = group->values; *list; list++)
+                free(*list);
+            free(group);
+        }
+
+        prev = ptr;
+        ptr = ptr->list.next;
+        free(prev);
+    }
+}
+
 #define CLEANUP xf86freeOutputClassList
 
 #define TOKEN_SEP "|"
@@ -139,29 +165,3 @@ xf86printOutputClassSection(FILE * cf, XF86ConfOutputClassPtr ptr)
         ptr = ptr->list.next;
     }
 }
-
-void
-xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
-{
-    XF86ConfOutputClassPtr prev;
-
-    while (ptr) {
-        xf86MatchGroup *group, *next;
-        char **list;
-
-        TestFree(ptr->identifier);
-        TestFree(ptr->comment);
-        TestFree(ptr->driver);
-
-        xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
-            xorg_list_del(&group->entry);
-            for (list = group->values; *list; list++)
-                free(*list);
-            free(group);
-        }
-
-        prev = ptr;
-        ptr = ptr->list.next;
-        free(prev);
-    }
-}
diff --git a/hw/xfree86/parser/Screen.c b/hw/xfree86/parser/Screen.c
index b5b454f..4731970 100644
--- a/hw/xfree86/parser/Screen.c
+++ b/hw/xfree86/parser/Screen.c
@@ -76,6 +76,33 @@ static xf86ConfigSymTabRec DisplayTab[] = {
     {-1, ""},
 };
 
+static void
+xf86freeModeList(XF86ModePtr ptr)
+{
+    XF86ModePtr prev;
+
+    while (ptr) {
+        TestFree(ptr->mode_name);
+        prev = ptr;
+        ptr = ptr->list.next;
+        free(prev);
+    }
+}
+
+static void
+xf86freeDisplayList(XF86ConfDisplayPtr ptr)
+{
+    XF86ConfDisplayPtr prev;
+
+    while (ptr) {
+        xf86freeModeList(ptr->disp_mode_lst);
+        xf86optionListFree(ptr->disp_option_lst);
+        prev = ptr;
+        ptr = ptr->list.next;
+        free(prev);
+    }
+}
+
 #define CLEANUP xf86freeDisplayList
 
 static XF86ConfDisplayPtr
@@ -433,28 +460,7 @@ xf86printScreenSection(FILE * cf, XF86ConfScreenPtr ptr)
 
 }
 
-void
-xf86freeScreenList(XF86ConfScreenPtr ptr)
-{
-    XF86ConfScreenPtr prev;
-    int i;
-    while (ptr) {
-        TestFree(ptr->scrn_identifier);
-        TestFree(ptr->scrn_monitor_str);
-        TestFree(ptr->scrn_device_str);
-        for (i = 0; i < ptr->num_gpu_devices; i++)
-            TestFree(ptr->scrn_gpu_device_str[i]);
-        TestFree(ptr->scrn_comment);
-        xf86optionListFree(ptr->scrn_option_lst);
-        xf86freeAdaptorLinkList(ptr->scrn_adaptor_lst);
-        xf86freeDisplayList(ptr->scrn_display_lst);
-        prev = ptr;
-        ptr = ptr->list.next;
-        free(prev);
-    }
-}
-
-void
+static void
 xf86freeAdaptorLinkList(XF86ConfAdaptorLinkPtr ptr)
 {
     XF86ConfAdaptorLinkPtr prev;
@@ -468,26 +474,20 @@ xf86freeAdaptorLinkList(XF86ConfAdaptorLinkPtr ptr)
 }
 
 void
-xf86freeDisplayList(XF86ConfDisplayPtr ptr)
-{
-    XF86ConfDisplayPtr prev;
-
-    while (ptr) {
-        xf86freeModeList(ptr->disp_mode_lst);
-        xf86optionListFree(ptr->disp_option_lst);
-        prev = ptr;
-        ptr = ptr->list.next;
-        free(prev);
-    }
-}
-
-void
-xf86freeModeList(XF86ModePtr ptr)
+xf86freeScreenList(XF86ConfScreenPtr ptr)
 {
-    XF86ModePtr prev;
-
+    XF86ConfScreenPtr prev;
+    int i;
     while (ptr) {
-        TestFree(ptr->mode_name);
+        TestFree(ptr->scrn_identifier);
+        TestFree(ptr->scrn_monitor_str);
+        TestFree(ptr->scrn_device_str);
+        for (i = 0; i < ptr->num_gpu_devices; i++)
+            TestFree(ptr->scrn_gpu_device_str[i]);
+        TestFree(ptr->scrn_comment);
+        xf86optionListFree(ptr->scrn_option_lst);
+        xf86freeAdaptorLinkList(ptr->scrn_adaptor_lst);
+        xf86freeDisplayList(ptr->scrn_display_lst);
         prev = ptr;
         ptr = ptr->list.next;
         free(prev);
diff --git a/hw/xfree86/parser/Vendor.c b/hw/xfree86/parser/Vendor.c
index 4f6e510..f137a4e 100644
--- a/hw/xfree86/parser/Vendor.c
+++ b/hw/xfree86/parser/Vendor.c
@@ -68,6 +68,22 @@ static xf86ConfigSymTabRec VendorSubTab[] = {
     {-1, ""},
 };
 
+static void
+xf86freeVendorSubList(XF86ConfVendSubPtr ptr)
+{
+    XF86ConfVendSubPtr prev;
+
+    while (ptr) {
+        TestFree(ptr->vs_identifier);
+        TestFree(ptr->vs_name);
+        TestFree(ptr->vs_comment);
+        xf86optionListFree(ptr->vs_option_lst);
+        prev = ptr;
+        ptr = ptr->list.next;
+        free(prev);
+    }
+}
+
 #define CLEANUP xf86freeVendorSubList
 
 static XF86ConfVendSubPtr
@@ -215,19 +231,3 @@ xf86freeVendorList(XF86ConfVendorPtr p)
     xf86optionListFree(p->vnd_option_lst);
     free(p);
 }
-
-void
-xf86freeVendorSubList(XF86ConfVendSubPtr ptr)
-{
-    XF86ConfVendSubPtr prev;
-
-    while (ptr) {
-        TestFree(ptr->vs_identifier);
-        TestFree(ptr->vs_name);
-        TestFree(ptr->vs_comment);
-        xf86optionListFree(ptr->vs_option_lst);
-        prev = ptr;
-        ptr = ptr->list.next;
-        free(prev);
-    }
-}
diff --git a/hw/xfree86/parser/configProcs.h b/hw/xfree86/parser/configProcs.h
index 774e2a2..e6c231e 100644
--- a/hw/xfree86/parser/configProcs.h
+++ b/hw/xfree86/parser/configProcs.h
@@ -55,12 +55,10 @@ int xf86validateInput(XF86ConfigPtr p);
 /* InputClass.c */
 XF86ConfInputClassPtr xf86parseInputClassSection(void);
 void xf86printInputClassSection(FILE * f, XF86ConfInputClassPtr ptr);
-void xf86freeInputClassList(XF86ConfInputClassPtr ptr);
 
 /* OutputClass.c */
 XF86ConfOutputClassPtr xf86parseOutputClassSection(void);
 void xf86printOutputClassSection(FILE * f, XF86ConfOutputClassPtr ptr);
-void xf86freeOutputClassList(XF86ConfOutputClassPtr ptr);
 
 /* Layout.c */
 XF86ConfLayoutPtr xf86parseLayoutSection(void);
@@ -92,16 +90,12 @@ XF86ConfInputPtr xf86parsePointerSection(void);
 XF86ConfScreenPtr xf86parseScreenSection(void);
 void xf86printScreenSection(FILE * cf, XF86ConfScreenPtr ptr);
 extern _X_EXPORT void xf86freeScreenList(XF86ConfScreenPtr ptr);
-void xf86freeAdaptorLinkList(XF86ConfAdaptorLinkPtr ptr);
-void xf86freeDisplayList(XF86ConfDisplayPtr ptr);
-void xf86freeModeList(XF86ModePtr ptr);
 int xf86validateScreen(XF86ConfigPtr p);
 
 /* Vendor.c */
 XF86ConfVendorPtr xf86parseVendorSection(void);
 void xf86freeVendorList(XF86ConfVendorPtr p);
 void xf86printVendorSection(FILE * cf, XF86ConfVendorPtr ptr);
-void xf86freeVendorSubList(XF86ConfVendSubPtr ptr);
 
 /* Video.c */
 XF86ConfVideoAdaptorPtr xf86parseVideoAdaptorSection(void);
commit c732bb2799ad7ff6b0cdd9c65487466e6a9b76e7
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Oct 22 10:31:29 2014 -0400

    present: static cleanup
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/present/present_event.c b/present/present_event.c
index d3a59ea..c586c9a 100644
--- a/present/present_event.c
+++ b/present/present_event.c
@@ -26,7 +26,7 @@
 
 #include "present_priv.h"
 
-RESTYPE present_event_type;
+static RESTYPE present_event_type;
 
 static int
 present_free_event(void *data, XID id)
diff --git a/present/present_priv.h b/present/present_priv.h
index f5c1652..996292e 100644
--- a/present/present_priv.h
+++ b/present/present_priv.h
@@ -147,8 +147,6 @@ present_window_priv(WindowPtr window)
 present_window_priv_ptr
 present_get_window_priv(WindowPtr window, Bool create);
 
-extern RESTYPE present_event_type;
-
 /*
  * present.c
  */
diff --git a/present/present_request.c b/present/present_request.c
index 7c53e72..35320b6 100644
--- a/present/present_request.c
+++ b/present/present_request.c
@@ -234,7 +234,7 @@ proc_present_query_capabilities (ClientPtr client)
     return Success;
 }
 
-int (*proc_present_vector[PresentNumberRequests]) (ClientPtr) = {
+static int (*proc_present_vector[PresentNumberRequests]) (ClientPtr) = {
     proc_present_query_version,            /* 0 */
     proc_present_pixmap,                   /* 1 */
     proc_present_notify_msc,               /* 2 */
@@ -319,7 +319,7 @@ sproc_present_query_capabilities (ClientPtr client)
     return (*proc_present_vector[stuff->presentReqType]) (client);
 }
 
-int (*sproc_present_vector[PresentNumberRequests]) (ClientPtr) = {
+static int (*sproc_present_vector[PresentNumberRequests]) (ClientPtr) = {
     sproc_present_query_version,           /* 0 */
     sproc_present_pixmap,                  /* 1 */
     sproc_present_notify_msc,              /* 2 */
commit 0db457b2b5b6e314e912efc62f158f8f0b8d48af
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Jul 8 15:56:55 2015 -0400

    dmx: Fix the build
    
    Broken since:
    
        commit 4fd81823fafcd103e8d890f4c0f7c2f90e822336
        Author: Dave Airlie <airlied at gmail.com>
        Date:   Tue Jun 30 14:54:42 2015 +1000
    
            prime: add rotation support for offloaded outputs (v2)
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/configure.ac b/configure.ac
index 328563e..98d0821 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2268,7 +2268,7 @@ if test "x$DMX" = xyes; then
 	fi
 	DMX_INCLUDES="$XEXT_INC $RENDER_INC $RECORD_INC"
 	XDMX_CFLAGS="$DMXMODULES_CFLAGS"
-	XDMX_LIBS="$FB_LIB $MI_LIB $XEXT_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB  $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
+	XDMX_LIBS="$FB_LIB $MI_LIB $XEXT_LIB $RANDR_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB  $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
 	XDMX_SYS_LIBS="$DMXMODULES_LIBS"
 	AC_SUBST([XDMX_CFLAGS])
 	AC_SUBST([XDMX_LIBS])


More information about the xorg-commit mailing list