summaryrefslogtreecommitdiff
path: root/include/scenefx/render/fx_renderer
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/render/fx_renderer
parent7e723f983b074e62e676caffe21cd5527b524587 (diff)
feat: add functions required by SwayFX (#35)
Diffstat (limited to 'include/scenefx/render/fx_renderer')
-rw-r--r--include/scenefx/render/fx_renderer/fx_effect_framebuffers.h29
-rw-r--r--include/scenefx/render/fx_renderer/fx_renderer.h108
2 files changed, 137 insertions, 0 deletions
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