jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0585540bb3558b2ff834a1bb730e897c6301a224

commit 0585540bb3558b2ff834a1bb730e897c6301a224
Author: Minkyoung Kim <mer....@samsung.com>
Date:   Tue Mar 17 11:17:26 2015 +0900

    evas/gl_x11: Optimize out calls to make current
    
    Summary: Reducing the number of calling eglMakeCurrent.
    
    Reviewers: jpeg
    
    Subscribers: wonsik, cedric, spacegrapher
    
    Differential Revision: https://phab.enlightenment.org/D2094
---
 src/modules/evas/engines/gl_drm/evas_engine.c      |  1 +
 .../engines/gl_generic/Evas_Engine_GL_Generic.h    |  4 +++
 src/modules/evas/engines/gl_generic/evas_engine.c  | 33 +++++++++++++---------
 src/modules/evas/engines/gl_sdl/evas_engine.c      |  1 +
 src/modules/evas/engines/gl_x11/evas_engine.c      |  1 +
 src/modules/evas/engines/gl_x11/evas_engine.h      |  4 +++
 src/modules/evas/engines/gl_x11/evas_x_main.c      | 27 +++++++++++++++++-
 src/modules/evas/engines/wayland_egl/evas_engine.c |  1 +
 8 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c 
b/src/modules/evas/engines/gl_drm/evas_engine.c
index 11a20b6..8736e99 100644
--- a/src/modules/evas/engines/gl_drm/evas_engine.c
+++ b/src/modules/evas/engines/gl_drm/evas_engine.c
@@ -641,6 +641,7 @@ eng_setup(Evas *eo_e, void *in)
                                                 eng_outbuf_egl_display_get,
                                                 eng_gl_context_new,
                                                 eng_gl_context_use,
