diff --git a/configure.ac b/configure.ac index 1a2b94793..dd3e54a63 100644 --- a/configure.ac +++ b/configure.ac @@ -53,7 +53,7 @@ if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then AC_MSG_RESULT(yes) build_recorder=true recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0" - PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl) + PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes) else AC_MSG_RESULT(no) fi @@ -88,7 +88,6 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION libgnome-menu-3.0 >= $GNOME_MENUS_REQUIRED_VERSION $recorder_modules gdk-x11-3.0 libsoup-2.4 - gl clutter-x11-1.0 >= $CLUTTER_MIN_VERSION clutter-glx-1.0 >= $CLUTTER_MIN_VERSION libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c index 46da710eb..3470637fa 100644 --- a/src/gnome-shell-plugin.c +++ b/src/gnome-shell-plugin.c @@ -28,10 +28,10 @@ #include #include +#define CLUTTER_ENABLE_EXPERIMENTAL_API +#define COGL_ENABLE_EXPERIMENTAL_API #include #include -#include -#include #include #include #include @@ -99,6 +99,7 @@ struct _GnomeShellPlugin int glx_error_base; int glx_event_base; guint have_swap_event : 1; + CoglContext *cogl_context; ShellGlobal *global; }; @@ -139,30 +140,59 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin) { } -static void -gnome_shell_plugin_start (MetaPlugin *plugin) +static gboolean +gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin) { - GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); + MetaPlugin *plugin = META_PLUGIN (shell_plugin); + CoglDisplay *cogl_display = + cogl_context_get_display (shell_plugin->cogl_context); + CoglRenderer *renderer = cogl_display_get_renderer (cogl_display); + const char * (* query_extensions_string) (Display *dpy, int screen); + Bool (* query_extension) (Display *dpy, int *error, int *event); MetaScreen *screen; MetaDisplay *display; Display *xdisplay; - GError *error = NULL; - int status; const char *glx_extensions; - GjsContext *gjs_context; + + /* We will only get swap events if Cogl is using GLX */ + if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX) + return FALSE; screen = meta_plugin_get_screen (plugin); display = meta_screen_get_display (screen); xdisplay = meta_display_get_xdisplay (display); - glXQueryExtension (xdisplay, - &shell_plugin->glx_error_base, - &shell_plugin->glx_event_base); + query_extensions_string = + (void *) cogl_get_proc_address ("glXQueryExtensionsString"); + query_extension = + (void *) cogl_get_proc_address ("glXQueryExtension"); - glx_extensions = glXQueryExtensionsString (xdisplay, - meta_screen_get_screen_number (screen)); - shell_plugin->have_swap_event = strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL; + query_extension (xdisplay, + &shell_plugin->glx_error_base, + &shell_plugin->glx_event_base); + + glx_extensions = + query_extensions_string (xdisplay, + meta_screen_get_screen_number (screen)); + + return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL; +} + +static void +gnome_shell_plugin_start (MetaPlugin *plugin) +{ + GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); + GError *error = NULL; + int status; + GjsContext *gjs_context; + ClutterBackend *backend; + + backend = clutter_get_default_backend (); + shell_plugin->cogl_context = clutter_backend_get_cogl_context (backend); + + shell_plugin->have_swap_event = + gnome_shell_plugin_has_swap_event (shell_plugin); shell_perf_log_define_event (shell_perf_log_get_default (), "glx.swapComplete",