From e840d731f6397fb07cbbe966abd372f7be4a1457 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Fri, 19 Jun 2020 16:30:41 +0900 Subject: [PATCH] filter: make grayscale, inverse_color faster (GL) 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 | 16 ++++++++++++ src/lib/evas/filters/evas_filter_parser.c | 30 ++++++++++++++++++++++ src/lib/evas/include/evas_common_private.h | 3 +++ src/lib/evas/include/evas_filter.h | 4 +++ .../evas/engines/gl_common/evas_gl_shader.c | 30 ++++++++++++++++++++-- 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/lib/evas/canvas/evas_filter_mixin.c b/src/lib/evas/canvas/evas_filter_mixin.c index 11a3fe4..cd1b745 100644 --- a/src/lib/evas/canvas/evas_filter_mixin.c +++ b/src/lib/evas/canvas/evas_filter_mixin.c @@ -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; diff --git a/src/lib/evas/filters/evas_filter_parser.c b/src/lib/evas/filters/evas_filter_parser.c index 19de824..5b9d9b0 100644 --- a/src/lib/evas/filters/evas_filter_parser.c +++ b/src/lib/evas/filters/evas_filter_parser.c @@ -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) { diff --git a/src/lib/evas/include/evas_common_private.h b/src/lib/evas/include/evas_common_private.h index 18f2012..893397d 100644 --- a/src/lib/evas/include/evas_common_private.h +++ b/src/lib/evas/include/evas_common_private.h @@ -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; }; diff --git a/src/lib/evas/include/evas_filter.h b/src/lib/evas/include/evas_filter.h index dd77981..33173a1 100644 --- a/src/lib/evas/include/evas_filter.h +++ b/src/lib/evas/include/evas_filter.h @@ -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); diff --git a/src/modules/evas/engines/gl_common/evas_gl_shader.c b/src/modules/evas/engines/gl_common/evas_gl_shader.c index ab91283..26df4a5 100755 --- a/src/modules/evas/engines/gl_common/evas_gl_shader.c +++ b/src/modules/evas/engines/gl_common/evas_gl_shader.c @@ -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) { -- 2.7.4