diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/backend/drm/drm.h | 24 | ||||
-rw-r--r-- | include/backend/drm/renderer.h | 56 | ||||
-rw-r--r-- | include/backend/drm/util.h | 3 |
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 { |