discomfitor pushed a commit to branch enlightenment-0.19. http://git.enlightenment.org/core/enlightenment.git/commit/?id=72b7860cf6e3471c544221b04c0373b43ef60ffa
commit 72b7860cf6e3471c544221b04c0373b43ef60ffa Author: Mike Blumenkrantz <[email protected]> Date: Wed Oct 14 12:51:45 2015 -0400 trap shaped x11 clients and prevent compositor blocking with high rect count in the case where a shaped window with many rects exists, there is a high probability of the damage rect count being huge, leading to massive blocking for each frame as the compositor attempts to fetch all of these rects from the xserver. instead, the compositor can shortcut this by forcing a full-window damage any time the rect count is sufficiently high, trading a blocking socket operation for some amount of (potential) overdraw. testing in affected scenarios has shown huge improvements: where previously the entire compositor would lock up, things work as expected now see https://bugzilla.mozilla.org/show_bug.cgi?id=1214746 for a sample case --- src/bin/e_comp_x.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 9614fb3..4c373af 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -2693,15 +2693,13 @@ _e_comp_x_damage(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Dam E_Client *ec; Ecore_X_Rectangle *rects = NULL; int n = 0; - Eina_Bool skip = EINA_FALSE; + Eina_Bool skip; ec = _e_comp_x_client_find_by_damage(ev->damage); if (!ec) return ECORE_CALLBACK_PASS_ON; + skip = ec->shape_rects_num > 50; if (ec->override && (!ec->comp_data->first_damage)) - { - e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h); - skip = EINA_TRUE; - } + skip = EINA_TRUE; if (ec->comp_data->damage) { Ecore_X_Region parts; @@ -2717,6 +2715,8 @@ _e_comp_x_damage(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Dam if (ec->comp->nocomp) e_pixmap_dirty(ec->pixmap); + else if (skip) + e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h); else if (n) { int i; --
