canvas gl: fix nutty code of partial rendering toggle. 55/231855/4
authorHermet Park <chuneon.park@samsung.com>
Fri, 24 Apr 2020 12:26:25 +0000 (21:26 +0900)
committerHermet Park <chuneon.park@samsung.com>
Mon, 27 Apr 2020 04:24:23 +0000 (04:24 +0000)
clean up partial rendering code for maintaining
and makei it work properly while toggling.

Change-Id: I8827c2526397fb73c961a0f4449f2bacd6525418

17 files changed:
src/modules/evas/engines/eglfs/evas_engine.c
src/modules/evas/engines/eglfs/evas_engine.h
src/modules/evas/engines/gl_common/evas_gl_core.c
src/modules/evas/engines/gl_common/evas_gl_core_private.h
src/modules/evas/engines/gl_drm/evas_engine.c
src/modules/evas/engines/gl_drm/evas_engine.h
src/modules/evas/engines/gl_drm/evas_outbuf.c
src/modules/evas/engines/gl_sdl/evas_engine.c
src/modules/evas/engines/gl_tbm/evas_engine.c
src/modules/evas/engines/gl_tbm/evas_engine.h
src/modules/evas/engines/gl_tbm/evas_tbm_main.c
src/modules/evas/engines/gl_x11/evas_engine.c
src/modules/evas/engines/gl_x11/evas_engine.h
src/modules/evas/engines/gl_x11/evas_x_main.c
src/modules/evas/engines/wayland_egl/evas_engine.c
src/modules/evas/engines/wayland_egl/evas_engine.h
src/modules/evas/engines/wayland_egl/evas_wl_main.c

index 641114b..8380922 100644 (file)
@@ -19,7 +19,7 @@
 
 /* external variables */
 int _evas_engine_eglfs_log_dom = -1;
-int _extn_have_buffer_age = 1;
+Eina_Bool _support_partial_render = EINA_TRUE;
 
 /* local variables */
 static Eina_Bool initted = EINA_FALSE;
@@ -229,10 +229,10 @@ gl_extn_veto(Render_Engine *re)
         s = getenv("EVAS_GL_PARTIAL_DISABLE");
         if ((s) && (atoi(s)))
           {
-             _extn_have_buffer_age = 0;
+             _support_partial_render = EINA_FALSE;
              glsym_eglSwapBuffersWithDamage = NULL;
           }
-        if (!strstr(str, "EGL_EXT_buffer_age")) _extn_have_buffer_age = 0;
+        if (!strstr(str, "EGL_EXT_buffer_age")) _support_partial_render = EINA_FALSE;
         if ((!strstr(str, "EGL_EXT_swap_buffers_with_damage")) &&
             (!strstr(str, "EGL_KHR_swap_buffers_with_damage")))
           glsym_eglSwapBuffersWithDamage = NULL;
@@ -240,7 +240,7 @@ gl_extn_veto(Render_Engine *re)
    else
      {
         if (getenv("EVAS_GL_INFO")) printf("NO EGL EXTN!\n");
-        _extn_have_buffer_age = 0;
+        _support_partial_render = EINA_FALSE;
      }
 }
 
index e3ad5ba..7161694 100644 (file)
@@ -21,7 +21,7 @@
 # include "../gl_generic/Evas_Engine_GL_Generic.h"
 
 extern int _evas_engine_eglfs_log_dom;
-extern int _extn_have_buffer_age;
+extern Eina_Bool _support_partial_render;
 
 # ifdef ERR
 #  undef ERR
index 2e14db3..3e132b5 100755 (executable)
@@ -2232,8 +2232,8 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
    _surface_context_list_print();
 
    // TIZEN_ONLY(20171206) : Disable Partial Rendering On EvasGL
-   if (evgl_engine->funcs->partial_rendering_disable)
-      evgl_engine->funcs->partial_rendering_disable();
+   if (evgl_engine->funcs->partial_rendering_enable)
+      evgl_engine->funcs->partial_rendering_enable(EINA_FALSE);
 
    return sfc;
 }
