aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/wlr/interfaces/wlr_output.h3
-rw-r--r--include/wlr/types/wlr_output.h7
-rw-r--r--include/wlr/types/wlr_output_layer.h68
3 files changed, 77 insertions, 1 deletions
diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h
index 073ed023..6c0bbd6c 100644
--- a/include/wlr/interfaces/wlr_output.h
+++ b/include/wlr/interfaces/wlr_output.h
@@ -22,7 +22,8 @@
WLR_OUTPUT_STATE_SCALE | \
WLR_OUTPUT_STATE_TRANSFORM | \
WLR_OUTPUT_STATE_RENDER_FORMAT | \
- WLR_OUTPUT_STATE_SUBPIXEL)
+ WLR_OUTPUT_STATE_SUBPIXEL | \
+ WLR_OUTPUT_STATE_LAYERS)
/**
* A backend implementation of struct wlr_output.
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h
index 45a93d47..5731eb91 100644
--- a/include/wlr/types/wlr_output.h
+++ b/include/wlr/types/wlr_output.h
@@ -67,6 +67,7 @@ enum wlr_output_state_field {
WLR_OUTPUT_STATE_GAMMA_LUT = 1 << 7,
WLR_OUTPUT_STATE_RENDER_FORMAT = 1 << 8,
WLR_OUTPUT_STATE_SUBPIXEL = 1 << 9,
+ WLR_OUTPUT_STATE_LAYERS = 1 << 10,
};
enum wlr_output_state_mode_type {
@@ -104,6 +105,10 @@ struct wlr_output_state {
// only valid if WLR_OUTPUT_STATE_GAMMA_LUT
uint16_t *gamma_lut;
size_t gamma_lut_size;
+
+ // only valid if WLR_OUTPUT_STATE_LAYERS
+ struct wlr_output_layer_state *layers;
+ size_t layers_len;
};
struct wlr_output_impl;
@@ -191,6 +196,8 @@ struct wlr_output {
struct wlr_buffer *cursor_front_buffer;
int software_cursor_locks; // number of locks forcing software cursors
+ struct wl_list layers; // wlr_output_layer.link
+
struct wlr_allocator *allocator;
struct wlr_renderer *renderer;
struct wlr_swapchain *swapchain;
diff --git a/include/wlr/types/wlr_output_layer.h b/include/wlr/types/wlr_output_layer.h
new file mode 100644
index 00000000..92980108
--- /dev/null
+++ b/include/wlr/types/wlr_output_layer.h
@@ -0,0 +1,68 @@
+/*
+ * This an unstable interface of wlroots. No guarantees are made regarding the
+ * future consistency of this API.
+ */
+#ifndef WLR_USE_UNSTABLE
+#error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features"
+#endif
+
+#ifndef WLR_TYPES_WLR_OUTPUT_LAYER_H
+#define WLR_TYPES_WLR_OUTPUT_LAYER_H
+
+#include <wlr/types/wlr_output.h>
+#include <wlr/util/addon.h>
+
+/**
+ * An output layer.
+ *
+ * Output layers are displayed between the output primary buffer (see
+ * wlr_output_attach_buffer() and wlr_output_attach_render()) and the cursor
+ * buffer. They can offload some rendering work to the backend.
+ *
+ * To configure output layers, callers should call wlr_output_layer_create() to
+ * create layers, attach struct wlr_output_layer_state onto
+ * struct wlr_output_state to describe their new state, and commit the output.
+ *
+ * Backends may have arbitrary limitations when it comes to displaying output
+ * layers. Backends indicate whether or not a layer can be displayed via
+ * wlr_output_layer_state.accepted after wlr_output_test() or
+ * wlr_output_commit() is called. Compositors using the output layers API
+ * directly are expected to setup layers, call wlr_output_test(), paint the
+ * layers that the backend rejected with the renderer, then call
+ * wlr_output_commit().
+ */
+struct wlr_output_layer {
+ struct wl_list link; // wlr_output.layers
+ struct wlr_addon_set addons;
+
+ void *data;
+};
+
+/**
+ * State for an output layer.
+ */
+struct wlr_output_layer_state {
+ struct wlr_output_layer *layer;
+
+ // Buffer to display, or NULL to disable the layer
+ struct wlr_buffer *buffer;
+ // Position in output-buffer-local coordinates
+ int x, y;
+
+ // Populated by the backend after wlr_output_test() and wlr_output_commit(),
+ // indicates whether the backend has acknowledged and will take care of
+ // displaying the layer
+ bool accepted;
+};
+
+/**
+ * Create a new output layer.
+ */
+struct wlr_output_layer *wlr_output_layer_create(struct wlr_output *output);
+
+/**
+ * Destroy an output layer.
+ */
+void wlr_output_layer_destroy(struct wlr_output_layer *layer);
+
+#endif