Compare commits
7 Commits
main
...
wip/carlos
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4d6f99c95d | ||
![]() |
9e54e404ee | ||
![]() |
6ec6ea7d3c | ||
![]() |
d8c4d78f4a | ||
![]() |
b7a662bfdd | ||
![]() |
9d61e6e56f | ||
![]() |
231d9e3c31 |
@@ -16,7 +16,7 @@ RUN dnf -y update && dnf -y upgrade && \
|
|||||||
dnf builddep -y mutter && \
|
dnf builddep -y mutter && \
|
||||||
|
|
||||||
# Until Fedora catches up with new build-deps
|
# Until Fedora catches up with new build-deps
|
||||||
dnf install -y 'pkgconfig(graphene-gobject-1.0)' 'pkgconfig(sysprof-capture-3)' && \
|
dnf install -y 'pkgconfig(graphene-gobject-1.0)' 'pkgconfig(sysprof-capture-3)' 'pkgconfig(libcap-ng)' && \
|
||||||
|
|
||||||
# For running unit tests
|
# For running unit tests
|
||||||
dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center && \
|
dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center && \
|
||||||
|
@@ -79,6 +79,15 @@ G_BEGIN_DECLS
|
|||||||
EGLDisplay
|
EGLDisplay
|
||||||
cogl_egl_context_get_egl_display (CoglContext *context);
|
cogl_egl_context_get_egl_display (CoglContext *context);
|
||||||
|
|
||||||
|
gboolean cogl_egl_init_thread (void);
|
||||||
|
|
||||||
|
EGLContext
|
||||||
|
cogl_egl_create_context (EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
EGLContext shared_context,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
/* The gobject introspection scanner seems to parse public headers in
|
/* The gobject introspection scanner seems to parse public headers in
|
||||||
|
@@ -110,6 +110,21 @@ static const CoglFeatureData winsys_feature_data[] =
|
|||||||
#include "winsys/cogl-winsys-egl-feature-functions.h"
|
#include "winsys/cogl-winsys-egl-feature-functions.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static GMainContext *egl_thread_context = NULL;
|
||||||
|
|
||||||
|
typedef struct _CreateEGLContextData
|
||||||
|
{
|
||||||
|
EGLDisplay display;
|
||||||
|
EGLConfig config;
|
||||||
|
EGLContext shared_context;
|
||||||
|
const EGLint *attrib_list;
|
||||||
|
EGLContext context;
|
||||||
|
GError *error;
|
||||||
|
GMutex mutex;
|
||||||
|
GCond cond;
|
||||||
|
gboolean finished;
|
||||||
|
} CreateEGLContextData;
|
||||||
|
|
||||||
static GCallback
|
static GCallback
|
||||||
_cogl_winsys_renderer_get_proc_address (CoglRenderer *renderer,
|
_cogl_winsys_renderer_get_proc_address (CoglRenderer *renderer,
|
||||||
const char *name,
|
const char *name,
|
||||||
@@ -386,16 +401,14 @@ try_create_context (CoglDisplay *display,
|
|||||||
|
|
||||||
attribs[i++] = EGL_NONE;
|
attribs[i++] = EGL_NONE;
|
||||||
|
|
||||||
egl_display->egl_context = eglCreateContext (edpy,
|
egl_display->egl_context = cogl_egl_create_context (edpy,
|
||||||
config,
|
config,
|
||||||
EGL_NO_CONTEXT,
|
EGL_NO_CONTEXT,
|
||||||
attribs);
|
attribs,
|
||||||
|
error);
|
||||||
|
|
||||||
if (egl_display->egl_context == EGL_NO_CONTEXT)
|
if (egl_display->egl_context == EGL_NO_CONTEXT)
|
||||||
{
|
goto err;
|
||||||
error_message = "Unable to create a suitable EGL context";
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (egl_renderer->private_features &
|
if (egl_renderer->private_features &
|
||||||
COGL_EGL_WINSYS_FEATURE_CONTEXT_PRIORITY)
|
COGL_EGL_WINSYS_FEATURE_CONTEXT_PRIORITY)
|
||||||
@@ -965,3 +978,206 @@ cogl_egl_context_get_egl_display (CoglContext *context)
|
|||||||
|
|
||||||
return egl_renderer->edpy;
|
return egl_renderer->edpy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gpointer
|
||||||
|
init_egl_context_thread (gpointer data)
|
||||||
|
{
|
||||||
|
GMainContext *main_context = data;
|
||||||
|
GMainLoop *main_loop = g_main_loop_new (main_context, FALSE);
|
||||||
|
|
||||||
|
g_main_loop_run (main_loop);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cogl_egl_init_thread (void)
|
||||||
|
{
|
||||||
|
g_autoptr (GMainContext) main_context = NULL;
|
||||||
|
g_autoptr (GThread) thread = NULL;
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
|
if (egl_thread_context != NULL)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
main_context = g_main_context_new ();
|
||||||
|
thread = g_thread_try_new ("EGL context generator thread",
|
||||||
|
init_egl_context_thread,
|
||||||
|
main_context, &error);
|
||||||
|
if (!thread)
|
||||||
|
{
|
||||||
|
g_warning ("Failed to create EGL Context generator thread: %s",
|
||||||
|
error->message);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
egl_thread_context = g_steal_pointer (&main_context);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CreateEGLContextData *
|
||||||
|
create_egl_context_data_new (EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
EGLContext shared_context,
|
||||||
|
const EGLint *attrib_list)
|
||||||
|
{
|
||||||
|
CreateEGLContextData *data;
|
||||||
|
|
||||||
|
data = g_new0 (CreateEGLContextData, 1);
|
||||||
|
data->display = display;
|
||||||
|
data->config = config;
|
||||||
|
data->shared_context = shared_context;
|
||||||
|
data->attrib_list = attrib_list;
|
||||||
|
data->context = EGL_NO_CONTEXT;
|
||||||
|
g_mutex_init (&data->mutex);
|
||||||
|
g_cond_init (&data->cond);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_egl_error_str (EGLint error_number)
|
||||||
|
{
|
||||||
|
switch (error_number)
|
||||||
|
{
|
||||||
|
case EGL_SUCCESS:
|
||||||
|
return "The last function succeeded without error.";
|
||||||
|
break;
|
||||||
|
case EGL_NOT_INITIALIZED:
|
||||||
|
return "EGL is not initialized, or could not be initialized, for the specified EGL display connection.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_ACCESS:
|
||||||
|
return "EGL cannot access a requested resource (for example a context is bound in another thread).";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_ALLOC:
|
||||||
|
return "EGL failed to allocate resources for the requested operation.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_ATTRIBUTE:
|
||||||
|
return "An unrecognized attribute or attribute value was passed in the attribute list.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_CONTEXT:
|
||||||
|
return "An EGLContext argument does not name a valid EGL rendering context.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_CONFIG:
|
||||||
|
return "An EGLConfig argument does not name a valid EGL frame buffer configuration.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_CURRENT_SURFACE:
|
||||||
|
return "The current surface of the calling thread is a window, pixel buffer or pixmap that is no longer valid.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_DISPLAY:
|
||||||
|
return "An EGLDisplay argument does not name a valid EGL display connection.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_SURFACE:
|
||||||
|
return "An EGLSurface argument does not name a valid surface (window, pixel buffer or pixmap) configured for GL rendering.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_MATCH:
|
||||||
|
return "Arguments are inconsistent (for example, a valid context requires buffers not supplied by a valid surface).";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_PARAMETER:
|
||||||
|
return "One or more argument values are invalid.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_NATIVE_PIXMAP:
|
||||||
|
return "A NativePixmapType argument does not refer to a valid native pixmap.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_NATIVE_WINDOW:
|
||||||
|
return "A NativeWindowType argument does not refer to a valid native window.";
|
||||||
|
break;
|
||||||
|
case EGL_CONTEXT_LOST:
|
||||||
|
return "A power management event has occurred. The application must destroy all contexts and reinitialise OpenGL ES state and objects to continue rendering. ";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_STREAM_KHR:
|
||||||
|
return "An EGLStreamKHR argument does not name a valid EGL stream.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_STATE_KHR:
|
||||||
|
return "An EGLStreamKHR argument is not in a valid state";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_DEVICE_EXT:
|
||||||
|
return "An EGLDeviceEXT argument does not name a valid EGL device.";
|
||||||
|
break;
|
||||||
|
case EGL_BAD_OUTPUT_LAYER_EXT:
|
||||||
|
return "An EGLOutputLayerEXT argument does not name a valid EGL output layer.";
|
||||||
|
default:
|
||||||
|
return "Unknown error";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_egl_error (GError **error)
|
||||||
|
{
|
||||||
|
EGLint error_number;
|
||||||
|
const char *error_str;
|
||||||
|
|
||||||
|
if (!error)
|
||||||
|
return;
|
||||||
|
|
||||||
|
error_number = eglGetError ();
|
||||||
|
error_str = get_egl_error_str (error_number);
|
||||||
|
g_set_error_literal (error, COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_CREATE_CONTEXT,
|
||||||
|
error_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Executed in the EGL context generator thread */
|
||||||
|
static gboolean
|
||||||
|
create_context_in_thread (gpointer user_data)
|
||||||
|
{
|
||||||
|
CreateEGLContextData *data = user_data;
|
||||||
|
|
||||||
|
g_mutex_lock (&data->mutex);
|
||||||
|
data->context = eglCreateContext (data->display,
|
||||||
|
data->config,
|
||||||
|
data->shared_context,
|
||||||
|
data->attrib_list);
|
||||||
|
if (data->context == EGL_NO_CONTEXT)
|
||||||
|
set_egl_error (&data->error);
|
||||||
|
|
||||||
|
data->finished = TRUE;
|
||||||
|
g_cond_signal (&data->cond);
|
||||||
|
g_mutex_unlock (&data->mutex);
|
||||||
|
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLContext
|
||||||
|
cogl_egl_create_context (EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
EGLContext shared_context,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
CreateEGLContextData *data;
|
||||||
|
EGLContext context;
|
||||||
|
GSource *source;
|
||||||
|
|
||||||
|
if (!cogl_egl_init_thread ())
|
||||||
|
{
|
||||||
|
g_set_error_literal (error, COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_CREATE_CONTEXT,
|
||||||
|
"EGL thread initialization failed");
|
||||||
|
return EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = create_egl_context_data_new (display, config,
|
||||||
|
shared_context, attrib_list);
|
||||||
|
g_mutex_lock (&data->mutex);
|
||||||
|
|
||||||
|
source = g_idle_source_new ();
|
||||||
|
g_source_set_callback (source, create_context_in_thread,
|
||||||
|
data, NULL);
|
||||||
|
g_source_attach (source, egl_thread_context);
|
||||||
|
g_source_unref (source);
|
||||||
|
|
||||||
|
while (!data->finished)
|
||||||
|
g_cond_wait (&data->cond, &data->mutex);
|
||||||
|
|
||||||
|
context = data->context;
|
||||||
|
if (data->error)
|
||||||
|
g_propagate_error (error, data->error);
|
||||||
|
|
||||||
|
g_mutex_unlock (&data->mutex);
|
||||||
|
g_free (data);
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
@@ -67,3 +67,6 @@
|
|||||||
/* Either <sys/random.h> or <linux/random.h> */
|
/* Either <sys/random.h> or <linux/random.h> */
|
||||||
#mesondefine HAVE_SYS_RANDOM
|
#mesondefine HAVE_SYS_RANDOM
|
||||||
#mesondefine HAVE_LINUX_RANDOM
|
#mesondefine HAVE_LINUX_RANDOM
|
||||||
|
|
||||||
|
/* Defined if libcap-ng is available */
|
||||||
|
#mesondefine HAVE_LIBCAPNG
|
||||||
|
@@ -120,10 +120,6 @@
|
|||||||
framebuffers instead of window content,
|
framebuffers instead of window content,
|
||||||
to manage HiDPI monitors. Does not
|
to manage HiDPI monitors. Does not
|
||||||
require a restart.
|
require a restart.
|
||||||
• “rt-scheduler” — makes mutter request a low priority
|
|
||||||
real-time scheduling. The executable
|
|
||||||
or user must have CAP_SYS_NICE.
|
|
||||||
Requires a restart.
|
|
||||||
• “autostart-xwayland” — initializes Xwayland lazily if there are
|
• “autostart-xwayland” — initializes Xwayland lazily if there are
|
||||||
X11 clients. Requires restart.
|
X11 clients. Requires restart.
|
||||||
</description>
|
</description>
|
||||||
|
@@ -36,6 +36,7 @@ libstartup_notification_req = '>= 0.7'
|
|||||||
libcanberra_req = '>= 0.26'
|
libcanberra_req = '>= 0.26'
|
||||||
libwacom_req = '>= 0.13'
|
libwacom_req = '>= 0.13'
|
||||||
atk_req = '>= 2.5.3'
|
atk_req = '>= 2.5.3'
|
||||||
|
libcapng_req = '>= 0.7.9'
|
||||||
|
|
||||||
# optional version requirements
|
# optional version requirements
|
||||||
udev_req = '>= 228'
|
udev_req = '>= 228'
|
||||||
@@ -127,6 +128,7 @@ xau_dep = dependency('xau')
|
|||||||
ice_dep = dependency('ice')
|
ice_dep = dependency('ice')
|
||||||
atk_dep = dependency('atk', version: atk_req)
|
atk_dep = dependency('atk', version: atk_req)
|
||||||
libcanberra_dep = dependency('libcanberra', version: libcanberra_req)
|
libcanberra_dep = dependency('libcanberra', version: libcanberra_req)
|
||||||
|
libcapng_dep = dependency('libcap-ng', required: get_option('libcapng'))
|
||||||
|
|
||||||
# For now always require X11 support
|
# For now always require X11 support
|
||||||
have_x11 = true
|
have_x11 = true
|
||||||
@@ -258,6 +260,7 @@ have_core_tests = false
|
|||||||
have_cogl_tests = false
|
have_cogl_tests = false
|
||||||
have_clutter_tests = false
|
have_clutter_tests = false
|
||||||
have_installed_tests = false
|
have_installed_tests = false
|
||||||
|
have_libcapng = libcapng_dep.found()
|
||||||
|
|
||||||
if have_tests
|
if have_tests
|
||||||
have_core_tests = get_option('core_tests')
|
have_core_tests = get_option('core_tests')
|
||||||
@@ -364,6 +367,7 @@ cdata.set('HAVE_SM', have_sm)
|
|||||||
cdata.set('HAVE_STARTUP_NOTIFICATION', have_startup_notification)
|
cdata.set('HAVE_STARTUP_NOTIFICATION', have_startup_notification)
|
||||||
cdata.set('HAVE_INTROSPECTION', have_introspection)
|
cdata.set('HAVE_INTROSPECTION', have_introspection)
|
||||||
cdata.set('HAVE_PROFILER', have_profiler)
|
cdata.set('HAVE_PROFILER', have_profiler)
|
||||||
|
cdata.set('HAVE_LIBCAPNG', have_libcapng)
|
||||||
|
|
||||||
xkb_base = xkeyboard_config_dep.get_pkgconfig_variable('xkb_base')
|
xkb_base = xkeyboard_config_dep.get_pkgconfig_variable('xkb_base')
|
||||||
cdata.set_quoted('XKB_BASE', xkb_base)
|
cdata.set_quoted('XKB_BASE', xkb_base)
|
||||||
@@ -445,6 +449,7 @@ output = [
|
|||||||
' Startup notification..... ' + have_startup_notification.to_string(),
|
' Startup notification..... ' + have_startup_notification.to_string(),
|
||||||
' Introspection............ ' + have_introspection.to_string(),
|
' Introspection............ ' + have_introspection.to_string(),
|
||||||
' Profiler................. ' + have_profiler.to_string(),
|
' Profiler................. ' + have_profiler.to_string(),
|
||||||
|
' libcap-ng................ ' + have_libcapng.to_string(),
|
||||||
'',
|
'',
|
||||||
' Tests:',
|
' Tests:',
|
||||||
'',
|
'',
|
||||||
|
@@ -152,3 +152,9 @@ option('xwayland_grab_default_access_rules',
|
|||||||
value: 'gnome-boxes,remote-viewer,virt-viewer,virt-manager,vinagre,vncviewer,Xephyr',
|
value: 'gnome-boxes,remote-viewer,virt-viewer,virt-manager,vinagre,vncviewer,Xephyr',
|
||||||
description: 'Comma delimited list of applications ressources or class allowed to issue X11 grabs in Xwayland'
|
description: 'Comma delimited list of applications ressources or class allowed to issue X11 grabs in Xwayland'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
option('libcapng',
|
||||||
|
type: 'feature',
|
||||||
|
value: 'auto',
|
||||||
|
description: 'Enable libcap-ng support'
|
||||||
|
)
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-egl.h"
|
#include "backends/meta-egl.h"
|
||||||
#include "backends/meta-egl-ext.h"
|
#include "backends/meta-egl-ext.h"
|
||||||
|
#include "cogl/cogl-egl.h"
|
||||||
#include "meta/util.h"
|
#include "meta/util.h"
|
||||||
|
|
||||||
struct _MetaEgl
|
struct _MetaEgl
|
||||||
@@ -506,16 +507,9 @@ meta_egl_create_context (MetaEgl *egl,
|
|||||||
const EGLint *attrib_list,
|
const EGLint *attrib_list,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
EGLContext context;
|
return cogl_egl_create_context (display, config,
|
||||||
|
share_context, attrib_list,
|
||||||
context = eglCreateContext (display, config, share_context, attrib_list);
|
error);
|
||||||
if (context == EGL_NO_CONTEXT)
|
|
||||||
{
|
|
||||||
set_egl_error (error);
|
|
||||||
return EGL_NO_CONTEXT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return context;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@@ -33,8 +33,7 @@ typedef enum _MetaExperimentalFeature
|
|||||||
META_EXPERIMENTAL_FEATURE_NONE = 0,
|
META_EXPERIMENTAL_FEATURE_NONE = 0,
|
||||||
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
|
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
|
||||||
META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS = (1 << 1),
|
META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS = (1 << 1),
|
||||||
META_EXPERIMENTAL_FEATURE_RT_SCHEDULER = (1 << 2),
|
META_EXPERIMENTAL_FEATURE_AUTOSTART_XWAYLAND = (1 << 2),
|
||||||
META_EXPERIMENTAL_FEATURE_AUTOSTART_XWAYLAND = (1 << 3),
|
|
||||||
} MetaExperimentalFeature;
|
} MetaExperimentalFeature;
|
||||||
|
|
||||||
#define META_TYPE_SETTINGS (meta_settings_get_type ())
|
#define META_TYPE_SETTINGS (meta_settings_get_type ())
|
||||||
|
@@ -264,8 +264,6 @@ experimental_features_handler (GVariant *features_variant,
|
|||||||
features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER;
|
features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER;
|
||||||
else if (g_str_equal (feature, "kms-modifiers"))
|
else if (g_str_equal (feature, "kms-modifiers"))
|
||||||
features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS;
|
features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS;
|
||||||
else if (g_str_equal (feature, "rt-scheduler"))
|
|
||||||
features |= META_EXPERIMENTAL_FEATURE_RT_SCHEDULER;
|
|
||||||
else if (g_str_equal (feature, "autostart-xwayland"))
|
else if (g_str_equal (feature, "autostart-xwayland"))
|
||||||
features |= META_EXPERIMENTAL_FEATURE_AUTOSTART_XWAYLAND;
|
features |= META_EXPERIMENTAL_FEATURE_AUTOSTART_XWAYLAND;
|
||||||
else
|
else
|
||||||
|
@@ -341,7 +341,6 @@ static void
|
|||||||
meta_backend_native_post_init (MetaBackend *backend)
|
meta_backend_native_post_init (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
MetaSettings *settings = meta_backend_get_settings (backend);
|
|
||||||
|
|
||||||
META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
|
META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
|
||||||
|
|
||||||
@@ -349,20 +348,6 @@ meta_backend_native_post_init (MetaBackend *backend)
|
|||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
meta_device_manager_native_set_relative_motion_filter (manager, relative_motion_filter,
|
meta_device_manager_native_set_relative_motion_filter (manager, relative_motion_filter,
|
||||||
meta_backend_get_monitor_manager (backend));
|
meta_backend_get_monitor_manager (backend));
|
||||||
|
|
||||||
if (meta_settings_is_experimental_feature_enabled (settings,
|
|
||||||
META_EXPERIMENTAL_FEATURE_RT_SCHEDULER))
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
struct sched_param sp = {
|
|
||||||
.sched_priority = sched_get_priority_min (SCHED_RR)
|
|
||||||
};
|
|
||||||
|
|
||||||
retval = sched_setscheduler (0, SCHED_RR | SCHED_RESET_ON_FORK, &sp);
|
|
||||||
|
|
||||||
if (retval != 0)
|
|
||||||
g_warning ("Failed to set RT scheduler: %m");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaMonitorManager *
|
static MetaMonitorManager *
|
||||||
|
@@ -3509,6 +3509,7 @@ create_secondary_egl_context (MetaEgl *egl,
|
|||||||
{
|
{
|
||||||
EGLint attributes[] = {
|
EGLint attributes[] = {
|
||||||
EGL_CONTEXT_CLIENT_VERSION, 3,
|
EGL_CONTEXT_CLIENT_VERSION, 3,
|
||||||
|
EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_HIGH_IMG,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -66,6 +66,10 @@
|
|||||||
#include <girepository.h>
|
#include <girepository.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBCAPNG
|
||||||
|
#include <cap-ng.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_NATIVE_BACKEND) && defined(HAVE_WAYLAND)
|
#if defined(HAVE_NATIVE_BACKEND) && defined(HAVE_WAYLAND)
|
||||||
#include <systemd/sd-login.h>
|
#include <systemd/sd-login.h>
|
||||||
#endif /* HAVE_WAYLAND && HAVE_NATIVE_BACKEND */
|
#endif /* HAVE_WAYLAND && HAVE_NATIVE_BACKEND */
|
||||||
@@ -522,6 +526,22 @@ meta_override_compositor_configuration (MetaCompositorType compositor_type,
|
|||||||
_backend_gtype_override = backend_gtype;
|
_backend_gtype_override = backend_gtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
|
static void
|
||||||
|
meta_set_scheduler (void)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct sched_param sp = {
|
||||||
|
.sched_priority = sched_get_priority_min (SCHED_RR)
|
||||||
|
};
|
||||||
|
|
||||||
|
retval = sched_setscheduler (0, SCHED_RR | SCHED_RESET_ON_FORK, &sp);
|
||||||
|
|
||||||
|
if (retval != 0)
|
||||||
|
g_warning ("Failed to set RT scheduler: %m");
|
||||||
|
}
|
||||||
|
#endif /* HAVE_NATIVE_BACKEND */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_init: (skip)
|
* meta_init: (skip)
|
||||||
*
|
*
|
||||||
@@ -553,8 +573,6 @@ meta_init (void)
|
|||||||
g_strerror (errno));
|
g_strerror (errno));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
g_unix_signal_add (SIGTERM, on_sigterm, NULL);
|
|
||||||
|
|
||||||
if (g_getenv ("MUTTER_VERBOSE"))
|
if (g_getenv ("MUTTER_VERBOSE"))
|
||||||
meta_set_verbose (TRUE);
|
meta_set_verbose (TRUE);
|
||||||
if (g_getenv ("MUTTER_DEBUG"))
|
if (g_getenv ("MUTTER_DEBUG"))
|
||||||
@@ -575,6 +593,21 @@ meta_init (void)
|
|||||||
meta_set_is_wayland_compositor (TRUE);
|
meta_set_is_wayland_compositor (TRUE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
|
if (backend_gtype == META_TYPE_BACKEND_NATIVE)
|
||||||
|
{
|
||||||
|
meta_set_scheduler ();
|
||||||
|
cogl_egl_init_thread ();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBCAPNG
|
||||||
|
capng_clear (CAPNG_SELECT_BOTH);
|
||||||
|
capng_apply (CAPNG_SELECT_BOTH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_unix_signal_add (SIGTERM, on_sigterm, NULL);
|
||||||
|
|
||||||
if (g_get_home_dir ())
|
if (g_get_home_dir ())
|
||||||
if (chdir (g_get_home_dir ()) < 0)
|
if (chdir (g_get_home_dir ()) < 0)
|
||||||
meta_warning ("Could not change to home directory %s.\n",
|
meta_warning ("Could not change to home directory %s.\n",
|
||||||
|
@@ -18,6 +18,7 @@ mutter_pkg_deps = [
|
|||||||
glib_dep,
|
glib_dep,
|
||||||
gsettings_desktop_schemas_dep,
|
gsettings_desktop_schemas_dep,
|
||||||
gtk3_dep,
|
gtk3_dep,
|
||||||
|
libcapng_dep,
|
||||||
pango_dep,
|
pango_dep,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user