From 5e832dfa76efba3ecbdc79d55c1444d583ae0d0a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Tue, 14 Apr 2015 20:41:56 +0900 Subject: [PATCH] Evas GL: Disable direct rendering if there is a map The engine itself (gl_generic) will detect whether the target surface (canvas where to draw the gl stuff) is the window backbuffer or not. --- src/lib/evas/canvas/evas_object_image.c | 8 ++++---- src/lib/evas/include/evas_private.h | 2 +- src/modules/evas/engines/gl_generic/evas_engine.c | 8 +++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 66463e5154..cabeebbb0c 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -2900,7 +2900,7 @@ evas_draw_image_map_async_check(Evas_Object_Protected_Data *obj, static void * evas_process_dirty_pixels(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o, - void *output, void *pixels) + void *output, void *surface, void *pixels) { Eina_Bool direct_override = EINA_FALSE, direct_force_off = EINA_FALSE; @@ -2923,7 +2923,7 @@ evas_process_dirty_pixels(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, if (ENFN->gl_direct_override_get) ENFN->gl_direct_override_get(output, &direct_override, &direct_force_off); if (ENFN->gl_surface_direct_renderable_get) - direct_renderable = ENFN->gl_surface_direct_renderable_get(output, ns, &direct_override); + direct_renderable = ENFN->gl_surface_direct_renderable_get(output, ns, &direct_override, surface); if ( ((direct_override) || ((direct_renderable) && @@ -2996,7 +2996,7 @@ evas_process_dirty_pixels(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, if (ENFN->gl_direct_override_get) ENFN->gl_direct_override_get(output, &direct_override, &direct_force_off); if (ENFN->gl_surface_direct_renderable_get) - ENFN->gl_surface_direct_renderable_get(output, ns, &direct_override); + ENFN->gl_surface_direct_renderable_get(output, ns, &direct_override, surface); if (direct_override && !direct_force_off) { @@ -3130,7 +3130,7 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v } else if (!o->cur->source) { - pixels = evas_process_dirty_pixels(eo_obj, obj, o, output, o->engine_data); + pixels = evas_process_dirty_pixels(eo_obj, obj, o, output, surface, o->engine_data); /* pixels = o->engine_data; */ imagew = o->cur->image.w; imageh = o->cur->image.h; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 6896c1e308..af2592bc1a 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1321,7 +1321,7 @@ struct _Evas_Func void *(*gl_current_surface_get) (void *data); int (*gl_rotation_angle_get) (void *data); Eina_Bool (*gl_surface_query) (void *data, void *surface, int attr, void *value); - Eina_Bool (*gl_surface_direct_renderable_get) (void *data, Evas_Native_Surface *ns, Eina_Bool *override); + Eina_Bool (*gl_surface_direct_renderable_get) (void *data, Evas_Native_Surface *ns, Eina_Bool *override, void *surface); void (*gl_image_direct_set) (void *data, void *image, Eina_Bool direct); int (*gl_image_direct_get) (void *data, void *image); void (*gl_get_pixels_pre) (void *data); diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 3fa094f2ef..4dab30bee4 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -1375,10 +1375,12 @@ eng_gl_direct_override_get(void *data, Eina_Bool *override, Eina_Bool *force_off } static Eina_Bool -eng_gl_surface_direct_renderable_get(void *data, Evas_Native_Surface *ns, Eina_Bool *override) +eng_gl_surface_direct_renderable_get(void *data, Evas_Native_Surface *ns, Eina_Bool *override, void *surface) { Render_Engine_GL_Generic *re = data; Eina_Bool direct_render, client_side_rotation; + Evas_Engine_GL_Context *gl_context; + Evas_GL_Image *sfc = surface; EVGLINIT(data, EINA_FALSE); if (!re || !ns) return EINA_FALSE; @@ -1391,6 +1393,10 @@ eng_gl_surface_direct_renderable_get(void *data, Evas_Native_Surface *ns, Eina_B if ((re->software.outbuf_get_rot(re->software.ob) != 0) && (!client_side_rotation)) return EINA_FALSE; + gl_context = re->window_gl_context_get(re->software.ob); + if (gl_context->def_surface != sfc) + return EINA_FALSE; + return EINA_TRUE; }