cogl: Revert swizzling for BGRA buffers

As it was originally reported on
https://bugzilla.gnome.org/show_bug.cgi?id=779234#c0, the hottest path was
convert_ubyte() in mesa. Reverting this shows no trace of those hot paths,
nor any higher than usual CPU activity.

As the improvements at the time were real, I can only conclude that pixel
conversion was happening somewhere further the pipeline, and swizzling just
helped indirectly. That got eventually fixed, so swizzling just stayed to
cause grief. And lots it caused.

Time to bin this, it seems.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/486
This commit is contained in:
Carlos Garnacho 2019-03-07 21:35:54 +01:00
parent d83a325f98
commit a871d56f88
10 changed files with 26 additions and 97 deletions

View File

@ -55,13 +55,6 @@ struct _CoglDriverVtable
GLenum *out_glintformat, GLenum *out_glintformat,
GLenum *out_glformat, GLenum *out_glformat,
GLenum *out_gltype); GLenum *out_gltype);
CoglPixelFormat
(* pixel_format_to_gl_with_target) (CoglContext *context,
CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *out_glintformat,
GLenum *out_glformat,
GLenum *out_gltype);
gboolean gboolean
(* update_features) (CoglContext *context, (* update_features) (CoglContext *context,

View File

@ -198,7 +198,6 @@ struct _CoglTextureDriver
CoglPixelFormat CoglPixelFormat
(* find_best_gl_get_data_format) (CoglContext *context, (* find_best_gl_get_data_format) (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *closest_gl_format, GLenum *closest_gl_format,
GLenum *closest_gl_type); GLenum *closest_gl_type);
}; };

View File

@ -787,7 +787,6 @@ cogl_texture_get_data (CoglTexture *texture,
closest_format = closest_format =
ctx->texture_driver->find_best_gl_get_data_format (ctx, ctx->texture_driver->find_best_gl_get_data_format (ctx,
texture_format,
format, format,
&closest_gl_format, &closest_gl_format,
&closest_gl_type); &closest_gl_type);

View File

@ -1274,15 +1274,11 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
if (!cogl_is_offscreen (framebuffer)) if (!cogl_is_offscreen (framebuffer))
y = framebuffer_height - y - height; y = framebuffer_height - y - height;
/* Use target format ANY, because GL texture_swizzle extension cannot required_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
* ever apply for glReadPixels. format,
*/ &gl_intformat,
required_format = ctx->driver_vtable->pixel_format_to_gl_with_target (ctx, &gl_format,
format, &gl_type);
COGL_PIXEL_FORMAT_ANY,
&gl_intformat,
&gl_format,
&gl_type);
/* NB: All offscreen rendering is done upside down so there is no need /* NB: All offscreen rendering is done upside down so there is no need
* to flip in this case... */ * to flip in this case... */

View File

