xserver: Branch 'master' - 25 commits

Keith Packard keithp at kemper.freedesktop.org
Mon Jul 6 14:57:30 PDT 2015


 glamor/glamor.c                                  |  123 +++++++++++-
 glamor/glamor_composite_glyphs.c                 |   65 +++---
 glamor/glamor_core.c                             |   13 -
 glamor/glamor_fbo.c                              |   51 +----
 glamor/glamor_gradient.c                         |   21 --
 glamor/glamor_largepixmap.c                      |   26 +-
 glamor/glamor_pixmap.c                           |   91 ---------
 glamor/glamor_priv.h                             |  228 +++++++----------------
 glamor/glamor_program.c                          |   14 -
 glamor/glamor_render.c                           |   82 --------
 glamor/glamor_transfer.c                         |    2 
 glamor/glamor_utils.h                            |    7 
 glamor/glamor_vbo.c                              |    1 
 hw/xfree86/drivers/modesetting/driver.c          |    4 
 hw/xfree86/drivers/modesetting/drmmode_display.c |    3 
 hw/xfree86/drivers/modesetting/present.c         |    2 
 16 files changed, 291 insertions(+), 442 deletions(-)

New commits:
commit e3624aa5fde658c44724a7ea21f5df9e3c586923
Author: Dave Airlie <airlied at gmail.com>
Date:   Wed Jul 1 20:41:15 2015 +1000

    xserver: fix build with glamor disabled.
    
    This fixes modesetting when glamor is disabled.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 8603338..7ee7590 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -1000,6 +1000,7 @@ msSharePixmapBacking(PixmapPtr ppix, ScreenPtr screen, void **handle)
 static Bool
 msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
 {
+#ifdef GLAMOR
     ScreenPtr screen = ppix->drawable.pScreen;
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     modesettingPtr ms = modesettingPTR(scrn);
@@ -1020,6 +1021,9 @@ msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
         return ret;
 
     return TRUE;
+#else
+    return FALSE;
+#endif
 }
 
 static Bool
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 8dbac07..dc7d9f6 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -146,6 +146,7 @@ drmmode_create_bo(drmmode_ptr drmmode, drmmode_bo *bo,
 Bool
 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;
@@ -165,9 +166,9 @@ drmmode_bo_for_pixmap(drmmode_ptr drmmode, drmmode_bo *bo, PixmapPtr pixmap)
                    "Failed to get fd for flip to new front.\n");
         return FALSE;
     }
-
     bo->dumb = dumb_get_bo_from_fd(drmmode->fd, fd, pitch, size);
     close(fd);
+#endif
 
     return bo->dumb != NULL;
 }
diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c
index 0905398..bb2976b 100644
--- a/hw/xfree86/drivers/modesetting/present.c
+++ b/hw/xfree86/drivers/modesetting/present.c
@@ -641,8 +641,8 @@ static present_screen_info_rec ms_present_screen_info = {
     .flush = ms_present_flush,
 
     .capabilities = PresentCapabilityNone,
-    .check_flip = ms_present_check_flip,
 #ifdef GLAMOR
+    .check_flip = ms_present_check_flip,
     .flip = ms_present_flip,
     .unflip = ms_present_unflip,
 #endif
commit 3703c88ac18063a35fd8c0fc52fee52d8c669638
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Jul 1 16:23:45 2015 -0700

    glamor: Use GL_ARB_debug_output to log GL errors.
    
    This should help people debugging when glamor does something stupid on
    their driver.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 702efd1..50d85ff 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -384,6 +384,45 @@ glamor_check_instruction_count(int gl_version)
     return TRUE;
 }
 
+static void GLAPIENTRY
+glamor_debug_output_callback(GLenum source,
+                             GLenum type,
+                             GLuint id,
+                             GLenum severity,
+                             GLsizei length,
+                             const GLchar *message,
+                             const void *userParam)
+{
+    ScreenPtr screen = (void *)userParam;
+    LogMessageVerb(X_ERROR, 0, "glamor%d: GL error: %*s\n",
+               screen->myNum, length, message);
+}
+
+/**
+ * Configures GL_ARB_debug_output to give us immediate callbacks when
+ * GL errors occur, so that we can log them.
+ */
+static void
+glamor_setup_debug_output(ScreenPtr screen)
+{
+    if (!epoxy_has_gl_extension("GL_ARB_debug_output"))
+        return;
+
+    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+    glDebugMessageControl(GL_DEBUG_SOURCE_API,
+                          GL_DEBUG_TYPE_ERROR,
+                          GL_DONT_CARE,
+                          0, NULL, GL_TRUE);
+    glDebugMessageCallback(glamor_debug_output_callback,
+                           screen);
+
+    /* If KHR_debug is present, all debug output is disabled by
+     * default on non-debug contexts.
+     */
+    if (epoxy_has_gl_extension("GL_KHR_debug"))
+        glEnable(GL_DEBUG_OUTPUT);
+}
+
 /** Set up glamor for an already-configured GL context. */
 Bool
 glamor_init(ScreenPtr screen, unsigned int flags)
@@ -531,6 +570,8 @@ glamor_init(ScreenPtr screen, unsigned int flags)
         epoxy_gl_version() >= 30 ||
         epoxy_has_gl_extension("GL_NV_pack_subimage");
 
+    glamor_setup_debug_output(screen);
+
     glamor_priv->use_quads = (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
     /* Driver-specific hack: Avoid using GL_QUADS on VC4, where
      * they'll be emulated more expensively than we can with our
commit f4dfd282d311e5f23631d33e0251bad1854b1ab9
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Jul 1 14:46:55 2015 -0700

    glamor: Add an assert to catch the previous bug.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Acked-by: Michel Dänzer <michel.daenzer at amd.com>

diff --git a/glamor/glamor_transfer.c b/glamor/glamor_transfer.c
index aa5e861..155d7e0 100644
--- a/glamor/glamor_transfer.c
+++ b/glamor/glamor_transfer.c
@@ -186,6 +186,8 @@ glamor_download_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
         BoxPtr                  boxes = in_boxes;
         int                     nbox = in_nbox;
 
+        /* This should not be called on GLAMOR_FBO_NO_FBO-allocated pixmaps. */
+        assert(fbo->fb);
         glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb);
 
         while (nbox--) {
commit c268d2fc33318f9ea0019053fa5de18f193e704e
Author: Keith Packard <keithp at keithp.com>
Date:   Thu Jul 2 17:06:27 2015 -0600

    glamor: Fix bad rendering of glyphs after an a1 glyph upload. (v3)
    
    Fixes regressions since Eric's "don't make an FBO for the glyph atlas"
    change.  The a1 upload was a fallback, as expected.  However, fallback
    reads use glReadPixels() because there's no glGetTexSubImage2D() to
    match glTexSubImage2D().  We were just binding the 0 FBO value, so the
    glReadPixels() would throw a GL error instead of getting any data.
    After the fallback was done we'd write back the undefined data to the
    atlas, blowing away the entire rest of the atlas because we didn't
    specify any bounds on our prepare.
    
    To fix the fallbacks to actually work, we'd need a prepare path that
    allocates some memory memory do a full glGetTexImage() into, then
    memcpy out of that.  Instead, just dodge the general fallback by
    implementing the specific upload we need to do here, which should also
    be *much* faster at uploading a1 glyphs since it's not
    readpixels/texsubimaging back and forth.
    
    v3: Use CopyPlane to a temp pixmap for the upload
    v4: Rewrite anholt's commit message to be from keithp's perspective
        (changes by anholt)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Eric Anholt <eric at anholt.net>

diff --git a/glamor/glamor_composite_glyphs.c b/glamor/glamor_composite_glyphs.c
index e92f1d9..cd88524 100644
--- a/glamor/glamor_composite_glyphs.c
+++ b/glamor/glamor_composite_glyphs.c
@@ -64,45 +64,58 @@ glamor_copy_glyph(PixmapPtr     glyph_pixmap,
         .x2 = glyph_draw->width,
         .y2 = glyph_draw->height,
     };
+    PixmapPtr upload_pixmap = glyph_pixmap;
 
-    if (glyph_pixmap->drawable.bitsPerPixel == atlas_draw->bitsPerPixel) {
-        glamor_upload_boxes((PixmapPtr) atlas_draw,
-                            &box, 1,
-                            0, 0,
-                            x, y,
-                            glyph_pixmap->devPrivate.ptr,
-                            glyph_pixmap->devKind);
-    } else {
-        GCPtr scratch_gc = GetScratchGC(atlas_draw->depth, atlas_draw->pScreen);
-        ChangeGCVal changes[2];
-        if (!scratch_gc)
-            return;
+    if (glyph_pixmap->drawable.bitsPerPixel != atlas_draw->bitsPerPixel) {
 
-        /* If we're dealing with 1-bit glyphs, we upload them to
-         * the cache as normal 8-bit alpha, since that's what GL
-         * can handle.
+        /* If we're dealing with 1-bit glyphs, we copy them to a
+         * temporary 8-bit pixmap and upload them from there, since
+         * that's what GL can handle.
          */
-        assert(glyph_draw->depth == 1);
-        assert(atlas_draw->depth == 8);
+        ScreenPtr       screen = atlas_draw->pScreen;
+        GCPtr           scratch_gc;
+        ChangeGCVal     changes[2];
+
+        upload_pixmap = glamor_create_pixmap(screen,
+                                             glyph_draw->width,
+                                             glyph_draw->height,
+                                             atlas_draw->depth,
+                                             GLAMOR_CREATE_PIXMAP_CPU);
+        if (!upload_pixmap)
+            return;
 
+        scratch_gc = GetScratchGC(upload_pixmap->drawable.depth, screen);
+        if (!scratch_gc) {
+            glamor_destroy_pixmap(upload_pixmap);
+            return;
+        }
         changes[0].val = 0xff;
         changes[1].val = 0x00;
         if (ChangeGC(NullClient, scratch_gc,
-                     GCForeground|GCBackground, changes) != Success)
-            goto bail_gc;
-        ValidateGC(atlas_draw, scratch_gc);
+                     GCForeground|GCBackground, changes) != Success) {
+            glamor_destroy_pixmap(upload_pixmap);
+            FreeScratchGC(scratch_gc);
+            return;
+        }
+        ValidateGC(&upload_pixmap->drawable, scratch_gc);
 
         (*scratch_gc->ops->CopyPlane)(glyph_draw,
-                                      atlas_draw,
+                                      &upload_pixmap->drawable,
                                       scratch_gc,
                                       0, 0,
                                       glyph_draw->width,
                                       glyph_draw->height,
-                                      x, y, 0x1);
-
-    bail_gc:
-        FreeScratchGC(scratch_gc);
+                                      0, 0, 0x1);
     }
