diff options
author | William McKinnon <[email protected]> | 2024-04-15 01:32:22 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2024-04-15 01:32:22 -0400 |
commit | e1f4bc5996b1c77c7fa8536b7c03d9eb4140227d (patch) | |
tree | 3fa8045ca37131acc96c88cec4a2f920de6113fb /include/scenefx | |
parent | 7e723f983b074e62e676caffe21cd5527b524587 (diff) |
feat: add functions required by SwayFX (#35)
Diffstat (limited to 'include/scenefx')
-rw-r--r-- | include/scenefx/fx_renderer/fx_renderer.h | 9 | ||||
-rw-r--r-- | include/scenefx/render/fx_renderer/fx_effect_framebuffers.h | 29 | ||||
-rw-r--r-- | include/scenefx/render/fx_renderer/fx_renderer.h | 108 | ||||
-rw-r--r-- | include/scenefx/render/pass.h | 126 | ||||
-rw-r--r-- | include/scenefx/types/fx/shadow_data.h | 2 |
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); |