aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-02-11 15:49:51 -0500
committerGitHub <noreply@github.com>2018-02-11 15:49:51 -0500
commit3497e53516d96ad67b26115e2e06218f68e1114d (patch)
tree0162715f2f4c8ca489f8417e6c934ef1d990099e /include
parent664d7bfe4eb55556be491bb87f8f1c0135d8cac5 (diff)
parenta9632341bfcb1e0a172d93c4fd331291a842332c (diff)
Merge pull request #625 from emersion/wlr-output-damage
Add wlr_output_damage
Diffstat (limited to 'include')
-rw-r--r--include/rootston/output.h16
-rw-r--r--include/wlr/types/wlr_output.h9
-rw-r--r--include/wlr/types/wlr_output_damage.h77
3 files changed, 88 insertions, 14 deletions
diff --git a/include/rootston/output.h b/include/rootston/output.h
index 3a6d3cc7..7f42904f 100644
--- a/include/rootston/output.h
+++ b/include/rootston/output.h
@@ -4,13 +4,7 @@
#include <time.h>
#include <pixman.h>
#include <wayland-server.h>
-
-/**
- * Damage tracking requires to keep track of previous frames' damage. To allow
- * damage tracking to work with triple buffering, a history of two frames is
- * required.
- */
-#define ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN 2
+#include <wlr/types/wlr_output_damage.h>
struct roots_desktop;
@@ -22,15 +16,9 @@ struct roots_output {
struct roots_view *fullscreen_view;
struct timespec last_frame;
- pixman_region32_t damage; // in ouput-local coordinates
-
- // circular queue for previous damage
- pixman_region32_t previous_damage[ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN];
- size_t previous_damage_idx;
+ struct wlr_output_damage *damage;
struct wl_listener frame;
- struct wl_listener mode;
- struct wl_listener needs_swap;
};
void output_add_notify(struct wl_listener *listener, void *data);
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h
index a653d527..8eed06fe 100644
--- a/include/wlr/types/wlr_output.h
+++ b/include/wlr/types/wlr_output.h
@@ -38,6 +38,15 @@ struct wlr_output_cursor {
struct wlr_output_impl;
+/**
+ * A compositor output region. This typically corresponds to a monitor that
+ * displays part of the compositor space.
+ *
+ * Compositors should listen to the `frame` event to render an output. They
+ * should call `wlr_output_make_current`, render and then call
+ * `wlr_output_swap_buffers`. No rendering should happen outside a `frame` event
+ * handler.
+ */
struct wlr_output {
const struct wlr_output_impl *impl;
struct wlr_backend *backend;
diff --git a/include/wlr/types/wlr_output_damage.h b/include/wlr/types/wlr_output_damage.h
new file mode 100644
index 00000000..52cbce78
--- /dev/null
+++ b/include/wlr/types/wlr_output_damage.h
@@ -0,0 +1,77 @@
+#ifndef WLR_TYPES_WLR_OUTPUT_DAMAGE_H
+#define WLR_TYPES_WLR_OUTPUT_DAMAGE_H
+
+#include <time.h>
+#include <pixman.h>
+#include <wlr/types/wlr_output.h>
+
+/**
+ * Damage tracking requires to keep track of previous frames' damage. To allow
+ * damage tracking to work with triple buffering, a history of two frames is
+ * required.
+ */
+#define WLR_OUTPUT_DAMAGE_PREVIOUS_LEN 2
+
+/**
+ * Tracks damage for an output.
+ *
+ * When a `frame` event is emitted, `wlr_output_damage_make_current` should be
+ * called. If necessary, the output should be repainted and
+ * `wlr_output_damage_swap_buffers` should be called. No rendering should happen
+ * outside a `frame` event handler.
+ */
+struct wlr_output_damage {
+ struct wlr_output *output;
+
+ pixman_region32_t current; // in output-local coordinates
+
+ // circular queue for previous damage
+ pixman_region32_t previous[WLR_OUTPUT_DAMAGE_PREVIOUS_LEN];
+ size_t previous_idx;
+
+ struct {
+ struct wl_signal frame;
+ struct wl_signal destroy;
+ } events;
+
+ struct wl_listener output_destroy;
+ struct wl_listener output_mode;
+ struct wl_listener output_transform;
+ struct wl_listener output_scale;
+ struct wl_listener output_needs_swap;
+ struct wl_listener output_frame;
+};
+
+struct wlr_output_damage *wlr_output_damage_create(struct wlr_output *output);
+void wlr_output_damage_destroy(struct wlr_output_damage *output_damage);
+/**
+ * Makes the output rendering context current. `needs_swap` is set to true if
+ * `wlr_output_damage_swap_buffers` needs to be called. The region of the output
+ * that needs to be repainted is added to `damage`.
+ */
+bool wlr_output_damage_make_current(struct wlr_output_damage *output_damage,
+ bool *needs_swap, pixman_region32_t *damage);
+/**
+ * Swaps the output buffers. If the time of the frame isn't known, set `when` to
+ * NULL.
+ *
+ * Swapping buffers schedules a `frame` event.
+ */
+bool wlr_output_damage_swap_buffers(struct wlr_output_damage *output_damage,
+ struct timespec *when, pixman_region32_t *damage);
+/**
+ * Accumulates damage and schedules a `frame` event.
+ */
+void wlr_output_damage_add(struct wlr_output_damage *output_damage,
+ pixman_region32_t *damage);
+/**
+ * Damages the whole output and schedules a `frame` event.
+ */
+void wlr_output_damage_add_whole(struct wlr_output_damage *output_damage);
+/**
+ * Accumulates damage from a box and schedules a `frame` event.
+ */
+void wlr_output_damage_add_box(struct wlr_output_damage *output_damage,
+ struct wlr_box *box);
+
+#endif