[cairo] [patch] gl: create BGRA texture and avoid conversion

Martin Robinson mrobinson at igalia.com
Wed Jan 30 12:29:31 PST 2013


On 01/30/2013 11:48 AM, Henry (Yu) Song - SISA wrote:
> @@ -316,6 +298,16 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx)
>      ctx->max_textures = 0;
>      glGetIntegerv (GL_MAX_TEXTURE_IMAGE_UNITS, &ctx->max_textures);
>  
> +    ctx->supports_bgra = FALSE;
> +#if CAIRO_HAS_GLESV2_SURFACE

I think it's slightly more correct to check the context flavor here. At
least with EGL you can select the API you want to access, though I don't
think we support that at the moment.

> +    /* if the driver supports both extensions, we are ensured that we can
> +     * create texture, upload image and read texture with BGRA format
> +     */
> +    if (_cairo_gl_has_extension ("GL_EXT_read_format_bgra")) {
> +	ctx->supports_bgra = TRUE;
> +    }
> +#endif

A few things:
1. You mention two extensions, but are only checking one.
2. Why delete the helper function?
3. This means that ctx->supports_bgra = FALSE for Desktop GL, even
though Desktop GL supports that format. It seems that it makes sense to
either set the flag properly or to hide it behind an #ifdef.
4. I felt like the old flag name was more descriptive.

> @@ -1079,17 +1170,14 @@ _cairo_gl_surface_map_to_image (void      *abstract_surface,
>  	 * interacting with other image surfaces. For ALPHA, GLES2 does not
>  	 * support GL_PACK_ROW_LENGTH anyway, and this makes sure that the
>  	 * pixman image that is created has row_stride = row_width * bpp. */
> -	if (surface->base.content == CAIRO_CONTENT_ALPHA || !ctx->can_read_bgra) {
> +	if (surface->base.content == CAIRO_CONTENT_ALPHA || !ctx->supports_bgra) {
>  	    cairo_bool_t little_endian = _cairo_is_little_endian ();
>  	    format = GL_RGBA;
>  
> -	    if (surface->base.content == CAIRO_CONTENT_COLOR) {
> -		pixman_format = little_endian ?
> -		    PIXMAN_x8b8g8r8 : PIXMAN_r8g8b8x8;
> -	    } else {
> -		pixman_format = little_endian ?
> -		    PIXMAN_a8b8g8r8 : PIXMAN_r8g8b8a8;
> -	    }
> +	    /* FIXME: for CAIRO_CONTENT_COLOR, using 4-byte aligned 
> +	     * GL_RGBA is more efficient */
> +	    pixman_format = little_endian ?
> +		PIXMAN_a8b8g8r8 : PIXMAN_r8g8b8a8;

I'm not sure I understand this change. Isn't it better to represent
CONTENT_COLOR images as having no alpha? My understanding is that this
can allow optimizations in pixman.

--Martin



More information about the cairo mailing list