filter: make grayscale, inverse_color faster (GL) 74/236674/8
authorShinwoo Kim <cinoo.kim@samsung.com>
Fri, 19 Jun 2020 07:30:41 +0000 (16:30 +0900)
committerHermet Park <chuneon.park@samsung.com>
Wed, 15 Jul 2020 04:49:29 +0000 (04:49 +0000)
This commit for grayscale, inverse_color filter used by enlightenment.
The fps is decreased with those filters because filter is using off-
screen buffer and copying data between buffers. This commit makes
filter do not use off-screen buffer. Finally the fps is almost same
between ON and OFF filter.

*tizen_only

Change-Id: Ia7ba742d4d8a893fe4908e17895c388cfa3fc286

src/lib/evas/canvas/evas_filter_mixin.c
src/lib/evas/filters/evas_filter_parser.c
src/lib/evas/include/evas_common_private.h
src/lib/evas/include/evas_filter.h
src/modules/evas/engines/gl_common/evas_gl_shader.c

index 11a3fe4..cd1b745 100644 (file)
@@ -255,6 +255,22 @@ evas_filter_object_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
    if (pd->data->invalid || (!pd->data->chain && !pd->data->code))
      return EINA_FALSE;
 
+   // TIZEN_ONLY(20200619): make filter faster
+   // TODO: apply for all type of object and filter
+   int instr_type;
+   if (ENFN->context_flush && /* quick hack to check gl engine */
+       obj->is_image_object && evas_filter_program_count(pd->data->chain) == 1)
+     {
+        instr_type = evas_filter_program_nth_instruction_type_get(pd->data->chain, 0);
+        if (instr_type == EVAS_FILTER_MODE_GRAYSCALE ||
+            instr_type == EVAS_FILTER_MODE_INVERSE_COLOR)
+          {
+             ((RGBA_Draw_Context *)context)->filter_mode = instr_type;
+             return EINA_FALSE;
+          }
+     }
+   //
+
    W = obj->cur->geometry.w;
    H = obj->cur->geometry.h;
    X = obj->cur->geometry.x;
index 19de824..5b9d9b0 100644 (file)
@@ -3665,6 +3665,36 @@ end:
    return success;
 }
 
+// TIZEN_ONLY(20200619): make filter faster
+int
+evas_filter_program_count(Evas_Filter_Program *pgm)
+{
+   if (!pgm) return 0;
+   return eina_inlist_count(pgm->instructions);
+}
+
+int
+evas_filter_program_nth_instruction_type_get(Evas_Filter_Program *pgm, unsigned int nth)
+{
+   Evas_Filter_Instruction *instr = NULL;
+   Eina_Accessor *a;
+   void *data;
+
+   if (!pgm) return -1;
+
+   a = eina_inlist_accessor_new(pgm->instructions);
+   if (!a) return -1;
+
+   if (eina_accessor_data_get(a, nth, &data))
+     instr = EINA_INLIST_CONTAINER_GET(data, Evas_Filter_Instruction);
+   eina_accessor_free(a);
+
+   if (!instr) return -1;
+
+   return instr->type;
+}
+//
+
 void
 evas_filter_parser_shutdown(void)
 {
index 18f2012..893397d 100644 (file)
@@ -766,6 +766,9 @@ struct _RGBA_Draw_Context
       unsigned char color_space;
    } interpolation;
    unsigned char render_op;
+   // TIZEN_ONLY(20200619): make filter faster
+   unsigned int filter_mode;
+   //
    unsigned char anti_alias : 1;
 };
 
index dd77981..33173a1 100644 (file)
@@ -170,6 +170,10 @@ Eina_Bool                evas_filter_context_run(void *engine, void *output, Eva
 
 Eina_Bool                evas_filter_font_draw(Evas_Filter_Context *ctx, void *engine, void *output, void *draw_context, int bufid, Evas_Font_Set *font, int x, int y, Evas_Text_Props *text_props, Eina_Bool do_async);
 Eina_Bool                evas_filter_target_set(Evas_Filter_Context *ctx, void *draw_context, void *surface, int x, int y, const RGBA_Map *map);
+// TIZEN_ONLY(20200619): make filter faster
+int                      evas_filter_program_count(Evas_Filter_Program *pgm);
+int                      evas_filter_program_nth_instruction_type_get(Evas_Filter_Program *pgm, unsigned int nth);
+//
 
 // utility function
 void                     _evas_filter_source_hash_free_cb(void *data);
index ab91283..26df4a5 100755 (executable)
@@ -1,6 +1,9 @@
 #include "config.h"
 #include "shader/evas_gl_shaders.x"
 #include "evas_gl_common.h"
+// TIZEN_ONLY(20200619): make filter faster
+#include "evas_filter.h"
+//
 
 #define SHADER_FLAG_SAM_BITSHIFT 3
 #define SHADER_FLAG_MASKSAM_BITSHIFT 6
@@ -889,7 +892,10 @@ evas_gl_common_shader_flags_get(Evas_GL_Shared *shared, Shader_Type type,
                                 Evas_GL_Texture *mtex, Eina_Bool mask_smooth,
                                 Eina_Bool mask_color, int mw, int mh,
                                 Eina_Bool alphaonly,
-                                Shader_Sampling *psam, int *pnomul, Shader_Sampling *pmasksam)
+                                Shader_Sampling *psam, int *pnomul, Shader_Sampling *pmasksam,
+                                // TIZEN_ONLY(20200619): make filter faster
+                                unsigned int filter_mode)
+                                //
 {
    Shader_Sampling sam = SHD_SAM11, masksam = SHD_SAM11;
    int nomul = 1, bgra = 0, k;
@@ -1036,6 +1042,23 @@ evas_gl_common_shader_flags_get(Evas_GL_Shared *shared, Shader_Type type,
    if (bgra)
      flags |= SHADER_FLAG_BGRA;
 
+   // TIZEN_ONLY(20200619): make filter faster
+   switch (filter_mode)
+     {
+      case EVAS_FILTER_MODE_SKIP:
+        break;
+      case EVAS_FILTER_MODE_GRAYSCALE:
+        flags |= SHADER_FLAG_FILTER_GRAYSCALE;
+        break;
+      case EVAS_FILTER_MODE_INVERSE_COLOR:
+        flags |= SHADER_FLAG_FILTER_INVERSE_COLOR;
+        break;
+      default:
+        ERR("Not supported one command filter(%u)", filter_mode);
+        break;
+     }
+   //
+
 end:
    if (mtex)
      flags |= SHADER_FLAG_MASK;
@@ -1151,7 +1174,10 @@ evas_gl_common_shader_program_get(Evas_Engine_GL_Context *gc,
    flags = evas_gl_common_shader_flags_get(gc->shared, type, map_points, npoints, r, g, b, a,
                                            sw, sh, w, h, smooth, tex, tex_only,
                                            mtex, mask_smooth, mask_color, mw, mh,
-                                           alphaonly, psam, pnomul, pmasksam);
+                                           alphaonly, psam, pnomul, pmasksam,
+                                           // TIZEN_ONLY(20200619): make filter faster
+                                           gc->dc->filter_mode);
+                                           //
    p = eina_hash_find(gc->shared->shaders_hash, &flags);
    if (!p)
      {