summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2024-01-02 01:15:34 +0100
committerErik Reider <[email protected]>2024-01-03 23:49:04 +0100
commit1a6918f948be034e65c50af8969d090b5e762dc1 (patch)
treed84116dac67ee8b649534b86c01851fc2956c3b7
parent51c7078b9ec413ebd8316501f01ccf769a090f64 (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.h4
-rw-r--r--include/render/fx_renderer/fx_stencilbuffer.h20
-rw-r--r--render/fx_renderer/fx_framebuffer.c27
-rw-r--r--render/fx_renderer/fx_renderer.c12
-rw-r--r--render/fx_renderer/fx_stencilbuffer.c50
-rw-r--r--render/fx_renderer/meson.build1
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',
)