summaryrefslogtreecommitdiff
path: root/render/fx_renderer
diff options
context:
space:
mode:
Diffstat (limited to 'render/fx_renderer')
-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
4 files changed, 23 insertions, 67 deletions
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',
)