+    glamor_upload_boxes((PixmapPtr) atlas_draw,
+                        &box, 1,
+                        0, 0,
+                        x, y,
+                        upload_pixmap->devPrivate.ptr,
+                        upload_pixmap->devKind);
+
+    if (upload_pixmap != glyph_pixmap)
+        glamor_destroy_pixmap(upload_pixmap);
 }
 
 static Bool
commit 5c440817f7c128c9a9d78ef9672f22641dbeeaa1
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 15:01:53 2015 -0700

    glamor: Use ARRAY_SIZE in a couple more places for consistency.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c
index 5619216..416c54a 100644
--- a/glamor/glamor_program.c
+++ b/glamor/glamor_program.c
@@ -145,8 +145,6 @@ static glamor_location_var location_vars[] = {
     },
 };
 
-#define NUM_LOCATION_VARS       (sizeof location_vars / sizeof location_vars[0])
-
 static char *
 add_var(char *cur, const char *add)
 {
@@ -170,7 +168,7 @@ vs_location_vars(glamor_program_location locations)
     int l;
     char *vars = strdup("");
 
-    for (l = 0; vars && l < NUM_LOCATION_VARS; l++)
+    for (l = 0; vars && l < ARRAY_SIZE(location_vars); l++)
         if (locations & location_vars[l].location)
             vars = add_var(vars, location_vars[l].vs_vars);
     return vars;
@@ -182,7 +180,7 @@ fs_location_vars(glamor_program_location locations)
     int l;
     char *vars = strdup("");
 
-    for (l = 0; vars && l < NUM_LOCATION_VARS; l++)
+    for (l = 0; vars && l < ARRAY_SIZE(location_vars); l++)
         if (locations & location_vars[l].location)
             vars = add_var(vars, location_vars[l].fs_vars);
     return vars;
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 78de8d7..488d1a7 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -707,10 +707,7 @@ combine_pict_format(PictFormatShort * des, const PictFormatShort src,
         return TRUE;
     }
 
-    for (i = 0;
-         i <
-         sizeof(pict_format_combine_tab) /
-         sizeof(pict_format_combine_tab[0]); i++) {
+    for (i = 0; i < ARRAY_SIZE(pict_format_combine_tab); i++) {
         if ((src_type == pict_format_combine_tab[i][0]
              && mask_type == pict_format_combine_tab[i][1])
             || (src_type == pict_format_combine_tab[i][1]
commit 7b6edb52435f474c43130f6ac4c6b2d2b28814f5
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 14:59:55 2015 -0700

    glamor: Mark a bunch of single-file data static.
    
    This gives the compiler a chance to optimize when the data is never
    changed -- for example, with pict_format_combine_tab, the compiler
    ends up inlining the 24 bytes of data into just 10 more bytes of code.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c
index 4f3526c..79f5981b 100644
--- a/glamor/glamor_core.c
+++ b/glamor/glamor_core.c
@@ -283,7 +283,7 @@ glamor_init_finish_access_shaders(ScreenPtr screen)
     glUniform1i(glamor_priv->finish_access_swap_rb[1], 0);
 }
 
-GCOps glamor_gc_ops = {
+static GCOps glamor_gc_ops = {
     .FillSpans = glamor_fill_spans,
     .SetSpans = glamor_set_spans,
     .PutImage = glamor_put_image,
diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c
index 1dc5f19..5619216 100644
--- a/glamor/glamor_program.c
+++ b/glamor/glamor_program.c
@@ -499,7 +499,7 @@ use_source_solid(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *prog)
     return TRUE;
 }
 
-const glamor_facet glamor_source_solid = {
+static const glamor_facet glamor_source_solid = {
     .name = "render_solid",
     .fs_exec = "       vec4 source = fg;\n",
     .locations = glamor_program_location_fg,
@@ -517,7 +517,7 @@ use_source_picture(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *pro
                               prog->fill_size_inv_uniform);
 }
 
-const glamor_facet glamor_source_picture = {
+static const glamor_facet glamor_source_picture = {
     .name = "render_picture",
     .vs_exec =  "       fill_pos = (fill_offset + primitive.xy + pos) * fill_size_inv;\n",
     .fs_exec =  "       vec4 source = texture2D(sampler, fill_pos);\n",
@@ -533,14 +533,14 @@ use_source_1x1_picture(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program
     return glamor_set_texture_pixmap((PixmapPtr) src->pDrawable);
 }
 
-const glamor_facet glamor_source_1x1_picture = {
+static const glamor_facet glamor_source_1x1_picture = {
     .name = "render_picture",
     .fs_exec =  "       vec4 source = texture2D(sampler, vec2(0.5));\n",
     .locations = glamor_program_location_fillsamp,
     .use_render = use_source_1x1_picture,
 };
 
-const glamor_facet *glamor_facet_source[glamor_program_source_count] = {
+static const glamor_facet *glamor_facet_source[glamor_program_source_count] = {
     [glamor_program_source_solid] = &glamor_source_solid,
     [glamor_program_source_picture] = &glamor_source_picture,
     [glamor_program_source_1x1_picture] = &glamor_source_1x1_picture,
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 509ebb8..78de8d7 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -660,7 +660,7 @@ glamor_flush_composite_rects(ScreenPtr screen)
     glamor_glDrawArrays_GL_QUADS(glamor_priv, glamor_priv->render_nr_quads);
 }
 
-int pict_format_combine_tab[][3] = {
+static const int pict_format_combine_tab[][3] = {
     {PICT_TYPE_ARGB, PICT_TYPE_A, PICT_TYPE_ARGB},
     {PICT_TYPE_ABGR, PICT_TYPE_A, PICT_TYPE_ABGR},
 };
commit 3fe6731b17ae953d49db4c1bf95e0022244513e1
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 14:50:43 2015 -0700

    glamor: Make a bunch of single-file glamor functions static.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor_largepixmap.c b/glamor/glamor_largepixmap.c
index cbfd033..9a6c95e 100644
--- a/glamor/glamor_largepixmap.c
+++ b/glamor/glamor_largepixmap.c
@@ -2,6 +2,10 @@
 
 #include "glamor_priv.h"
 
+static void
+glamor_get_transform_extent_from_box(struct pixman_box32 *box,
+                                     struct pixman_transform *transform);
+
 static inline glamor_pixmap_private *
 __glamor_large(glamor_pixmap_private *pixmap_priv) {
     assert(glamor_pixmap_priv_is_large(pixmap_priv));
@@ -681,7 +685,7 @@ glamor_compute_clipped_regions(PixmapPtr pixmap,
 /* XXX overflow still exist. maybe we need to change to use region32.
  * by default. Or just use region32 for repeat cases?
  **/
-glamor_pixmap_clipped_regions *
+static glamor_pixmap_clipped_regions *
 glamor_compute_transform_clipped_regions(PixmapPtr pixmap,
                                          struct pixman_transform *transform,
                                          RegionPtr region, int *n_region,
@@ -876,7 +880,7 @@ glamor_merge_clipped_regions(PixmapPtr pixmap,
  * boundary and can avoid some overhead.
  *
  **/
-Bool
+static Bool
 glamor_get_transform_block_size(struct pixman_transform *transform,
                                 int block_w, int block_h,
                                 int *transformed_block_w,
@@ -925,7 +929,7 @@ glamor_get_transform_block_size(struct pixman_transform *transform,
 	p.v[0] = x;  \
 	p.v[1] = y;  \
 	p.v[2] = 1.0; } while (0)
-void
+static void
 glamor_get_transform_extent_from_box(struct pixman_box32 *box,
                                      struct pixman_transform *transform)
 {
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 8f63088..66e5012 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -660,12 +660,6 @@ void glamor_composite(CARD8 op,
 void glamor_composite_rects(CARD8 op,
                             PicturePtr pDst,
                             xRenderColor *color, int nRect, xRectangle *rects);
-PicturePtr glamor_convert_gradient_picture(ScreenPtr screen,
-                                           PicturePtr source,
-                                           int x_source,
-                                           int y_source, int width, int height);
-
-void *glamor_setup_composite_vbo(ScreenPtr screen, int n_verts);
 
 /* glamor_trapezoid.c */
 void glamor_trapezoids(CARD8 op,
@@ -741,14 +735,6 @@ glamor_compute_clipped_regions_ext(PixmapPtr pixmap,
                                    int inner_block_w, int inner_block_h,
                                    int reverse, int upsidedown);
 
-glamor_pixmap_clipped_regions *
-glamor_compute_transform_clipped_regions(PixmapPtr pixmap,
-                                         struct pixman_transform *transform,
-                                         RegionPtr region,
-                                         int *n_region, int dx, int dy,
-                                         int repeat_type, int reverse,
-                                         int upsidedown);
-
 Bool glamor_composite_largepixmap_region(CARD8 op,
                                          PicturePtr source,
                                          PicturePtr mask,
@@ -764,14 +750,6 @@ Bool glamor_composite_largepixmap_region(CARD8 op,
                                          INT16 x_dest, INT16 y_dest,
                                          CARD16 width, CARD16 height);
 
-Bool glamor_get_transform_block_size(struct pixman_transform *transform,
-                                     int block_w, int block_h,
-                                     int *transformed_block_w,
-                                     int *transformed_block_h);
-
-void glamor_get_transform_extent_from_box(struct pixman_box32 *temp_box,
-                                          struct pixman_transform *transform);
-
 /**
  * Upload a picture to gl texture. Similar to the
  * glamor_upload_pixmap_to_texture. Used in rendering.
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 4a82534..509ebb8 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -604,7 +604,7 @@ glamor_composite_with_copy(CARD8 op,
     return ret;
 }
 
-void *
+static void *
 glamor_setup_composite_vbo(ScreenPtr screen, int n_verts)
 {
     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
@@ -1238,7 +1238,7 @@ glamor_composite_with_shader(CARD8 op,
     return ret;
 }
 
-PicturePtr
+static PicturePtr
 glamor_convert_gradient_picture(ScreenPtr screen,
                                 PicturePtr source,
                                 int x_source,
commit a8e84e8c3b2047775fe2da9371329290eee23655
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 14:45:43 2015 -0700

    glamor: Drop dead glamor_es2_pixmap_read_prepare().
    
    It's been unused since I killed glamor_download_pixmap_to_cpu().
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index 0e51550..9a14527 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -1059,73 +1059,3 @@ glamor_upload_pixmap_to_texture(PixmapPtr pixmap)
 
     return ret;
 }
-
-/*
- * as gles2 only support a very small set of color format and
- * type when do glReadPixel,
- * Before we use glReadPixels to get back a textured pixmap,
- * Use shader to convert it to a supported format and thus
- * get a new temporary pixmap returned.
- * */
-
-glamor_pixmap_fbo *
-glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h,
-                               GLenum format, GLenum type, int no_alpha,
-                               int revert, int swap_rb)
-{
-    glamor_pixmap_private *source_priv;
-    glamor_screen_private *glamor_priv;
-    ScreenPtr screen;
-    glamor_pixmap_fbo *temp_fbo;
-    float temp_xscale, temp_yscale, source_xscale, source_yscale;
-    static float vertices[8];
-    static float texcoords[8];
-
-    screen = source->drawable.pScreen;
-
-    glamor_priv = glamor_get_screen_private(screen);
-    source_priv = glamor_get_pixmap_private(source);
-    temp_fbo = glamor_create_fbo(glamor_priv, w, h, format, 0);
-    if (temp_fbo == NULL)
-        return NULL;
-
-    glamor_make_current(glamor_priv);
-    temp_xscale = 1.0 / w;
-    temp_yscale = 1.0 / h;
-
-    glamor_set_normalize_vcoords((struct glamor_pixmap_private *) NULL,
-                                 temp_xscale, temp_yscale, 0, 0, w, h,
-                                 vertices);
-
-    glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE,
-                          2 * sizeof(float), vertices);
-    glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-
-    pixmap_priv_get_scale(source_priv, &source_xscale, &source_yscale);
-    glamor_set_normalize_tcoords(source_priv, source_xscale,
-                                 source_yscale,
-                                 x, y,
-                                 x + w, y + h,
-                                 texcoords);
-
-    glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT, GL_FALSE,
-                          2 * sizeof(float), texcoords);
-    glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
-    glActiveTexture(GL_TEXTURE0);
-    glBindTexture(GL_TEXTURE_2D, source_priv->fbo->tex);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
-    glamor_set_destination_pixmap_fbo(glamor_priv, temp_fbo, 0, 0, w, h);
-    glamor_set_alu(screen, GXcopy);
-    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);
-    return temp_fbo;
-}
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index a8732c0..8f63088 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -626,12 +626,6 @@ void glamor_set_destination_pixmap_fbo(glamor_screen_private *glamor_priv, glamo
  * */
 void glamor_set_destination_pixmap_priv_nc(glamor_screen_private *glamor_priv, PixmapPtr pixmap, glamor_pixmap_private *pixmap_priv);
 
-glamor_pixmap_fbo *glamor_es2_pixmap_read_prepare(PixmapPtr source, int x,
-                                                  int y, int w, int h,
-                                                  GLenum format, GLenum type,
-                                                  int no_alpha, int revert,
-                                                  int swap_rb);
-
 Bool glamor_set_alu(ScreenPtr screen, unsigned char alu);
 Bool glamor_set_planemask(int depth, unsigned long planemask);
 RegionPtr glamor_bitmap_to_region(PixmapPtr pixmap);
commit cad56dc62dbf2ba097cc0fa61217897ba40d8d66
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 14:41:27 2015 -0700

    glamor: Restore the hook to glamor_composite_rectangles().
    
    It was apparently accidentally dropped in keithp's removal of _nf
    functions in 90d326fcc687e6d6d4b308f6272ededcf8145a17.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 525249c..702efd1 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -616,7 +616,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
     ps->AddTraps = glamor_add_traps;
 
     glamor_priv->saved_procs.composite_rects = ps->CompositeRects;
-    ps->CompositeRects = miCompositeRects;
+    ps->CompositeRects = glamor_composite_rectangles;
 
     glamor_priv->saved_procs.glyphs = ps->Glyphs;
     ps->Glyphs = glamor_composite_glyphs;
commit 7adb38a0d18de2e8b0762d9dd82b851883ad75fe
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 14:25:16 2015 -0700

    glamor: Fix up some weird formatting in _glamor_create_fbo_array().
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 9da4f45..84f3b22 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -424,8 +424,8 @@ glamor_create_fbo_array(glamor_screen_private *glamor_priv,
 
  cleanup:
     for (i = 0; i < block_wcnt * block_hcnt; i++)
-        if ((fbo_array)[i])
-            glamor_destroy_fbo(glamor_priv, (fbo_array)[i]);
+        if (fbo_array[i])
+            glamor_destroy_fbo(glamor_priv, fbo_array[i]);
     free(box_array);
     free(fbo_array);
     return NULL;
commit 835067a4095e5e48703aa6561fea3ee95923e832
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jun 30 14:14:50 2015 -0700

    glamor: Drop a redundant check.
    
    Above, we've already checked for ->fbo && ->fbo->fb and returned.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index f2bf223..0e51550 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -897,8 +897,7 @@ glamor_pixmap_upload_prepare(PixmapPtr pixmap, GLenum format, int no_alpha,
     }
 
     if ((flag == GLAMOR_CREATE_FBO_NO_FBO
-         && pixmap_priv->fbo && pixmap_priv->fbo->tex)
-        || (flag == 0 && pixmap_priv->fbo && pixmap_priv->fbo->fb))
+         && pixmap_priv->fbo && pixmap_priv->fbo->tex))
         return 0;
 
     if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
commit 47b868492c7ff0909ff71e3ee1aaa79daaade513
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Feb 5 12:34:41 2015 -0800

    glamor: Simplify some temp pixmap extents calculations.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

diff --git a/glamor/glamor_largepixmap.c b/glamor/glamor_largepixmap.c
index da3fb61..cbfd033 100644
--- a/glamor/glamor_largepixmap.c
+++ b/glamor/glamor_largepixmap.c
@@ -755,7 +755,6 @@ glamor_merge_clipped_regions(PixmapPtr pixmap,
                              glamor_pixmap_clipped_regions *clipped_regions,
                              int *n_regions, int *need_clean_fbo)
 {
-    BoxPtr temp_extent;
     BoxRec temp_box, copy_box;
     RegionPtr temp_region;
     glamor_pixmap_private *temp_priv;
@@ -779,9 +778,8 @@ glamor_merge_clipped_regions(PixmapPtr pixmap,
     RegionValidate(temp_region, &overlap);
     DEBUGF("temp region: \n");
     DEBUGRegionPrint(temp_region);
-    temp_extent = RegionExtents(temp_region);
 
-    temp_box = *temp_extent;
+    temp_box = *RegionExtents(temp_region);
 
     DEBUGF("need copy region: \n");
     DEBUGF("%d %d %d %d \n", temp_box.x1, temp_box.y1, temp_box.x2,
@@ -801,16 +799,16 @@ glamor_merge_clipped_regions(PixmapPtr pixmap,
     assert(glamor_pixmap_priv_is_small(temp_priv));
 
     priv->box = temp_box;
-    if (temp_extent->x1 >= 0 && temp_extent->x2 <= pixmap_width
-        && temp_extent->y1 >= 0 && temp_extent->y2 <= pixmap_height) {
+    if (temp_box.x1 >= 0 && temp_box.x2 <= pixmap_width
+        && temp_box.y1 >= 0 && temp_box.y2 <= pixmap_height) {
         int dx, dy;
 
         copy_box.x1 = 0;
         copy_box.y1 = 0;
-        copy_box.x2 = temp_extent->x2 - temp_extent->x1;
-        copy_box.y2 = temp_extent->y2 - temp_extent->y1;
-        dx = temp_extent->x1;
-        dy = temp_extent->y1;
+        copy_box.x2 = temp_box.x2 - temp_box.x1;
+        copy_box.y2 = temp_box.y2 - temp_box.y1;
+        dx = temp_box.x1;
+        dy = temp_box.y1;
         glamor_copy(&pixmap->drawable,
                     &temp_pixmap->drawable,
                     NULL, &copy_box, 1, dx, dy, 0, 0, 0, NULL);
commit bfb6a290afabe492d93ec8024fac6b28f672d7d0
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Feb 5 11:46:32 2015 -0800

    glamor: Drop a dead flag to glamor_create_fbo_array().
    
    v2: Don't forget to set priv->block_w/block_h like the wrapper used
        to.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org> (v1)

diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index e4aa4c6..9da4f45 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -358,20 +358,24 @@ glamor_create_fbo(glamor_screen_private *glamor_priv,
     return fbo;
 }
 
-static glamor_pixmap_fbo *
-_glamor_create_fbo_array(glamor_screen_private *glamor_priv,
+/**
+ * Create storage for the w * h region, using FBOs of the GL's maximum
+ * supported size.
+ */
+glamor_pixmap_fbo *
+glamor_create_fbo_array(glamor_screen_private *glamor_priv,
                          int w, int h, GLenum format, int flag,
                          int block_w, int block_h,
-                         glamor_pixmap_private *pixmap_priv, int has_fbo)
+                         glamor_pixmap_private *priv)
 {
     int block_wcnt;
     int block_hcnt;
     glamor_pixmap_fbo **fbo_array;
     BoxPtr box_array;
     int i, j;
-    glamor_pixmap_private *priv;
 
-    priv = pixmap_priv;
+    priv->block_w = block_w;
+    priv->block_h = block_h;
 
     block_wcnt = (w + block_w - 1) / block_w;
     block_hcnt = (h + block_h - 1) / block_h;
@@ -402,13 +406,10 @@ _glamor_create_fbo_array(glamor_screen_private *glamor_priv,
             fbo_w =
                 box_array[i * block_wcnt + j].x2 - box_array[i * block_wcnt +
                                                              j].x1;
-            if (!has_fbo)
-                fbo_array[i * block_wcnt + j] = glamor_create_fbo(glamor_priv,
-                                                                  fbo_w, fbo_h,
-                                                                  format,
-                                                                  GLAMOR_CREATE_PIXMAP_FIXUP);
-            else
-                fbo_array[i * block_wcnt + j] = priv->fbo;
+            fbo_array[i * block_wcnt + j] = glamor_create_fbo(glamor_priv,
+                                                              fbo_w, fbo_h,
+                                                              format,
+                                                              GLAMOR_CREATE_PIXMAP_FIXUP);
             if (fbo_array[i * block_wcnt + j] == NULL)
                 goto cleanup;
         }
@@ -430,20 +431,6 @@ _glamor_create_fbo_array(glamor_screen_private *glamor_priv,
     return NULL;
 }
 
-/* Create a fbo array to cover the w*h region, by using block_w*block_h
- * block.*/
-glamor_pixmap_fbo *
-glamor_create_fbo_array(glamor_screen_private *glamor_priv,
-                        int w, int h, GLenum format, int flag,
-                        int block_w, int block_h,
-                        glamor_pixmap_private *pixmap_priv)
-{
-    pixmap_priv->block_w = block_w;
-    pixmap_priv->block_h = block_h;
-    return _glamor_create_fbo_array(glamor_priv, w, h, format, flag,
-                                    block_w, block_h, pixmap_priv, 0);
-}
-
 glamor_pixmap_fbo *
 glamor_pixmap_detach_fbo(glamor_pixmap_private *pixmap_priv)
 {
commit fe3fedf280596c2c2e69dddd30bb9ff17dbe611e
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Feb 5 11:33:54 2015 -0800

    glamor: Drop dead GLAMOR_FBO_DOWNLOADED flag.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index a9b94f6..a8732c0 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -314,11 +314,6 @@ enum glamor_fbo_state {
      * point at anything.
      */
     GLAMOR_FBO_NORMAL,
-    /**
-     * The FBO is present and can be accessed as a linear memory
-     * mapping through devPrivate.ptr.
-     */
-    GLAMOR_FBO_DOWNLOADED,
 };
 
 typedef struct glamor_pixmap_fbo {
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 66c3492..cef62c5 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -758,7 +758,6 @@ glamor_translate_boxes(BoxPtr boxes, int nbox, int dx, int dy)
 
 #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_HAS_FBO_DOWNLOADED(pixmap_priv)    (pixmap_priv && (pixmap_priv->gl_fbo == GLAMOR_FBO_DOWNLOADED))
 
 /**
  * Borrow from uxa.
commit 447274094147f31025700a2ff6f94e3b0c96fa17
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Feb 5 11:20:50 2015 -0800

    glamor: Move doxygen for private structs into the structs.
    
    This should hopefully keep the comments more up to date with the
    structure comments.  While I'm here, I've reworded a few of them to be
    more accurate, and dropped a bunch of stale comments.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 57aa445..a9b94f6 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -321,96 +321,26 @@ enum glamor_fbo_state {
     GLAMOR_FBO_DOWNLOADED,
 };
 
-/* glamor_pixmap_fbo:
- * @list:    to be used to link to the cache pool list.
- * @expire:  when push to cache pool list, set a expire count.
- * 	     will be freed when glamor_priv->tick is equal or
- * 	     larger than this expire count in block handler.
- * @tex:     attached texture.
- * @fb:      attached fbo.
- * @width:   width of this fbo.
- * @height:  height of this fbo.
- * @external set when the texture was not created by glamor
- * @format:  internal format of this fbo's texture.
- * @type:    internal type of this fbo's texture.
- * @glamor_priv: point to glamor private data.
- */
 typedef struct glamor_pixmap_fbo {
-    struct xorg_list list;
+    struct xorg_list list; /**< linked list pointers when in the fbo cache */
+    /** glamor_priv->tick number when this FBO will be expired from the cache. */
     unsigned int expire;
-    GLuint tex;
-    GLuint fb;
-    int width;
-    int height;
+    GLuint tex; /**< GL texture name */
+    GLuint fb; /**< GL FBO name */
+    int width; /**< width in pixels */
+    int height; /**< height in pixels */
+    /**
+     * Flag for when texture contents might be shared with a
+     * non-glamor user.
+     *
+     * This is used to avoid putting textures used by other clients
+     * into the FBO cache.
+     */
     Bool external;
-    GLenum format;
-    GLenum type;
+    GLenum format; /**< GL format used to create the texture. */
+    GLenum type; /**< GL type used to create the texture. */
 } glamor_pixmap_fbo;
 
-/*
- * glamor_pixmap_private - glamor pixmap's private structure.
- * @is_picture: The drawable is attached to a picture.
- * @pict_format: the corresponding picture's format.
- * @pixmap: The corresponding pixmap's pointer.
- * @box: current fbo's coords in the whole pixmap.
- * @block_w: block width of this large pixmap.
- * @block_h: block height of this large pixmap.
- * @block_wcnt: block count in one block row.
- * @block_hcnt: block count in one block column.
- * @nbox: total block count.
- * @box_array: contains each block's corresponding box.
- * @fbo_array: contains each block's fbo pointer.
- *
- * For GLAMOR_TEXTURE_LARGE, nbox should larger than 1.
- * And the box and fbo will both have nbox elements.
- * and box[i] store the relatively coords in this pixmap
- * of the fbo[i]. The reason why use boxes not region to
- * represent this structure is we may need to use overlapped
- * boxes for one pixmap for some special reason.
- *
- * pixmap
- * ******************
- * *  fbo0 * fbo1   *
- * *       *        *
- * ******************
- * *  fbo2 * fbo3   *
- * *       *        *
- * ******************
- *
- * Let's assume the texture has size of 1024x1024
- * box[0] = {0,0,1024,1024}
- * box[1] = {1024,0,2048,2048}
- * ...
- *
- * For GLAMOR_TEXTURE_ATLAS nbox should be 1. And box
- * and fbo both has one elements, and the box store
- * the relatively coords in the fbo of this pixmap:
- *
- * fbo
- * ******************
- * *   pixmap       *
- * *   *********    *
- * *   *       *    *
- * *   *********    *
- * *                *
- * ******************
- *
- * Assume the pixmap is at the (100,100) relatively to
- * the fbo's origin.
- * box[0]={100, 100, 1124, 1124};
- *
- * Considering large pixmap is not a normal case, to keep
- * it simple, I designe it as the following way.
- * When deal with a large pixmap, it split the working
- * rectangle into serval boxes, and each box fit into a
- * corresponding fbo. And then the rendering function will
- * loop from the left-top box to the right-bottom box,
- * each time, we will set current box and current fbo
- * to the box and fbo elements. Thus the inner routines
- * can handle it as normal, only the coords calculation need
- * to aware of it's large pixmap.
- **/
-
 typedef struct glamor_pixmap_clipped_regions {
     int block_idx;
     RegionPtr region;
@@ -425,8 +355,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;
@@ -436,11 +368,40 @@ typedef struct glamor_pixmap_private {
 #if GLAMOR_HAS_GBM
     EGLImageKHR image;
 #endif
+    /** block width of this large pixmap. */
     int block_w;
+    /** block height of this large pixmap. */
     int block_h;
+
+    /** block_wcnt: block count in one block row. */
     int block_wcnt;
+    /** block_hcnt: block count in one block column. */
     int block_hcnt;
+
+    /**
+     * The list of boxes for the bounds of the FBOs making up the
+     * pixmap.
+     *
+     * For a 2048x2048 pixmap with GL FBO size limits of 1024x1024:
+     *
+     * ******************
+     * *  fbo0 * fbo1   *
+     * *       *        *
+     * ******************
+     * *  fbo2 * fbo3   *
+     * *       *        *
+     * ******************
+     *
+     * box[0] = {0,0,1024,1024}
+     * box[1] = {1024,0,2048,2048}
+     * ...
+     */
     BoxPtr box_array;
+
+    /**
+     * Array of fbo structs containing the actual GL texture/fbo
+     * names.
+     */
     glamor_pixmap_fbo **fbo_array;
 } glamor_pixmap_private;
 
@@ -561,19 +522,19 @@ glamor_pixmap_hcnt(glamor_pixmap_private *priv)
     for (y = 0; y < glamor_pixmap_hcnt(priv); y++)      \
         for (x = 0; x < glamor_pixmap_wcnt(priv); x++)
 
-/*
- * Pixmap dynamic status, used by dynamic upload feature.
- *
- * GLAMOR_NONE:  initial status, don't need to do anything.
- * GLAMOR_UPLOAD_PENDING: marked as need to be uploaded to gl texture.
- * GLAMOR_UPLOAD_DONE: the pixmap has been uploaded successfully.
- * GLAMOR_UPLOAD_FAILED: fail to upload the pixmap.
- *
- * */
+/**
+ * Pixmap upload status, used by glamor_render.c's support for
+ * temporarily uploading pixmaps to GL textures to get a Composite
+ * operation done.
+ */
 typedef enum glamor_pixmap_status {
+    /** initial status, don't need to do anything. */
     GLAMOR_NONE,
+    /** marked as need to be uploaded to gl texture. */
     GLAMOR_UPLOAD_PENDING,
+    /** the pixmap has been uploaded successfully. */
     GLAMOR_UPLOAD_DONE,
+    /** fail to upload the pixmap. */
     GLAMOR_UPLOAD_FAILED
 } glamor_pixmap_status_t;
 
commit 33d6384b29db1b28a9d1a035dc7cc82da8f33c99
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Feb 5 11:18:24 2015 -0800

    glamor: Drop the dead "PBO" field in an FBO cache struct.
    
    PBOs are only used at the whole pixmap level.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index abb7284..e4aa4c6 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -121,8 +121,6 @@ glamor_purge_fbo(glamor_screen_private *glamor_priv,
         glDeleteFramebuffers(1, &fbo->fb);
     if (fbo->tex)
         glDeleteTextures(1, &fbo->tex);
-    if (fbo->pbo)
-        glDeleteBuffers(1, &fbo->pbo);
 
     free(fbo);
 }
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index d72c9bc..57aa445 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -328,7 +328,6 @@ enum glamor_fbo_state {
  * 	     larger than this expire count in block handler.
  * @tex:     attached texture.
  * @fb:      attached fbo.
- * @pbo:     attached pbo.
  * @width:   width of this fbo.
  * @height:  height of this fbo.
  * @external set when the texture was not created by glamor
@@ -341,7 +340,6 @@ typedef struct glamor_pixmap_fbo {
     unsigned int expire;
     GLuint tex;
     GLuint fb;
-    GLuint pbo;
     int width;
     int height;
     Bool external;
commit 1734aa285663d83070e6313bb976f976aa2bea4c
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Feb 4 18:07:06 2015 -0800

    glamor: Remove dead gl_tex flag in the fbo struct.
    
    This used to be used in the old copy_area path.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 6017f5e..abb7284 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -479,12 +479,6 @@ glamor_pixmap_attach_fbo(PixmapPtr pixmap, glamor_pixmap_fbo *fbo)
     case GLAMOR_TEXTURE_ONLY:
     case GLAMOR_TEXTURE_DRM:
         pixmap_priv->gl_fbo = GLAMOR_FBO_NORMAL;
-        if (fbo->tex != 0)
-            pixmap_priv->gl_tex = 1;
-        else {
-            /* XXX For the Xephyr only, may be broken now. */
-            pixmap_priv->gl_tex = 0;
-        }
         pixmap->devPrivate.ptr = NULL;
     default:
         break;
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 90489a2..d72c9bc 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -351,7 +351,6 @@ typedef struct glamor_pixmap_fbo {
 
 /*
  * glamor_pixmap_private - glamor pixmap's private structure.
- * @gl_tex:  The pixmap is in a gl texture originally.
  * @is_picture: The drawable is attached to a picture.
  * @pict_format: the corresponding picture's format.
  * @pixmap: The corresponding pixmap's pointer.
@@ -429,7 +428,6 @@ typedef struct glamor_pixmap_private {
      */
     glamor_access_t map_access;
     unsigned char is_picture:1;
-    unsigned char gl_tex:1;
     glamor_pixmap_fbo *fbo;
     BoxRec box;
     int drm_stride;
commit 82d23fc7290a2986efbc2982eeaa0de0ad5ad0d1
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Feb 4 18:02:34 2015 -0800

    glamor: Propagate the fact that pbo_valid is never set.
    
    The code to set it was deleted in keithp's big rewrite.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index 4e87371..f2bf223 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -1047,27 +1047,13 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
 enum glamor_pixmap_status
 glamor_upload_pixmap_to_texture(PixmapPtr pixmap)
 {
-    glamor_pixmap_private *pixmap_priv;
-    void *data;
-    int pbo;
     int ret;
 
-    pixmap_priv = glamor_get_pixmap_private(pixmap);
-
-    if ((pixmap_priv->fbo)
-        && (pixmap_priv->fbo->pbo_valid)) {
-        data = NULL;
-        pbo = pixmap_priv->fbo->pbo;
-    }
-    else {
-        data = pixmap->devPrivate.ptr;
-        pbo = 0;
-    }
-
     if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
                                             pixmap->drawable.width,
                                             pixmap->drawable.height,
-                                            pixmap->devKind, data, pbo))
+                                            pixmap->devKind,
+                                            pixmap->devPrivate.ptr, 0))
         ret = GLAMOR_UPLOAD_DONE;
     else
         ret = GLAMOR_UPLOAD_FAILED;
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 3e666b4..90489a2 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -326,7 +326,6 @@ enum glamor_fbo_state {
  * @expire:  when push to cache pool list, set a expire count.
  * 	     will be freed when glamor_priv->tick is equal or
  * 	     larger than this expire count in block handler.
- * @pbo_valid: The pbo has a valid copy of the pixmap's data.
  * @tex:     attached texture.
  * @fb:      attached fbo.
  * @pbo:     attached pbo.
@@ -340,7 +339,6 @@ enum glamor_fbo_state {
 typedef struct glamor_pixmap_fbo {
     struct xorg_list list;
     unsigned int expire;
-    unsigned char pbo_valid;
     GLuint tex;
     GLuint fb;
     GLuint pbo;
commit 0e3f1252dacdc3194a99a2d090b5c13f070f8799
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 18:40:47 2015 -0700

    glamor: Avoid using GL_QUADS on VC4.
    
    Improves text rendering from about 284k glyphs per second to 320k
    glyphs per second.  There's no GL extension for probing this, because
    of the philosophy of "Don't expose whether things are really in
    hardware or not."
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index fbb1d85..525249c 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -531,6 +531,15 @@ glamor_init(ScreenPtr screen, unsigned int flags)
         epoxy_gl_version() >= 30 ||
         epoxy_has_gl_extension("GL_NV_pack_subimage");
 
+    glamor_priv->use_quads = (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
+    /* Driver-specific hack: Avoid using GL_QUADS on VC4, where
+     * they'll be emulated more expensively than we can with our
+     * cached IB.
+     */
+    if (strstr((char *)glGetString(GL_VENDOR), "Broadcom") &&
+        strstr((char *)glGetString(GL_RENDERER), "VC4"))
+        glamor_priv->use_quads = FALSE;
+
     glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &glamor_priv->max_fbo_size);
     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glamor_priv->max_fbo_size);
     glGetIntegerv(GL_MAX_VIEWPORT_DIMS, max_viewport_size);
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 681895f..3e666b4 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -203,6 +203,7 @@ typedef struct glamor_screen_private {
     Bool has_pack_subimage;
     Bool has_unpack_subimage;
     Bool has_rw_pbo;
+    Bool use_quads;
     int max_fbo_size;
 
     struct xorg_list
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 73cda9c..66c3492 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -1400,7 +1400,7 @@ glamor_make_current(glamor_screen_private *glamor_priv)
 static inline void
 glamor_glDrawArrays_GL_QUADS(glamor_screen_private *glamor_priv, unsigned count)
 {
-    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+    if (glamor_priv->use_quads) {
         glDrawArrays(GL_QUADS, 0, count * 4);
     } else {
         glamor_gldrawarrays_quads_using_indices(glamor_priv, count);
commit f47e3f539568d19e22d10d7dd4ec09c7d570e716
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 18:36:28 2015 -0700

    glamor: Use proper Bools for some boolean values.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 17f8253..681895f 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -194,16 +194,16 @@ typedef struct glamor_screen_private {
     unsigned int tick;
     enum glamor_gl_flavor gl_flavor;
     int glsl_version;
-    int has_pack_invert;
-    int has_fbo_blit;
-    int has_map_buffer_range;
-    int has_buffer_storage;
-    int has_khr_debug;
-    int has_nv_texture_barrier;
-    int has_pack_subimage;
-    int has_unpack_subimage;
+    Bool has_pack_invert;
+    Bool has_fbo_blit;
+    Bool has_map_buffer_range;
+    Bool has_buffer_storage;
+    Bool has_khr_debug;
+    Bool has_nv_texture_barrier;
+    Bool has_pack_subimage;
+    Bool has_unpack_subimage;
+    Bool has_rw_pbo;
     int max_fbo_size;
-    int has_rw_pbo;
 
     struct xorg_list
         fbo_cache[CACHE_FORMAT_COUNT][CACHE_BUCKET_WCOUNT][CACHE_BUCKET_HCOUNT];
commit 4001a7465e6fb27fc82fa20ea5a65283d33a5e2e
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 16:56:35 2015 -0700

    glamor: Provide a fallback path for using an index buffer to do quads.
    
    Improves x11perf -aa10text performance by 1377.59% +/- 23.8198% (n=93)
    on Intel with GLES2.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 935fb74..fbb1d85 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -274,6 +274,68 @@ glamor_set_debug_level(int *debug_level)
 
 int glamor_debug_level;
 
+void
+glamor_gldrawarrays_quads_using_indices(glamor_screen_private *glamor_priv,
+                                        unsigned count)
+{
+    unsigned i;
+
+    /* For a single quad, don't bother with an index buffer. */
+    if (count ==  1)
+        goto fallback;
+
+    if (glamor_priv->ib_size < count) {
+        /* Basic GLES2 doesn't have any way to map buffer objects for
+         * writing, but it's long past time for drivers to have
+         * MapBufferRange.
+         */
+        if (!glamor_priv->has_map_buffer_range)
+            goto fallback;
+
+        /* Lazy create the buffer name, and only bind it once since
+         * none of the glamor code binds it to anything else.
+         */
+        if (!glamor_priv->ib) {
+            glGenBuffers(1, &glamor_priv->ib);
+            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ib);
+        }
+
+        /* For now, only support GL_UNSIGNED_SHORTs. */
+        if (count > ((1 << 16) - 1) / 4) {
+            goto fallback;
+        } else {
+            uint16_t *data;
+            size_t size = count * 6 * sizeof(GLushort);
+
+            glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW);
+            data = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER,
+                                    0, size,
+                                    GL_MAP_WRITE_BIT |
+                                    GL_MAP_INVALIDATE_BUFFER_BIT);
+            for (i = 0; i < count; i++) {
+                data[i * 6 + 0] = i * 4 + 0;
+                data[i * 6 + 1] = i * 4 + 1;
+                data[i * 6 + 2] = i * 4 + 2;
+                data[i * 6 + 3] = i * 4 + 0;
+                data[i * 6 + 4] = i * 4 + 2;
+                data[i * 6 + 5] = i * 4 + 3;
+            }
+            glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
+
+            glamor_priv->ib_size = count;
+            glamor_priv->ib_type = GL_UNSIGNED_SHORT;
+        }
+    }
+
+    glDrawElements(GL_TRIANGLES, count * 6, glamor_priv->ib_type, NULL);
+    return;
+
+fallback:
+    for (i = 0; i < count; i++)
+        glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4);
+}
+
+
 /**
  * Creates any pixmaps used internally by glamor, since those can't be
  * allocated at ScreenInit time.
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index c80df22..17f8253 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -261,6 +261,14 @@ typedef struct glamor_screen_private {
      */
     char *vb;
     int vb_stride;
+
+    /** Cached index buffer for translating GL_QUADS to triangles. */
+    GLuint ib;
+    /** Index buffer type: GL_UNSIGNED_SHORT or GL_UNSIGNED_INT */
+    GLenum ib_type;
+    /** Number of quads the index buffer has indices for. */
+    unsigned ib_size;
+
     Bool has_source_coords, has_mask_coords;
     int render_nr_quads;
     glamor_composite_shader composite_shader[SHADER_SOURCE_COUNT]
@@ -643,6 +651,9 @@ glamor_pixmap_fbo *glamor_create_fbo_array(glamor_screen_private *glamor_priv,
                                            int flag, int block_w, int block_h,
                                            glamor_pixmap_private *);
 
+void glamor_gldrawarrays_quads_using_indices(glamor_screen_private *glamor_priv,
+                                             unsigned count);
+
 /* glamor_core.c */
 void glamor_init_finish_access_shaders(ScreenPtr screen);
 
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 0927ffb..73cda9c 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -1403,9 +1403,7 @@ glamor_glDrawArrays_GL_QUADS(glamor_screen_private *glamor_priv, unsigned count)
     if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
         glDrawArrays(GL_QUADS, 0, count * 4);
     } else {
-        unsigned i;
-        for (i = 0; i < count; i++)
-            glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4);
+        glamor_gldrawarrays_quads_using_indices(glamor_priv, count);
     }
 }
 
commit e8fc929d4a140666420a64d592371f5d3eb10cca
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 17:26:46 2015 -0700

    glamor: Use GL_EXT_map_buffer_range if present.
    
    We were only looking for the desktop GL version of the extension, so
    GLES2 missed out.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 0378388..935fb74 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -454,7 +454,8 @@ glamor_init(ScreenPtr screen, unsigned int flags)
     glamor_priv->has_fbo_blit =
         epoxy_has_gl_extension("GL_EXT_framebuffer_blit");
     glamor_priv->has_map_buffer_range =
-        epoxy_has_gl_extension("GL_ARB_map_buffer_range");
+        epoxy_has_gl_extension("GL_ARB_map_buffer_range") ||
+        epoxy_has_gl_extension("GL_EXT_map_buffer_range");
     glamor_priv->has_buffer_storage =
         epoxy_has_gl_extension("GL_ARB_buffer_storage");
     glamor_priv->has_nv_texture_barrier =
commit 4fc4cde0ce7d1a35bab3b3bbd787d688cd415d78
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 16:34:55 2015 -0700

    glamor: Use the normal GL_QUADS drawing helper in the render code.
    
    We use this for all of our other performance-sensitive rendering, too.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index a951cec..0378388 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -554,7 +554,6 @@ glamor_init(ScreenPtr screen, unsigned int flags)
 
     glamor_priv->saved_procs.destroy_picture = ps->DestroyPicture;
     ps->DestroyPicture = glamor_destroy_picture;
-    glamor_init_composite_shaders(screen);
 
     glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
     screen->SetWindowPixmap = glamor_set_window_pixmap;
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 438d1e9..c80df22 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -248,8 +248,8 @@ typedef struct glamor_screen_private {
     int                         glyph_max_dim;
     char                        *glyph_defines;
 
-    /* vertext/elment_index buffer object for render */
-    GLuint vbo, ebo;
+    /** Vertex buffer for all GPU rendering. */
+    GLuint vbo;
     /** Next offset within the VBO that glamor_get_vbo_space() will use. */
     int vbo_offset;
     int vbo_size;
@@ -262,7 +262,7 @@ typedef struct glamor_screen_private {
     char *vb;
     int vb_stride;
     Bool has_source_coords, has_mask_coords;
-    int render_nr_verts;
+    int render_nr_quads;
     glamor_composite_shader composite_shader[SHADER_SOURCE_COUNT]
         [SHADER_MASK_COUNT]
         [SHADER_IN_COUNT];
@@ -701,7 +701,6 @@ void glamor_composite(CARD8 op,
                       INT16 yMask,
                       INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
 
-void glamor_init_composite_shaders(ScreenPtr screen);
 void glamor_composite_rects(CARD8 op,
                             PicturePtr pDst,
                             xRenderColor *color, int nRect, xRectangle *rects);
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 1849cce..4a82534 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -379,41 +379,6 @@ glamor_lookup_composite_shader(ScreenPtr screen, struct
     return shader;
 }
 
-static void
-glamor_init_eb(unsigned short *eb, int vert_cnt)
-{
-    int i, j;
-
-    for (i = 0, j = 0; j < vert_cnt; i += 6, j += 4) {
-        eb[i] = j;
-        eb[i + 1] = j + 1;
-        eb[i + 2] = j + 2;
-        eb[i + 3] = j;
-        eb[i + 4] = j + 2;
-        eb[i + 5] = j + 3;
-    }
-}
-
-void
-glamor_init_composite_shaders(ScreenPtr screen)
-{
-    glamor_screen_private *glamor_priv;
-    unsigned short *eb;
-    int eb_size;
-
-    glamor_priv = glamor_get_screen_private(screen);
-    glamor_make_current(glamor_priv);
-    glGenBuffers(1, &glamor_priv->ebo);
-    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
-
-    eb_size = GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(short) * 2;
-
-    eb = XNFalloc(eb_size);
-    glamor_init_eb(eb, GLAMOR_COMPOSITE_VBO_VERT_CNT);
-    glBufferData(GL_ELEMENT_ARRAY_BUFFER, eb_size, eb, GL_STATIC_DRAW);
-    free(eb);
-}
-
 static Bool
 glamor_set_composite_op(ScreenPtr screen,
                         CARD8 op, struct blendinfo *op_info_result,
@@ -647,7 +612,7 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts)
     char *vbo_offset;
     float *vb;
 
-    glamor_priv->render_nr_verts = 0;
+    glamor_priv->render_nr_quads = 0;
     glamor_priv->vb_stride = 2 * sizeof(float);
     if (glamor_priv->has_source_coords)
         glamor_priv->vb_stride += 2 * sizeof(float);
@@ -689,17 +654,10 @@ glamor_flush_composite_rects(ScreenPtr screen)
 
     glamor_make_current(glamor_priv);
 
-    if (!glamor_priv->render_nr_verts)
+    if (!glamor_priv->render_nr_quads)
         return;
 
-    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
-        glDrawRangeElements(GL_TRIANGLES, 0, glamor_priv->render_nr_verts,
-                            (glamor_priv->render_nr_verts * 3) / 2,
-                            GL_UNSIGNED_SHORT, NULL);
-    } else {
-        glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
-                       GL_UNSIGNED_SHORT, NULL);
-    }
+    glamor_glDrawArrays_GL_QUADS(glamor_priv, glamor_priv->render_nr_quads);
 }
 
 int pict_format_combine_tab[][3] = {
@@ -1249,7 +1207,7 @@ glamor_composite_with_shader(CARD8 op,
                                                      vertices, vb_stride);
                 vertices += 2;
             }
-            glamor_priv->render_nr_verts += 4;
+            glamor_priv->render_nr_quads++;
             rects++;
 
             /* We've incremented by one of our 4 verts, now do the other 3. */
commit c5e6fffbdd88ad714454b9de1ac1c3eb9f6bf196
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 17:05:28 2015 -0700

    glamor: Drop CloseScreen-time GL resource cleanup code.
    
    These will all be freed when the context is freed.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 71ca4f4..a951cec 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -585,13 +585,8 @@ glamor_release_screen_priv(ScreenPtr screen)
     glamor_screen_private *glamor_priv;
 
     glamor_priv = glamor_get_screen_private(screen);
-    glamor_fini_composite_shaders(screen);
     glamor_fini_vbo(screen);
     glamor_fini_pixmap_fbo(screen);
-    glamor_fini_finish_access_shaders(screen);
-#ifdef GLAMOR_GRADIENT_SHADER
-    glamor_fini_gradient_shader(screen);
-#endif
     glamor_pixmap_fini(screen);
     free(glamor_priv);
 
diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c
index 965024e..4f3526c 100644
--- a/glamor/glamor_core.c
+++ b/glamor/glamor_core.c
@@ -283,17 +283,6 @@ glamor_init_finish_access_shaders(ScreenPtr screen)
     glUniform1i(glamor_priv->finish_access_swap_rb[1], 0);
 }
 
-void
-glamor_fini_finish_access_shaders(ScreenPtr screen)
-{
-    glamor_screen_private *glamor_priv;
-
-    glamor_priv = glamor_get_screen_private(screen);
-    glamor_make_current(glamor_priv);
-    glDeleteProgram(glamor_priv->finish_access_prog[0]);
-    glDeleteProgram(glamor_priv->finish_access_prog[1]);
-}
-
 GCOps glamor_gc_ops = {
     .FillSpans = glamor_fill_spans,
     .SetSpans = glamor_set_spans,
diff --git a/glamor/glamor_gradient.c b/glamor/glamor_gradient.c
index d34131d..30c29f6 100644
--- a/glamor/glamor_gradient.c
+++ b/glamor/glamor_gradient.c
@@ -582,27 +582,6 @@ glamor_init_gradient_shader(ScreenPtr screen)
     _glamor_create_radial_gradient_program(screen, RADIAL_LARGE_STOPS, 0);
 }
 
-void
-glamor_fini_gradient_shader(ScreenPtr screen)
-{
-    glamor_screen_private *glamor_priv;
-    int i = 0;
-
-    glamor_priv = glamor_get_screen_private(screen);
-    glamor_make_current(glamor_priv);
-
-    for (i = 0; i < 3; i++) {
-        /* Linear Gradient */
-        if (glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][i])
-            glDeleteProgram(glamor_priv->gradient_prog
-                            [SHADER_GRADIENT_LINEAR][i]);
-
-        if (glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][i])
-            glDeleteProgram(glamor_priv->gradient_prog
-                            [SHADER_GRADIENT_RADIAL][i]);
-    }
-}
-
 static void
 _glamor_gradient_convert_trans_matrix(PictTransform *from, float to[3][3],
                                       int width, int height, int normalize)
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 480d13b..438d1e9 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -645,7 +645,6 @@ glamor_pixmap_fbo *glamor_create_fbo_array(glamor_screen_private *glamor_priv,
 
 /* glamor_core.c */
 void glamor_init_finish_access_shaders(ScreenPtr screen);
-void glamor_fini_finish_access_shaders(ScreenPtr screen);
 
 Bool glamor_get_drawable_location(const DrawablePtr drawable);
 void glamor_get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap,
@@ -703,7 +702,6 @@ void glamor_composite(CARD8 op,
                       INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
 
 void glamor_init_composite_shaders(ScreenPtr screen);
-void glamor_fini_composite_shaders(ScreenPtr screen);
 void glamor_composite_rects(CARD8 op,
                             PicturePtr pDst,
                             xRenderColor *color, int nRect, xRectangle *rects);
@@ -722,7 +720,6 @@ void glamor_trapezoids(CARD8 op,
 
 /* glamor_gradient.c */
 void glamor_init_gradient_shader(ScreenPtr screen);
-void glamor_fini_gradient_shader(ScreenPtr screen);
 PicturePtr glamor_generate_linear_gradient_picture(ScreenPtr screen,
                                                    PicturePtr src_picture,
                                                    int x_source, int y_source,
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 05eee91..1849cce 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -414,27 +414,6 @@ glamor_init_composite_shaders(ScreenPtr screen)
     free(eb);
 }
 
-void
-glamor_fini_composite_shaders(ScreenPtr screen)
-{
-    glamor_screen_private *glamor_priv;
-    glamor_composite_shader *shader;
-    int i, j, k;
-
-    glamor_priv = glamor_get_screen_private(screen);
-    glamor_make_current(glamor_priv);
-    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-    glDeleteBuffers(1, &glamor_priv->ebo);
-
-    for (i = 0; i < SHADER_SOURCE_COUNT; i++)
-        for (j = 0; j < SHADER_MASK_COUNT; j++)
-            for (k = 0; k < SHADER_IN_COUNT; k++) {
-                shader = &glamor_priv->composite_shader[i][j][k];
-                if (shader->prog)
-                    glDeleteProgram(shader->prog);
-            }
-}
-
 static Bool
 glamor_set_composite_op(ScreenPtr screen,
                         CARD8 op, struct blendinfo *op_info_result,
diff --git a/glamor/glamor_vbo.c b/glamor/glamor_vbo.c
index e906101..d74a005 100644
--- a/glamor/glamor_vbo.c
+++ b/glamor/glamor_vbo.c
@@ -171,7 +171,6 @@ glamor_fini_vbo(ScreenPtr screen)
 
     glamor_make_current(glamor_priv);
 
-    glDeleteBuffers(1, &glamor_priv->vbo);
     if (!glamor_priv->has_map_buffer_range)
         free(glamor_priv->vb);
 }
commit 3d6dcad00d67bff407385ad37c7efde7b73ba719
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 19 19:04:16 2015 -0700

    glamor: Fix text rendering on GLES2.
    
    The GL_QUADS helper takes a number of quads, not a number of vertices.
    
    Signed-off-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/glamor/glamor_composite_glyphs.c b/glamor/glamor_composite_glyphs.c
index 1f0d75e..e92f1d9 100644
--- a/glamor/glamor_composite_glyphs.c
+++ b/glamor/glamor_composite_glyphs.c
@@ -256,7 +256,7 @@ glamor_glyphs_flush(CARD8 op, PicturePtr src, PicturePtr dst,
                 if (glamor_glyph_use_130(glamor_priv))
                     glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, nglyph);
                 else
-                    glamor_glDrawArrays_GL_QUADS(glamor_priv, nglyph * 4);
+                    glamor_glDrawArrays_GL_QUADS(glamor_priv, nglyph);
             }
         }
         if (prog->alpha != glamor_program_alpha_ca_first)


More information about the xorg-commit mailing list