diff --git a/mutter-force-rgb8.patch b/mutter-force-rgb8.patch new file mode 100644 index 0000000..7427d40 --- /dev/null +++ b/mutter-force-rgb8.patch @@ -0,0 +1,328 @@ +Index: mutter-3.26.2+20180207.4b2d21ff0/cogl/cogl/winsys/cogl-winsys-egl-private.h +=================================================================== +--- mutter-3.26.2+20180207.4b2d21ff0.orig/cogl/cogl/winsys/cogl-winsys-egl-private.h 2018-02-07 04:07:59.000000000 +0100 ++++ mutter-3.26.2+20180207.4b2d21ff0/cogl/cogl/winsys/cogl-winsys-egl-private.h 2018-02-28 10:27:18.840086775 +0100 +@@ -90,6 +90,11 @@ + (* add_config_attributes) (CoglDisplay *display, + CoglFramebufferConfig *config, + EGLint *attributes); ++ CoglBool ++ (* choose_config) (CoglDisplay *display, ++ EGLint *attributes, ++ EGLConfig *out_config, ++ CoglError **error); + } CoglWinsysEGLVtable; + + typedef enum _CoglEGLWinsysFeature +Index: mutter-3.26.2+20180207.4b2d21ff0/cogl/cogl/winsys/cogl-winsys-egl-x11.c +=================================================================== +--- mutter-3.26.2+20180207.4b2d21ff0.orig/cogl/cogl/winsys/cogl-winsys-egl-x11.c 2018-02-07 04:07:59.000000000 +0100 ++++ mutter-3.26.2+20180207.4b2d21ff0/cogl/cogl/winsys/cogl-winsys-egl-x11.c 2018-02-28 10:27:18.840086775 +0100 +@@ -337,6 +337,32 @@ + } + + static CoglBool ++_cogl_winsys_egl_choose_config (CoglDisplay *display, ++ EGLint *attributes, ++ EGLConfig *out_config, ++ CoglError **error) ++{ ++ CoglRenderer *renderer = display->renderer; ++ CoglRendererEGL *egl_renderer = renderer->winsys; ++ EGLint config_count = 0; ++ EGLBoolean status; ++ ++ status = eglChooseConfig (egl_renderer->edpy, ++ attributes, ++ out_config, 1, ++ &config_count); ++ if (status != EGL_TRUE || config_count == 0) ++ { ++ _cogl_set_error (error, COGL_WINSYS_ERROR, ++ COGL_WINSYS_ERROR_CREATE_CONTEXT, ++ "No compatible EGL configs found"); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++static CoglBool + _cogl_winsys_egl_display_setup (CoglDisplay *display, + CoglError **error) + { +@@ -841,6 +867,7 @@ + _cogl_winsys_egl_vtable = + { + .add_config_attributes = _cogl_winsys_egl_add_config_attributes, ++ .choose_config = _cogl_winsys_egl_choose_config, + .display_setup = _cogl_winsys_egl_display_setup, + .display_destroy = _cogl_winsys_egl_display_destroy, + .context_created = _cogl_winsys_egl_context_created, +Index: mutter-3.26.2+20180207.4b2d21ff0/cogl/cogl/winsys/cogl-winsys-egl.c +=================================================================== +--- mutter-3.26.2+20180207.4b2d21ff0.orig/cogl/cogl/winsys/cogl-winsys-egl.c 2018-02-07 04:07:59.000000000 +0100 ++++ mutter-3.26.2+20180207.4b2d21ff0/cogl/cogl/winsys/cogl-winsys-egl.c 2018-02-28 10:27:18.840086775 +0100 +@@ -338,10 +338,9 @@ + CoglRendererEGL *egl_renderer = renderer->winsys; + EGLDisplay edpy; + EGLConfig config; +- EGLint config_count = 0; +- EGLBoolean status; + EGLint attribs[9]; + EGLint cfg_attribs[MAX_EGL_CONFIG_ATTRIBS]; ++ GError *config_error = NULL; + const char *error_message; + + _COGL_RETURN_VAL_IF_FAIL (egl_display->egl_context == NULL, TRUE); +@@ -356,14 +355,16 @@ + + edpy = egl_renderer->edpy; + +- status = eglChooseConfig (edpy, ++ if (!egl_renderer->platform_vtable->choose_config (display, + cfg_attribs, +- &config, 1, +- &config_count); +- if (status != EGL_TRUE || config_count == 0) ++ &config, ++ &config_error)) + { +- error_message = "Unable to find a usable EGL configuration"; +- goto fail; ++ _cogl_set_error (error, COGL_WINSYS_ERROR, ++ COGL_WINSYS_ERROR_CREATE_CONTEXT, ++ "Couldn't choose config: %s", config_error->message); ++ g_error_free (config_error); ++ goto err; + } + + egl_display->egl_config = config; +@@ -419,6 +420,7 @@ + COGL_WINSYS_ERROR_CREATE_CONTEXT, + "%s", error_message); + ++err: + cleanup_context (display); + + return FALSE; +Index: mutter-3.26.2+20180207.4b2d21ff0/src/backends/meta-egl.c +=================================================================== +--- mutter-3.26.2+20180207.4b2d21ff0.orig/src/backends/meta-egl.c 2018-02-07 04:07:59.000000000 +0100 ++++ mutter-3.26.2+20180207.4b2d21ff0/src/backends/meta-egl.c 2018-02-28 10:27:18.840086775 +0100 +@@ -246,7 +246,73 @@ + } + + gboolean +-meta_egl_choose_config (MetaEgl *egl, ++meta_egl_get_config_attrib (MetaEgl *egl, ++ EGLDisplay display, ++ EGLConfig config, ++ EGLint attribute, ++ EGLint *value, ++ GError **error) ++{ ++ if (!eglGetConfigAttrib (display, ++ config, ++ attribute, ++ value)) ++ { ++ set_egl_error (error); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++EGLConfig * ++meta_egl_choose_all_configs (MetaEgl *egl, ++ EGLDisplay display, ++ const EGLint *attrib_list, ++ EGLint *out_num_configs, ++ GError **error) ++{ ++ EGLint num_configs; ++ EGLConfig *configs; ++ EGLint num_matches; ++ ++ if (!eglGetConfigs (display, NULL, 0, &num_configs)) ++ { ++ set_egl_error (error); ++ return FALSE; ++ } ++ ++ if (num_configs < 1) ++ { ++ g_set_error (error, G_IO_ERROR, ++ G_IO_ERROR_FAILED, ++ "No EGL configurations available"); ++ return FALSE; ++ } ++ ++ configs = g_new0 (EGLConfig, num_configs); ++ ++ if (!eglChooseConfig (display, attrib_list, configs, num_configs, &num_matches)) ++ { ++ g_free (configs); ++ set_egl_error (error); ++ return FALSE; ++ } ++ ++ if (num_matches == 0) ++ { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "No matching EGL configs"); ++ g_free (configs); ++ return NULL; ++ } ++ ++ *out_num_configs = num_configs; ++ return configs; ++} ++ ++gboolean ++meta_egl_choose_first_config (MetaEgl *egl, + EGLDisplay display, + const EGLint *attrib_list, + EGLConfig *chosen_config, +@@ -279,6 +345,14 @@ + return FALSE; + } + ++ if (num_matches == 0) ++ { ++ g_free (configs); ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "No matching EGLConfig found"); ++ return FALSE; ++ } ++ + /* + * We don't have any preference specified yet, so lets choose the first one. + */ +Index: mutter-3.26.2+20180207.4b2d21ff0/src/backends/meta-egl.h +=================================================================== +--- mutter-3.26.2+20180207.4b2d21ff0.orig/src/backends/meta-egl.h 2018-02-07 04:07:59.000000000 +0100 ++++ mutter-3.26.2+20180207.4b2d21ff0/src/backends/meta-egl.h 2018-02-28 10:27:18.840086775 +0100 +@@ -46,12 +46,25 @@ + EGLDisplay display, + GError **error); + +-gboolean meta_egl_choose_config (MetaEgl *egl, ++gboolean meta_egl_choose_first_config (MetaEgl *egl, + EGLDisplay display, + const EGLint *attrib_list, + EGLConfig *chosen_config, + GError **error); + ++gboolean meta_egl_get_config_attrib (MetaEgl *egl, ++ EGLDisplay display, ++ EGLConfig config, ++ EGLint attribute, ++ EGLint *value, ++ GError **error); ++ ++EGLConfig * meta_egl_choose_all_configs (MetaEgl *egl, ++ EGLDisplay display, ++ const EGLint *attrib_list, ++ EGLint *out_num_configs, ++ GError **error); ++ + EGLImageKHR meta_egl_create_image (MetaEgl *egl, + EGLDisplay display, + EGLContext context, +Index: mutter-3.26.2+20180207.4b2d21ff0/src/backends/native/meta-renderer-native.c +=================================================================== +--- mutter-3.26.2+20180207.4b2d21ff0.orig/src/backends/native/meta-renderer-native.c 2018-02-07 04:07:59.000000000 +0100 ++++ mutter-3.26.2+20180207.4b2d21ff0/src/backends/native/meta-renderer-native.c 2018-02-28 10:27:18.840086775 +0100 +@@ -332,6 +332,73 @@ + } + + static gboolean ++choose_egl_config_from_gbm_format (MetaEgl *egl, ++ EGLDisplay egl_display, ++ const EGLint *attributes, ++ uint32_t gbm_format, ++ EGLConfig *out_config, ++ GError **error) ++{ ++ EGLConfig *egl_configs; ++ EGLint n_configs; ++ EGLint i; ++ ++ egl_configs = meta_egl_choose_all_configs (egl, egl_display, ++ attributes, ++ &n_configs, ++ error); ++ if (!egl_configs) ++ return FALSE; ++ ++ for (i = 0; i < n_configs; i++) ++ { ++ EGLint visual_id; ++ ++ if (!meta_egl_get_config_attrib (egl, egl_display, ++ egl_configs[i], ++ EGL_NATIVE_VISUAL_ID, ++ &visual_id, ++ error)) ++ { ++ g_free (egl_configs); ++ return FALSE; ++ } ++ ++ if ((uint32_t) visual_id == gbm_format) ++ { ++ *out_config = egl_configs[i]; ++ g_free (egl_configs); ++ return TRUE; ++ } ++ } ++ ++ g_free (egl_configs); ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "No EGL config matching supported GBM format found"); ++ return FALSE; ++} ++ ++static gboolean ++meta_renderer_native_choose_egl_config (CoglDisplay *cogl_display, ++ EGLint *attributes, ++ EGLConfig *out_config, ++ GError **error) ++{ ++ CoglRenderer *cogl_renderer = cogl_display->renderer; ++ CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; ++ MetaBackend *backend = meta_get_backend (); ++ MetaEgl *egl = meta_backend_get_egl (backend); ++ EGLDisplay egl_display = cogl_renderer_egl->edpy; ++ ++ return choose_egl_config_from_gbm_format (egl, ++ egl_display, ++ attributes, ++ GBM_FORMAT_XRGB8888, ++ out_config, ++ error); ++} ++ ++static gboolean + meta_renderer_native_setup_egl_display (CoglDisplay *cogl_display, + GError **error) + { +@@ -376,7 +443,7 @@ + EGL_NONE + }; + +- if (!meta_egl_choose_config (egl, egl_display, pbuffer_config_attribs, ++ if (!meta_egl_choose_first_config (egl, egl_display, pbuffer_config_attribs, + &pbuffer_config, error)) + return EGL_NO_SURFACE; + +@@ -1355,6 +1422,7 @@ + static const CoglWinsysEGLVtable + _cogl_winsys_egl_vtable = { + .add_config_attributes = meta_renderer_native_add_egl_config_attributes, ++ .choose_config = meta_renderer_native_choose_egl_config, + .display_setup = meta_renderer_native_setup_egl_display, + .display_destroy = meta_renderer_native_destroy_egl_display, + .context_created = meta_renderer_native_egl_context_created, diff --git a/mutter.changes b/mutter.changes index 912569b..052f73a 100644 --- a/mutter.changes +++ b/mutter.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Feb 28 09:36:10 UTC 2018 - fcrozat@suse.com + +- Add mutter-force-rgb8.patch: force 8-bit RGB EGL config, + to prevent slowness when using Wayland with 10-bit display + (bsc#1081931 glgo#GNOME/mutter#2). + ------------------------------------------------------------------- Sun Feb 18 13:11:19 UTC 2018 - bjorn.lie@gmail.com diff --git a/mutter.spec b/mutter.spec index 95ee12c..19d3577 100644 --- a/mutter.spec +++ b/mutter.spec @@ -20,7 +20,7 @@ Name: mutter Version: 3.26.2+20180207.4b2d21ff0 Release: 0 Summary: Window and compositing manager based on Clutter -License: GPL-2.0+ +License: GPL-2.0-or-later Group: System/GUI/GNOME Url: https://www.gnome.org #Source0: https://download.gnome.org/sources/mutter/3.26/%%{name}-%%{version}.tar.xz @@ -30,6 +30,8 @@ Source: %{name}-%{version}.tar.xz Patch0: mutter-fix-startup.patch # PATCH-FEATURE-UPSTREAM mutter-iconcache-Support-RGB16_565-format-for-16-bit-color-.patch FATE#323412 bgo#781704 bsc#1024748 vliaskovitis@suse.com -- iconcache: Support RGB16_565 format for 16-bit sessions Patch1: mutter-iconcache-Support-RGB16_565-format-for-16-bit-color-.patch +# PATCH-FIX-UPSTREAM mutter-force-rgb8.patch bsc#1081931 glgo#GNOME/mutter#2 fcrozat@suse.Com -- Force RGB8 to prevent Wayland slowness +Patch2: mutter-force-rgb8.patch # SLE-only patches start at 1000 # PATCH-FEATURE-SLE mutter-SLE-bell.patch FATE#316042 bnc#889218 idonmez@suse.com -- make audible bell work out of the box. @@ -140,6 +142,7 @@ applications that want to make use of the mutter library. %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 # SLE-only patches and translations. %if !0%{?is_opensuse}