summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels De Graef <nielsdegraef@gmail.com>2018-12-05 15:25:54 +0100
committerNiels De Graef <nielsdegraef@gmail.com>2018-12-05 15:34:41 +0100
commit16a2aaf860e87051805b2955dfabc31dc4ae9cb9 (patch)
tree0dec78f98e5d95f768097c607e5289a4d3aafdf8
parent9004253c4ef582f8fbfbae7410098d077fb357af (diff)
downloadmutter-wip/nielsdg/sprinkle-some-g-likely.tar.gz
wayland/buffer: use G_UNLIKELY for error pathswip/nielsdg/sprinkle-some-g-likely
We do a lot of if-checks in `MetaWaylandBuffer` to deal with unexpected situations (as we should). However, that means we get a branching penalty for every time this leads to a misprediction. Although these should in theory be mitigated by a proper branch predictor, it doesn't hurt giving some hints to make sure that we don't sacrifice our hot path. Especially given that in the case of video streams, the `meta_wayland_buffer_attach` is called for example 60 times per second.
-rw-r--r--src/wayland/meta-wayland-buffer.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index 9fee02d52..280dfba89 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -232,15 +232,15 @@ shm_buffer_attach (MetaWaylandBuffer *buffer,
cogl_object_unref (bitmap);
- if (!cogl_texture_allocate (COGL_TEXTURE (texture), error))
- g_clear_pointer (&texture, cogl_object_unref);
+ if (G_UNLIKELY (!cogl_texture_allocate (COGL_TEXTURE (texture), error)))
+ cogl_clear_object (&texture);
wl_shm_buffer_end_access (shm_buffer);
buffer->texture = texture;
buffer->is_y_inverted = TRUE;
- if (!buffer->texture)
+ if (G_UNLIKELY (!buffer->texture))
return FALSE;
return TRUE;
@@ -259,23 +259,27 @@ egl_image_buffer_attach (MetaWaylandBuffer *buffer,
CoglPixelFormat cogl_format;
EGLImageKHR egl_image;
CoglTexture2D *texture;
+ gboolean res = FALSE;
if (buffer->texture)
return TRUE;
- if (!meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
- EGL_TEXTURE_FORMAT, &format,
- error))
+ res = meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
+ EGL_TEXTURE_FORMAT, &format,
+ error);
+ if (G_UNLIKELY (!res))
return FALSE;
- if (!meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
- EGL_WIDTH, &width,
- error))
+ res = meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
+ EGL_WIDTH, &width,
+ error);
+ if (G_UNLIKELY (!res))
return FALSE;
- if (!meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
- EGL_HEIGHT, &height,
- error))
+ res = meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
+ EGL_HEIGHT, &height,
+ error);
+ if (G_UNLIKELY (!res))
return FALSE;
if (!meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
@@ -304,7 +308,7 @@ egl_image_buffer_attach (MetaWaylandBuffer *buffer,
EGL_WAYLAND_BUFFER_WL, buffer->resource,
NULL,
error);
- if (egl_image == EGL_NO_IMAGE_KHR)
+ if (G_UNLIKELY (egl_image == EGL_NO_IMAGE_KHR))
return FALSE;
texture = cogl_egl_texture_2d_new_from_image (cogl_context,
@@ -315,7 +319,7 @@ egl_image_buffer_attach (MetaWaylandBuffer *buffer,
meta_egl_destroy_image (egl, egl_display, egl_image, NULL);
- if (!texture)
+ if (G_UNLIKELY (!texture))
return FALSE;
buffer->texture = COGL_TEXTURE (texture);
@@ -346,7 +350,7 @@ meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
{
g_return_val_if_fail (buffer->resource, FALSE);
- if (!meta_wayland_buffer_is_realized (buffer))
+ if (G_UNLIKELY (!meta_wayland_buffer_is_realized (buffer)))
{
/* The buffer should have been realized at surface commit time */
g_set_error (error, G_IO_ERROR,
@@ -426,18 +430,17 @@ process_shm_buffer_damage (MetaWaylandBuffer *buffer,
bpp = _cogl_pixel_format_get_bytes_per_pixel (format);
cairo_region_get_rectangle (region, i, &rect);
- if (!_cogl_texture_set_region (buffer->texture,
- rect.width, rect.height,
- format,
- stride,
- data + rect.x * bpp + rect.y * stride,
- rect.x, rect.y,
- 0,
- error))
- {
- set_texture_failed = TRUE;
- break;
- }
+ set_texture_failed =
+ !_cogl_texture_set_region (buffer->texture,
+ rect.width, rect.height,
+ format,
+ stride,
+ data + rect.x * bpp + rect.y * stride,
+ rect.x, rect.y,
+ 0,
+ error);
+ if (G_UNLIKELY (set_texture_failed))
+ break;
}
wl_shm_buffer_end_access (shm_buffer);
@@ -474,7 +477,7 @@ meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
break;
}
- if (!res)
+ if (G_UNLIKELY (!res))
{
g_warning ("Failed to process Wayland buffer damage: %s", error->message);
g_error_free (error);