@@ -2447,7 +2447,7 @@ evgl_surface_destroy(void *eng_data, EVGL_Surface *sfc)
 
    // TIZEN_ONLY(20171206) : Disable Partial Rendering On EvasGL
    if (evgl_engine->funcs->partial_rendering_enable)
-     evgl_engine->funcs->partial_rendering_enable();
+     evgl_engine->funcs->partial_rendering_enable(EINA_TRUE);
 
    return 1;
 
index 76d0a0c..648e3ef 100755 (executable)
@@ -358,12 +358,8 @@ struct _EVGL_Interface
    int         (*native_win_prerotation_set)(void *data);
 
 
-   // TIZEN_ONLY(20171206) : Disable Partial Rendering On EvasGL
-   // partial rendering enable
-   void        (*partial_rendering_enable)();
-
-   // partial rendering disable
-   void        (*partial_rendering_disable)();
+   // TIZEN_ONLY(20171206) : Toggling Partial Rendering On EvasGL
+   void        (*partial_rendering_enable)(Eina_Bool on);
 };
 
 struct _EVGL_Surface
index 8981f62..e2ce530 100755 (executable)
@@ -63,7 +63,7 @@ struct scanout_handle
 
 /* external variables */
 int _evas_engine_gl_drm_log_dom = -1;
-int _extn_have_buffer_age = 1;
+Eina_Bool _support_partial_render = EINA_TRUE;
 int _extn_have_context_priority = 0;
 
 /* local variables */
@@ -158,7 +158,6 @@ static const EVGL_Interface evgl_funcs =
    NULL, // native_win_surface_config_get
    NULL, // native_win_prerotation_set
    NULL, //partial_rendering_enable
-   NULL, //partial_rendering_disable
 };
 
 Eina_Bool
@@ -301,12 +300,12 @@ gl_extn_veto(Render_Engine *re)
         s = getenv("EVAS_GL_PARTIAL_DISABLE");
         if ((s) && (atoi(s)))
           {
-             _extn_have_buffer_age = 0;
+             _support_partial_render = EINA_FALSE;
              glsym_eglSwapBuffersWithDamage = NULL;
              glsym_eglSetDamageRegionKHR = NULL;
           }
         if (!_ckext(str, "EGL_EXT_buffer_age"))
-          _extn_have_buffer_age = 0;
+          _support_partial_render = EINA_FALSE;
 
         if (!_ckext(str, "EGL_KHR_partial_update"))
           glsym_eglSetDamageRegionKHR = NULL;
@@ -320,7 +319,7 @@ gl_extn_veto(Render_Engine *re)
    else
      {
         if (getenv("EVAS_GL_INFO")) printf("NO EGL EXTN!\n");
-        _extn_have_buffer_age = 0;
+        _support_partial_render = EINA_FALSE;
      }
 }
 
index 705d565..c8a965d 100644 (file)
@@ -27,7 +27,7 @@
 # include "../gl_generic/Evas_Engine_GL_Generic.h"
 
 extern int _evas_engine_gl_drm_log_dom;
-extern int _extn_have_buffer_age;
+extern Eina_Bool _support_partial_render;
 extern int _extn_have_context_priority;
 
 # ifdef ERR
index ce3d656..40d815f 100755 (executable)
@@ -576,7 +576,7 @@ evas_outbuf_buffer_state_get(Outbuf *ob)
 
    ecore_drm2_fb_release(ob->priv.output, EINA_FALSE);
 
-   if (ob->swap_mode == MODE_AUTO && _extn_have_buffer_age)
+   if (ob->swap_mode == MODE_AUTO && _support_partial_render)
      {
         Render_Output_Swap_Mode swap_mode;
         EGLint age = 0;
index eabfe77..6d4cb3b 100755 (executable)
@@ -261,7 +261,6 @@ static const EVGL_Interface evgl_funcs =
    NULL, // native_win_surface_config_get
    NULL, // native_win_prerotation_set
    NULL, //partial_rendering_enable
-   NULL, //partial_rendering_disable
 };
 
 static void *
index 411c08a..15dfbfb 100755 (executable)
@@ -110,7 +110,7 @@ static Eina_Bool useHash = EINA_FALSE;
 
 /* external variables */
 int _evas_engine_gl_tbm_log_dom = -1;
