From cbfb7af7fd4728f993124e81f8666a2e8cee6085 Mon Sep 17 00:00:00 2001 From: Erik Reider <35975961+ErikReider@users.noreply.github.com> Date: Mon, 17 Apr 2023 23:24:48 +0200 Subject: Add kawase blur (#120) Co-authored-by: Erik Reider Co-authored-by: Will McKinnon --- include/sway/desktop/fx_renderer/fx_framebuffer.h | 23 ++++++++++++ include/sway/desktop/fx_renderer/fx_renderer.h | 44 ++++++++++++++++++++--- include/sway/desktop/fx_renderer/fx_texture.h | 18 ++++++++++ 3 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 include/sway/desktop/fx_renderer/fx_framebuffer.h create mode 100644 include/sway/desktop/fx_renderer/fx_texture.h (limited to 'include/sway/desktop/fx_renderer') diff --git a/include/sway/desktop/fx_renderer/fx_framebuffer.h b/include/sway/desktop/fx_renderer/fx_framebuffer.h new file mode 100644 index 00000000..965c1def --- /dev/null +++ b/include/sway/desktop/fx_renderer/fx_framebuffer.h @@ -0,0 +1,23 @@ +#ifndef FX_FRAMEBUFFER_H +#define FX_FRAMEBUFFER_H + +#include +#include +#include + +#include "sway/desktop/fx_renderer/fx_texture.h" + +struct fx_framebuffer { + struct fx_texture texture; + GLuint fb; +}; + +void fx_framebuffer_bind(struct fx_framebuffer *buffer, GLsizei width, GLsizei height); + +void fx_framebuffer_create(struct wlr_output *output, struct fx_framebuffer *buffer, + bool bind); + +void fx_framebuffer_release(struct fx_framebuffer *buffer); + + +#endif diff --git a/include/sway/desktop/fx_renderer/fx_renderer.h b/include/sway/desktop/fx_renderer/fx_renderer.h index a48a00e1..37887d30 100644 --- a/include/sway/desktop/fx_renderer/fx_renderer.h +++ b/include/sway/desktop/fx_renderer/fx_renderer.h @@ -5,6 +5,9 @@ #include #include +#include "sway/desktop/fx_renderer/fx_framebuffer.h" +#include "sway/desktop/fx_renderer/fx_texture.h" + enum corner_location { ALL, TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, NONE }; enum fx_tex_shader_source { @@ -24,8 +27,9 @@ struct decoration_data { float saturation; int corner_radius; float dim; - float* dim_color; + float *dim_color; bool has_titlebar; + bool blur; }; struct gles2_tex_shader { @@ -54,13 +58,34 @@ struct rounded_quad_shader { GLint radius; }; +struct blur_shader { + GLuint program; + GLint proj; + GLint tex; + GLint pos_attrib; + GLint tex_attrib; + GLint radius; + GLint halfpixel; +}; + struct fx_renderer { struct wlr_egl *egl; float projection[9]; + struct sway_output *sway_output; + GLuint stencil_buffer_id; + struct fx_framebuffer wlr_buffer; // Just the framebuffer used by wlroots + struct fx_framebuffer main_buffer; // The main FB used for rendering + struct fx_framebuffer blur_buffer; // Contains the blurred background for tiled windows + // Blur swaps between the two effects buffers everytime it scales the image + struct fx_framebuffer effects_buffer; // Buffer used for effects + struct fx_framebuffer effects_buffer_swapped; // Swap buffer used for effects + + bool blur_buffer_dirty; + struct { bool OES_egl_image_external; } exts; @@ -83,6 +108,9 @@ struct fx_renderer { struct rounded_quad_shader rounded_tl_quad; struct rounded_quad_shader rounded_tr_quad; + struct blur_shader blur1; + struct blur_shader blur2; + struct { GLuint program; GLint proj; @@ -117,19 +145,21 @@ struct fx_renderer { struct fx_renderer *fx_renderer_create(struct wlr_egl *egl); -void fx_renderer_begin(struct fx_renderer *renderer, uint32_t width, uint32_t height); +void fx_renderer_fini(struct fx_renderer *renderer); + +void fx_renderer_begin(struct fx_renderer *renderer, struct sway_output *output); -void fx_renderer_end(); +void fx_renderer_end(struct fx_renderer *renderer); void fx_renderer_clear(const float color[static 4]); void fx_renderer_scissor(struct wlr_box *box); -bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer, struct wlr_texture *wlr_texture, +bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer, struct fx_texture *fx_texture, const struct wlr_fbox *src_box, const struct wlr_box *dst_box, const float matrix[static 9], struct decoration_data deco_data); -bool fx_render_texture_with_matrix(struct fx_renderer *renderer, struct wlr_texture *wlr_texture, +bool fx_render_texture_with_matrix(struct fx_renderer *renderer, struct fx_texture *fx_texture, const struct wlr_box *dst_box, const float matrix[static 9], struct decoration_data deco_data); void fx_render_rect(struct fx_renderer *renderer, const struct wlr_box *box, @@ -146,4 +176,8 @@ void fx_render_border_corner(struct fx_renderer *renderer, const struct wlr_box void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *box, const float color[static 4], const float projection[static 9], int radius, float blur_sigma); +void fx_render_blur(struct fx_renderer *renderer, struct sway_output *output, + const float matrix[static 9], struct fx_framebuffer **buffer, + struct blur_shader *shader, const struct wlr_box *box, int blur_radius); + #endif diff --git a/include/sway/desktop/fx_renderer/fx_texture.h b/include/sway/desktop/fx_renderer/fx_texture.h new file mode 100644 index 00000000..0c375913 --- /dev/null +++ b/include/sway/desktop/fx_renderer/fx_texture.h @@ -0,0 +1,18 @@ +#ifndef FX_TEXTURE_H +#define FX_TEXTURE_H + +#include +#include +#include + +struct fx_texture { + GLuint target; + GLuint id; + bool has_alpha; + int width; + int height; +}; + +struct fx_texture fx_texture_from_wlr_texture(struct wlr_texture* tex); + +#endif -- cgit v1.2.3