diff --git a/include/sway/desktop/fx_renderer/fx_renderer.h b/include/sway/desktop/fx_renderer/fx_renderer.h index 14f5df66..893e3c7e 100644 --- a/include/sway/desktop/fx_renderer/fx_renderer.h +++ b/include/sway/desktop/fx_renderer/fx_renderer.h @@ -189,9 +189,6 @@ void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *bo const float color[static 4], const float matrix[static 9], int radius, float blur_sigma); -void fx_render_blur_segments(struct fx_renderer *renderer, - const float matrix[static 9], pixman_region32_t* damage, - struct fx_framebuffer **buffer, struct blur_shader* shader, - const struct wlr_box *box, int blur_radius); +void fx_render_main_buffer_blur(struct fx_renderer *renderer, const float gl_matrix[static 9], pixman_region32_t *damage, const struct wlr_box *dst_box, struct fx_framebuffer *current_buffer, int blur_radius, int blur_passes); #endif diff --git a/sway/desktop/fx_renderer/fx_renderer.c b/sway/desktop/fx_renderer/fx_renderer.c index a6bbfd06..37100f0b 100644 --- a/sway/desktop/fx_renderer/fx_renderer.c +++ b/sway/desktop/fx_renderer/fx_renderer.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "log.h" #include "sway/desktop/fx_renderer/fx_framebuffer.h" @@ -875,3 +876,26 @@ void fx_render_blur_segments(struct fx_renderer *renderer, *buffer = &renderer->effects_buffer_swapped; } } + +void fx_render_main_buffer_blur(struct fx_renderer *renderer, const float gl_matrix[static 9], pixman_region32_t *damage, const struct wlr_box *dst_box, struct fx_framebuffer *current_buffer, int blur_radius, int blur_passes) { + // damage region will be scaled, make a temp + pixman_region32_t tempDamage; + pixman_region32_init(&tempDamage); + + // Downscale + for (int i = 0; i < blur_passes; ++i) { + wlr_region_scale(&tempDamage, damage, 1.0f / (1 << (i + 1))); + fx_render_blur_segments(renderer, gl_matrix, &tempDamage, ¤t_buffer, + &renderer->shaders.blur1, dst_box, blur_radius); + } + + // Upscale + for (int i = blur_passes - 1; i >= 0; --i) { + // when upsampling we make the region twice as big + wlr_region_scale(&tempDamage, damage, 1.0f / (1 << i)); + fx_render_blur_segments(renderer, gl_matrix, &tempDamage, ¤t_buffer, + &renderer->shaders.blur2, dst_box, blur_radius); + } + + pixman_region32_fini(&tempDamage); +} diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 448fce82..d68878e4 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -206,29 +206,11 @@ struct fx_framebuffer *render_main_buffer_blur(struct sway_output *output, fx_framebuffer_bind(&renderer->effects_buffer); glBindTexture(renderer->main_buffer.texture.target, renderer->main_buffer.texture.id); - // damage region will be scaled, make a temp - pixman_region32_t tempDamage; - pixman_region32_init(&tempDamage); - int blur_radius = config->blur_params.radius; int blur_passes = config->blur_params.num_passes; - // Downscale - for (int i = 0; i < blur_passes; ++i) { - wlr_region_scale(&tempDamage, &damage, 1.0f / (1 << (i + 1))); - fx_render_blur_segments(renderer, gl_matrix, &tempDamage, ¤t_buffer, - &renderer->shaders.blur1, dst_box, blur_radius); - } + fx_render_main_buffer_blur(renderer, gl_matrix, &damage, dst_box, current_buffer, blur_radius, blur_passes); - // Upscale - for (int i = blur_passes - 1; i >= 0; --i) { - // when upsampling we make the region twice as big - wlr_region_scale(&tempDamage, &damage, 1.0f / (1 << i)); - fx_render_blur_segments(renderer, gl_matrix, &tempDamage, ¤t_buffer, - &renderer->shaders.blur2, dst_box, blur_radius); - } - - pixman_region32_fini(&tempDamage); pixman_region32_fini(&damage); // Bind back to the default buffer