evas: differentiate engine from output.
authorCedric BAIL <cedric@osg.samsung.com>
Fri, 25 Aug 2017 17:49:53 +0000 (10:49 -0700)
committerCedric BAIL <cedric@osg.samsung.com>
Fri, 25 Aug 2017 17:49:53 +0000 (10:49 -0700)
21 files changed:
src/lib/evas/canvas/evas_main.c
src/lib/evas/canvas/evas_object_main.c
src/lib/evas/canvas/evas_render.c
src/lib/evas/include/evas_inline.x
src/lib/evas/include/evas_private.h
src/modules/evas/engines/buffer/evas_engine.c
src/modules/evas/engines/drm/evas_engine.c
src/modules/evas/engines/eglfs/evas_engine.c
src/modules/evas/engines/fb/evas_engine.c
src/modules/evas/engines/gl_cocoa/evas_engine.c
src/modules/evas/engines/gl_drm/evas_engine.c
src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
src/modules/evas/engines/gl_sdl/evas_engine.c
src/modules/evas/engines/gl_x11/evas_engine.c
src/modules/evas/engines/software_ddraw/evas_engine.c
src/modules/evas/engines/software_gdi/evas_engine.c
src/modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h
src/modules/evas/engines/software_generic/evas_engine.c
src/modules/evas/engines/software_x11/evas_engine.c
src/modules/evas/engines/wayland_egl/evas_engine.c
src/modules/evas/engines/wayland_shm/evas_engine.c

index f72f0d7..043133a 100644 (file)
@@ -378,7 +378,9 @@ next_zombie:
    evas_event_callback_all_del(eo_e);
    evas_event_callback_cleanup(eo_e);
 
+   /* cleanup engine backend */
    EINA_LIST_FREE(e->outputs, evo) efl_canvas_output_del(evo);
