aboutsummaryrefslogtreecommitdiff
path: root/include/backend/drm
diff options
context:
space:
mode:
Diffstat (limited to 'include/backend/drm')
-rw-r--r--include/backend/drm/drm.h24
-rw-r--r--include/backend/drm/renderer.h56
-rw-r--r--include/backend/drm/util.h3
3 files changed, 53 insertions, 30 deletions
diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h
index ffd3138f..0ab4ff21 100644
--- a/include/backend/drm/drm.h
+++ b/include/backend/drm/drm.h
@@ -25,11 +25,17 @@ struct wlr_drm_plane {
struct wlr_drm_surface surf;
struct wlr_drm_surface mgpu_surf;
+ /* Buffer to be submitted to the kernel on the next page-flip */
+ struct wlr_drm_fb pending_fb;
+ /* Buffer submitted to the kernel, will be presented on next vblank */
+ struct wlr_drm_fb queued_fb;
+ /* Buffer currently displayed on screen */
+ struct wlr_drm_fb current_fb;
+
uint32_t drm_format; // ARGB8888 or XRGB8888
struct wlr_drm_format_set formats;
// Only used by cursor
- float matrix[9];
bool cursor_enabled;
int32_t cursor_hotspot_x, cursor_hotspot_y;
@@ -124,16 +130,16 @@ struct wlr_drm_connector {
drmModeCrtc *old_crtc;
- bool pageflip_pending;
struct wl_event_source *retry_pageflip;
struct wl_list link;
- // Buffer submitted to the kernel but not yet displayed
- struct wlr_buffer *pending_buffer;
- struct gbm_bo *pending_bo;
- // Buffer currently being displayed
- struct wlr_buffer *current_buffer;
- struct gbm_bo *current_bo;
+ /*
+ * We've asked for a state change in the kernel, and yet to recieve 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.
+ */
+ bool pageflip_pending;
};
struct wlr_drm_backend *get_drm_backend_from_backend(
@@ -150,6 +156,8 @@ bool set_drm_connector_gamma(struct wlr_output *output, size_t size,
bool drm_connector_set_mode(struct wlr_output *output,
struct wlr_output_mode *mode);
+struct wlr_drm_fb *plane_get_next_fb(struct wlr_drm_plane *plane);
+
bool legacy_crtc_set_cursor(struct wlr_drm_backend *drm,
struct wlr_drm_crtc *crtc, struct gbm_bo *bo);
bool legacy_crtc_move_cursor(struct wlr_drm_backend *drm,
diff --git a/include/backend/drm/renderer.h b/include/backend/drm/renderer.h
index 567cf95e..bfccf9d5 100644
--- a/include/backend/drm/renderer.h
+++ b/include/backend/drm/renderer.h
@@ -10,6 +10,7 @@
struct wlr_drm_backend;
struct wlr_drm_plane;
+struct wlr_buffer;
struct wlr_drm_renderer {
int fd;
@@ -29,33 +30,48 @@ struct wlr_drm_surface {
struct gbm_surface *gbm;
EGLSurface egl;
+};
+
+enum wlr_drm_fb_type {
+ WLR_DRM_FB_TYPE_NONE,
+ WLR_DRM_FB_TYPE_SURFACE,
+ WLR_DRM_FB_TYPE_WLR_BUFFER
+};
+
+struct wlr_drm_fb {
+ enum wlr_drm_fb_type type;
+ struct gbm_bo *bo;
+
+ struct wlr_drm_surface *mgpu_surf;
+ struct gbm_bo *mgpu_bo;
- struct gbm_bo *front;
- struct gbm_bo *back;
+ union {
+ struct wlr_drm_surface *surf;
+ struct wlr_buffer *wlr_buf;
+ };
};
bool init_drm_renderer(struct wlr_drm_backend *drm,
struct wlr_drm_renderer *renderer, wlr_renderer_create_func_t create_render);
void finish_drm_renderer(struct wlr_drm_renderer *renderer);
-bool init_drm_surface(struct wlr_drm_surface *surf,
- struct wlr_drm_renderer *renderer, uint32_t width, uint32_t height,
- uint32_t format, struct wlr_drm_format_set *set, uint32_t flags);
-
-bool init_drm_plane_surfaces(struct wlr_drm_plane *plane,
- struct wlr_drm_backend *drm, int32_t width, uint32_t height,
- uint32_t format, bool with_modifiers);
-
-void finish_drm_surface(struct wlr_drm_surface *surf);
-bool make_drm_surface_current(struct wlr_drm_surface *surf, int *buffer_age);
-struct gbm_bo *swap_drm_surface_buffers(struct wlr_drm_surface *surf,
- pixman_region32_t *damage);
-struct gbm_bo *get_drm_surface_front(struct wlr_drm_surface *surf);
-void post_drm_surface(struct wlr_drm_surface *surf);
-struct gbm_bo *copy_drm_surface_mgpu(struct wlr_drm_surface *dest,
- struct gbm_bo *src);
-struct gbm_bo *import_gbm_bo(struct wlr_drm_renderer *renderer,
- struct wlr_dmabuf_attributes *attribs);
+bool drm_surface_make_current(struct wlr_drm_surface *surf, int *buffer_age);
bool export_drm_bo(struct gbm_bo *bo, struct wlr_dmabuf_attributes *attribs);
+void drm_fb_clear(struct wlr_drm_fb *fb);
+bool drm_fb_lock_surface(struct wlr_drm_fb *fb, struct wlr_drm_surface *surf);
+bool drm_fb_import_wlr(struct wlr_drm_fb *fb, struct wlr_drm_renderer *renderer,
+ struct wlr_buffer *buf, struct wlr_drm_format_set *set);
+
+void drm_fb_move(struct wlr_drm_fb *new, struct wlr_drm_fb *old);
+
+bool drm_surface_render_black_frame(struct wlr_drm_surface *surf);
+struct gbm_bo *drm_fb_acquire(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm,
+ struct wlr_drm_surface *mgpu);
+
+bool drm_plane_init_surface(struct wlr_drm_plane *plane,
+ struct wlr_drm_backend *drm, int32_t width, uint32_t height,
+ uint32_t format, uint32_t flags, bool with_modifiers);
+void drm_plane_finish_surface(struct wlr_drm_plane *plane);
+
#endif
diff --git a/include/backend/drm/util.h b/include/backend/drm/util.h
index 2d9d11f4..15895ec6 100644
--- a/include/backend/drm/util.h
+++ b/include/backend/drm/util.h
@@ -14,8 +14,7 @@ void parse_edid(struct wlr_output *restrict output, size_t len,
// Returns the string representation of a DRM output type
const char *conn_get_name(uint32_t type_id);
// Returns the DRM framebuffer id for a gbm_bo
-uint32_t get_fb_for_bo(struct gbm_bo *bo, uint32_t drm_format,
- bool with_modifiers);
+uint32_t get_fb_for_bo(struct gbm_bo *bo, bool with_modifiers);
// Part of match_obj
enum {