aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/render/gles2.h3
-rw-r--r--render/gles2/renderer.c35
2 files changed, 22 insertions, 16 deletions
diff --git a/include/render/gles2.h b/include/render/gles2.h
index cc5a2808..84e8f0ce 100644
--- a/include/render/gles2.h
+++ b/include/render/gles2.h
@@ -12,6 +12,7 @@
#include <wlr/render/interface.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/render/wlr_texture.h>
+#include <wlr/util/addon.h>
#include <wlr/util/log.h>
struct wlr_gles2_pixel_format {
@@ -84,7 +85,7 @@ struct wlr_gles2_buffer {
GLuint rbo;
GLuint fbo;
- struct wl_listener buffer_destroy;
+ struct wlr_addon addon;
};
struct wlr_gles2_texture {
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c
index 9ae6e2bb..01efaf1d 100644
--- a/render/gles2/renderer.c
+++ b/render/gles2/renderer.c
@@ -48,7 +48,7 @@ static struct wlr_gles2_renderer *gles2_get_renderer_in_context(
static void destroy_buffer(struct wlr_gles2_buffer *buffer) {
wl_list_remove(&buffer->link);
- wl_list_remove(&buffer->buffer_destroy.link);
+ wlr_addon_finish(&buffer->addon);
struct wlr_egl_context prev_ctx;
wlr_egl_save_context(&prev_ctx);
@@ -68,21 +68,26 @@ static void destroy_buffer(struct wlr_gles2_buffer *buffer) {
free(buffer);
}
+static void handle_buffer_destroy(struct wlr_addon *addon) {
+ struct wlr_gles2_buffer *buffer =
+ wl_container_of(addon, buffer, addon);
+ destroy_buffer(buffer);
+}
+
+static const struct wlr_addon_interface buffer_addon_impl = {
+ .name = "wlr_gles2_buffer",
+ .destroy = handle_buffer_destroy,
+};
+
static struct wlr_gles2_buffer *get_buffer(struct wlr_gles2_renderer *renderer,
struct wlr_buffer *wlr_buffer) {
- struct wlr_gles2_buffer *buffer;
- wl_list_for_each(buffer, &renderer->buffers, link) {
- if (buffer->buffer == wlr_buffer) {
- return buffer;
- }
+ struct wlr_addon *addon =
+ wlr_addon_find(&wlr_buffer->addons, renderer, &buffer_addon_impl);
+ if (addon == NULL) {
+ return NULL;
}
- return NULL;
-}
-
-static void handle_buffer_destroy(struct wl_listener *listener, void *data) {
- struct wlr_gles2_buffer *buffer =
- wl_container_of(listener, buffer, buffer_destroy);
- destroy_buffer(buffer);
+ struct wlr_gles2_buffer *buffer = wl_container_of(addon, buffer, addon);
+ return buffer;
}
static struct wlr_gles2_buffer *create_buffer(struct wlr_gles2_renderer *renderer,
@@ -129,8 +134,8 @@ static struct wlr_gles2_buffer *create_buffer(struct wlr_gles2_renderer *rendere
goto error_image;
}
- buffer->buffer_destroy.notify = handle_buffer_destroy;
- wl_signal_add(&wlr_buffer->events.destroy, &buffer->buffer_destroy);
+ wlr_addon_init(&buffer->addon, &wlr_buffer->addons, renderer,
+ &buffer_addon_impl);
wl_list_insert(&renderer->buffers, &buffer->link);