+   e->engine.func->engine_free(e->backend);
 
    if (e->common_init)
      {
@@ -1037,6 +1039,10 @@ evas_output_method_set(Evas *eo_e, int render_method)
    if (e->engine.module) evas_module_unref(e->engine.module);
    e->engine.module = em;
    evas_module_ref(em);
+
+   /* Initialize the engine first */
+   e->backend = e->engine.func->engine_new();
+
    /* get the engine info struct */
    if (e->engine.func->info_size)
      {
index a237da4..ea824ac 100644 (file)
@@ -738,7 +738,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
                                 obj->cur->cache.clip.w,
                                 obj->cur->cache.clip.h);
              if ((w > 0) && (h > 0))
-               obj->layer->evas->engine.func->output_redraws_rect_add(ENC, ENDT,
+               obj->layer->evas->engine.func->output_redraws_rect_add(ENC,
                                                                       x + e->framespace.x,
                                                                       y + e->framespace.y,
                                                                       w, h);
@@ -753,7 +753,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
                                 obj->prev->cache.clip.w,
                                 obj->prev->cache.clip.h);
              if ((w > 0) && (h > 0))
-               obj->layer->evas->engine.func->output_redraws_rect_add(ENC, ENDT,
+               obj->layer->evas->engine.func->output_redraws_rect_add(ENC,
                                                                       x + e->framespace.x,
                                                                       y + e->framespace.y,
                                                                       w, h);
@@ -776,7 +776,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
                                           obj->cur->cache.clip.w,
                                           obj->cur->cache.clip.h);
                        if ((w > 0) && (h > 0))
-                         obj->layer->evas->engine.func->output_redraws_rect_add(ENC, ENDT,
+                         obj->layer->evas->engine.func->output_redraws_rect_add(ENC,
                                                                                 x + e->framespace.x,
                                                                                 y + e->framespace.y,
                                                                                 w, h);
@@ -788,7 +788,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
                                           obj->prev->cache.clip.w,
                                           obj->prev->cache.clip.h);
                        if ((w > 0) && (h > 0))
-                         obj->layer->evas->engine.func->output_redraws_rect_add(ENC, ENDT,
+                         obj->layer->evas->engine.func->output_redraws_rect_add(ENC,
                                                                                 x + e->framespace.x,
                                                                                 y + e->framespace.y,
                                                                                 w, h);
index 4c2dca9..5d2495c 100644 (file)
@@ -303,12 +303,12 @@ static void
 _evas_render_prev_cur_clip_cache_add(Evas_Public_Data *evas, Evas_Object_Protected_Data *obj)
 {
    // FIXME: Iterate over each output
-   ENFN->output_redraws_rect_add(ENC, ENDT,
+   ENFN->output_redraws_rect_add(ENC,
                                  obj->prev->cache.clip.x + evas->framespace.x,
                                  obj->prev->cache.clip.y + evas->framespace.y,
                                  obj->prev->cache.clip.w,
                                  obj->prev->cache.clip.h);
-   ENFN->output_redraws_rect_add(ENC, ENDT,
+   ENFN->output_redraws_rect_add(ENC,
                                  obj->cur->cache.clip.x + evas->framespace.x,
                                  obj->cur->cache.clip.y + evas->framespace.y,
                                  obj->cur->cache.clip.w,
@@ -556,7 +556,7 @@ _evas_render_object_map_change_update(Evas_Public_Data *evas,
                                 obj->prev->clipper->prev->cache.clip.w,
                                 obj->prev->clipper->prev->cache.clip.h);
           }
-        ENFN->output_redraws_rect_add(ENC, ENDT, x + fx, y + fy, w, h);
+        ENFN->output_redraws_rect_add(ENC, x + fx, y + fy, w, h);
         x = obj->map->cur.map->normal_geometry.x;
         y = obj->map->cur.map->normal_geometry.y;
         w = obj->map->cur.map->normal_geometry.w;
@@ -569,7 +569,7 @@ _evas_render_object_map_change_update(Evas_Public_Data *evas,
                                 obj->cur->clipper->cur->cache.clip.w,
                                 obj->cur->clipper->cur->cache.clip.h);
           }
-        ENFN->output_redraws_rect_add(ENC, ENDT, x + fx, y + fy, w, h);
+        ENFN->output_redraws_rect_add(ENC, x + fx, y + fy, w, h);
      }
    else if (hmap)
      {
@@ -585,7 +585,7 @@ _evas_render_object_map_change_update(Evas_Public_Data *evas,
                                 obj->prev->clipper->prev->cache.clip.w,
                                 obj->prev->clipper->prev->cache.clip.h);
           }
-        ENFN->output_redraws_rect_add(ENC, ENDT, x + fx, y + fy, w, h);
+        ENFN->output_redraws_rect_add(ENC, x + fx, y + fy, w, h);
         x = obj->cur->cache.clip.x;
         y = obj->cur->cache.clip.y;
         w = obj->cur->cache.clip.w;
@@ -598,7 +598,7 @@ _evas_render_object_map_change_update(Evas_Public_Data *evas,
                                 obj->cur->clipper->cur->cache.clip.w,
                                 obj->cur->clipper->cur->cache.clip.h);
           }
-        ENFN->output_redraws_rect_add(ENC, ENDT, x + fx, y + fy, w, h);
+        ENFN->output_redraws_rect_add(ENC, x + fx, y + fy, w, h);
      }
 }
 
