diff options
author | Erik Reider <[email protected]> | 2024-01-02 01:15:34 +0100 |
---|---|---|
committer | Erik Reider <[email protected]> | 2024-01-03 23:49:04 +0100 |
commit | 1a6918f948be034e65c50af8969d090b5e762dc1 (patch) | |
tree | d84116dac67ee8b649534b86c01851fc2956c3b7 | |
parent | 51c7078b9ec413ebd8316501f01ccf769a090f64 (diff) |
Integrated the stencil rb into fx_framebuffer
Every fx_framebuffer will now have a stencil buffer
-rw-r--r-- | include/render/fx_renderer/fx_renderer.h | 4 | ||||
-rw-r--r-- | include/render/fx_renderer/fx_stencilbuffer.h | 20 | ||||
-rw-r--r-- | render/fx_renderer/fx_framebuffer.c | 27 | ||||
-rw-r--r-- | render/fx_renderer/fx_renderer.c | 12 | ||||
-rw-r--r-- | render/fx_renderer/fx_stencilbuffer.c | 50 | ||||
-rw-r--r-- | render/fx_renderer/meson.build | 1 |
6 files changed, 24 insertions, 90 deletions
diff --git a/include/render/fx_renderer/fx_renderer.h b/include/render/fx_renderer/fx_renderer.h index 6483f12..d62d6b4 100644 --- a/include/render/fx_renderer/fx_renderer.h +++ b/include/render/fx_renderer/fx_renderer.h @@ -11,7 +11,6 @@ #include <wlr/util/addon.h> #include <wlr/util/box.h> -#include "render/fx_renderer/fx_stencilbuffer.h" #include "render/fx_renderer/shaders.h" #include "render/pass.h" #include "types/fx/shadow_data.h" @@ -44,6 +43,7 @@ struct fx_framebuffer { EGLImageKHR image; GLuint rbo; GLuint fbo; + GLuint sb; // Stencil struct wlr_addon addon; }; @@ -153,8 +153,6 @@ struct fx_renderer { struct wl_list buffers; // fx_framebuffer.link struct wl_list textures; // fx_texture.link - struct fx_stencilbuffer stencil_buffer; - struct fx_framebuffer *current_buffer; uint32_t viewport_width, viewport_height; }; diff --git a/include/render/fx_renderer/fx_stencilbuffer.h b/include/render/fx_renderer/fx_stencilbuffer.h deleted file mode 100644 index 6909f96..0000000 --- a/include/render/fx_renderer/fx_stencilbuffer.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef FX_STENCILBUFFER_H -#define FX_STENCILBUFFER_H - -#include <GLES2/gl2.h> -#include <stdbool.h> -#include <wlr/render/wlr_texture.h> - -struct fx_stencilbuffer { - GLuint rb; - int width; - int height; -}; - -struct fx_stencilbuffer fx_stencilbuffer_create(void); - -void fx_stencilbuffer_init(struct fx_stencilbuffer *stencil_buffer, int width, int height); - -void fx_stencilbuffer_release(struct fx_stencilbuffer *stencil_buffer); - -#endif diff --git a/render/fx_renderer/fx_framebuffer.c b/render/fx_renderer/fx_framebuffer.c index 3e52f49..fea101b 100644 --- a/render/fx_renderer/fx_framebuffer.c +++ b/render/fx_renderer/fx_framebuffer.c @@ -62,15 +62,32 @@ struct fx_framebuffer *fx_framebuffer_get_or_create(struct fx_renderer *renderer glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, buffer->rbo); GLenum fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - pop_fx_debug(renderer); - if (fb_status != GL_FRAMEBUFFER_COMPLETE) { wlr_log(WLR_ERROR, "Failed to create FBO"); + glBindFramebuffer(GL_FRAMEBUFFER, 0); goto error_image; } + // Init stencil buffer + glGenRenderbuffers(1, &buffer->sb); + glBindRenderbuffer(GL_RENDERBUFFER, buffer->sb); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, + wlr_buffer->width, wlr_buffer->height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, buffer->sb); + fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (fb_status != GL_FRAMEBUFFER_COMPLETE) { + wlr_log(WLR_ERROR, + "Stencil buffer incomplete, couldn't create! (FB status: %i)", + fb_status); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + goto error_stencil; + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + pop_fx_debug(renderer); + wlr_addon_init(&buffer->addon, &wlr_buffer->addons, renderer, &buffer_addon_impl); @@ -81,6 +98,8 @@ struct fx_framebuffer *fx_framebuffer_get_or_create(struct fx_renderer *renderer return buffer; +error_stencil: + glDeleteRenderbuffers(1, &buffer->sb); error_image: wlr_egl_destroy_image(renderer->egl, buffer->image); error_buffer: diff --git a/render/fx_renderer/fx_renderer.c b/render/fx_renderer/fx_renderer.c index 9d3b763..d00b088 100644 --- a/render/fx_renderer/fx_renderer.c +++ b/render/fx_renderer/fx_renderer.c @@ -21,7 +21,6 @@ #include "render/egl.h" #include "render/fx_renderer/fx_renderer.h" -#include "render/fx_renderer/fx_stencilbuffer.h" #include "render/fx_renderer/matrix.h" #include "render/fx_renderer/util.h" #include "render/pixel_format.h" @@ -138,12 +137,6 @@ static bool fx_renderer_begin(struct wlr_renderer *wlr_renderer, uint32_t width, renderer->viewport_width = width; renderer->viewport_height = height; - // Add the stencil to the wlr fbo - fx_stencilbuffer_init(&renderer->stencil_buffer, width, height); - - // Finally bind the main wlr FBO - fx_framebuffer_bind_wlr_fbo(renderer); - // refresh projection matrix matrix_projection(renderer->projection, width, height, WL_OUTPUT_TRANSFORM_FLIPPED_180); @@ -566,8 +559,6 @@ static void fx_renderer_destroy(struct wlr_renderer *wlr_renderer) { fx_texture_destroy(tex); } - fx_stencilbuffer_release(&renderer->stencil_buffer); - push_fx_debug(renderer); glDeleteProgram(renderer->shaders.quad.program); glDeleteProgram(renderer->shaders.tex_rgba.program); @@ -795,9 +786,6 @@ struct wlr_renderer *fx_renderer_create_egl(struct wlr_egl *egl) { renderer->exts_str = exts_str; renderer->drm_fd = -1; - // Create the stencil buffer - renderer->stencil_buffer = fx_stencilbuffer_create(); - wlr_log(WLR_INFO, "Creating scenefx FX renderer"); wlr_log(WLR_INFO, "Using %s", glGetString(GL_VERSION)); wlr_log(WLR_INFO, "GL vendor: %s", glGetString(GL_VENDOR)); diff --git a/render/fx_renderer/fx_stencilbuffer.c b/render/fx_renderer/fx_stencilbuffer.c deleted file mode 100644 index 4f57216..0000000 --- a/render/fx_renderer/fx_stencilbuffer.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <assert.h> -#include <wlr/render/gles2.h> -#include <wlr/util/log.h> - -#include "include/render/fx_renderer/fx_stencilbuffer.h" - -struct fx_stencilbuffer fx_stencilbuffer_create(void) { - return (struct fx_stencilbuffer) { - .rb = -1, - .width = -1, - .height = -1, - }; -} - -void fx_stencilbuffer_init(struct fx_stencilbuffer *stencil_buffer, int width, int height) { - bool first_alloc = false; - - if (stencil_buffer->rb == (uint32_t) -1) { - glGenRenderbuffers(1, &stencil_buffer->rb); - first_alloc = true; - } - - if (first_alloc || stencil_buffer->width != width || stencil_buffer->height != height) { - glBindRenderbuffer(GL_RENDERBUFFER, stencil_buffer->rb); - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); - stencil_buffer->width = width; - stencil_buffer->height = height; - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - wlr_log(WLR_ERROR, - "Stencil buffer incomplete, couldn't create! (FB status: %i)", - status); - return; - } - } - - // Reattach the RenderBuffer to the FrameBuffer - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, stencil_buffer->rb); -} - -void fx_stencilbuffer_release(struct fx_stencilbuffer *stencil_buffer) { - if (stencil_buffer->rb != (uint32_t) -1 && stencil_buffer->rb) { - glDeleteRenderbuffers(1, &stencil_buffer->rb); - } - stencil_buffer->rb = -1; - stencil_buffer->width = -1; - stencil_buffer->height = -1; -} diff --git a/render/fx_renderer/meson.build b/render/fx_renderer/meson.build index ef5521f..6f16dea 100644 --- a/render/fx_renderer/meson.build +++ b/render/fx_renderer/meson.build @@ -12,7 +12,6 @@ wlr_files += files( 'pixel_format.c', 'fx_pass.c', 'fx_framebuffer.c', - 'fx_stencilbuffer.c', 'fx_texture.c', 'fx_renderer.c', ) |