+                                                
NULL,//eng_outbuf_context_is_current_set
                                                 &evgl_funcs,
                                                 epd->output.w, epd->output.h))
           {
diff --git a/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h 
b/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
index e5743ee..f74bef4 100644
--- a/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
+++ b/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
@@ -14,6 +14,7 @@ typedef Evas_Engine_GL_Context 
*(*Window_GL_Context_Get)(Outbuf *ob);
 typedef void *(*Window_EGL_Display_Get)(Outbuf *ob);
 typedef Context_3D *(*Window_GL_Context_New)(Outbuf *ob);
 typedef void (*Window_GL_Context_Use)(Context_3D *ctx);
+typedef void (*Window_Context_Is_Current_Set)(Outbuf *ob, Eina_Bool 
context_current);
 
 struct _Render_Engine_GL_Generic
 {
@@ -24,6 +25,7 @@ struct _Render_Engine_GL_Generic
    Window_EGL_Display_Get window_egl_display_get;
    Window_GL_Context_New window_gl_context_new;
    Window_GL_Context_Use window_gl_context_use;
+   Window_Context_Is_Current_Set window_context_is_current_set;
 
    struct {
       Evas_Object_Image_Pixels_Get_Cb  get_pixels;
@@ -56,6 +58,7 @@ evas_render_engine_gl_generic_init(Render_Engine_GL_Generic 
*re,
                                    Window_EGL_Display_Get 
window_egl_display_get,
                                    Window_GL_Context_New window_gl_context_new,
                                    Window_GL_Context_Use window_gl_context_use,
+                                   Window_Context_Is_Current_Set 
window_context_is_current_set,
                                    const EVGL_Interface *evgl_funcs,
                                    int w, int h)
 {
@@ -78,6 +81,7 @@ evas_render_engine_gl_generic_init(Render_Engine_GL_Generic 
*re,
    re->window_egl_display_get = window_egl_display_get;
    re->window_gl_context_new = window_gl_context_new;
    re->window_gl_context_use = window_gl_context_use;
+   re->window_context_is_current_set = window_context_is_current_set;
 
    re->func.get_pixels = NULL;
    re->func.get_pixels_data = NULL;
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c 
b/src/modules/evas/engines/gl_generic/evas_engine.c
index 67c6deb..236a4bc 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -805,6 +805,23 @@ eng_image_data_preload_cancel(void *data EINA_UNUSED, void 
*image, const Eo *tar
    evas_gl_preload_target_unregister(gim->tex, (Eo*) target);
 }
 
+static void
+eng_gl_get_pixels_pre(void *data EINA_UNUSED)
+{
+   evgl_get_pixels_pre();
+}
+
+static void
+eng_gl_get_pixels_post(void *data)
+{
+   Render_Engine_GL_Generic *re = data;
+   if (!re) return;
+
+   evgl_get_pixels_post();
+   if (re->window_context_is_current_set)
+     re->window_context_is_current_set(re->software.ob, EINA_FALSE);
+}
+
 static Eina_Bool
 eng_image_draw(void *data, void *context, void *surface, void *image, int 
src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int 
dst_h, int smooth, Eina_Bool do_async EINA_UNUSED)
 {
@@ -856,9 +873,9 @@ eng_image_draw(void *data, void *context, void *surface, 
void *image, int src_x,
                              direct_surface);
 
         // Call pixel get function
-        evgl_get_pixels_pre();
+        eng_gl_get_pixels_pre(re);
         re->func.get_pixels(re->func.get_pixels_data, re->func.obj);
-        evgl_get_pixels_post();
+        eng_gl_get_pixels_post(re);
 
         // Call end tile if it's being used
         if ((gl_context->master_clip.enabled) &&
@@ -1374,18 +1391,6 @@ eng_gl_get_pixels_set(void *data, void *get_pixels, void 
*get_pixels_data, void
    re->func.obj = (Evas_Object*)obj;
 }
 
-static void
-eng_gl_get_pixels_pre(void *data EINA_UNUSED)
-{
-   evgl_get_pixels_pre();
-}
-
-static void
-eng_gl_get_pixels_post(void *data EINA_UNUSED)
-{
-   evgl_get_pixels_post();
-}
-
 static Eina_Bool
 eng_gl_surface_lock(void *data, void *surface)
 {
diff --git a/src/modules/evas/engines/gl_sdl/evas_engine.c 
b/src/modules/evas/engines/gl_sdl/evas_engine.c
index 5691684..c0420af 100644
--- a/src/modules/evas/engines/gl_sdl/evas_engine.c
+++ b/src/modules/evas/engines/gl_sdl/evas_engine.c
@@ -318,6 +318,7 @@ eng_setup(Evas *eo_e, void *in)
                                            _window_egl_display_get,
                                            _window_gl_context_new,
                                            _window_gl_context_use,
+                                           
NULL,//eng_outbuf_context_is_current_set
                                            &evgl_funcs,
                                            e->output.w, e->output.h))
      goto on_error;
diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c 
b/src/modules/evas/engines/gl_x11/evas_engine.c
index c6d3982..58f3efd 100644
--- a/src/modules/evas/engines/gl_x11/evas_engine.c
+++ b/src/modules/evas/engines/gl_x11/evas_engine.c
@@ -1645,6 +1645,7 @@ eng_setup(Evas *eo_e, void *in)
                                                 eng_outbuf_egl_display_get,
                                                 eng_gl_context_new,
                                                 eng_gl_context_use,
+                                                
eng_outbuf_context_is_current_set,
                                                 &evgl_funcs,
                                                 e->output.w, e->output.h))
           {
diff --git a/src/modules/evas/engines/gl_x11/evas_engine.h 
b/src/modules/evas/engines/gl_x11/evas_engine.h
index a090393..b8945b6 100644
--- a/src/modules/evas/engines/gl_x11/evas_engine.h
+++ b/src/modules/evas/engines/gl_x11/evas_engine.h
@@ -108,6 +108,9 @@ struct _Outbuf
    struct {
       unsigned char drew : 1;
    } draw;
+
+   Eina_Bool        context_switch_optimize : 1;
+   Eina_Bool        context_current : 1;
 };
 
 struct _Context_3D
@@ -196,6 +199,7 @@ void eng_outbuf_push_updated_region(Outbuf *ob, RGBA_Image 
*update,
 void eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode 
render_mode);
 Evas_Engine_GL_Context *eng_outbuf_gl_context_get(Outbuf *ob);
 void *eng_outbuf_egl_display_get(Outbuf *ob);
+void eng_outbuf_context_is_current_set(Outbuf *ob, Eina_Bool context_current);
 
 Eina_Bool eng_preload_make_current(void *data, void *doit);
 
diff --git a/src/modules/evas/engines/gl_x11/evas_x_main.c 
b/src/modules/evas/engines/gl_x11/evas_x_main.c
index 29b3910..fccf47d 100644
--- a/src/modules/evas/engines/gl_x11/evas_x_main.c
+++ b/src/modules/evas/engines/gl_x11/evas_x_main.c
@@ -133,7 +133,8 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info,
 #endif
    const GLubyte *vendor, *renderer, *version, *glslversion;
    int blacklist = 0;
-   int val = 0;
+   int val = 0, context_optimize_disable = 0;
+   char* s;
 
    if (!fbconf) eng_best_visual_get(info);
    if (!_evas_gl_x11_vi) return NULL;
@@ -158,6 +159,15 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info,
    gw->depth_bits = depth_bits;
    gw->stencil_bits = stencil_bits;
    gw->msaa_bits = msaa_bits;
+   gw->context_current = EINA_FALSE;
+
+   if ((s = getenv("EVAS_GL_CONTEXT_SWITCH_OPTIMIZE_DISABLE")) != NULL)
+     context_optimize_disable = atoi(s);
+
+   if (context_optimize_disable == 1)
+     gw->context_switch_optimize = EINA_FALSE;
+   else
+     gw->context_switch_optimize = EINA_TRUE;
 
    if (gw->alpha && _evas_gl_x11_rgba_vi)
      gw->visualinfo = _evas_gl_x11_rgba_vi;
@@ -581,6 +591,10 @@ eng_window_use(Outbuf *gw)
 
    xwin = _tls_outbuf_get();
 
+   if (xwin && (xwin == gw))
+     if (gw->context_switch_optimize && gw->context_current)
+       return;
+
    glsym_evas_gl_preload_render_lock(eng_window_make_current, gw);
 #ifdef GL_GLES
    if (xwin)
@@ -635,6 +649,8 @@ eng_window_use(Outbuf *gw)
                   ERR("glXMakeContextCurrent(%p, %p, %p, %p)", (void 
*)gw->disp, (void *)gw->glxwin, (void *)gw->win, (void *)gw->context);
                }
 #endif
+             if (xwin) xwin->context_current = EINA_FALSE;
+             gw->context_current = EINA_TRUE;
           }
      }
    if (gw) glsym_evas_gl_common_context_use(gw->gl_context);
@@ -1459,3 +1475,12 @@ eng_outbuf_egl_display_get(Outbuf *ob)
    return NULL;
 #endif
 }
+
+void
+eng_outbuf_context_is_current_set(Outbuf *ob, Eina_Bool context_current)
+{
+   if (!ob) return;
+
+   ob->context_current = context_current;
+   return;
+}
diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c 
b/src/modules/evas/engines/wayland_egl/evas_engine.c
index 0b33672..1e0d229 100644
--- a/src/modules/evas/engines/wayland_egl/evas_engine.c
+++ b/src/modules/evas/engines/wayland_egl/evas_engine.c
@@ -618,6 +618,7 @@ eng_setup(Evas *evas, void *info)
                                                 eng_outbuf_egl_display_get, 
                                                 eng_gl_context_new, 
                                                 eng_gl_context_use, 
+                                                NULL, 
//eng_outbuf_context_is_current_set
                                                 &evgl_funcs, 
                                                 epd->output.w, epd->output.h))
           {

-- 


Reply via email to