summaryrefslogtreecommitdiff
path: root/include/sway/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'include/sway/desktop')
-rw-r--r--include/sway/desktop/fx_renderer/fx_framebuffer.h23
-rw-r--r--include/sway/desktop/fx_renderer/fx_renderer.h44
-rw-r--r--include/sway/desktop/fx_renderer/fx_texture.h18
3 files changed, 80 insertions, 5 deletions
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 <GLES2/gl2.h>
+#include <stdbool.h>
+#include <wlr/types/wlr_output.h>
+
+#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 <GLES2/gl2ext.h>
#include <stdbool.h>
+#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 <GLES2/gl2.h>
+#include <stdbool.h>
+#include <wlr/render/wlr_texture.h>
+
+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