enlightenment/src/modules/wl_drm/e_mod_main.h

205 lines
5.4 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_Evdev_Input E_Evdev_Input;
typedef struct _E_Evdev_Input_Device E_Evdev_Input_Device;
struct _E_Drm_Compositor
{
E_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 wl_list sprites;
Eina_Bool sprites_broken;
E_Compositor_State prev_state;
};
struct _E_Tty
{
E_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;
};
struct _E_Sprite
{
struct wl_list link;
unsigned int fb_id;
unsigned int pending_fb_id;
E_Surface *surface, *pending_surface;
E_Drm_Compositor *compositor;
struct wl_listener destroy_listener;
struct wl_listener pending_destroy_listener;
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_Output_Mode base;
drmModeModeInfo info;
};
struct _E_Drm_Output
{
E_Output base;
unsigned int crtc_id;
unsigned int conn_id;
drmModeCrtcPtr orig_crtc;
GLuint rbo[2];
unsigned int fb_id[2];
EGLImageKHR image[2];
struct gbm_bo *bo[2];
unsigned int current;
unsigned int fs_surf_fb_id;
unsigned int pending_fs_surf_fb_id;
struct wl_buffer *scanout_buffer, *pending_scanout_buffer;
struct wl_listener scanout_buffer_destroy_listener;
struct wl_listener pending_scanout_buffer_destroy_listener;
/* TODO: backlight */
};
struct _E_Evdev_Input
{
E_Input_Device base;
struct wl_list devices;
struct udev_monitor *monitor;
char *seat;
};
struct _E_Evdev_Input_Device
{
E_Evdev_Input *master;
struct wl_list link;
struct wl_event_source *source;
E_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_Output *output, unsigned int supported);
EINTERN E_Tty *e_tty_create(E_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_Output *base, pixman_region32_t *damage);
EINTERN void e_drm_output_destroy(E_Output *base);
EINTERN void e_drm_output_assign_planes(E_Output *base);
EINTERN void e_drm_output_set_dpms(E_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_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_Output *base, E_Surface *es, pixman_region32_t *overlap);
EINTERN Eina_Bool e_drm_output_surface_transform_supported(E_Surface *es);
EINTERN Eina_Bool e_drm_output_surface_overlap_supported(E_Output *base __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_Output *output, E_Input_Device *device, pixman_region32_t *overlap);
EINTERN Eina_Bool e_drm_output_set_cursor(E_Output *output, E_Input_Device *device);
EINTERN void e_evdev_add_devices(struct udev *udev, E_Input_Device *base);
EINTERN void e_evdev_remove_devices(E_Input_Device *base);
EINTERN void e_evdev_input_create(E_Compositor *comp, struct udev *udev, const char *seat);
EINTERN void e_evdev_input_destroy(E_Input_Device *base);
#endif