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;
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)
{
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);
#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
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;
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;
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)
{