-Eina_Bool extn_have_buffer_age = EINA_TRUE;
+Eina_Bool support_partial_render = EINA_TRUE;
 Eina_Bool extn_have_y_inverted = EINA_TRUE;
 
 /* local function prototypes */
@@ -294,14 +294,14 @@ gl_extn_veto(Render_Engine *re)
         // Disable Partial Rendering
         if ((s = getenv("EVAS_GL_PARTIAL_DISABLE")) && atoi(s))
           {
-             extn_have_buffer_age = EINA_FALSE;
+             support_partial_render = EINA_FALSE;
              glsym_eglSwapBuffersWithDamage = NULL;
              glsym_eglSetDamageRegionKHR = NULL;
           }
         if (!strstr(str, "EGL_EXT_buffer_age"))
           {
              if (!strstr(str, "EGL_KHR_partial_update"))
-               extn_have_buffer_age = EINA_FALSE;
+               support_partial_render = EINA_FALSE;
           }
         if (!strstr(str, "EGL_KHR_partial_update"))
           {
@@ -339,7 +339,7 @@ gl_extn_veto(Render_Engine *re)
      {
         if (getenv("EVAS_GL_INFO"))
           printf("NO EGL EXTN!\n");
-        extn_have_buffer_age = EINA_FALSE;
+        support_partial_render = EINA_FALSE;
      }
 }
 
@@ -901,7 +901,6 @@ static const EVGL_Interface evgl_funcs =
    evgl_eng_native_win_surface_config_get,
    NULL, // native_win_prerotation_set
    NULL, //partial_rendering_enable
-   NULL, //partial_rendering_disable
 };
 
 /* engine functions */
index e97072c..38977c3 100755 (executable)
@@ -105,7 +105,7 @@ struct _Render_Engine
    Render_Output_GL_Generic generic;
 };
 
-extern Eina_Bool extn_have_buffer_age;
+extern Eina_Bool support_partial_render;
 extern Eina_Bool extn_have_y_inverted;
 
 extern Evas_GL_Common_Context_New glsym_evas_gl_common_context_new;
