diff options
author | William McKinnon <[email protected]> | 2023-09-06 00:32:08 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2023-09-06 00:32:08 -0400 |
commit | 6f6991a1b38b03e87fd3f73607ca2393ae62cfea (patch) | |
tree | fcb05d87a897f167f57142877aa7e2003d32bf82 /sway/desktop/fx_renderer/fx_renderer.c | |
parent | 13eeea5ed5f569eb8a9af329af8a7f6b4b0b114e (diff) |
refactor: simplify blur (#219)
* refactor: removed surface_width + surface_height from render_blur()
* Fixed scaling issues
* Minor refactors
* removed scaled_dst box
* removed uneeded fb bind
* removed unneeded src_box
* removed unneeded wlr_fbox_from_box function
* removed src_box
* Don't scale the blur translucent region twice
* Renamed extended_damage to original_damage to reflect better what it actually is
* Removed unneeded clearing of the wlr fbo before rendering onto it
* Removed the need for our own main FBO, also fixes some damage bugs
* Simplified detection of blur on workspace
* cleaned up comments
---------
Co-authored-by: Erik Reider <[email protected]>
Diffstat (limited to 'sway/desktop/fx_renderer/fx_renderer.c')
-rw-r--r-- | sway/desktop/fx_renderer/fx_renderer.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/sway/desktop/fx_renderer/fx_renderer.c b/sway/desktop/fx_renderer/fx_renderer.c index 81841a04..c0a39716 100644 --- a/sway/desktop/fx_renderer/fx_renderer.c +++ b/sway/desktop/fx_renderer/fx_renderer.c @@ -15,6 +15,8 @@ #include "log.h" #include "sway/desktop/fx_renderer/fx_framebuffer.h" #include "sway/desktop/fx_renderer/fx_renderer.h" +#include "sway/desktop/fx_renderer/fx_stencilbuffer.h" +#include "sway/desktop/fx_renderer/fx_texture.h" #include "sway/desktop/fx_renderer/matrix.h" #include "sway/server.h" @@ -251,12 +253,14 @@ static void load_gl_proc(void *proc_ptr, const char *name) { *(void **)proc_ptr = proc; } -struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) { +struct fx_renderer *fx_renderer_create(struct wlr_egl *egl, struct wlr_output *wlr_output) { struct fx_renderer *renderer = calloc(1, sizeof(struct fx_renderer)); if (renderer == NULL) { return NULL; } + renderer->wlr_output = wlr_output; + // TODO: wlr_egl_make_current or eglMakeCurrent? // TODO: assert instead of conditional statement? if (!eglMakeCurrent(wlr_egl_get_display(egl), EGL_NO_SURFACE, EGL_NO_SURFACE, @@ -265,8 +269,9 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) { return NULL; } - renderer->main_buffer = fx_framebuffer_create(); + renderer->wlr_buffer = fx_framebuffer_create(); renderer->blur_buffer = fx_framebuffer_create(); + renderer->blur_saved_pixels_buffer = fx_framebuffer_create(); renderer->effects_buffer = fx_framebuffer_create(); renderer->effects_buffer_swapped = fx_framebuffer_create(); @@ -385,8 +390,8 @@ error: } void fx_renderer_fini(struct fx_renderer *renderer) { - fx_framebuffer_release(&renderer->main_buffer); fx_framebuffer_release(&renderer->blur_buffer); + fx_framebuffer_release(&renderer->blur_saved_pixels_buffer); fx_framebuffer_release(&renderer->effects_buffer); fx_framebuffer_release(&renderer->effects_buffer_swapped); } @@ -396,32 +401,36 @@ void fx_renderer_begin(struct fx_renderer *renderer, int width, int height) { renderer->viewport_width = width; renderer->viewport_height = height; - // Store the wlr framebuffer - GLint wlr_fb = -1; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &wlr_fb); - if (wlr_fb < 0) { - sway_log(SWAY_ERROR, "Failed to get wlr framebuffer!"); - abort(); - } - renderer->wlr_buffer.fb = wlr_fb; + // Store the wlr FBO + renderer->wlr_buffer.fb = + wlr_gles2_renderer_get_current_fbo(renderer->wlr_output->renderer); + // Get the fx_texture + struct wlr_texture *wlr_texture = wlr_texture_from_buffer( + renderer->wlr_output->renderer, renderer->wlr_output->back_buffer); + renderer->wlr_buffer.texture = fx_texture_from_wlr_texture(wlr_texture); + wlr_texture_destroy(wlr_texture); + // Add the stencil to the wlr fbo + fx_framebuffer_add_stencil_buffer(&renderer->wlr_buffer, width, height); // Create the framebuffers - fx_framebuffer_update(&renderer->main_buffer, width, height); + fx_framebuffer_update(&renderer->blur_saved_pixels_buffer, width, height); fx_framebuffer_update(&renderer->effects_buffer, width, height); fx_framebuffer_update(&renderer->effects_buffer_swapped, width, height); // Add a stencil buffer to the main buffer & bind the main buffer - fx_framebuffer_bind(&renderer->main_buffer); - fx_framebuffer_add_stencil_buffer(&renderer->main_buffer, width, height); + fx_framebuffer_bind(&renderer->wlr_buffer); + + pixman_region32_init(&renderer->blur_padding_region); // refresh projection matrix matrix_projection(renderer->projection, width, height, WL_OUTPUT_TRANSFORM_FLIPPED_180); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); +} - // Bind to our main framebuffer - fx_framebuffer_bind(&renderer->main_buffer); +void fx_renderer_end(struct fx_renderer *renderer) { + pixman_region32_fini(&renderer->blur_padding_region); } void fx_renderer_clear(const float color[static 4]) { |