@ -781,12 +781,11 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
upload_format = cogl_bitmap_get_format (upload_bmp); upload_format = cogl_bitmap_get_format (upload_bmp);
ctx->driver_vtable->pixel_format_to_gl_with_target (ctx, ctx->driver_vtable->pixel_format_to_gl (ctx,
upload_format, upload_format,
_cogl_texture_get_format (tex), NULL, /* internal gl format */
NULL, /* internal gl format */ &gl_format,
&gl_format, &gl_type);
&gl_type);
/* If this touches the first pixel then we'll update our copy */ /* If this touches the first pixel then we'll update our copy */
if (dst_x == 0 && dst_y == 0 && if (dst_x == 0 && dst_y == 0 &&

View File

@ -94,12 +94,11 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
} }
static CoglPixelFormat static CoglPixelFormat
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, _cogl_driver_pixel_format_to_gl (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format, GLenum *out_glintformat,
GLenum *out_glintformat, GLenum *out_glformat,
GLenum *out_glformat, GLenum *out_gltype)
GLenum *out_gltype)
{ {
CoglPixelFormat required_format; CoglPixelFormat required_format;
GLenum glintformat = 0; GLenum glintformat = 0;
@ -173,16 +172,7 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
case COGL_PIXEL_FORMAT_BGRA_8888: case COGL_PIXEL_FORMAT_BGRA_8888:
case COGL_PIXEL_FORMAT_BGRA_8888_PRE: case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
glintformat = GL_RGBA; glintformat = GL_RGBA;
/* If the driver has texture_swizzle, pretend internal glformat = GL_BGRA;
* and buffer format are the same here, the pixels
* will be flipped through this extension.
*/
if (target_format == format &&
_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
glformat = GL_RGBA;
else
glformat = GL_BGRA;
gltype = GL_UNSIGNED_BYTE; gltype = GL_UNSIGNED_BYTE;
break; break;
@ -297,20 +287,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
return required_format; return required_format;
} }
static CoglPixelFormat
_cogl_driver_pixel_format_to_gl (CoglContext *context,
CoglPixelFormat format,
GLenum *out_glintformat,
GLenum *out_glformat,
GLenum *out_gltype)
{
return _cogl_driver_pixel_format_to_gl_with_target (context,
format, format,
out_glintformat,
out_glformat,
out_gltype);
}
static gboolean static gboolean
_cogl_get_gl_version (CoglContext *ctx, _cogl_get_gl_version (CoglContext *ctx,
int *major_out, int *major_out,
@ -685,7 +661,6 @@ _cogl_driver_gl =
{ {
_cogl_driver_pixel_format_from_gl_internal, _cogl_driver_pixel_format_from_gl_internal,
_cogl_driver_pixel_format_to_gl, _cogl_driver_pixel_format_to_gl,
_cogl_driver_pixel_format_to_gl_with_target,
_cogl_driver_update_features, _cogl_driver_update_features,
_cogl_offscreen_gl_allocate, _cogl_offscreen_gl_allocate,
_cogl_offscreen_gl_free, _cogl_offscreen_gl_free,

View File

@ -112,18 +112,6 @@ _cogl_texture_driver_gen (CoglContext *ctx,
red_swizzle) ); red_swizzle) );
} }
/* If swizzle extension is available, prefer it to flip bgra buffers to rgba */
if ((internal_format == COGL_PIXEL_FORMAT_BGRA_8888 ||
internal_format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
{
static const GLint bgra_swizzle[] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA };
GE( ctx, glTexParameteriv (gl_target,
GL_TEXTURE_SWIZZLE_RGBA,
bgra_swizzle) );
}
return tex; return tex;
} }
@ -531,16 +519,14 @@ static CoglPixelFormat
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
(CoglContext *context, (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *closest_gl_format, GLenum *closest_gl_format,
GLenum *closest_gl_type) GLenum *closest_gl_type)
{ {
return context->driver_vtable->pixel_format_to_gl_with_target (context, return context->driver_vtable->pixel_format_to_gl (context,
format, format,
target_format, NULL, /* don't need */
NULL, /* don't need */ closest_gl_format,
closest_gl_format, closest_gl_type);
closest_gl_type);
} }
const CoglTextureDriver const CoglTextureDriver

View File

@ -65,12 +65,11 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
} }
static CoglPixelFormat static CoglPixelFormat
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, _cogl_driver_pixel_format_to_gl (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format, GLenum *out_glintformat,
GLenum *out_glintformat, GLenum *out_glformat,
GLenum *out_glformat, GLenum *out_gltype)
GLenum *out_gltype)
{ {
CoglPixelFormat required_format; CoglPixelFormat required_format;
GLenum glintformat; GLenum glintformat;
@ -218,20 +217,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
return required_format; return required_format;
} }
static CoglPixelFormat
_cogl_driver_pixel_format_to_gl (CoglContext *context,
CoglPixelFormat format,
GLenum *out_glintformat,
GLenum *out_glformat,
GLenum *out_gltype)
{
return _cogl_driver_pixel_format_to_gl_with_target (context,
format, format,
out_glintformat,
out_glformat,
out_gltype);
}
static gboolean static gboolean
_cogl_get_gl_version (CoglContext *ctx, _cogl_get_gl_version (CoglContext *ctx,
int *major_out, int *major_out,
@ -449,7 +434,6 @@ _cogl_driver_gles =
{ {
_cogl_driver_pixel_format_from_gl_internal, _cogl_driver_pixel_format_from_gl_internal,
_cogl_driver_pixel_format_to_gl, _cogl_driver_pixel_format_to_gl,
_cogl_driver_pixel_format_to_gl_with_target,
_cogl_driver_update_features, _cogl_driver_update_features,
_cogl_offscreen_gl_allocate, _cogl_offscreen_gl_allocate,
_cogl_offscreen_gl_free, _cogl_offscreen_gl_free,

View File

@ -613,7 +613,6 @@ static CoglPixelFormat
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
(CoglContext *context, (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *closest_gl_format, GLenum *closest_gl_format,
GLenum *closest_gl_type) GLenum *closest_gl_type)
{ {

View File

@ -59,7 +59,6 @@ _cogl_driver_nop =
{ {
NULL, /* pixel_format_from_gl_internal */ NULL, /* pixel_format_from_gl_internal */
NULL, /* pixel_format_to_gl */ NULL, /* pixel_format_to_gl */
NULL, /* pixel_format_to_gl_with_target */
_cogl_driver_update_features, _cogl_driver_update_features,
_cogl_offscreen_nop_allocate, _cogl_offscreen_nop_allocate,
_cogl_offscreen_nop_free, _cogl_offscreen_nop_free,