jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=c4a797ff6e102cb594c3d300d93886ed033f9e75
commit c4a797ff6e102cb594c3d300d93886ed033f9e75 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Fri Jun 12 16:44:43 2015 +0900 Evas filters: Remove unnecessary copy of buffers When doing blur from alpha to rgba, there was an extra copy step added, that was not required. This should improve the performance a little bit in this situation. --- src/lib/evas/filters/evas_filter.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c index 36bedbb..0f24870 100644 --- a/src/lib/evas/filters/evas_filter.c +++ b/src/lib/evas/filters/evas_filter.c @@ -817,7 +817,7 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, Evas_Filter_Buffer *out_dy = NULL, *out_dx = NULL; Evas_Filter_Buffer *copybuf = NULL, *blur_out = NULL; Eina_Bool copy_back = EINA_FALSE, blend = EINA_FALSE; - int R, G, B, A; + int R, G, B, A; DATA32 color; int ret = 0, id; EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, -1); @@ -848,6 +848,14 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, if (in == out) out->dirty = EINA_FALSE; blend = (out->dirty && !out->transient); + ENFN->context_color_get(ENDT, drawctx, &R, &G, &B, &A); + color = ARGB_JOIN(A, R, G, B); + if (!color) + { + DBG("Blur with transparent color. Nothing to do."); + /* FIXME: return skip; */ + } + switch (type) { case EVAS_FILTER_BLUR_GAUSSIAN: @@ -892,11 +900,15 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, else type = EVAS_FILTER_BLUR_BOX; + if (dy && (color != 0xFFFFFFFF)) + ENFN->context_color_set(ENDT, drawctx, 255, 255, 255, 255); id = evas_filter_command_blur_add(ctx, drawctx, inbuf, tmp_out, type, dx, 0, tmp_ox, tmp_oy, 0); if (id < 0) goto fail; cmd = _evas_filter_command_get(ctx, id); cmd->blur.auto_count = EINA_TRUE; + if (dy && (color != 0xFFFFFFFF)) + ENFN->context_color_set(ENDT, drawctx, R, G, B, A); } if (dy) @@ -924,7 +936,8 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, if (!in->alpha_only && out->alpha_only) { - ERR("Output and input don't have the same format"); + /* FIXME: Add temporary buffer + blend */ + ERR("Input is RGBA but output is Alpha only. Unsupported config for blur."); goto fail; } else if ((blend || (in->alpha_only && !out->alpha_only)) || @@ -933,7 +946,10 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, DBG("Adding extra blending step %d --> %d (%s --> %s)", in->id, out->id, in->alpha_only ? "Alpha" : "RGBA", out->alpha_only ? "Alpha" : "RGBA"); + Eina_Bool wasl = in->locked; + in->locked = 1; blur_out = evas_filter_temporary_buffer_get(ctx, 0, 0, in->alpha_only); + in->locked = wasl; if (!blur_out) goto fail; blend = EINA_TRUE; } @@ -1004,8 +1020,6 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, } } - ENFN->context_color_get(ENDT, drawctx, &R, &G, &B, &A); - if (dx) { DBG("Add horizontal blur %d -> %d (%dpx)", in->id, out_dx->id, dx); @@ -1015,7 +1029,8 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, cmd->blur.dx = dx; cmd->blur.dy = 0; cmd->blur.count = count; - DRAW_COLOR_SET(R, G, B, A); + if (!dy && !blend) + DRAW_COLOR_SET(R, G, B, A); ret = cmd->id; } @@ -1028,7 +1043,8 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, cmd->blur.dx = 0; cmd->blur.dy = dy; cmd->blur.count = count; - DRAW_COLOR_SET(R, G, B, A); + if (!blend) + DRAW_COLOR_SET(R, G, B, A); if (ret <= 0) ret = cmd->id; } @@ -1038,7 +1054,7 @@ evas_filter_command_blur_add(Evas_Filter_Context *ctx, void *drawctx, if (!cmd) goto fail; DBG("Add copy %d -> %d", copybuf->id, blur_out->id); - cmd->ENFN->context_color_set(cmd->ENDT, drawctx, 0, 0, 0, 255); + cmd->ENFN->context_color_set(cmd->ENDT, drawctx, 255, 255, 255, 255); render_op = cmd->ENFN->context_render_op_get(cmd->ENDT, drawctx); cmd->ENFN->context_render_op_set(cmd->ENDT, drawctx, EVAS_RENDER_COPY); id = evas_filter_command_blend_add(ctx, drawctx, copybuf->id, blur_out->id, ox, oy, EVAS_FILTER_FILL_MODE_NONE); --