12 Commits

Author SHA1 Message Date
Jonas Dreßler
7c8ed95330 blur-effect: Remove modify_paint_volume vfunc override
If we modify the paint volume to make it larger and include the blur
radius, we should also use the gained size and draw something there.
Since the framebuffers are only the size of the actor to blur, we're not
doing that right now anyway, so remove the vfunc override.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 11:11:02 -03:00
Jonas Dreßler
f351cfa2f7 blur-effect: Use sigma value instead of blur radius
Almost all implementations, including CSS [1] of gaussian blurs use the
sigma/standard deviation value as the input parameter, even if they call
that value "radius". Since using sigma is more correct mathematically
and avoids confusion for people used to other blur implementations, use
that parameter here, too.

[1] https://www.w3.org/TR/filter-effects-1/#funcdef-filter-blur

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 11:10:38 -03:00
Jonas Dreßler
d26bb38be9 blur-effect: Implement incremental calculation of gauss coefficient
Use the shader for linear sampling and incremental calculation of the
gaussian kernel values as it was implemented by Patrick Walton in
webrender.

The sigma value for the blur (the standard deviation) is calculated by
taking the blur radius and dividing it by 3, this value is used by most
implementations of gaussian blurs since it covers a high percentage of
the gaussian shape.

The linear sampling optimization is implemented by skipping every second
texel (i += 2) in the for-loop that's sampling adjacent texels.

https://github.com/servo/webrender/blob/master/webrender/res/cs_blur.glsl
38ec7db6f1

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 11:07:55 -03:00
Jonas Dreßler
b75e61d5c8 blur-effect: Only apply paint opacity once when blurring actor
We don't want to apply the opacity multiple times, because this would
also multiply the opacity we're applying.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 14:02:28 +00:00
Jonas Dreßler
ca35ae4364 blur-effect: Only apply paint opacity to actor blur
We don't want to apply the opacity of the actor when blurring the
background.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 14:02:28 +00:00
Jonas Dreßler
f6fa08fa75 blur-effect: Don't paint background using actor opacity
The background should always be painted fully opaque, the opacity of the
actor does not change the one of the background.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 14:02:28 +00:00
Jonas Dreßler
46f94241eb blur-effect: Use int for opacity override
The opacity override can be -1 if no override is set, so use the
appropriate datatype here.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 14:02:28 +00:00
Jonas Dreßler
ea2ddaa9dd 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
2020-02-12 14:02:28 +00:00
Jonas Dreßler
b4d491a4d2 blur-effect: Add some more documentation about performance
Explicitly mention that this effect works best for large blur radii and
can be slow if the blurred actor/image is large and not being scaled.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 14:02:28 +00:00
Jonas Dreßler
463dcc6b93 blur-effect: Fix crash when switching to ACTOR mode
The `clear_framebuffer()` function takes a CoglFramebuffer, not a
FramebufferData object.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/991
2020-02-12 14:02:28 +00:00
Georges Basile Stavracas Neto
e169e5a30a shell/blur-effect: Set float brightness property
The brightness property of ShellBlurEffect is of float type, but
we are calling g_value_set_int() in the GObject::get_property()
handler, which throws warnings when trying to set the property
via g_object_set() and family.

Use g_value_set_float() instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/924
2020-01-09 22:03:55 +00:00
Georges Basile Stavracas Neto
248eb7419e Introduce ShellBlurEffect
This is a moderately fast two-pass gaussian blur implementation.
It downscales the framebuffer dynamically before applying the
gaussian shader, which cuts down rendering time quite considerably.

The blur shader takes 2 uniforms as input: the blur radius; and
whether to blur vertically or horizontally.

The blur radius is treated as an integer in C land to simplify
calculations. The vertical parameter is treated as an integer by
the shader simply due to Cogl not having proper boolean support
in snippets.

At last, brightness is also added to avoid needing to use an extra
effect to achieve that. Brightness is applied in a different pipeline
than blur, so we can control it more tightly.

ShellBlurEffect also implements a "background" mode, where the contents
beneath the actor are blurred, but not the actor itself. This mode is
performance-heavy.

Related: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1848

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/864
2020-01-08 15:59:15 -03:00