aboutsummaryrefslogtreecommitdiff
path: root/include/backend/drm
diff options
context:
space:
mode:
Diffstat (limited to 'include/backend/drm')
-rw-r--r--include/backend/drm/drm.h26
-rw-r--r--include/backend/drm/iface.h5
2 files changed, 21 insertions, 10 deletions
diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h
index c7dd70f8..b121b3bc 100644
--- a/include/backend/drm/drm.h
+++ b/include/backend/drm/drm.h
@@ -129,6 +129,22 @@ struct wlr_drm_connector_state {
struct wlr_drm_fb *primary_fb;
};
+/**
+ * Per-page-flip tracking struct.
+ *
+ * We've asked for a state change in the kernel, and yet to receive a
+ * notification for its completion. Currently, the kernel only has a queue
+ * length of 1, and no way to modify your submissions after they're sent.
+ *
+ * However, we might have multiple in-flight page-flip events, for instance
+ * when performing a non-blocking commit followed by a blocking commit. In
+ * that case, conn will be set to NULL on the non-blocking commit to indicate
+ * that it's been superseded.
+ */
+struct wlr_drm_page_flip {
+ struct wlr_drm_connector *conn;
+};
+
struct wlr_drm_connector {
struct wlr_output output; // only valid if status != DISCONNECTED
@@ -153,14 +169,8 @@ struct wlr_drm_connector {
struct wl_list link; // wlr_drm_backend.connectors
- /* CRTC ID if a page-flip is pending, zero otherwise.
- *
- * We've asked for a state change in the kernel, and yet to receive a
- * notification for its completion. Currently, the kernel only has a
- * queue length of 1, and no way to modify your submissions after
- * they're sent.
- */
- uint32_t pending_page_flip_crtc;
+ // Last committed page-flip
+ struct wlr_drm_page_flip *pending_page_flip;
};
struct wlr_drm_backend *get_drm_backend_from_backend(
diff --git a/include/backend/drm/iface.h b/include/backend/drm/iface.h
index 9916f383..dbe4c908 100644
--- a/include/backend/drm/iface.h
+++ b/include/backend/drm/iface.h
@@ -12,6 +12,7 @@ struct wlr_drm_connector;
struct wlr_drm_crtc;
struct wlr_drm_connector_state;
struct wlr_drm_fb;
+struct wlr_drm_page_flip;
// Used to provide atomic or legacy DRM functions
struct wlr_drm_interface {
@@ -19,8 +20,8 @@ struct wlr_drm_interface {
void (*finish)(struct wlr_drm_backend *drm);
// Commit all pending changes on a CRTC.
bool (*crtc_commit)(struct wlr_drm_connector *conn,
- const struct wlr_drm_connector_state *state, uint32_t flags,
- bool test_only);
+ const struct wlr_drm_connector_state *state,
+ struct wlr_drm_page_flip *page_flip, uint32_t flags, bool test_only);
};
extern const struct wlr_drm_interface atomic_iface;