@@ -626,7 +626,7 @@ evas_render_update_del(Evas_Public_Data *evas, int x, int y, int w, int h)
    // FIXME: handle multiple output
    if (EINA_LIKELY((evas->update_del_redirect_array == NULL)))
      {
-        ENFN->output_redraws_rect_del(ENC, ENDT, x, y, w, h);
+        ENFN->output_redraws_rect_del(ENC, x, y, w, h);
      }
    else
      {
@@ -2853,7 +2853,7 @@ skip_obscures:
      {
         // FIXME: Only add necessary rects (if object itself hasn't changed)
         // FIXME: handle multiple output
-        ENFN->output_redraws_rect_add(ENC, ENDT, x, y, w, h);
+        ENFN->output_redraws_rect_add(ENC, x, y, w, h);
      }
 
 end:
@@ -3238,7 +3238,7 @@ evas_render_updates_internal(Evas *eo_e,
    eina_evlog("+render_phase3", eo_e, 0.0, NULL);
    EINA_LIST_FREE(e->damages, r)
      {
-        ENFN->output_redraws_rect_add(ENC, ENDT, r->x, r->y, r->w, r->h);
+        ENFN->output_redraws_rect_add(ENC, r->x, r->y, r->w, r->h);
         eina_rectangle_free(r);
      }
    eina_evlog("-render_phase3", eo_e, 0.0, NULL);
@@ -3247,12 +3247,12 @@ evas_render_updates_internal(Evas *eo_e,
    eina_evlog("+render_phase4", eo_e, 0.0, NULL);
    if (e->viewport.changed)
      {
-        ENFN->output_redraws_rect_add(ENC, ENDT, 0, 0, e->output.w, e->output.h);
+        ENFN->output_redraws_rect_add(ENC, 0, 0, e->output.w, e->output.h);
      }
    if (e->output.changed)
      {
         ENFN->output_resize(ENC, ENDT, e->output.w, e->output.h);
-        ENFN->output_redraws_rect_add(ENC, ENDT, 0, 0, e->output.w, e->output.h);
+        ENFN->output_redraws_rect_add(ENC, 0, 0, e->output.w, e->output.h);
      }
    if ((e->output.w != e->viewport.w) || (e->output.h != e->viewport.h))
      {
@@ -3265,14 +3265,14 @@ evas_render_updates_internal(Evas *eo_e,
          * which covers the Whole viewport. This is because 'framespace' is
          * defined as "the space IN the viewport which is Occupied by the
          * window frame" */
-        ENFN->output_redraws_rect_add(ENC, ENDT,
+        ENFN->output_redraws_rect_add(ENC,
                                       e->viewport.x, e->viewport.y,
                                       e->viewport.w, e->viewport.h);
      }
 
    if (redraw_all)
      {
-        ENFN->output_redraws_rect_add(ENC, ENDT, 0, 0, e->output.w, e->output.h);
+        ENFN->output_redraws_rect_add(ENC, 0, 0, e->output.w, e->output.h);
      }
    eina_evlog("-render_phase4", eo_e, 0.0, NULL);
 
index 74eb25a..7886a0f 100644 (file)
@@ -359,13 +359,7 @@ _evas_default_output_get(Evas_Public_Data *e)
 static inline void *
 _evas_engine_context(Evas_Public_Data *e)
 {
-   // Need to split between engine context
-   // and output context, use one for now.
-   Efl_Canvas_Output *output;
-
-   if (!e->outputs) return NULL;
-   output = eina_list_data_get(e->outputs);
-   return output->output;
+   return e->backend;
 }
 
 #define _EVAS_COLOR_CLAMP(x, y) do { \
index 1765464..b1ae9c7 100644 (file)
@@ -963,6 +963,7 @@ struct _Evas_Public_Data
    Eina_List     *devices;
    Eina_Array    *cur_device;
 
+   void          *backend;
    Eina_List     *outputs;
 
    Evas_Device   *default_seat;
@@ -1394,14 +1395,19 @@ struct _Evas_Object_Func
 
 struct _Evas_Func
 {
+   void *(*engine_new)                     (void);
+   void (*engine_free)                     (void *engine);
+
    void (*output_info_setup)               (void *info);
    void *(*output_setup)                   (void *engine, void *info, unsigned int w, unsigned int h);
    int  (*output_update)                   (void *engine, void *data, void *info, unsigned int w, unsigned int h);
-
    void (*output_free)                     (void *engine, void *data);
    void (*output_resize)                   (void *engine, void *data, int w, int h);
-   void (*output_redraws_rect_add)         (void *engine, void *data, int x, int y, int w, int h);
-   void (*output_redraws_rect_del)         (void *engine, void *data, int x, int y, int w, int h);
+
+   /* The redraws are automatically propagated on all output */
+   void (*output_redraws_rect_add)         (void *engine, int x, int y, int w, int h);
+   void (*output_redraws_rect_del)         (void *engine, int x, int y, int w, int h);
+
    void (*output_redraws_clear)            (void *engine, void *data);
    void *(*output_redraws_next_update_get) (void *engine, void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
    void (*output_redraws_next_update_push) (void *engine, void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
index 7ece6c6..68af177 100644 (file)
@@ -24,7 +24,7 @@ static void eng_output_free(void *engine EINA_UNUSED, void *data);
 
 /* engine api this module provides */
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Buffer *info = in;
    Outbuf *ob;
@@ -74,7 +74,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
                                         info->info.switch_data);
    if (!ob) goto on_error;
 
-   if (!evas_render_engine_software_generic_init(re, ob,
+   if (!evas_render_engine_software_generic_init(engine, re, ob,
                                                  evas_buffer_outbuf_buf_swap_mode_get,
                                                  evas_buffer_outbuf_buf_rot_get,
                                                  evas_buffer_outbuf_reconfigure,
@@ -106,13 +106,13 @@ eng_output_info_setup(void *info)
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
    if ((re = (Render_Engine *)data))
      {
-        evas_render_engine_software_generic_clean(re);
+        evas_render_engine_software_generic_clean(engine, re);
         free(re);
      }
 }
index ca05530..5cbd5e1 100644 (file)
@@ -19,7 +19,7 @@ static Evas_Func func, pfunc;
 int _evas_engine_drm_log_dom;
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *einfo, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *einfo, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Drm *info = einfo;
    Render_Engine *re;
@@ -33,7 +33,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *einfo, unsigned int w, unsigned
 
    re->dev = info->info.dev;
 
-   if (!evas_render_engine_software_generic_init(&re->generic, ob,
+   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob,
                                                  _outbuf_state_get,
                                                  _outbuf_rotation_get,
                                                  _outbuf_reconfigure,
@@ -52,7 +52,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *einfo, unsigned int w, unsigned
    return re;
 
 init_err:
-   evas_render_engine_software_generic_clean(&re->generic);
+   evas_render_engine_software_generic_clean(engine, &re->generic);
 err:
    free(re);
    return NULL;
@@ -82,11 +82,11 @@ eng_output_update(void *engine EINA_UNUSED, void *data, void *einfo, unsigned in
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re = data;
 
-   evas_render_engine_software_generic_clean(&re->generic);
+   evas_render_engine_software_generic_clean(engine, &re->generic);
    free(re);
 }
 
index e33c52b..88321d8 100644 (file)
@@ -679,7 +679,7 @@ eng_output_info_setup(void *info)
 }
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Eglfs *info = in;
    Render_Engine *re = NULL;
@@ -701,7 +701,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
 
    ob->evas = evas;
 
-   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+   if (!evas_render_engine_gl_generic_init(engine, &re->generic, ob,
                                            evas_outbuf_buffer_state_get,
                                            evas_outbuf_rot_get,
                                            evas_outbuf_reconfigure,
@@ -796,7 +796,7 @@ eng_output_update(void *engine EINA_UNUSED, void *data, void *info, unsigned int
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
@@ -808,7 +808,7 @@ eng_output_free(void *engine EINA_UNUSED, void *data)
         if (gl_wins == 1) glsym_evgl_engine_shutdown(re);
 
         /* NB: evas_render_engine_software_generic_clean() frees ob */
-        evas_render_engine_software_generic_clean(&re->generic.software);
+        evas_render_engine_software_generic_clean(engine, &re->generic.software);
 
         gl_wins--;
 
index 635d1ae..c29e8f2 100644 (file)
@@ -18,7 +18,7 @@ typedef Render_Output_Software_Generic Render_Engine;
 
 /* engine api this module provides */
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_FB *info = in;
    Render_Engine *re;
@@ -38,7 +38,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
                                    info->info.refresh);
    if (!ob) goto on_error;
 
-   if (!evas_render_engine_software_generic_init(re, ob, NULL,
+   if (!evas_render_engine_software_generic_init(engine, re, ob, NULL,
                                                  evas_fb_outbuf_fb_get_rot,
                                                  evas_fb_outbuf_fb_reconfigure,
                                                  NULL,
@@ -74,7 +74,7 @@ eng_output_info_setup(void *info)
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
@@ -82,7 +82,7 @@ eng_output_free(void *engine EINA_UNUSED, void *data)
    if (re)
      {
         _outbufs = eina_list_remove(_outbufs, re->ob);
-        evas_render_engine_software_generic_clean(re);
+        evas_render_engine_software_generic_clean(engine, re);
         free(re);
      }
 }
index 92fcb31..6143017 100644 (file)
@@ -126,7 +126,7 @@ static const EVGL_Interface evgl_funcs =
 };
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_GL_Cocoa *const info = in;
    Render_Engine *re;
@@ -157,7 +157,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
 
    info->view = ob->ns_gl_view;
 
-   chk = evas_render_engine_gl_generic_init(&re->generic, ob,
+   chk = evas_render_engine_gl_generic_init(engine, &re->generic, ob,
                                             evas_outbuf_buffer_state_get,
                                             evas_outbuf_rot_get,
                                             evas_outbuf_reconfigure,
index ce5358f..1993a98 100644 (file)
@@ -900,7 +900,7 @@ eng_output_info_setup(void *info)
 }
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_GL_Drm *info = in;
    Render_Engine *re = NULL;
@@ -933,7 +933,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
         return NULL;
      }
 
-   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+   if (!evas_render_engine_gl_generic_init(engine, &re->generic, ob,
                                            evas_outbuf_buffer_state_get,
                                            evas_outbuf_rot_get,
                                            evas_outbuf_reconfigure,
@@ -1028,7 +1028,7 @@ eng_output_update(void *engine EINA_UNUSED, void *data, void *in, unsigned int w
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
@@ -1043,7 +1043,7 @@ eng_output_free(void *engine EINA_UNUSED, void *data)
 
         info = eng_get_ob(re)->info;
         /* NB: evas_render_engine_software_generic_clean() frees ob */
-        evas_render_engine_software_generic_clean(&re->generic.software);
+        evas_render_engine_software_generic_clean(engine, &re->generic.software);
 
         eng_gbm_shutdown(info);
         gl_wins--;
index 89bcbf6..7fdcea5 100644 (file)
@@ -41,7 +41,8 @@ struct _Render_Output_GL_Generic
 };
 
 static inline Eina_Bool
-evas_render_engine_gl_generic_init(Render_Output_GL_Generic *re,
+evas_render_engine_gl_generic_init(Render_Engine_Software_Generic *engine,
+                                   Render_Output_GL_Generic *re,
                                    Outbuf *ob,
                                    Outbuf_Swap_Mode_Get outbuf_swap_mode_get,
                                    Outbuf_Get_Rot outbuf_get_rot,
@@ -63,7 +64,7 @@ evas_render_engine_gl_generic_init(Render_Output_GL_Generic *re,
                                    const EVGL_Interface *evgl_funcs,
                                    int w, int h)
 {
-   if (!evas_render_engine_software_generic_init(&re->software, ob,
+   if (!evas_render_engine_software_generic_init(engine, &re->software, ob,
                                                  outbuf_swap_mode_get,
                                                  outbuf_get_rot,
                                                  outbuf_reconfigure,
index bec1189..847ecc6 100644 (file)
@@ -267,7 +267,7 @@ static const EVGL_Interface evgl_funcs =
 };
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Render_Engine *re = NULL;
    Outbuf *ob = NULL;
@@ -282,7 +282,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
    re = calloc(1, sizeof (Render_Engine));
    if (!re) goto on_error;
 
-   if (!evas_render_engine_gl_generic_init(&re->generic, ob, NULL,
+   if (!evas_render_engine_gl_generic_init(engine, &re->generic, ob, NULL,
                                            _outbuf_get_rot,
                                            _outbuf_reconfigure,
                                            _outbuf_region_first_rect,
@@ -313,11 +313,11 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re = data;
 
-   evas_render_engine_software_generic_clean(&re->generic.software);
+   evas_render_engine_software_generic_clean(engine, &re->generic.software);
 }
 
 static void
index cb3ca43..c885353 100644 (file)
@@ -1576,7 +1576,7 @@ _re_winfree(Render_Engine *re)
 }
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_GL_X11 *info = in;
    Render_Engine *re = NULL;
@@ -1639,7 +1639,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
                        info->msaa_bits);
    if (!ob) goto on_error;
 
-   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+   if (!evas_render_engine_gl_generic_init(engine, &re->generic, ob,
                                            eng_outbuf_swap_mode,
                                            eng_outbuf_get_rot,
                                            eng_outbuf_reconfigure,
@@ -1751,7 +1751,7 @@ eng_output_update(void *engine EINA_UNUSED, void *data, void *in, unsigned int w
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
@@ -1780,7 +1780,7 @@ eng_output_free(void *engine EINA_UNUSED, void *data)
 
         if (gl_wins == 1) glsym_evgl_engine_shutdown(re);
 
-        evas_render_engine_software_generic_clean(&re->generic.software);
+        evas_render_engine_software_generic_clean(engine, &re->generic.software);
 
 #ifndef GL_GLES
         if (glsym_glXReleaseBuffersMESA)
index a935922..f8882e8 100644 (file)
@@ -21,7 +21,7 @@ int _evas_log_dom_module = -1;
 /* engine api this module provides */
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Software_DDraw *info = in;
    Render_Engine *re;
@@ -40,7 +40,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
                                          info->info.fullscreen);
    if (!ob) goto on_error;
 
-   if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL,
+   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob, NULL,
                                                  evas_software_ddraw_outbuf_rot_get,
                                                  evas_software_ddraw_outbuf_reconfigure,
                                                  NULL,
@@ -72,14 +72,14 @@ eng_output_info_setup(void *info)
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
    if (!data) return;
 
    re = (Render_Engine *)data;
-   evas_render_engine_software_generic_clean(&re->generic);
+   evas_render_engine_software_generic_clean(engine, &re->generic);
    free(re);
 }
 
index 462a379..10562d3 100644 (file)
@@ -17,7 +17,7 @@ struct _Render_Engine
 
 /* engine api this module provides */
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Software_Gdi *info = in;
    Render_Engine *re;
@@ -44,7 +44,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
                                        0, 0);
    if (!ob) goto on_error;
 
-   if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL,
+   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob, NULL,
                                                  evas_software_gdi_outbuf_rot_get,
                                                  evas_software_gdi_outbuf_reconfigure,
                                                  NULL,
@@ -97,14 +97,14 @@ eng_output_update(void *engine EINA_UNUSED, void *data, void *in, unsigned int w
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
    if (!data) return;
 
    re = (Render_Engine *)data;
-   evas_render_engine_software_generic_clean(&re->generic);
+   evas_render_engine_software_generic_clean(engine, &re->generic);
    free(re);
 }
 
index d563b56..48ab061 100644 (file)
@@ -32,6 +32,7 @@ typedef enum
    MERGE_SMART = 4
 } Render_Output_Merge_Mode;
 
+typedef struct _Render_Engine_Software_Generic Render_Engine_Software_Generic;
 typedef struct _Render_Output_Software_Generic Render_Output_Software_Generic;
 typedef struct _Outbuf Outbuf;
 
@@ -79,8 +80,19 @@ struct _Render_Output_Software_Generic
    unsigned char tile_strict : 1;
 };
 
+struct _Render_Engine_Software_Generic
+{
+   Eina_List *outputs;
+
+   struct {
+      int w, h;
+      Eina_Bool strict;
+   } tile;
+};
+
 static inline Eina_Bool
-evas_render_engine_software_generic_init(Render_Output_Software_Generic *re,
+evas_render_engine_software_generic_init(Render_Engine_Software_Generic *engine,
+                                         Render_Output_Software_Generic *re,
                                          Outbuf *ob,
                                          Outbuf_Swap_Mode_Get outbuf_swap_mode_get,
                                          Outbuf_Get_Rot outbuf_get_rot,
@@ -131,11 +143,14 @@ evas_render_engine_software_generic_init(Render_Output_Software_Generic *re,
    /* in preliminary tests 16x16 gave highest framerates */
    evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
 
+   engine->outputs = eina_list_append(engine->outputs, re);
+
    return EINA_TRUE;
 }
 
 static inline void
-evas_render_engine_software_generic_clean(Render_Output_Software_Generic *re)
+evas_render_engine_software_generic_clean(Render_Engine_Software_Generic *engine,
+                                          Render_Output_Software_Generic *re)
 {
    if (re->tb) evas_common_tilebuf_free(re->tb);
    if (re->ob) re->outbuf_free(re->ob);
@@ -146,6 +161,8 @@ evas_render_engine_software_generic_clean(Render_Output_Software_Generic *re)
    if (re->rects_prev[2]) evas_common_tilebuf_free_render_rects(re->rects_prev[2]);
    if (re->rects_prev[3]) evas_common_tilebuf_free_render_rects(re->rects_prev[3]);
 
+   engine->outputs = eina_list_remove(engine->outputs, re);
+
    memset(re, 0, sizeof (Render_Output_Software_Generic));
 }
 
index 3ea6c71..af80a9b 100644 (file)
@@ -3897,6 +3897,29 @@ eng_gl_rotation_angle_get(void *data EINA_UNUSED)
    initialized by evas_render_engine_software_generic_init().
  */
 
+static void *
+eng_engine_new(void)
+{
+   Render_Engine_Software_Generic *engine;
+
+   engine = calloc(1, sizeof (Render_Engine_Software_Generic));
+   if (!engine) return NULL;
+
+   return engine;
+}
+
+static void
+eng_engine_free(void *engine)
+{
+   Render_Engine_Software_Generic *e = engine;
+   Render_Output_Software_Generic *output;
+
+   EINA_LIST_FREE(e->outputs, output)
+     ERR("Output %p not properly cleaned before engine destruction.", output);
+
+   free(e);
+}
+
 static void
 eng_output_resize(void *engine EINA_UNUSED, void *data, int w, int h)
 {
@@ -3917,21 +3940,25 @@ eng_output_resize(void *engine EINA_UNUSED, void *data, int w, int h)
 }
 
 static void
-eng_output_redraws_rect_add(void *engine EINA_UNUSED, void *data, int x, int y, int w, int h)
+eng_output_redraws_rect_add(void *engine, int x, int y, int w, int h)
 {
+   Render_Engine_Software_Generic *backend = engine;
    Render_Output_Software_Generic *re;
+   Eina_List *l;
 
-   re = (Render_Output_Software_Generic *)data;
-   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+   EINA_LIST_FOREACH(backend->outputs, l, re)
+     evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
 }
 
 static void
-eng_output_redraws_rect_del(void *engine EINA_UNUSED, void *data, int x, int y, int w, int h)
+eng_output_redraws_rect_del(void *engine, int x, int y, int w, int h)
 {
+   Render_Engine_Software_Generic *backend = engine;
    Render_Output_Software_Generic *re;
+   Eina_List *l;
 
-   re = (Render_Output_Software_Generic *)data;
-   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+   EINA_LIST_FOREACH(backend->outputs, l, re)
+     evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
 }
 
 static void
@@ -4659,6 +4686,8 @@ eng_gfx_filter_process(void *data EINA_UNUSED, Evas_Filter_Command *cmd)
 
 static Evas_Func func =
 {
+     eng_engine_new,
+     eng_engine_free,
      NULL, // eng_info_setup
      NULL, // eng_setup
      NULL, // eng_update
index c1cab73..49f3683 100644 (file)
@@ -64,7 +64,7 @@ _output_egl_shutdown(Render_Engine *re)
 }
 
 static void *
-_output_xlib_setup(int w, int h, int rot, Display *disp, Drawable draw,
+_output_xlib_setup(void *engine, int w, int h, int rot, Display *disp, Drawable draw,
                    Visual *vis, Colormap cmap, int depth, int debug,
                    int grayscale, int max_colors, Pixmap mask,
                    int shape_dither, int destination_alpha)
@@ -96,7 +96,7 @@ _output_xlib_setup(int w, int h, int rot, Display *disp, Drawable draw,
 //   re->ob->onebuf = 1;
 
    evas_software_xlib_outbuf_debug_set(ob, debug);
-   if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL,
+   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob, NULL,
                                                  evas_software_xlib_outbuf_get_rot,
                                                  evas_software_xlib_outbuf_reconfigure,
                                                  NULL,
@@ -122,7 +122,7 @@ on_error:
 }
 
 static void *
-_output_swapbuf_setup(int w, int h, int rot, Display *disp, Drawable draw,
+_output_swapbuf_setup(void *engine, int w, int h, int rot, Display *disp, Drawable draw,
                       Visual *vis, Colormap cmap, int depth,
                       int debug EINA_UNUSED,
                       int grayscale, int max_colors, Pixmap mask,
@@ -144,7 +144,7 @@ _output_swapbuf_setup(int w, int h, int rot, Display *disp, Drawable draw,
                                         destination_alpha);
    if (!ob) goto on_error;
 
-   if (!evas_render_engine_software_generic_init(&re->generic, ob,
+   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob,
                                                  evas_software_xlib_swapbuf_buffer_state_get,
                                                  evas_software_xlib_swapbuf_get_rot,
                                                  evas_software_xlib_swapbuf_reconfigure,
@@ -231,7 +231,7 @@ eng_output_info_setup(void *info)
 }
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Software_X11 *info = in;
    Render_Engine *re = NULL;
@@ -252,7 +252,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
      }
 
    if (try_swapbuf)
-     re = _output_swapbuf_setup(w, h,
+     re = _output_swapbuf_setup(engine, w, h,
                                 info->info.rotation, info->info.connection,
                                 info->info.drawable, info->info.visual,
                                 info->info.colormap,
@@ -264,7 +264,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned in
    if (re) re->outbuf_alpha_get = evas_software_xlib_swapbuf_alpha_get;
    else
      {
-        re = _output_xlib_setup(w, h,
+        re = _output_xlib_setup(engine, w, h,
                                 info->info.rotation, info->info.connection,
                                 info->info.drawable, info->info.visual,
                                 info->info.colormap,
@@ -341,14 +341,14 @@ eng_output_update(void *engine EINA_UNUSED, void *data, void *in, unsigned int w
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
    if ((re = (Render_Engine *)data))
      {
         _outbufs = eina_list_remove(_outbufs, re->generic.ob);
-        evas_render_engine_software_generic_clean(&re->generic);
+        evas_render_engine_software_generic_clean(engine, &re->generic);
         _output_egl_shutdown(re);
         free(re);
      }
index 0630daf..be50952 100644 (file)
@@ -546,7 +546,7 @@ _eng_swap_mode_get(void)
 }
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *info, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *info, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Wayland *inf = info;
    Render_Engine *re;
@@ -576,7 +576,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *info, unsigned int w, unsigned
    ob = eng_window_new(inf, w, h, swap_mode);
    if (!ob) goto ob_err;
 
-   if (!evas_render_engine_gl_generic_init(&re->generic, ob,
+   if (!evas_render_engine_gl_generic_init(engine, &re->generic, ob,
                                            eng_outbuf_swap_mode_get,
                                            eng_outbuf_rotation_get,
                                            eng_outbuf_reconfigure,
@@ -719,7 +719,7 @@ eng_canvas_alpha_get(void *engine)
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
@@ -729,7 +729,7 @@ eng_output_free(void *engine EINA_UNUSED, void *data)
 
         if (gl_wins == 1) glsym_evgl_engine_shutdown(re);
 
-        evas_render_engine_software_generic_clean(&re->generic.software);
+        evas_render_engine_software_generic_clean(engine, &re->generic.software);
 
         gl_wins--;
 
index b2cbb75..e74cc2f 100644 (file)
@@ -28,7 +28,7 @@ struct _Render_Engine
 };
 
 static void *
-eng_output_setup(void *engine EINA_UNUSED, void *info, unsigned int w, unsigned int h)
+eng_output_setup(void *engine, void *info, unsigned int w, unsigned int h)
 {
    Evas_Engine_Info_Wayland *einfo = info;
    Render_Engine *re;
@@ -42,7 +42,7 @@ eng_output_setup(void *engine EINA_UNUSED, void *info, unsigned int w, unsigned
    ob = _evas_outbuf_setup(w, h, einfo);
    if (!ob) goto err;
 
-   if (!evas_render_engine_software_generic_init(&re->generic, ob,
+   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob,
                                                  _evas_outbuf_swap_mode_get,
                                                  _evas_outbuf_rotation_get,
                                                  NULL,
@@ -145,13 +145,13 @@ eng_output_update(void *engine, void *data, void *info, unsigned int w, unsigned
 }
 
 static void
-eng_output_free(void *engine EINA_UNUSED, void *data)
+eng_output_free(void *engine, void *data)
 {
    Render_Engine *re;
 
    if ((re = (Render_Engine *)data))
      {
-        evas_render_engine_software_generic_clean(&re->generic);
+        evas_render_engine_software_generic_clean(engine, &re->generic);
         free(re);
      }
 }