summaryrefslogtreecommitdiff
path: root/render/fx_renderer/fx_stencilbuffer.c
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2023-08-06 20:48:58 +0200
committerGitHub <[email protected]>2023-08-06 14:48:58 -0400
commitb929a2bbadf467864796ad4ec90882ce86cfebff (patch)
tree8229d63bfe8e1ba7908c5ca988c3bb774ea7990b /render/fx_renderer/fx_stencilbuffer.c
parenta2b827ab71f51240a192fa20913f6e83d8528612 (diff)
feat: add box shadows (#16)
Diffstat (limited to 'render/fx_renderer/fx_stencilbuffer.c')
-rw-r--r--render/fx_renderer/fx_stencilbuffer.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/render/fx_renderer/fx_stencilbuffer.c b/render/fx_renderer/fx_stencilbuffer.c
new file mode 100644
index 0000000..4f57216
--- /dev/null
+++ b/render/fx_renderer/fx_stencilbuffer.c
@@ -0,0 +1,50 @@
+#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;
+}