This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch devs/devilhorns/apos
in repository efl.
View the commit online.
commit e825880a74be4f6c706dbc44ab99b67c35a95f3c
Author: Christopher Michael <[email protected]>
AuthorDate: Wed Aug 27 08:04:55 2025 -0500
ecore_evas_drm: Add initial ecore_evas drm engine rewrite
NB: Won't actually render anything yet
---
.../ecore_evas/engines/drm/ecore_evas_drm.c | 1058 ++++++++++++++++++++
1 file changed, 1058 insertions(+)
diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
new file mode 100644
index 0000000000..3c9da5bf04
--- /dev/null
+++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
@@ -0,0 +1,1058 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Eina.h>
+#include <Ecore.h>
+#include "ecore_private.h"
+#include <Ecore_Input.h>
+#include <Ecore_Input_Evas.h>
+#include <Ecore_Evas.h>
+#include "ecore_evas_private.h"
+#include "ecore_evas_drm.h"
+#include <Ecore_Drm2.h>
+#include <Evas_Engine_Drm.h>
+#include <drm_fourcc.h>
+
+#ifdef _WIN32
+# ifndef EFL_MODULE_STATIC
+# define EMODAPI __declspec(dllexport)
+# else
+# define EMODAPI
+# endif
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EMODAPI __attribute__ ((visibility("default")))
+# endif
+# endif
+#endif /* ! _WIN32 */
+
+#ifndef EMODAPI
+# define EMODAPI
+#endif
+
+typedef struct _Ecore_Evas_Engine_Drm_Data
+{
+ int x, y, w, h;
+ int depth, bpp, rotation;
+ unsigned int format;
+
+ double tick_offset;
+ double tick_timestamp;
+ Ecore_Job *tick_job;
+
+ Ecore_Job *focus_job;
+
+ Ecore_Drm2_Device *dev;
+ Ecore_Drm2_Display *disp;
+
+ Ecore_Fd_Handler *fd_hdlr;
+
+ Eina_Bool ticking : 1;
+ Eina_Bool blanktime : 1;
+} Ecore_Evas_Engine_Drm_Data;
+
+static int _drm_init_count = 0;
+
+static Ecore_Evas_Interface_Drm *
+_ecore_evas_drm_interface_new(void)
+{
+ Ecore_Evas_Interface_Drm *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Drm));
+ if (!iface) return NULL;
+
+ iface->base.name = "drm";
+ iface->base.version = 1;
+
+ return iface;
+}
+
+static int
+_ecore_evas_drm_init(Ecore_Evas *ee EINA_UNUSED, Ecore_Evas_Engine_Drm_Data *edata, const char *device)
+{
+ _drm_init_count++;
+ if (_drm_init_count > 1) return _drm_init_count;
+
+ if (!ecore_drm2_init())
+ {
+ ERR("Failed to init Ecore_Drm2 library");
+ goto init_err;
+ }
+
+ if (!device) device = getenv("XDG_SEAT");
+ if (!device) device = "seat0";
+
+ edata->dev = ecore_drm2_device_open(device, 0);
+ if (!edata->dev)
+ {
+ ERR("Failed to open Ecore_Drm2 device");
+ goto open_err;
+ }
+
+ edata->disp = ecore_drm2_display_find(edata->dev, edata->x, edata->y);
+
+ ecore_drm2_device_preferred_depth_get(edata->dev,
+ &edata->depth, &edata->bpp);
+
+ ecore_event_evas_init();
+
+ /* TODO: handlers */
+
+ return _drm_init_count;
+
+open_err:
+ ecore_drm2_shutdown();
+init_err:
+ return --_drm_init_count;
+}
+
+static int
+_ecore_evas_drm_shutdown(Ecore_Evas_Engine_Drm_Data *edata)
+{
+ _drm_init_count--;
+ if (_drm_init_count == 0)
+ {
+ if (edata->dev)
+ {
+ ecore_drm2_device_close(edata->dev);
+ edata->dev = NULL;
+ }
+
+ ecore_event_evas_shutdown();
+ ecore_drm2_shutdown();
+
+ /* TODO: free handlers */
+ }
+
+ if (_drm_init_count < 0) _drm_init_count = 0;
+ return _drm_init_count;
+}
+
+static void
+_drm_focus_job(void *data)
+{
+ Ecore_Evas *ee;
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ ee = data;
+ edata = ee->engine.data;
+
+ _ecore_evas_focus_device_set(ee, NULL, EINA_TRUE);
+ edata->focus_job = NULL;
+}
+
+static void
+_drm_avoid_damage_do(Ecore_Evas *ee, int on)
+{
+ ee->prop.avoid_damage = on;
+ if (ee->prop.avoid_damage)
+ {
+ if (ECORE_EVAS_PORTRAIT(ee))
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+ else
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+ }
+}
+
+static void
+_drm_alpha_do(Ecore_Evas *ee, int on)
+{
+ Evas_Engine_Info_Drm *einfo;
+
+ if (ee->alpha == on) return;
+
+ einfo = (Evas_Engine_Info_Drm *)evas_engine_info_get(ee->evas);
+ if (!einfo) return;
+
+ ee->alpha = on;
+ einfo->alpha = on;
+
+ if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+ ERR("evas_engine_info_set() for engine '%s' failed", ee->driver);
+
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+}
+
+static void
+_drm_transparent_do(Ecore_Evas *ee, int on)
+{
+ Evas_Engine_Info_Drm *einfo;
+
+ if (ee->transparent == on) return;
+
+ einfo = (Evas_Engine_Info_Drm *)evas_engine_info_get(ee->evas);
+ if (!einfo) return;
+
+ ee->transparent = on;
+ einfo->alpha = on;
+
+ if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+ ERR("evas_engine_info_set() for engine '%s' failed", ee->driver);
+
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+}
+
+static void
+_drm_rotation_do(Ecore_Evas *ee, int rotation, int resize)
+{
+ Evas_Engine_Info_Drm *einfo;
+ int diff;
+
+ einfo = (Evas_Engine_Info_Drm *)evas_engine_info_get(ee->evas);
+ if (!einfo) return;
+
+ diff = ee->rotation - rotation;
+ if (diff < 0) diff = -diff;
+
+ einfo->rotation = rotation;
+
+ if (diff != 180)
+ {
+ int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
+
+ if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+ ERR("evas_engine_info_set() for engine '%s' failed", ee->driver);
+
+ if (!resize)
+ {
+ if (!ee->prop.fullscreen)
+ {
+ ee->expecting_resize.w = ee->h;
+ ee->expecting_resize.h = ee->w;
+ evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
+ evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
+ }
+ else
+ {
+ if (PORTRAIT_CHECK(rotation))
+ {
+ evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
+ evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
+ }
+ else
+ {
+ evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
+ evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
+ }
+ if (ee->func.fn_resize) ee->func.fn_resize(ee);
+ }
+ if (PORTRAIT_CHECK(rotation))
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+ else
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
+ }
+ else
+ {
+ if (PORTRAIT_CHECK(rotation))
+ {
+ evas_output_size_set(ee->evas, ee->w, ee->h);
+ evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+ }
+ else
+ {
+ evas_output_size_set(ee->evas, ee->h, ee->w);
+ evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+ }
+ if (ee->func.fn_resize) ee->func.fn_resize(ee);
+ if (PORTRAIT_CHECK(rotation))
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+ else
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+ }
+ ecore_evas_size_min_get(ee, &minw, &minh);
+ ecore_evas_size_max_get(ee, &maxw, &maxh);
+ ecore_evas_size_base_get(ee, &basew, &baseh);
+ ecore_evas_size_step_get(ee, &stepw, &steph);
+ ee->rotation = rotation;
+ ecore_evas_size_min_set(ee, minh, minw);
+ ecore_evas_size_max_set(ee, maxh, maxw);
+ ecore_evas_size_base_set(ee, baseh, basew);
+ ecore_evas_size_step_set(ee, steph, stepw);
+ /* TODO: mouse_move_process ?? */
+ }
+ else
+ {
+ if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+ ERR("evas_engine_info_set() for engine '%s' failed", ee->driver);
+
+ ee->rotation = rotation;
+ /* TODO: mouse_move_process ?? */
+ if (ee->func.fn_resize) ee->func.fn_resize(ee);
+ if (PORTRAIT_CHECK(rotation))
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+ else
+ evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+ }
+}
+
+static int
+_drm_render_updates_process(Ecore_Evas *ee, Eina_List *updates)
+{
+ int rend = 0;
+
+ if (ee->prop.avoid_damage)
+ {
+ if (updates)
+ {
+ /* TODO: process updates ? */
+ _ecore_evas_idle_timeout_update(ee);
+ rend = 1;
+ }
+ }
+ else if (((ee->visible) && (!ee->draw_block)) ||
+ ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
+ ((ee->should_be_visible) && (ee->prop.override)))
+ {
+ if (updates)
+ {
+ _ecore_evas_idle_timeout_update(ee);
+ rend = 1;
+ }
+ }
+ else
+ evas_norender(ee->evas);
+
+ if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+
+ return rend;
+}
+
+/* local ecore_evas engine functions */
+static int
+_drm_render(Ecore_Evas *ee)
+{
+ int rend = 0;
+
+ if (ee->in_async_render) return 0;
+
+ rend = ecore_evas_render_prepare(ee);
+
+ if (!ee->can_async_render)
+ {
+ Eina_List *updates;
+
+ updates = evas_render_updates(ee->evas);
+ rend = _drm_render_updates_process(ee, updates);
+ evas_render_updates_free(updates);
+ }
+ else if (evas_render_async(ee->evas))
+ {
+ ee->in_async_render = EINA_TRUE;
+ rend = 1;
+ }
+ else if (ee->func.fn_post_render)
+ ee->func.fn_post_render(ee);
+
+ return rend;
+}
+
+static void
+_drm_free(Ecore_Evas *ee)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ ecore_evas_input_event_unregister(ee);
+
+ edata = ee->engine.data;
+ ecore_main_fd_handler_del(edata->fd_hdlr);
+ edata->fd_hdlr = NULL;
+ _ecore_evas_drm_shutdown(edata);
+ free(edata);
+}
+
+static void
+_drm_move(Ecore_Evas *ee, int x, int y)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ edata = ee->engine.data;
+
+ ee->req.x = x;
+ ee->req.y = y;
+ if ((ee->x == x) && (ee->y == y)) return;
+ ee->x = x;
+ ee->y = y;
+ edata->x = x;
+ edata->y = y;
+ if (ee->func.fn_move) ee->func.fn_move(ee);
+}
+
+static void
+_drm_resize(Ecore_Evas *ee, int w, int h)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ edata = ee->engine.data;
+
+ ee->req.w = w;
+ ee->req.h = h;
+ if ((ee->w == w) && (ee->h == h)) return;
+ ee->w = w;
+ ee->h = h;
+ edata->w = w;
+ edata->h = h;
+ evas_output_size_set(ee->evas, w, h);
+ evas_output_viewport_set(ee->evas, ee->x, ee->y, w, h);
+ if (ee->func.fn_resize) ee->func.fn_resize(ee);
+}
+
+static void
+_drm_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+ _drm_move(ee, x, y);
+ _drm_resize(ee, w, h);
+}
+
+static void
+_drm_rotation_set(Ecore_Evas *ee, int rotation, int resize)
+{
+ if (ee->rotation == rotation) return;
+ if (ee->in_async_render)
+ {
+ ee->delayed.rotation = rotation;
+ ee->delayed.rotation_resize = resize;
+ ee->delayed.rotation_changed = EINA_TRUE;
+ return;
+ }
+ _drm_rotation_do(ee, rotation, resize);
+}
+
+static void
+_drm_show(Ecore_Evas *ee)
+{
+ if (ee->visible) return;
+
+ ee->should_be_visible = EINA_TRUE;
+
+ if (ee->prop.avoid_damage)
+ {
+ _drm_render(ee);
+ /* ecore_evas_render(ee); */
+ /* ecore_evas_render_wait(ee); */
+ }
+
+ if (ee->prop.override)
+ {
+ ee->prop.withdrawn = EINA_FALSE;
+ if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
+ }
+
+ ee->visible = EINA_TRUE;
+ if (ee->func.fn_show) ee->func.fn_show(ee);
+
+ if (ee->prop.fullscreen)
+ {
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ edata = ee->engine.data;
+ if (!edata->focus_job)
+ edata->focus_job = ecore_job_add(_drm_focus_job, ee);
+ }
+
+ /* TODO: flip ? */
+}
+
+static void
+_drm_hide(Ecore_Evas *ee)
+{
+ if (!ee->visible) return;
+
+ if (ee->prop.override)
+ {
+ ee->prop.withdrawn = EINA_TRUE;
+ if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
+ }
+
+ ee->visible = EINA_FALSE;
+ ee->should_be_visible = EINA_FALSE;
+ evas_sync(ee->evas);
+ if (ee->func.fn_hide) ee->func.fn_hide(ee);
+}
+
+static void
+_drm_title_set(Ecore_Evas *ee, const char *title)
+{
+ if (eina_streq(ee->prop.title, title)) return;
+ if (ee->prop.title) free(ee->prop.title);
+ ee->prop.title = NULL;
+ if (title) ee->prop.title = strdup(title);
+}
+
+static void
+_drm_name_class_set(Ecore_Evas *ee, const char *name, const char *cls)
+{
+ if (!eina_streq(ee->prop.name, name))
+ {
+ if (ee->prop.name) free(ee->prop.name);
+ ee->prop.name = NULL;
+ if (name) ee->prop.name = strdup(name);
+ }
+
+ if (!eina_streq(ee->prop.clas, cls))
+ {
+ if (ee->prop.clas) free(ee->prop.clas);
+ ee->prop.clas = NULL;
+ if (cls) ee->prop.clas = strdup(cls);
+ }
+}
+
+static void
+_drm_size_min_set(Ecore_Evas *ee, int w, int h)
+{
+ if (w < 0) w = 0;
+ if (h < 0) h = 0;
+ if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
+ ee->prop.min.w = w;
+ ee->prop.min.h = h;
+}
+
+static void
+_drm_size_max_set(Ecore_Evas *ee, int w, int h)
+{
+ if (w < 0) w = 0;
+ if (h < 0) h = 0;
+ if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
+ ee->prop.max.w = w;
+ ee->prop.max.h = h;
+}
+
+static void
+_drm_size_base_set(Ecore_Evas *ee, int w, int h)
+{
+ if (w < 0) w = 0;
+ if (h < 0) h = 0;
+ if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
+ ee->prop.base.w = w;
+ ee->prop.base.h = h;
+}
+
+static void
+_drm_size_step_set(Ecore_Evas *ee, int w, int h)
+{
+ if (w < 1) w = 1;
+ if (h < 1) h = 1;
+ if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
+ ee->prop.step.w = w;
+ ee->prop.step.h = h;
+}
+
+static void
+_drm_layer_set(Ecore_Evas *ee, int layer)
+{
+ if (ee->prop.layer == layer) return;
+ if (layer < 1) layer = 1;
+ else if (layer > 255) layer = 255;
+ ee->prop.layer = layer;
+}
+
+static void
+_drm_iconified_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ if (ee->prop.iconified == on) return;
+ ee->prop.iconified = on;
+ if (!on) ecore_evas_activate(ee);
+}
+
+static void
+_drm_borderless_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ if (ee->prop.borderless == on) return;
+ ee->prop.borderless = on;
+}
+
+static void
+_drm_maximized_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ if (ee->prop.maximized == on) return;
+ ee->prop.maximized = on;
+}
+
+static void
+_drm_fullscreen_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ if (ee->prop.fullscreen == on) return;
+ ee->prop.fullscreen = on;
+ /* TODO */
+}
+
+static void
+_drm_avoid_damage_set(Ecore_Evas *ee, int on)
+{
+ if (ee->prop.avoid_damage == on) return;
+ if (ee->in_async_render)
+ {
+ ee->delayed.avoid_damage = on;
+ return;
+ }
+ _drm_avoid_damage_do(ee, on);
+}
+
+static void
+_drm_withdrawn_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ if (ee->prop.withdrawn == on) return;
+ ee->prop.withdrawn = on;
+ if (on)
+ ecore_evas_hide(ee);
+ else
+ ecore_evas_show(ee);
+}
+
+static void
+_drm_ignore_events_set(Ecore_Evas *ee, int on)
+{
+ if (ee->ignore_events == on) return;
+ ee->ignore_events = on;
+}
+
+static void
+_drm_alpha_set(Ecore_Evas *ee, int on)
+{
+ if (ee->in_async_render)
+ {
+ if (ee->visible)
+ {
+ ee->delayed.alpha = on;
+ ee->delayed.alpha_changed = EINA_TRUE;
+ return;
+ }
+ evas_sync(ee->evas);
+ }
+ _drm_alpha_do(ee, on);
+}
+
+static void
+_drm_transparent_set(Ecore_Evas *ee, int on)
+{
+ if (ee->in_async_render)
+ {
+ if (ee->visible)
+ {
+ ee->delayed.transparent = on;
+ ee->delayed.transparent_changed = EINA_TRUE;
+ return;
+ }
+ evas_sync(ee->evas);
+ }
+ _drm_transparent_do(ee, on);
+}
+
+static void
+_drm_aspect_set(Ecore_Evas *ee, double aspect)
+{
+ if (EINA_FLT_EQ(ee->prop.aspect, aspect)) return;
+ ee->prop.aspect = aspect;
+}
+
+/* TODO */
+//screen_geom
+//screen_dpi
+
+static void
+_drm_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ edata = ee->engine.data;
+ ecore_drm2_device_pointer_xy_get(edata->dev, x, y);
+}
+
+static Eina_Bool
+_drm_pointer_warp(const Ecore_Evas *ee, Evas_Coord x, Evas_Coord y)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ edata = ee->engine.data;
+ ecore_drm2_device_pointer_warp(edata->dev, x, y);
+ return EINA_TRUE;
+}
+
+static void
+_drm_tick_job(void *data)
+{
+ Ecore_Evas *ee;
+ Ecore_Evas_Engine_Drm_Data *edata;
+ int x, y, w, h;
+
+ ee = data;
+ edata = ee->engine.data;
+ edata->tick_job = NULL;
+
+ ecore_drm2_display_info_get(edata->disp, &x, &y, &w, &h, NULL);
+
+ ecore_evas_animator_tick(ee, &(Eina_Rectangle){x, y, w, h},
+ edata->tick_timestamp - edata->tick_offset);
+}
+
+static void
+_drm_animator_register(Ecore_Evas *ee)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+ Eina_Bool ret = EINA_FALSE;
+ double timestamp;
+ long sec, usec;
+
+ edata = ee->engine.data;
+
+ if ((ee->animator_ticked) || (ee->animator_ran))
+ {
+ edata->ticking = EINA_TRUE;
+ return;
+ }
+
+ if (!edata->blanktime)
+ {
+ ret = ecore_drm2_display_blanktime_get(edata->disp, 1, &sec, &usec);
+ if (ret)
+ {
+ timestamp = (double)sec + ((double)usec / 1000000.0);
+ edata->tick_offset = timestamp - ecore_time_get();
+ if (fabs(edata->tick_offset) < 0.010)
+ edata->tick_offset = 0.0;
+ edata->blanktime = EINA_TRUE;
+ }
+ }
+
+ if ((!edata->ticking) || (ee->in_async_render))
+ {
+ ret = ecore_drm2_display_blanktime_get(edata->disp, 0, &sec, &usec);
+ if (ret)
+ {
+ edata->tick_timestamp = (double)sec + ((double)usec / 1000000);
+ edata->tick_job = ecore_job_add(_drm_tick_job, ee);
+ }
+ else
+ {
+ /* TODO: flip ?? */
+ }
+ }
+
+ edata->ticking = EINA_TRUE;
+}
+
+static void
+_drm_animator_unregister(Ecore_Evas *ee)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ edata = ee->engine.data;
+ edata->ticking = EINA_FALSE;
+ if (edata->tick_job)
+ {
+ ecore_job_del(edata->tick_job);
+ edata->tick_job = NULL;
+ }
+}
+
+static void
+_drm_evas_changed(Ecore_Evas *ee, Eina_Bool changed)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ if (changed) return;
+
+ edata = ee->engine.data;
+ if (edata->ticking)
+ {
+ /* TODO: flip ? */
+ }
+}
+
+static double
+_drm_last_tick_get(Ecore_Evas *ee)
+{
+ Ecore_Evas_Engine_Drm_Data *edata;
+ long sec, usec;
+
+ edata = ee->engine.data;
+
+ /* FIXME: Account for multiple outputs */
+
+ /* get blank time */
+ if (!ecore_drm2_display_blanktime_get(edata->disp, 0, &sec, &usec))
+ return -1.0;
+
+ return (double)sec + ((double)usec / 1000000);
+}
+
+static Ecore_Evas_Engine_Func _ecore_evas_drm_engine_func =
+{
+ _drm_free,
+ NULL, //void (*fn_callback_resize_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //void (*fn_callback_move_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //void (*fn_callback_show_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //void (*fn_callback_hide_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //_ecore_evas_drm_delete_request_set,
+ NULL, //void (*fn_callback_destroy_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //_ecore_evas_drm_callback_focus_in_set,
+ NULL, //_ecore_evas_drm_callback_focus_out_set,
+ NULL, //_ecore_evas_drm_callback_mouse_in_set,
+ NULL, //_ecore_evas_drm_callback_mouse_out_set,
+ NULL, //void (*fn_callback_sticky_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //void (*fn_callback_unsticky_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //void (*fn_callback_pre_render_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ NULL, //void (*fn_callback_post_render_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+ _drm_move,
+ NULL, //void (*fn_managed_move) (Ecore_Evas *ee, int x, int y);
+ _drm_resize,
+ _drm_move_resize,
+ _drm_rotation_set,
+ NULL, //void (*fn_shaped_set) (Ecore_Evas *ee, int shaped);
+ _drm_show,
+ _drm_hide,
+ NULL, //void (*fn_raise) (Ecore_Evas *ee);
+ NULL, //void (*fn_lower) (Ecore_Evas *ee);
+ NULL, //void (*fn_activate) (Ecore_Evas *ee);
+ _drm_title_set,
+ _drm_name_class_set,
+ _drm_size_min_set,
+ _drm_size_max_set,
+ _drm_size_base_set,
+ _drm_size_step_set,
+ NULL, // object_cursor_set
+ NULL, // object_cursor_unset
+ _drm_layer_set,
+ NULL, //void (*fn_focus_set) (Ecore_Evas *ee, Eina_Bool on);
+ _drm_iconified_set,
+ _drm_borderless_set,
+ NULL, //void (*fn_override_set) (Ecore_Evas *ee, Eina_Bool on);
+ _drm_maximized_set,
+ _drm_fullscreen_set,
+ _drm_avoid_damage_set,
+ _drm_withdrawn_set,
+ NULL, //void (*fn_sticky_set) (Ecore_Evas *ee, Eina_Bool on);
+ _drm_ignore_events_set,
+ _drm_alpha_set,
+ _drm_transparent_set,
+ NULL, //void (*fn_profiles_set) (Ecore_Evas *ee, const char **profiles, int count);
+ NULL, //void (*fn_profile_set) (Ecore_Evas *ee, const char *profile);
+ NULL, //void (*fn_window_group_set) (Ecore_Evas *ee, const Ecore_Evas *ee_group);
+ _drm_aspect_set,
+ NULL, //void (*fn_urgent_set) (Ecore_Evas *ee, Eina_Bool on);
+ NULL, //void (*fn_modal_set) (Ecore_Evas *ee, Eina_Bool on);
+ NULL, //void (*fn_demands_attention_set) (Ecore_Evas *ee, Eina_Bool on);
+ NULL, //void (*fn_focus_skip_set) (Ecore_Evas *ee, Eina_Bool on);
+ _drm_render,
+ NULL, //_drm_screen_geometry_get,
+ NULL, //_drm_screen_dpi_get,
+ NULL, //void (*fn_msg_parent_send) (Ecore_Evas *ee, int maj, int min, void *data, int size);
+ NULL, //void (*fn_msg_send) (Ecore_Evas *ee, int maj, int min, void *data, int size);
+ _drm_pointer_xy_get,
+ _drm_pointer_warp,
+ NULL, // wm_rot_preferred_rotation_set
+ NULL, // wm_rot_available_rotations_set
+ NULL, // wm_rot_manual_rotation_done_set
+ NULL, // wm_rot_manual_rotation_done
+ NULL, // aux_hints_set
+#ifndef VSYNC_ANIMATOR
+ NULL,
+ NULL,
+#else
+ _drm_animator_register, // animator_register
+ _drm_animator_unregister, // animator_unregister
+#endif
+ _drm_evas_changed,
+ NULL, //fn_focus_device_set
+ NULL, //fn_callback_focus_device_in_set
+ NULL, //fn_callback_focus_device_out_set
+ NULL, //fn_callback_device_mouse_in_set
+ NULL, //fn_callback_device_mouse_out_set
+ NULL, //fn_pointer_device_xy_get
+ NULL, //fn_prepare
+ _drm_last_tick_get,
+};
+
+static Eina_Bool
+_cb_drm_event(void *data EINA_UNUSED, Ecore_Fd_Handler *hdlr EINA_UNUSED)
+{
+ /* Ecore_Evas *ee; */
+ /* Ecore_Evas_Engine_Drm_Data *edata; */
+
+ /* ee = data; */
+ /* edata = ee->engine.data; */
+
+ /* TODO */
+
+ return EINA_TRUE;
+}
+
+static void
+_cb_drm_render_updates(void *data, Evas *evas EINA_UNUSED, void *event)
+{
+ Ecore_Evas *ee;
+ Evas_Event_Render_Post *ev;
+
+ ee = data;
+ ev = event;
+ if (!ev) return;
+
+ ee->in_async_render = EINA_FALSE;
+
+ _drm_render_updates_process(ee, ev->updated_area);
+
+ if (ee->delayed.alpha_changed)
+ {
+ _drm_alpha_do(ee, ee->delayed.alpha);
+ ee->delayed.alpha_changed = EINA_FALSE;
+ }
+
+ if (ee->delayed.transparent_changed)
+ {
+ _drm_transparent_do(ee, ee->delayed.transparent);
+ ee->delayed.transparent_changed = EINA_FALSE;
+ }
+
+ if (ee->delayed.avoid_damage != ee->prop.avoid_damage)
+ _drm_avoid_damage_do(ee, ee->delayed.avoid_damage);
+
+ if (ee->delayed.rotation_changed)
+ {
+ ee->delayed.rotation_changed = EINA_FALSE;
+ }
+}
+
+static Ecore_Evas *
+_ecore_evas_new_internal(const char *device, int x, int y, int w, int h, Eina_Bool gl)
+{
+ Ecore_Evas *ee;
+ Ecore_Evas_Interface_Drm *iface;
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ int method = 0;
+
+ if (gl)
+ {
+ /* TODO */
+ }
+ else
+ method = evas_render_method_lookup("drm");
+
+ if (!method) return NULL;
+
+ ee = calloc(1, sizeof(Ecore_Evas));
+ if (!ee) return NULL;
+
+ edata = calloc(1, sizeof(Ecore_Evas_Engine_Drm_Data));
+ if (!edata)
+ {
+ free(ee);
+ return NULL;
+ }
+
+ edata->x = x;
+ edata->y = y;
+ edata->w = w;
+ edata->h = h;
+ edata->format = DRM_FORMAT_XRGB8888;
+
+ if (_ecore_evas_drm_init(ee, edata, device) < 1)
+ {
+ free(edata);
+ free(ee);
+ return NULL;
+ }
+
+ ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+ if (gl) ee->driver = "gl_drm";
+ else ee->driver = "drm";
+
+ ee->engine.func->fn_animator_register = NULL;
+ ee->engine.func->fn_animator_unregister = NULL;
+ if (ecore_drm2_device_vblank_supported(edata->dev))
+ {
+ ee->engine.func->fn_animator_register = _drm_animator_register;
+ ee->engine.func->fn_animator_unregister = _drm_animator_unregister;
+ }
+
+ ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_evas_drm_engine_func;
+ ee->engine.data = ""
+
+ iface = _ecore_evas_drm_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
+
+ ee->x = ee->req.x = x;
+ ee->y = ee->req.y = y;
+ ee->w = ee->req.w = w;
+ ee->h = ee->req.h = h;
+
+ ee->prop.max.w = 32767;
+ ee->prop.max.h = 32767;
+ ee->prop.layer = 4;
+ ee->prop.request_pos = 0;
+ ee->prop.sticky = 0;
+ ee->prop.withdrawn = EINA_TRUE;
+ ee->alpha = EINA_FALSE;
+
+ ee->can_async_render = !gl;
+ if (getenv("ECORE_EVAS_FORCE_SYNC_RENDER"))
+ ee->can_async_render = 0;
+
+ if (!ecore_evas_evas_new(ee, w, h))
+ {
+ ERR("Can not create a Canvas.");
+ goto eng_err;
+ }
+
+ evas_output_method_set(ee->evas, method);
+ evas_output_viewport_set(ee->evas, x, y, w, h);
+
+ /* TODO: evas_callback_render_flush_post ?? */
+ /* TODO: evas_callback_render_pre ?? */
+
+ if (ee->can_async_render)
+ evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST,
+ _cb_drm_render_updates, ee);
+
+#ifdef BUILD_ECORE_EVAS_GL_DRM
+ if (gl)
+ {
+
+ }
+ else
+#endif
+ {
+ Evas_Engine_Info_Drm *einfo;
+
+ einfo = (Evas_Engine_Info_Drm *)evas_engine_info_get(ee->evas);
+ if (!einfo) goto eng_err;
+
+ einfo->dev = edata->dev;
+ einfo->bpp = edata->bpp;
+ einfo->depth = edata->depth;
+ einfo->format = edata->format;
+ einfo->rotation = edata->rotation;
+ einfo->alpha = ee->alpha;
+
+ if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+ {
+ ERR("evas_engine_info_set() for engine '%s' failed", ee->driver);
+ goto eng_err;
+ }
+ }
+
+ /* TODO: prop window */
+
+ ecore_evas_data_set(ee, "device", edata->dev);
+ ecore_evas_done(ee, EINA_FALSE);
+
+ /* TODO: finish */
+
+ edata->fd_hdlr =
+ ecore_main_fd_handler_add(ecore_drm2_device_fd_get(edata->dev),
+ ECORE_FD_READ, _cb_drm_event, ee, NULL, NULL);
+
+ return ee;
+
+eng_err:
+ ecore_evas_free(ee);
+ return NULL;
+}
+
+EMODAPI Ecore_Evas *
+ecore_evas_drm_new_internal(const char *device, unsigned int parent EINA_UNUSED, int x, int y, int w, int h)
+{
+ return _ecore_evas_new_internal(device, x, y, w, h, EINA_FALSE);
+}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.