summaryrefslogtreecommitdiff
path: root/include/scenefx
diff options
context:
space:
mode:
authorWilliam McKinnon <[email protected]>2024-04-15 01:32:22 -0400
committerGitHub <[email protected]>2024-04-15 01:32:22 -0400
commite1f4bc5996b1c77c7fa8536b7c03d9eb4140227d (patch)
tree3fa8045ca37131acc96c88cec4a2f920de6113fb /include/scenefx
parent7e723f983b074e62e676caffe21cd5527b524587 (diff)
feat: add functions required by SwayFX (#35)
Diffstat (limited to 'include/scenefx')
-rw-r--r--include/scenefx/fx_renderer/fx_renderer.h9
-rw-r--r--include/scenefx/render/fx_renderer/fx_effect_framebuffers.h29
-rw-r--r--include/scenefx/render/fx_renderer/fx_renderer.h108
-rw-r--r--include/scenefx/render/pass.h126
-rw-r--r--include/scenefx/types/fx/shadow_data.h2
5 files changed, 265 insertions, 9 deletions
diff --git a/include/scenefx/fx_renderer/fx_renderer.h b/include/scenefx/fx_renderer/fx_renderer.h
deleted file mode 100644
index 2e64ffb..0000000
--- a/include/scenefx/fx_renderer/fx_renderer.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef SCENEFX_FX_OPENGL_H
-#define SCENEFX_FX_OPENGL_H
-
-#include <wlr/backend.h>
-
-struct wlr_renderer *fx_renderer_create_with_drm_fd(int drm_fd);
-struct wlr_renderer *fx_renderer_create(struct wlr_backend *backend);
-
-#endif
diff --git a/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h b/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h
new file mode 100644
index 0000000..566884a
--- /dev/null
+++ b/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h
@@ -0,0 +1,29 @@
+#ifndef _FX_EFFECT_FRAMEBUFFERS_H
+#define _FX_EFFECT_FRAMEBUFFERS_H
+
+#include <wlr/types/wlr_output.h>
+#include <wlr/util/addon.h>
+
+/**
+ * Used to add effect framebuffers per output instead of every output sharing
+ * them.
+ */
+struct fx_effect_framebuffers {
+ struct wlr_addon addon;
+
+ // Contains the blurred background for tiled windows
+ struct fx_framebuffer *optimized_blur_buffer;
+ // Contains the original pixels to draw over the areas where artifact are visible
+ struct fx_framebuffer *blur_saved_pixels_buffer;
+ // Blur swaps between the two effects buffers everytime it scales the image
+ // Buffer used for effects
+ struct fx_framebuffer *effects_buffer;
+ // Swap buffer used for effects
+ struct fx_framebuffer *effects_buffer_swapped;
+
+ bool blur_buffer_dirty;
+};
+
+struct fx_effect_framebuffers *fx_effect_framebuffers_try_get(struct wlr_output *output);
+
+#endif
diff --git a/include/scenefx/render/fx_renderer/fx_renderer.h b/include/scenefx/render/fx_renderer/fx_renderer.h
new file mode 100644
index 0000000..9c7839f
--- /dev/null
+++ b/include/scenefx/render/fx_renderer/fx_renderer.h
@@ -0,0 +1,108 @@
+#ifndef SCENEFX_FX_OPENGL_H
+#define SCENEFX_FX_OPENGL_H
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <wlr/backend.h>
+#include <wlr/render/interface.h>
+#include <wlr/types/wlr_buffer.h>
+
+#include "render/fx_renderer/shaders.h"
+
+struct wlr_renderer *fx_renderer_create_with_drm_fd(int drm_fd);
+struct wlr_renderer *fx_renderer_create(struct wlr_backend *backend);
+
+struct fx_renderer *fx_get_renderer(
+ struct wlr_renderer *wlr_renderer);
+
+//
+// fx_texture
+//
+
+struct fx_texture_attribs {
+ GLenum target; /* either GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES */
+ GLuint tex;
+
+ bool has_alpha;
+};
+
+///
+/// fx_renderer
+///
+
+// TODO: make this private
+struct fx_renderer {
+ struct wlr_renderer wlr_renderer;
+
+ float projection[9];
+ struct wlr_egl *egl;
+ int drm_fd;
+
+ const char *exts_str;
+ struct {
+ bool EXT_read_format_bgra;
+ bool KHR_debug;
+ bool OES_egl_image_external;
+ bool OES_egl_image;
+ bool EXT_texture_type_2_10_10_10_REV;
+ bool OES_texture_half_float_linear;
+ bool EXT_texture_norm16;
+ bool EXT_disjoint_timer_query;
+ } exts;
+
+ struct {
+ PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
+ PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR;
+ PFNGLDEBUGMESSAGECONTROLKHRPROC glDebugMessageControlKHR;
+ PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR;
+ PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR;
+ PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES;
+ PFNGLGETGRAPHICSRESETSTATUSKHRPROC glGetGraphicsResetStatusKHR;
+ PFNGLGENQUERIESEXTPROC glGenQueriesEXT;
+ PFNGLDELETEQUERIESEXTPROC glDeleteQueriesEXT;
+ PFNGLQUERYCOUNTEREXTPROC glQueryCounterEXT;
+ PFNGLGETQUERYOBJECTIVEXTPROC glGetQueryObjectivEXT;
+ PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64vEXT;
+ PFNGLGETINTEGER64VEXTPROC glGetInteger64vEXT;
+ } procs;
+
+ struct {
+ struct quad_shader quad;
+ struct quad_round_shader quad_round;
+ struct quad_round_shader quad_round_tl;
+ struct quad_round_shader quad_round_tr;
+ struct quad_round_shader quad_round_bl;
+ struct quad_round_shader quad_round_br;
+ struct tex_shader tex_rgba;
+ struct tex_shader tex_rgbx;
+ struct tex_shader tex_ext;
+ struct box_shadow_shader box_shadow;
+ struct rounded_border_corner_shader rounded_border_corner;
+ struct stencil_mask_shader stencil_mask;
+ struct blur_shader blur1;
+ struct blur_shader blur2;
+ struct blur_effects_shader blur_effects;
+ } shaders;
+
+ struct wl_list buffers; // fx_framebuffer.link
+ struct wl_list textures; // fx_texture.link
+
+ struct fx_framebuffer *current_buffer;
+ uint32_t viewport_width, viewport_height;
+
+ // Set to true when 'wlr_renderer_begin_buffer_pass' is called instead of
+ // our custom 'fx_renderer_begin_buffer_pass' function
+ bool basic_renderer;
+
+ // The region where there's blur
+ pixman_region32_t blur_padding_region;
+};
+
+
+struct wlr_texture *fx_texture_from_buffer(struct wlr_renderer *wlr_renderer,
+ struct wlr_buffer *buffer);
+
+void fx_texture_get_attribs(struct wlr_texture *texture,
+ struct fx_texture_attribs *attribs);
+
+#endif
diff --git a/include/scenefx/render/pass.h b/include/scenefx/render/pass.h
new file mode 100644
index 0000000..d005c37
--- /dev/null
+++ b/include/scenefx/render/pass.h
@@ -0,0 +1,126 @@
+#ifndef SCENE_FX_RENDER_PASS_H
+#define SCENE_FX_RENDER_PASS_H
+
+#include <stdbool.h>
+#include <wlr/render/pass.h>
+#include <wlr/render/interface.h>
+#include "scenefx/types/fx/shadow_data.h"
+
+struct fx_gles_render_pass {
+ struct wlr_render_pass base;
+ struct fx_framebuffer *buffer;
+ struct fx_effect_framebuffers *fx_effect_framebuffers;
+ struct wlr_output *output;
+ float projection_matrix[9];
+ struct fx_render_timer *timer;
+};
+
+enum corner_location { TOP_LEFT, TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, ALL };
+
+/**
+ * Begin a new render pass with the supplied destination buffer.
+ *
+ * Callers must call wlr_render_pass_submit() once they are done with the
+ * render pass.
+ */
+struct fx_gles_render_pass *fx_renderer_begin_buffer_pass(struct wlr_renderer *wlr_renderer,
+ struct wlr_buffer *wlr_buffer, struct wlr_output *output,
+ const struct wlr_buffer_pass_options *options);
+
+struct fx_render_texture_options {
+ struct wlr_render_texture_options base;
+ const struct wlr_box *clip_box; // Used to clip csd. Ignored if NULL
+ int corner_radius;
+ bool has_titlebar;
+ bool discard_transparent;
+ float dim;
+ struct wlr_render_color dim_color;
+};
+
+struct fx_render_rect_options {
+ struct wlr_render_rect_options base;
+ // TODO: Add effects here in the future
+};
+
+struct fx_render_box_shadow_options {
+ struct wlr_box shadow_box;
+ struct wlr_box clip_box;
+ /* Clip region, leave NULL to disable clipping */
+ const pixman_region32_t *clip;
+
+ struct shadow_data *shadow_data;
+ int corner_radius;
+};
+
+struct fx_render_rounded_rect_options {
+ struct wlr_render_rect_options base;
+ int corner_radius;
+ enum corner_location corner_location;
+};
+
+struct fx_render_rounded_border_corner_options {
+ struct wlr_render_rect_options base;
+ int corner_radius;
+ int border_thickness;
+ enum corner_location corner_location;
+};
+
+struct fx_render_blur_pass_options {
+ struct fx_render_texture_options tex_options;
+ pixman_region32_t *opaque_region;
+ struct fx_framebuffer *current_buffer;
+ struct blur_data *blur_data;
+ bool use_optimized_blur;
+ bool ignore_transparent;
+};
+
+/**
+ * Render a fx texture.
+ */
+void fx_render_pass_add_texture(struct fx_gles_render_pass *render_pass,
+ const struct fx_render_texture_options *options);
+
+/**
+ * Render a rectangle.
+ */
+void fx_render_pass_add_rect(struct fx_gles_render_pass *render_pass,
+ const struct fx_render_rect_options *options);
+
+/**
+ * Render a rounded rectangle.
+ */
+void fx_render_pass_add_rounded_rect(struct fx_gles_render_pass *render_pass,
+ const struct fx_render_rounded_rect_options *options);
+
+/**
+ * Render a border corner.
+ */
+void fx_render_pass_add_rounded_border_corner(struct fx_gles_render_pass *render_pass,
+ const struct fx_render_rounded_border_corner_options *options);
+
+/**
+ * Render a box shadow.
+ */
+void fx_render_pass_add_box_shadow(struct fx_gles_render_pass *pass,
+ const struct fx_render_box_shadow_options *options);
+
+/**
+ * Render blur.
+ */
+void fx_render_pass_add_blur(struct fx_gles_render_pass *pass,
+ struct fx_render_blur_pass_options *fx_options);
+
+/**
+ * Render optimized blur.
+ */
+void fx_render_pass_add_optimized_blur(struct fx_gles_render_pass *pass,
+ struct fx_render_blur_pass_options *fx_options);
+
+/**
+ * Render from one buffer to another
+ */
+void fx_renderer_read_to_buffer(struct fx_gles_render_pass *pass,
+ pixman_region32_t *region, struct fx_framebuffer *dst_buffer,
+ struct fx_framebuffer *src_buffer, bool transformed_region);
+
+#endif
diff --git a/include/scenefx/types/fx/shadow_data.h b/include/scenefx/types/fx/shadow_data.h
index d96a084..c307871 100644
--- a/include/scenefx/types/fx/shadow_data.h
+++ b/include/scenefx/types/fx/shadow_data.h
@@ -9,6 +9,8 @@ struct shadow_data {
bool enabled;
struct wlr_render_color color;
float blur_sigma;
+ float offset_x;
+ float offset_y;
};
struct shadow_data shadow_data_get_default(void);