diff --git a/glamor/glamor_getimage.c b/glamor/glamor_getimage.c index 086ec4b6d..377783cb6 100644 --- a/glamor/glamor_getimage.c +++ b/glamor/glamor_getimage.c @@ -78,7 +78,8 @@ _glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, glamor_set_destination_pixmap_priv_nc(pixmap_priv); glamor_validate_pixmap(pixmap); - if (glamor_priv->gl_flavor == GLAMOR_GL_ES2) { + if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 + && (glamor_tex_format_is_readable(format) || !no_revert)) { /* XXX prepare whole pixmap is not efficient. */ temp_pixmap = glamor_es2_pixmap_read_prepare(pixmap, &tex_format, diff --git a/glamor/glamor_getspans.c b/glamor/glamor_getspans.c index be81fbb9c..92c278fe5 100644 --- a/glamor/glamor_getspans.c +++ b/glamor/glamor_getspans.c @@ -66,7 +66,9 @@ _glamor_get_spans(DrawablePtr drawable, glamor_set_destination_pixmap_priv_nc(pixmap_priv); glamor_validate_pixmap(pixmap); - if (glamor_priv->gl_flavor == GLAMOR_GL_ES2) { + if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 + && (glamor_tex_format_is_readable(format) || !no_revert)) { + /* XXX prepare whole pixmap is not efficient. */ temp_pixmap = glamor_es2_pixmap_read_prepare(pixmap, &format, diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c index 2020e2145..9c9e517de 100644 --- a/glamor/glamor_pixmap.c +++ b/glamor/glamor_pixmap.c @@ -681,15 +681,11 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access) glamor_validate_pixmap(pixmap); if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 - && - ((format != GL_RGBA && format != GL_RGB && format != GL_ALPHA) - || no_revert != 1)) { - + && (glamor_tex_format_is_readable(format) || !no_revert)) { temp_pixmap = glamor_es2_pixmap_read_prepare(pixmap, &format, &type, no_alpha, no_revert); - } switch (access) { case GLAMOR_ACCESS_RO: diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h index c7d1c2943..b29292832 100644 --- a/glamor/glamor_utils.h +++ b/glamor/glamor_utils.h @@ -603,4 +603,10 @@ inline static Bool glamor_ddx_fallback_check_gc(GCPtr gc) return (!pixmap || glamor_ddx_fallback_check_pixmap(&pixmap->drawable)); } +inline static Bool glamor_tex_format_is_readable(GLenum format) +{ + return ((format == GL_RGBA || format == GL_RGB || format == GL_ALPHA)); + +} + #endif