From 5ffa10eede8580e262e855c3f7e4761f3e807877 Mon Sep 17 00:00:00 2001 From: William McKinnon Date: Wed, 26 Jul 2023 00:58:20 -0400 Subject: [PATCH] moved more into fx_renderer --- .../sway/desktop/fx_renderer/fx_renderer.h | 3 +- sway/desktop/fx_renderer/fx_renderer.c | 41 +++++++++++-------- sway/desktop/render.c | 12 +----- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/include/sway/desktop/fx_renderer/fx_renderer.h b/include/sway/desktop/fx_renderer/fx_renderer.h index 964cef3e..624bd030 100644 --- a/include/sway/desktop/fx_renderer/fx_renderer.h +++ b/include/sway/desktop/fx_renderer/fx_renderer.h @@ -189,5 +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_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); +struct fx_framebuffer *fx_render_main_buffer_blur(struct fx_renderer *renderer, const float matrix[static 9], + pixman_region32_t *damage, const struct wlr_box *dst_box, 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 1ea5232f..bfe4a7ae 100644 --- a/sway/desktop/fx_renderer/fx_renderer.c +++ b/sway/desktop/fx_renderer/fx_renderer.c @@ -809,11 +809,8 @@ void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *bo glDisable(GL_STENCIL_TEST); } -void fx_render_blur_pass(struct fx_renderer *renderer, const float matrix[static 9], +void fx_render_blur_pass(struct fx_renderer *renderer, const float gl_matrix[static 9], struct blur_shader *shader, const struct wlr_box *box, int blur_radius, struct fx_framebuffer **buffer) { - glDisable(GL_BLEND); - glDisable(GL_STENCIL_TEST); - glActiveTexture(GL_TEXTURE0); glBindTexture((*buffer)->texture.target, (*buffer)->texture.id); @@ -824,8 +821,6 @@ void fx_render_blur_pass(struct fx_renderer *renderer, const float matrix[static // OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set // to GL_FALSE - float gl_matrix[9]; - wlr_matrix_transpose(gl_matrix, matrix); glUniformMatrix3fv(shader->proj, 1, GL_FALSE, gl_matrix); glUniform1i(shader->tex, 0); @@ -849,7 +844,7 @@ void fx_render_blur_pass(struct fx_renderer *renderer, const float matrix[static glDisableVertexAttribArray(shader->tex_attrib); } -void fx_render_blur_segments(struct fx_renderer *renderer, const float matrix[static 9], +void fx_render_blur_segments(struct fx_renderer *renderer, const float gl_matrix[static 9], pixman_region32_t *damage, struct fx_framebuffer **buffer, struct blur_shader* shader, const struct wlr_box *box, int blur_radius) { if (*buffer == &renderer->effects_buffer) { @@ -865,7 +860,7 @@ void fx_render_blur_segments(struct fx_renderer *renderer, const float matrix[st const pixman_box32_t box = rects[i]; struct wlr_box new_box = { box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1 }; fx_renderer_scissor(&new_box); - fx_render_blur_pass(renderer, matrix, shader, &new_box, blur_radius, buffer); + fx_render_blur_pass(renderer, gl_matrix, shader, &new_box, blur_radius, buffer); } } @@ -876,34 +871,44 @@ void fx_render_blur_segments(struct fx_renderer *renderer, const float matrix[st } } -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) { +struct fx_framebuffer *fx_render_main_buffer_blur(struct fx_renderer *renderer, const float matrix[static 9], + pixman_region32_t *damage, const struct wlr_box *dst_box, int blur_radius, int blur_passes) { + glDisable(GL_BLEND); + glDisable(GL_STENCIL_TEST); + + struct fx_framebuffer *current_buffer = &renderer->main_buffer; + // Bind to blur framebuffer fx_framebuffer_bind(&renderer->effects_buffer); glBindTexture(renderer->main_buffer.texture.target, renderer->main_buffer.texture.id); + float gl_matrix[9]; + wlr_matrix_multiply(gl_matrix, renderer->projection, matrix); + wlr_matrix_transpose(gl_matrix, gl_matrix); + // damage region will be scaled, make a temp - pixman_region32_t tempDamage; - pixman_region32_init(&tempDamage); + pixman_region32_t temp_damage; + pixman_region32_init(&temp_damage); // 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, current_buffer, + wlr_region_scale(&temp_damage, damage, 1.0f / (1 << (i + 1))); + fx_render_blur_segments(renderer, gl_matrix, &temp_damage, ¤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, current_buffer, + wlr_region_scale(&temp_damage, damage, 1.0f / (1 << i)); + fx_render_blur_segments(renderer, gl_matrix, &temp_damage, ¤t_buffer, &renderer->shaders.blur2, dst_box, blur_radius); } - pixman_region32_fini(&tempDamage); + pixman_region32_fini(&temp_damage); // Bind back to the default buffer fx_framebuffer_bind(&renderer->main_buffer); + + return current_buffer; } diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 79ca742c..edc80288 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -189,22 +189,14 @@ struct fx_framebuffer *render_main_buffer_blur(struct sway_output *output, float matrix[9]; wlr_matrix_project_box(matrix, &monitor_box, transform, 0, wlr_output->transform_matrix); - float gl_matrix[9]; - wlr_matrix_multiply(gl_matrix, renderer->projection, matrix); - pixman_region32_t damage; pixman_region32_init(&damage); pixman_region32_copy(&damage, original_damage); wlr_region_transform(&damage, &damage, transform, monitor_box.width, monitor_box.height); - wlr_region_expand(&damage, &damage, config_get_blur_size()); - // Initially blur main_buffer content into the effects_buffers - struct fx_framebuffer *current_buffer = &renderer->main_buffer; - - int blur_radius = config->blur_params.radius; - int blur_passes = config->blur_params.num_passes; - fx_render_main_buffer_blur(renderer, gl_matrix, &damage, dst_box, ¤t_buffer, blur_radius, blur_passes); + struct fx_framebuffer *current_buffer = fx_render_main_buffer_blur(renderer, matrix, &damage, + dst_box, config->blur_params.radius, config->blur_params.num_passes); pixman_region32_fini(&damage);