enlightenment/src/modules/wl_drm/e_mod_main.h

235 lines
5.9 KiB
C

#ifndef E_MOD_MAIN_H
# define E_MOD_MAIN_H
# define DLOGFNS 1
# ifdef DLOGFNS
# include <stdio.h>
# define DLOGFN(fl, ln, fn) printf("-E-DRM: %25s: %5i - %s\n", fl, ln, fn);
# else
# define DLOGFN(fl, ln, fn)
# endif
# include <libudev.h>
# include <gbm.h>
# include <xf86drm.h>
# include <xf86drmMode.h>
# include <drm_fourcc.h>
# include <termios.h>
# include <linux/kd.h>
# include <linux/vt.h>
# include <linux/major.h>
# include <sys/ioctl.h>
# include <wayland-server.h>
# include <mtdev.h>
typedef void (*tty_vt_func_t)(E_Compositor *comp, int event);
typedef struct _E_Tty E_Tty;
typedef struct _E_Drm_Compositor E_Drm_Compositor;
typedef struct _E_Sprite E_Sprite;
typedef struct _E_Drm_Output_Mode E_Drm_Output_Mode;
typedef struct _E_Drm_Output E_Drm_Output;
typedef struct _E_Drm_Fb E_Drm_Fb;
typedef struct _E_Evdev_Input E_Evdev_Input;
typedef struct _E_Evdev_Input_Device E_Evdev_Input_Device;
struct _E_Drm_Fb
{
E_Drm_Output *output;
unsigned int fb, stride, hdl, size;
int fd;
Eina_Bool client_buffer : 1;
struct
{
struct wl_buffer *buffer;
struct wl_listener buffer_destroy;
} reference;
struct gbm_bo *bo;
void *map;
};
struct _E_Drm_Compositor
{
E_Wayland_Compositor base;
struct udev *udev;
struct wl_event_source *drm_source;
struct udev_monitor *udev_monitor;
struct wl_event_source *udev_drm_source;
struct
{
int id, fd;
} drm;
struct gbm_device *gbm;
unsigned int *crtcs;
int num_crtcs;
unsigned int crtc_alloc;
unsigned int conn_alloc;
E_Tty *tty;
struct
{
unsigned int width, height;
} min, max;
struct wl_list sprites;
Eina_Bool sprites_broken;
unsigned int prev_state;
};
struct _E_Tty
{
E_Wayland_Compositor *comp;
int fd;
struct termios term_attribs;
struct wl_event_source *input_source;
struct wl_event_source *vt_source;
tty_vt_func_t vt_func;
int vt, start_vt;
Eina_Bool has_vt : 1;
int kbd_mode;
};
struct _E_Sprite
{
struct wl_list link;
E_Drm_Output *output;
E_Drm_Fb *current_fb, *next_fb;
E_Drm_Compositor *compositor;
unsigned int possible_crtcs;
unsigned int plane_id;
int sx, sy;
unsigned int sw, sh;
unsigned int dx, dy, dw, dh;
unsigned int format_count;
unsigned int formats[];
};
struct _E_Drm_Output_Mode
{
E_Wayland_Output_Mode base;
drmModeModeInfo info;
};
struct _E_Drm_Output
{
E_Wayland_Output base;
unsigned int crtc_id;
unsigned int conn_id;
drmModeCrtcPtr orig_crtc;
struct
{
Eina_Bool vblank : 1;
Eina_Bool page_flip : 1;
} pending;
struct gbm_surface *gsurface;
struct gbm_bo *gcursor[2];
struct
{
E_Wayland_Surface *surface;
int current;
} cursor;
E_Drm_Fb *current, *next, *dummy[2];
pixman_image_t *img[2];
int current_img;
pixman_region32_t prev_damage;
/* TODO: backlight */
};
struct _E_Evdev_Input
{
E_Wayland_Input base;
struct wl_list devices;
struct udev_monitor *monitor;
struct wl_event_source *monitor_source;
char *seat;
};
struct _E_Evdev_Input_Device
{
E_Evdev_Input *master;
struct wl_list link;
struct wl_event_source *source;
E_Wayland_Output *output;
char *devnode;
int fd;
struct
{
int min_x, max_x, min_y, max_y;
int ox, oy, rx, ry;
int x, y;
} absolute;
struct
{
int slot;
int x[16], y[16];
} mt;
struct mtdev *mtdev;
struct
{
int dx, dy;
} rel;
int type;
Eina_Bool is_pad : 1;
Eina_Bool is_mt : 1;
};
extern E_Drm_Compositor *_comp;
EAPI extern E_Module_Api e_modapi;
EAPI void *e_modapi_init(E_Module *m);
EAPI int e_modapi_shutdown(E_Module *m);
EAPI int e_modapi_save(E_Module *m);
EINTERN E_Sprite *e_sprite_create(E_Drm_Compositor *dcomp, drmModePlane *plane);
EINTERN Eina_Bool e_sprite_crtc_supported(E_Wayland_Output *output, unsigned int supported);
EINTERN E_Tty *e_tty_create(E_Wayland_Compositor *comp, tty_vt_func_t vt_func, int tty);
EINTERN void e_tty_destroy(E_Tty *et);
EINTERN int e_drm_output_subpixel_convert(int value);
EINTERN Eina_Bool e_drm_output_add_mode(E_Drm_Output *output, drmModeModeInfo *info);
EINTERN void e_drm_output_set_modes(E_Drm_Compositor *dcomp);
EINTERN void e_drm_output_scanout_buffer_destroy(struct wl_listener *listener, void *data);
EINTERN void e_drm_output_pending_scanout_buffer_destroy(struct wl_listener *listener, void *data);
EINTERN void e_drm_output_repaint(E_Wayland_Output *base, pixman_region32_t *damage);
EINTERN void e_drm_output_destroy(E_Wayland_Output *base);
EINTERN void e_drm_output_assign_planes(E_Wayland_Output *base);
EINTERN void e_drm_output_set_dpms(E_Wayland_Output *base, E_Dpms_Level level);
EINTERN Eina_Bool e_drm_output_prepare_scanout_surface(E_Drm_Output *output);
EINTERN void e_drm_output_disable_sprites(E_Wayland_Output *base);
EINTERN drmModePropertyPtr e_drm_output_get_property(int fd, drmModeConnectorPtr conn, const char *name);
EINTERN int e_drm_output_prepare_overlay_surface(E_Wayland_Output *base, E_Wayland_Surface *es, pixman_region32_t *overlap);
EINTERN Eina_Bool e_drm_output_surface_transform_supported(E_Wayland_Surface *es);
EINTERN Eina_Bool e_drm_output_surface_overlap_supported(E_Wayland_Output *base EINA_UNUSED, pixman_region32_t *overlap);
EINTERN Eina_Bool e_drm_output_surface_format_supported(E_Sprite *s, unsigned int format);
EINTERN void e_drm_output_set_cursor_region(E_Wayland_Output *output, E_Wayland_Input *device, pixman_region32_t *overlap);
EINTERN Eina_Bool e_drm_output_set_cursor(E_Wayland_Output *output, E_Wayland_Input *device);
EINTERN void e_evdev_add_devices(struct udev *udev, E_Wayland_Input *base);
EINTERN void e_evdev_remove_devices(E_Wayland_Input *base);
EINTERN void e_evdev_input_create(E_Wayland_Compositor *comp, struct udev *udev, const char *seat);
EINTERN void e_evdev_input_destroy(E_Wayland_Input *base);
#endif