From a7ea20b4776f4bac0ae95c8fbfb464fb77fccde6 Mon Sep 17 00:00:00 2001 From: Erik Reider Date: Sat, 29 Apr 2023 19:17:37 +0200 Subject: [PATCH] Moved the stencil buffer into fx_framebuffer --- .../sway/desktop/fx_renderer/fx_framebuffer.h | 4 +- .../sway/desktop/fx_renderer/fx_renderer.h | 2 - sway/desktop/fx_renderer/fx_framebuffer.c | 25 +++++++++++- sway/desktop/fx_renderer/fx_renderer.c | 38 ++++--------------- sway/desktop/render.c | 3 +- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/include/sway/desktop/fx_renderer/fx_framebuffer.h b/include/sway/desktop/fx_renderer/fx_framebuffer.h index 289b4d87..a965a933 100644 --- a/include/sway/desktop/fx_renderer/fx_framebuffer.h +++ b/include/sway/desktop/fx_renderer/fx_framebuffer.h @@ -10,11 +10,13 @@ struct fx_framebuffer { struct fx_texture texture; GLuint fb; + GLuint stencil_buffer; }; void fx_framebuffer_bind(struct fx_framebuffer *buffer); -void fx_framebuffer_create(struct fx_framebuffer *buffer, int width, int height, bool bind); +void fx_framebuffer_create(struct fx_framebuffer *buffer, int width, int height, + bool bind, bool create_stencil_buffer); void fx_framebuffer_release(struct fx_framebuffer *buffer); diff --git a/include/sway/desktop/fx_renderer/fx_renderer.h b/include/sway/desktop/fx_renderer/fx_renderer.h index b03db984..44e0429c 100644 --- a/include/sway/desktop/fx_renderer/fx_renderer.h +++ b/include/sway/desktop/fx_renderer/fx_renderer.h @@ -84,8 +84,6 @@ struct fx_renderer { int viewport_width, viewport_height; - GLuint stencil_buffer_id; - struct fx_framebuffer wlr_buffer; // Just the framebuffer used by wlroots struct fx_framebuffer main_buffer; // The main FB used for rendering struct fx_framebuffer blur_buffer; // Contains the blurred background for tiled windows diff --git a/sway/desktop/fx_renderer/fx_framebuffer.c b/sway/desktop/fx_renderer/fx_framebuffer.c index 6cc1dbf3..56dbf58f 100644 --- a/sway/desktop/fx_renderer/fx_framebuffer.c +++ b/sway/desktop/fx_renderer/fx_framebuffer.c @@ -5,7 +5,8 @@ void fx_framebuffer_bind(struct fx_framebuffer *buffer) { glBindFramebuffer(GL_FRAMEBUFFER, buffer->fb); } -void fx_framebuffer_create(struct fx_framebuffer *buffer, int width, int height, bool bind) { +void fx_framebuffer_create(struct fx_framebuffer *buffer, int width, int height, + bool bind, bool create_stencil_buffer) { bool firstAlloc = false; // Create a new framebuffer @@ -44,6 +45,19 @@ void fx_framebuffer_create(struct fx_framebuffer *buffer, int width, int height, sway_log(SWAY_DEBUG, "Framebuffer created, status %i", status); } + if (create_stencil_buffer && buffer->stencil_buffer == (uint32_t) -1) { + glGenRenderbuffers(1, &buffer->stencil_buffer); + glBindRenderbuffer(GL_RENDERBUFFER, buffer->stencil_buffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, buffer->stencil_buffer); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + sway_log(SWAY_ERROR, "Stencilbuffer incomplete, couldn't create! (FB status: %i)", status); + return; + } + sway_log(SWAY_DEBUG, "Stencilbuffer created, status %i", status); + } + // Bind the default framebuffer glBindTexture(GL_TEXTURE_2D, 0); if (bind) { @@ -52,11 +66,20 @@ void fx_framebuffer_create(struct fx_framebuffer *buffer, int width, int height, } void fx_framebuffer_release(struct fx_framebuffer *buffer) { + // Release the framebuffer if (buffer->fb != (uint32_t) -1 && buffer->fb) { glDeleteFramebuffers(1, &buffer->fb); } buffer->fb= -1; + // Release the stencil buffer + if (buffer->stencil_buffer != (uint32_t)-1 && buffer->stencil_buffer) { + glDeleteRenderbuffers(1, &buffer->stencil_buffer); + } + buffer->stencil_buffer = -1; + + + // Release the texture if (buffer->texture.id) { glDeleteTextures(1, &buffer->texture.id); } diff --git a/sway/desktop/fx_renderer/fx_renderer.c b/sway/desktop/fx_renderer/fx_renderer.c index 2dc9a939..f1bc1b6b 100644 --- a/sway/desktop/fx_renderer/fx_renderer.c +++ b/sway/desktop/fx_renderer/fx_renderer.c @@ -34,30 +34,6 @@ static const GLfloat verts[] = { 0, 1, // bottom left }; -static void create_stencil_buffer(GLuint *buffer_id, int width, int height) { - if (*buffer_id != (uint32_t) -1) { - return; - } - - glGenRenderbuffers(1, buffer_id); - glBindRenderbuffer(GL_RENDERBUFFER, *buffer_id); - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, *buffer_id); - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - sway_log(SWAY_ERROR, "Stencilbuffer incomplete, couldn't create! (FB status: %i)", status); - return; - } - sway_log(SWAY_DEBUG, "Stencilbuffer created, status %i", status); -} - -static void release_stencil_buffer(GLuint *buffer_id) { - if (*buffer_id != (uint32_t)-1 && buffer_id) { - glDeleteRenderbuffers(1, buffer_id); - } - *buffer_id = -1; -} - static GLuint compile_shader(GLuint type, const GLchar *src) { GLuint shader = glCreateShader(type); glShaderSource(shader, 1, &src, NULL); @@ -203,11 +179,14 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) { } renderer->main_buffer.fb = -1; + renderer->main_buffer.stencil_buffer = -1; renderer->blur_buffer.fb = -1; + renderer->blur_buffer.stencil_buffer = -1; renderer->effects_buffer.fb = -1; + renderer->effects_buffer.stencil_buffer = -1; renderer->effects_buffer_swapped.fb = -1; - renderer->stencil_buffer_id = -1; + renderer->effects_buffer_swapped.stencil_buffer = -1; renderer->blur_buffer_dirty = true; @@ -380,7 +359,6 @@ void fx_renderer_fini(struct fx_renderer *renderer) { fx_framebuffer_release(&renderer->blur_buffer); fx_framebuffer_release(&renderer->effects_buffer); fx_framebuffer_release(&renderer->effects_buffer_swapped); - release_stencil_buffer(&renderer->stencil_buffer_id); } void fx_renderer_begin(struct fx_renderer *renderer, int width, int height) { @@ -398,10 +376,9 @@ void fx_renderer_begin(struct fx_renderer *renderer, int width, int height) { renderer->wlr_buffer.fb = wlr_fb; // Create the framebuffers - fx_framebuffer_create(&renderer->main_buffer, width, height, true); - create_stencil_buffer(&renderer->stencil_buffer_id, width, height); - fx_framebuffer_create(&renderer->effects_buffer, width, height, false); - fx_framebuffer_create(&renderer->effects_buffer_swapped, width, height, false); + fx_framebuffer_create(&renderer->main_buffer, width, height, true, true); + fx_framebuffer_create(&renderer->effects_buffer, width, height, false, false); + fx_framebuffer_create(&renderer->effects_buffer_swapped, width, height, false, false); // refresh projection matrix matrix_projection(renderer->projection, width, height, @@ -416,7 +393,6 @@ void fx_renderer_begin(struct fx_renderer *renderer, int width, int height) { void fx_renderer_end(struct fx_renderer *renderer) { // Release the main buffer fx_framebuffer_release(&renderer->main_buffer); - release_stencil_buffer(&renderer->stencil_buffer_id); } void fx_renderer_clear(const float color[static 4]) { diff --git a/sway/desktop/render.c b/sway/desktop/render.c index d89ce72e..a2d66b52 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -621,7 +621,8 @@ void render_monitor_blur(struct sway_output *output, pixman_region32_t *damage) // Render the newly blurred content into the blur_buffer fx_framebuffer_create(&renderer->blur_buffer, - output->renderer->viewport_width, output->renderer->viewport_height, true); + output->renderer->viewport_width, output->renderer->viewport_height, + true, false); // Clear the damaged region of the blur_buffer float clear_color[] = { 0, 0, 0, 0 }; int nrects;