#ifndef DRM_BACKEND_H #define DRM_BACKEND_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include "drm-properties.h" struct wlr_drm_plane { uint32_t type; uint32_t id; uint32_t fb_id; uint32_t possible_crtcs; int32_t x, y; uint32_t width, height; struct gbm_surface *gbm; EGLSurface egl; struct gbm_bo *front; struct gbm_bo *back; union wlr_drm_plane_props props; }; struct wlr_drm_crtc { uint32_t id; struct wlr_drm_plane *primary; struct wlr_drm_plane *overlay; struct wlr_drm_plane *cursor; union wlr_drm_crtc_props props; }; struct wlr_drm_renderer { int fd; struct gbm_device *gbm; struct wlr_egl egl; }; bool wlr_drm_renderer_init(struct wlr_drm_renderer *renderer, int fd); void wlr_drm_renderer_free(struct wlr_drm_renderer *renderer); struct wlr_backend_state { int fd; dev_t dev; size_t num_crtcs; struct wlr_drm_crtc *crtcs; size_t num_planes; struct wlr_drm_plane *planes; size_t num_overlay_planes; struct wlr_drm_plane *overlay_planes; size_t num_primary_planes; struct wlr_drm_plane *primary_planes; size_t num_cursor_planes; struct wlr_drm_plane *cursor_planes; struct wlr_backend *backend; struct wl_display *display; struct wl_event_source *drm_event; struct wl_listener session_signal; struct wl_listener drm_invalidated; uint32_t taken_crtcs; list_t *outputs; struct wlr_drm_renderer renderer; struct wlr_session *session; struct wlr_udev *udev; }; enum wlr_drm_output_state { DRM_OUTPUT_DISCONNECTED, DRM_OUTPUT_NEEDS_MODESET, DRM_OUTPUT_CONNECTED, }; struct wlr_output_mode_state { struct wlr_wl_output_mode *wlr_mode; drmModeModeInfo mode; }; struct wlr_output_state { struct wlr_output *wlr_output; enum wlr_drm_output_state state; uint32_t connector; struct { uint32_t dpms; } props; uint32_t width; uint32_t height; uint32_t crtc; drmModeCrtc *old_crtc; struct wlr_drm_renderer *renderer; EGLSurface *egl; struct gbm_surface *gbm; struct gbm_bo *bo[2]; struct gbm_bo *cursor_bo[2]; int current_cursor; uint32_t cursor_width, cursor_height; bool pageflip_pending; bool cleanup; }; bool wlr_drm_init_resources(struct wlr_backend_state *drm); void wlr_drm_output_cleanup(struct wlr_output_state *output, bool restore); void wlr_drm_scan_connectors(struct wlr_backend_state *state); int wlr_drm_event(int fd, uint32_t mask, void *data); void wlr_drm_output_start_renderer(struct wlr_output_state *output); void wlr_drm_output_pause_renderer(struct wlr_output_state *output); #endif