From ea2ddaa9ddaa643fce99d5eb6a948b0b0d3553fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Mon, 10 Feb 2020 15:22:33 +0100 Subject: [PATCH] blur-effect: Floor downscaled frambuffer sizes Floor the downscaled size of the new framebuffer to make sure we don't initialize a framebuffer with a floating point value that might be interpreted wrong by `cogl_texture_2d_new_with_size` and end up with a slightly wrong aspect ratio of the framebuffer. This fixes situations where the widths or heights of downscaled framebuffers sometimes miss some pixels at the border. While at it, remove the `downscale_factor` argument from `setup_projection_matrix` since that function doesn't need the initial size of the actor anyway. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991 --- src/shell-blur-effect.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/shell-blur-effect.c b/src/shell-blur-effect.c index 7f1be6b1d..e40bb542a 100644 --- a/src/shell-blur-effect.c +++ b/src/shell-blur-effect.c @@ -323,21 +323,18 @@ update_brightness_uniform (ShellBlurEffect *self) static void setup_projection_matrix (CoglFramebuffer *framebuffer, float width, - float height, - float downscale_factor) + float height) { CoglMatrix projection; - float downscaled_width = width / downscale_factor; - float downscaled_height = height / downscale_factor; cogl_matrix_init_identity (&projection); cogl_matrix_scale (&projection, - 2.0 / downscaled_width, - -2.0 / downscaled_height, + 2.0 / width, + -2.0 / height, 1.f); cogl_matrix_translate (&projection, - -downscaled_width / 2.0, - -downscaled_height / 2.0, + -width / 2.0, + -height / 2.0, 0); cogl_framebuffer_set_projection_matrix (framebuffer, &projection); @@ -355,10 +352,10 @@ update_fbo (FramebufferData *data, g_clear_pointer (&data->texture, cogl_object_unref); g_clear_pointer (&data->framebuffer, cogl_object_unref); - data->texture = - cogl_texture_2d_new_with_size (ctx, - width / downscale_factor, - height / downscale_factor); + float new_width = floorf (width / downscale_factor); + float new_height = floorf (height / downscale_factor); + + data->texture = cogl_texture_2d_new_with_size (ctx, new_width, new_height); if (!data->texture) return FALSE; @@ -371,7 +368,7 @@ update_fbo (FramebufferData *data, return FALSE; } - setup_projection_matrix (data->framebuffer, width, height, downscale_factor); + setup_projection_matrix (data->framebuffer, new_width, new_height); return TRUE; }