summaryrefslogtreecommitdiff
path: root/render/fx_renderer/fx_framebuffer.c
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2023-12-31 00:32:39 +0100
committerErik Reider <[email protected]>2024-01-03 23:49:04 +0100
commit51c7078b9ec413ebd8316501f01ccf769a090f64 (patch)
treec66ea9c9e7dd010c069acf1578dd617d23a1d0cc /render/fx_renderer/fx_framebuffer.c
parentb6a990da71b5b0947650a50dcf1a083acfce868c (diff)
Converted fx_renderer to impl wlr_renderer
Makes the fx_renderer the default renderer for everything, no wlr_gles2 rendering. This includes wlr_render_pass (fx_render_pass in our case)
Diffstat (limited to 'render/fx_renderer/fx_framebuffer.c')
-rw-r--r--render/fx_renderer/fx_framebuffer.c140
1 files changed, 61 insertions, 79 deletions
diff --git a/render/fx_renderer/fx_framebuffer.c b/render/fx_renderer/fx_framebuffer.c
index 4de6439..3e52f49 100644
--- a/render/fx_renderer/fx_framebuffer.c
+++ b/render/fx_renderer/fx_framebuffer.c
@@ -12,7 +12,7 @@
static void handle_buffer_destroy(struct wlr_addon *addon) {
struct fx_framebuffer *buffer =
wl_container_of(addon, buffer, addon);
- fx_framebuffer_release(buffer);
+ fx_framebuffer_destroy(buffer);
}
static const struct wlr_addon_interface buffer_addon_impl = {
@@ -20,101 +20,83 @@ static const struct wlr_addon_interface buffer_addon_impl = {
.destroy = handle_buffer_destroy,
};
+struct fx_framebuffer *fx_framebuffer_get_or_create(struct fx_renderer *renderer,
+ struct wlr_buffer *wlr_buffer) {
+ struct wlr_addon *addon =
+ wlr_addon_find(&wlr_buffer->addons, renderer, &buffer_addon_impl);
+ if (addon) {
+ struct fx_framebuffer *buffer = wl_container_of(addon, buffer, addon);
+ return buffer;
+ }
-struct fx_framebuffer fx_framebuffer_create(void) {
- return (struct fx_framebuffer) {
- .initialized = false,
- .fbo = -1,
- .rbo = -1,
- .wlr_buffer = NULL,
- .image = NULL,
- };
-}
-
-void fx_framebuffer_bind(struct fx_framebuffer *fx_buffer) {
- glBindFramebuffer(GL_FRAMEBUFFER, fx_buffer->fbo);
-}
+ struct fx_framebuffer *buffer = calloc(1, sizeof(*buffer));
+ if (buffer == NULL) {
+ wlr_log_errno(WLR_ERROR, "Allocation failed");
+ return NULL;
+ }
+ buffer->buffer = wlr_buffer;
+ buffer->renderer = renderer;
-void fx_framebuffer_bind_wlr_fbo(struct fx_renderer *renderer) {
- glBindFramebuffer(GL_FRAMEBUFFER, renderer->wlr_main_buffer_fbo);
-}
+ struct wlr_dmabuf_attributes dmabuf = {0};
+ if (!wlr_buffer_get_dmabuf(wlr_buffer, &dmabuf)) {
+ goto error_buffer;
+ }
-void fx_framebuffer_update(struct fx_renderer *fx_renderer, struct fx_framebuffer *fx_buffer,
- int width, int height) {
- struct wlr_output *output = fx_renderer->wlr_output;
+ bool external_only;
+ buffer->image = wlr_egl_create_image_from_dmabuf(renderer->egl,
+ &dmabuf, &external_only);
+ if (buffer->image == EGL_NO_IMAGE_KHR) {
+ goto error_buffer;
+ }
- fx_buffer->renderer = fx_renderer;
+ push_fx_debug(renderer);
- bool first_alloc = false;
+ glGenRenderbuffers(1, &buffer->rbo);
+ glBindRenderbuffer(GL_RENDERBUFFER, buffer->rbo);
+ renderer->procs.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER,
+ buffer->image);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
- if (!fx_buffer->wlr_buffer ||
- fx_buffer->wlr_buffer->width != width ||
- fx_buffer->wlr_buffer->height != height) {
- wlr_buffer_drop(fx_buffer->wlr_buffer);
- fx_buffer->wlr_buffer = wlr_allocator_create_buffer(output->allocator,
- width, height, &output->swapchain->format);
- first_alloc = true;
- }
+ glGenFramebuffers(1, &buffer->fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, buffer->fbo);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_RENDERBUFFER, buffer->rbo);
+ GLenum fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
- if (fx_buffer->fbo == (uint32_t) -1 || first_alloc) {
- glGenFramebuffers(1, &fx_buffer->fbo);
- first_alloc = true;
- }
+ pop_fx_debug(renderer);
- if (fx_buffer->rbo == (uint32_t) -1 || first_alloc) {
- struct wlr_dmabuf_attributes dmabuf = {0};
- if (!wlr_buffer_get_dmabuf(fx_buffer->wlr_buffer, &dmabuf)) {
- goto error_buffer;
- }
-
- bool external_only;
- fx_buffer->image = wlr_egl_create_image_from_dmabuf(fx_renderer->egl,
- &dmabuf, &external_only);
- if (fx_buffer->image == EGL_NO_IMAGE_KHR) {
- goto error_buffer;
- }
-
- glGenRenderbuffers(1, &fx_buffer->rbo);
- glBindRenderbuffer(GL_RENDERBUFFER, fx_buffer->rbo);
- fx_renderer->procs.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER,
- fx_buffer->image);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
-
- glBindFramebuffer(GL_FRAMEBUFFER, fx_buffer->fbo);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_RENDERBUFFER, fx_buffer->rbo);
- GLenum fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- if (fb_status != GL_FRAMEBUFFER_COMPLETE) {
- wlr_log(WLR_ERROR, "Failed to create FBO");
- goto error_image;
- }
+ if (fb_status != GL_FRAMEBUFFER_COMPLETE) {
+ wlr_log(WLR_ERROR, "Failed to create FBO");
+ goto error_image;
}
- if (!fx_buffer->initialized) {
- fx_buffer->initialized = true;
+ wlr_addon_init(&buffer->addon, &wlr_buffer->addons, renderer,
+ &buffer_addon_impl);
- wlr_addon_init(&fx_buffer->addon, &fx_buffer->wlr_buffer->addons, fx_renderer,
- &buffer_addon_impl);
+ wl_list_insert(&renderer->buffers, &buffer->link);
- wl_list_insert(&fx_renderer->buffers, &fx_buffer->link);
- }
+ wlr_log(WLR_DEBUG, "Created GL FBO for buffer %dx%d",
+ wlr_buffer->width, wlr_buffer->height);
- if (first_alloc) {
- wlr_log(WLR_DEBUG, "Created GL FBO for buffer %dx%d",
- fx_buffer->wlr_buffer->width, fx_buffer->wlr_buffer->height);
- }
+ return buffer;
- return;
error_image:
- wlr_egl_destroy_image(fx_renderer->egl, fx_buffer->image);
+ wlr_egl_destroy_image(renderer->egl, buffer->image);
error_buffer:
- wlr_log(WLR_ERROR, "Could not create FX buffer! Aborting...");
- abort();
+ free(buffer);
+ return NULL;
+}
+
+void fx_framebuffer_bind(struct fx_framebuffer *fx_buffer) {
+ glBindFramebuffer(GL_FRAMEBUFFER, fx_buffer->fbo);
+}
+
+void fx_framebuffer_bind_wlr_fbo(struct fx_renderer *renderer) {
+ glBindFramebuffer(GL_FRAMEBUFFER, renderer->current_buffer->fbo);
}
-void fx_framebuffer_release(struct fx_framebuffer *fx_buffer) {
+void fx_framebuffer_destroy(struct fx_framebuffer *fx_buffer) {
// Release the framebuffer
wl_list_remove(&fx_buffer->link);
wlr_addon_finish(&fx_buffer->addon);
@@ -132,5 +114,5 @@ void fx_framebuffer_release(struct fx_framebuffer *fx_buffer) {
wlr_egl_restore_context(&prev_ctx);
- fx_buffer->initialized = false;
+ free(fx_buffer);
}