From b5e6014dddb8f084a1cad0b7ee35f9ab24dd457c Mon Sep 17 00:00:00 2001 From: Erik Reider <35975961+ErikReider@users.noreply.github.com> Date: Wed, 17 Apr 2024 09:44:16 +0200 Subject: Made fx_renderer private (#39) --- include/render/fx_renderer/fx_renderer.h | 70 ++++++++++++++++++++ .../render/fx_renderer/fx_effect_framebuffers.h | 3 + include/scenefx/render/fx_renderer/fx_renderer.h | 75 +--------------------- render/fx_renderer/fx_pass.c | 23 +++---- render/fx_renderer/fx_renderer.c | 6 +- 5 files changed, 88 insertions(+), 89 deletions(-) diff --git a/include/render/fx_renderer/fx_renderer.h b/include/render/fx_renderer/fx_renderer.h index 1028038..cdfb4c8 100644 --- a/include/render/fx_renderer/fx_renderer.h +++ b/include/render/fx_renderer/fx_renderer.h @@ -11,6 +11,8 @@ #include #include +#include "render/fx_renderer/shaders.h" + struct fx_pixel_format { uint32_t drm_format; // optional field, if empty then internalformat = format @@ -118,4 +120,72 @@ struct fx_render_timer { bool wlr_render_timer_is_fx(struct wlr_render_timer *timer); +/// +/// fx_renderer +/// + +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; +}; + #endif diff --git a/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h b/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h index 566884a..2a11a21 100644 --- a/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h +++ b/include/scenefx/render/fx_renderer/fx_effect_framebuffers.h @@ -22,6 +22,9 @@ struct fx_effect_framebuffers { struct fx_framebuffer *effects_buffer_swapped; bool blur_buffer_dirty; + + // The region where there's blur + pixman_region32_t blur_padding_region; }; struct fx_effect_framebuffers *fx_effect_framebuffers_try_get(struct wlr_output *output); diff --git a/include/scenefx/render/fx_renderer/fx_renderer.h b/include/scenefx/render/fx_renderer/fx_renderer.h index 9c7839f..5529f0e 100644 --- a/include/scenefx/render/fx_renderer/fx_renderer.h +++ b/include/scenefx/render/fx_renderer/fx_renderer.h @@ -7,7 +7,7 @@ #include #include -#include "render/fx_renderer/shaders.h" +struct fx_renderer; struct wlr_renderer *fx_renderer_create_with_drm_fd(int drm_fd); struct wlr_renderer *fx_renderer_create(struct wlr_backend *backend); @@ -26,79 +26,6 @@ struct fx_texture_attribs { 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); diff --git a/render/fx_renderer/fx_pass.c b/render/fx_renderer/fx_pass.c index f3a9485..9a27de1 100644 --- a/render/fx_renderer/fx_pass.c +++ b/render/fx_renderer/fx_pass.c @@ -84,10 +84,12 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { pop_fx_debug(renderer); wlr_buffer_unlock(pass->buffer->buffer); + if (pass->output) { + struct fx_effect_framebuffers *fbos = fx_effect_framebuffers_try_get(pass->output); + pixman_region32_fini(&fbos->blur_padding_region); + } free(pass); - pixman_region32_fini(&renderer->blur_padding_region); - return true; } @@ -961,6 +963,8 @@ 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_renderer *renderer = fx_get_renderer(wlr_renderer); + assert(output); + renderer->basic_renderer = false; if (!wlr_egl_make_current(renderer->egl)) { return NULL; @@ -977,17 +981,14 @@ struct fx_gles_render_pass *fx_renderer_begin_buffer_pass( return NULL; } - // Update the buffers if needed - struct fx_effect_framebuffers *fbos = NULL; // For per output framebuffers - if (output) { - fbos = fx_effect_framebuffers_try_get(output); - fx_framebuffer_get_or_create_custom(renderer, output, &fbos->blur_saved_pixels_buffer); - fx_framebuffer_get_or_create_custom(renderer, output, &fbos->effects_buffer); - fx_framebuffer_get_or_create_custom(renderer, output, &fbos->effects_buffer_swapped); - } + struct fx_effect_framebuffers *fbos = fx_effect_framebuffers_try_get(output); + // Update the buffers if needed + fx_framebuffer_get_or_create_custom(renderer, output, &fbos->blur_saved_pixels_buffer); + fx_framebuffer_get_or_create_custom(renderer, output, &fbos->effects_buffer); + fx_framebuffer_get_or_create_custom(renderer, output, &fbos->effects_buffer_swapped); - pixman_region32_init(&renderer->blur_padding_region); + pixman_region32_init(&fbos->blur_padding_region); struct fx_gles_render_pass *pass = begin_buffer_pass(buffer, timer); if (!pass) { diff --git a/render/fx_renderer/fx_renderer.c b/render/fx_renderer/fx_renderer.c index 0b9e1a4..b089b4e 100644 --- a/render/fx_renderer/fx_renderer.c +++ b/render/fx_renderer/fx_renderer.c @@ -119,6 +119,7 @@ static const char *reset_status_str(GLenum status) { } } +// TODO: Deprecate all older rendering functions? static bool fx_renderer_begin(struct wlr_renderer *wlr_renderer, uint32_t width, uint32_t height) { struct fx_renderer *renderer = @@ -140,8 +141,6 @@ static bool fx_renderer_begin(struct wlr_renderer *wlr_renderer, uint32_t width, renderer->viewport_width = width; renderer->viewport_height = height; - pixman_region32_init(&renderer->blur_padding_region); - // refresh projection matrix matrix_projection(renderer->projection, width, height, WL_OUTPUT_TRANSFORM_FLIPPED_180); @@ -157,8 +156,7 @@ static bool fx_renderer_begin(struct wlr_renderer *wlr_renderer, uint32_t width, } static void fx_renderer_end(struct wlr_renderer *wlr_renderer) { - struct fx_renderer *renderer = fx_get_renderer_in_context(wlr_renderer); - pixman_region32_fini(&renderer->blur_padding_region); + // no-op } static void fx_renderer_clear(struct wlr_renderer *wlr_renderer, -- cgit v1.2.3