index a40e1b4..bd76cf9 100755 (executable)
@@ -483,7 +483,7 @@ eng_outbuf_rotation_get(Outbuf *ob)
 Render_Output_Swap_Mode
 eng_outbuf_swap_mode_get(Outbuf *ob)
 {
-   if ((ob->swap_mode == MODE_AUTO) && (extn_have_buffer_age))
+   if ((ob->swap_mode == MODE_AUTO) && (support_partial_render))
      {
         Render_Output_Swap_Mode swap_mode;
         EGLint age = 0;
index 60001d2..29009bd 100755 (executable)
@@ -25,7 +25,7 @@ const char *debug_dir;
 int swap_buffer_debug_mode = -1;
 int swap_buffer_debug = 0;
 int partial_render_debug = -1;
-int extn_have_buffer_age = 1;
+Eina_Bool support_partial_render = EINA_TRUE;
 
 static int initted = 0;
 static int gl_wins = 0;
@@ -1259,7 +1259,6 @@ static const EVGL_Interface evgl_funcs =
    evgl_eng_native_win_surface_config_get,
    NULL, // native_win_prerotation_set
    NULL, //partial_rendering_enable
-   NULL, //partial_rendering_disable
 };
 
 //----------------------------------------------------------//
@@ -1443,14 +1442,14 @@ gl_extn_veto(Render_Engine *re)
         // Disable Partial Rendering
         if ((s = getenv("EVAS_GL_PARTIAL_DISABLE")) && atoi(s))
           {
-             extn_have_buffer_age = 0;
+             support_partial_render = EINA_FALSE;
              glsym_eglSwapBuffersWithDamage = NULL;
              glsym_eglSetDamageRegionKHR = NULL;
           }
         if (!strstr(str, "EGL_EXT_buffer_age"))
           {
              if (!strstr(str, "EGL_KHR_partial_update"))
-               extn_have_buffer_age = 0;
+               support_partial_render = EINA_FALSE;
           }
         if (!strstr(str, "EGL_KHR_partial_update"))
           {
@@ -1493,7 +1492,7 @@ gl_extn_veto(Render_Engine *re)
      {
         if (getenv("EVAS_GL_INFO"))
           printf("NO EGL EXTN!\n");
-        extn_have_buffer_age = 0;
+        support_partial_render = EINA_FALSE;
      }
 #else
    str = glXQueryExtensionsString(eng_get_ob(re)->info->info.display,
@@ -1529,7 +1528,7 @@ gl_extn_veto(Render_Engine *re)
           }
         if (!strstr(tmpstr, "GLX_EXT_buffer_age"))
           {
-             extn_have_buffer_age = 0;
+             support_partial_render = EINA_FALSE;
           }
         if (!strstr(tmpstr, "GLX_EXT_swap_control"))
           {
@@ -1552,7 +1551,7 @@ gl_extn_veto(Render_Engine *re)
         glsym_glXReleaseTexImage = NULL;
         glsym_glXGetVideoSync = NULL;
         glsym_glXWaitVideoSync = NULL;
-        extn_have_buffer_age = 0;
+        support_partial_render = EINA_FALSE;
         glsym_glXSwapIntervalEXT = NULL;
         glsym_glXSwapIntervalSGI = NULL;
         glsym_glXReleaseBuffersMESA = NULL;
index 78af5be..7db4e58 100644 (file)
@@ -125,7 +125,7 @@ struct _Context_3D
 #endif
 };
 
-extern int extn_have_buffer_age;
+extern Eina_Bool support_partial_render;
 extern int partial_render_debug;
 extern int swap_buffer_debug_mode;
 extern int swap_buffer_debug;
index 209ee1d..b8558d7 100755 (executable)
@@ -1419,7 +1419,7 @@ eng_outbuf_get_rot(Outbuf *ob)
 Render_Output_Swap_Mode
 eng_outbuf_swap_mode(Outbuf *ob)
 {
-   if (ob->swap_mode == MODE_AUTO && extn_have_buffer_age)
+   if (ob->swap_mode == MODE_AUTO && support_partial_render)
      {
         Render_Output_Swap_Mode swap_mode;
         eina_evlog("+gl_query_surf_swap_mode", ob, 0.0, NULL);
index e5062a8..2bede82 100755 (executable)
@@ -85,13 +85,13 @@ static Evas_Func func, pfunc;
 
 /* external variables */
 int _evas_engine_wl_egl_log_dom = -1;
-Eina_Bool extn_have_buffer_age = EINA_TRUE;      //partial rendering support
 Eina_Bool extn_have_y_inverted = EINA_TRUE;
 
-/* backup for partail update */
+/* partial rendering support */
+Eina_Bool support_partial_render = EINA_TRUE;
+Eina_Bool partial_render = EINA_TRUE;
 unsigned int (*glsym_prev_eglSwapBuffersWithDamage) (EGLDisplay a, void *b, const EGLint *d, EGLint c) = NULL;
 unsigned int (*glsym_prev_eglSetDamageRegionKHR) (EGLDisplay a, EGLSurface b, EGLint *c, EGLint d) = NULL;
-Eina_Bool prev_extn_have_buffer_age = EINA_TRUE;
 
 /* local functions */
 static inline Outbuf *
@@ -209,14 +209,14 @@ gl_extn_veto(Render_Engine *re)
         // Disable Partial Rendering
         if ((s = getenv("EVAS_GL_PARTIAL_DISABLE")) && atoi(s))
           {
-             extn_have_buffer_age = EINA_FALSE;
+             support_partial_render = EINA_FALSE;
              glsym_eglSwapBuffersWithDamage = NULL;
              glsym_eglSetDamageRegionKHR = NULL;
           }
         if (!strstr(str, "EGL_EXT_buffer_age"))
           {
              if (!strstr(str, "EGL_KHR_partial_update"))
-               extn_have_buffer_age = EINA_FALSE;
+               support_partial_render = EINA_FALSE;
           }
         if (!strstr(str, "EGL_KHR_partial_update"))
           {
@@ -259,7 +259,7 @@ gl_extn_veto(Render_Engine *re)
      {
         if (getenv("EVAS_GL_INFO"))
           printf("NO EGL EXTN!\n");
-        extn_have_buffer_age = EINA_FALSE;
+        support_partial_render = EINA_FALSE;
      }
 }
 
@@ -790,32 +790,34 @@ evgl_eng_native_win_surface_config_get(void *data, int *win_depth,
        eng_get_ob(re)->detected.msaa);
 }
 
-// TIZEN_ONLY(20171206) : Disable Partial Rendering On EvasGL
+// TIZEN_ONLY(20171206) : Enable Partial Rendering On EvasGL
 static void
-evgl_eng_partial_rendering_enable()
+evgl_eng_partial_rendering_enable(Eina_Bool on)
 {
-   if (extn_have_buffer_age) return;
+   if (!support_partial_render) return;
 
-   extn_have_buffer_age = prev_extn_have_buffer_age;
-   prev_extn_have_buffer_age = EINA_FALSE;
+   if (on)
+     {
+        if (partial_render) return;   //already turned on
 
-   glsym_eglSwapBuffersWithDamage = glsym_prev_eglSwapBuffersWithDamage;
-   glsym_eglSetDamageRegionKHR = glsym_prev_eglSetDamageRegionKHR;
-}
+        //backup restore
+        glsym_eglSwapBuffersWithDamage = glsym_prev_eglSwapBuffersWithDamage;
+        glsym_eglSetDamageRegionKHR = glsym_prev_eglSetDamageRegionKHR;
+        partial_render = EINA_TRUE;
+     }
+   else
+     {
+        if (!partial_render) return;  //already turned off
 
-// TIZEN_ONLY(20171206) : Disable Partial Rendering On EvasGL
-static void
-evgl_eng_partial_rendering_disable()
-{
-   if (!extn_have_buffer_age) return;
+        //backup
+        glsym_prev_eglSwapBuffersWithDamage = glsym_eglSwapBuffersWithDamage;
+        glsym_prev_eglSetDamageRegionKHR = glsym_eglSetDamageRegionKHR;
 
-   prev_extn_have_buffer_age = extn_have_buffer_age;
-   glsym_prev_eglSwapBuffersWithDamage = glsym_eglSwapBuffersWithDamage;
-   glsym_prev_eglSetDamageRegionKHR = glsym_eglSetDamageRegionKHR;
+        glsym_eglSwapBuffersWithDamage = NULL;
+        glsym_eglSetDamageRegionKHR = NULL;
 
-   extn_have_buffer_age = EINA_FALSE;
-   glsym_eglSwapBuffersWithDamage = NULL;
-   glsym_eglSetDamageRegionKHR = NULL;
+        partial_render = EINA_FALSE;
+     }
 }
 
 static const EVGL_Interface evgl_funcs =
@@ -840,7 +842,6 @@ static const EVGL_Interface evgl_funcs =
    evgl_eng_native_win_surface_config_get,
    evgl_eng_native_win_prerotation_set,
    evgl_eng_partial_rendering_enable,
-   evgl_eng_partial_rendering_disable,
 };
 
 /* engine functions */
index 889163d..3794a7d 100755 (executable)
@@ -105,7 +105,7 @@ struct _Context_3D
    EGLSurface surface;
 };
 
-extern Eina_Bool extn_have_buffer_age;
+extern Eina_Bool support_partial_render;
 extern Eina_Bool extn_have_y_inverted;
 
 extern Evas_GL_Common_Context_New glsym_evas_gl_common_context_new;
index b700b39..c9a9f9f 100755 (executable)
@@ -601,7 +601,7 @@ eng_outbuf_rotation_get(Outbuf *ob)
 Render_Output_Swap_Mode
 eng_outbuf_swap_mode_get(Outbuf *ob)
 {
-   if ((ob->swap_mode == MODE_AUTO) && (extn_have_buffer_age))
+   if ((ob->swap_mode == MODE_AUTO) && (support_partial_render))
      {
         Render_Output_Swap_Mode swap_mode;
         EGLint age = 0;