summaryrefslogtreecommitdiff
path: root/render/fx_renderer/fx_effect_framebuffers.c
blob: 4589b21973672ed1060126f143a195969b54661c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <wlr/types/wlr_output.h>
#include <wlr/util/addon.h>
#include <wlr/util/log.h>

#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"

static void addon_handle_destroy(struct wlr_addon *addon) {
	struct fx_effect_framebuffers *fbos = wl_container_of(addon, fbos, addon);
	wlr_addon_finish(&fbos->addon);
	free(fbos);
}

static const struct wlr_addon_interface fbos_addon_impl = {
	.name = "fx_effect_framebuffers",
	.destroy = addon_handle_destroy,
};

static bool fx_effect_framebuffers_assign(struct wlr_output *output,
		struct fx_effect_framebuffers *fbos) {
	wlr_addon_init(&fbos->addon, &output->addons, output, &fbos_addon_impl);
	return true;
}

struct fx_effect_framebuffers *fx_effect_framebuffers_try_get(struct wlr_output *output) {
	struct fx_effect_framebuffers *fbos = NULL;

	struct wlr_addon *addon = wlr_addon_find(&output->addons, output,
			&fbos_addon_impl);
	if (!addon) {
		goto create_new;
		return NULL;
	}

	if (!(fbos = wl_container_of(addon, fbos, addon))) {
		goto create_new;
	}
	return fbos;

create_new:;
	fbos = calloc(1, sizeof(*fbos));
	if (!fbos) {
		wlr_log(WLR_ERROR, "Could not allocate a fx_effect_framebuffers");
		abort();
	}
	fbos->blur_buffer_dirty = false;

	if (!fx_effect_framebuffers_assign(output, fbos)) {
		wlr_log(WLR_ERROR, "Could not assign fx_effect_framebuffers to output: '%s'",
				output->name);
		abort();
	}
	return fbos;
}