From d45ac12628489f3adf2210a7ec9f08f7a2cb4cf9 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Fri, 18 Jun 2010 04:38:43 +0100 Subject: [PATCH] egl: Consolidates eglx and eglnative into one "egl" winsys This remove quite a lot of redundant code by consolidating the eglx and eglnative window system backends. --- clutter/Makefile.am | 2 +- clutter/cogl/cogl/Makefile.am | 4 +- .../cogl/winsys/{cogl-eglx.c => cogl-egl.c} | 0 clutter/cogl/cogl/winsys/cogl-eglnative.c | 35 - clutter/{eglx => egl}/Makefile.am | 26 +- .../{eglnative => egl}/clutter-backend-egl.c | 24 +- clutter/{eglx => egl}/clutter-backend-egl.h | 2 +- clutter/{eglx => egl}/clutter-egl-headers.h | 0 .../clutter-eglx.h => egl/clutter-egl.h} | 30 +- .../{eglnative => egl}/clutter-event-tslib.c | 0 .../{eglnative => egl}/clutter-stage-egl.c | 0 clutter/{eglx => egl}/clutter-stage-egl.h | 13 + clutter/eglnative/Makefile.am | 29 - clutter/eglnative/clutter-backend-egl.h | 110 --- clutter/eglnative/clutter-egl-headers.h | 33 - clutter/eglnative/clutter-egl.h | 48 - clutter/eglnative/clutter-stage-egl.h | 41 - clutter/eglx/clutter-backend-egl.c | 823 ------------------ clutter/eglx/clutter-stage-egl.c | 366 -------- configure.ac | 9 +- doc/reference/clutter/Makefile.am | 12 +- doc/reference/clutter/clutter-docs.xml.in | 3 +- doc/reference/clutter/clutter-sections.txt | 7 +- 23 files changed, 79 insertions(+), 1538 deletions(-) rename clutter/cogl/cogl/winsys/{cogl-eglx.c => cogl-egl.c} (100%) delete mode 100644 clutter/cogl/cogl/winsys/cogl-eglnative.c rename clutter/{eglx => egl}/Makefile.am (56%) rename clutter/{eglnative => egl}/clutter-backend-egl.c (98%) rename clutter/{eglx => egl}/clutter-backend-egl.h (99%) rename clutter/{eglx => egl}/clutter-egl-headers.h (100%) rename clutter/{eglx/clutter-eglx.h => egl/clutter-egl.h} (68%) rename clutter/{eglnative => egl}/clutter-event-tslib.c (100%) rename clutter/{eglnative => egl}/clutter-stage-egl.c (100%) rename clutter/{eglx => egl}/clutter-stage-egl.h (87%) delete mode 100644 clutter/eglnative/Makefile.am delete mode 100644 clutter/eglnative/clutter-backend-egl.h delete mode 100644 clutter/eglnative/clutter-egl-headers.h delete mode 100644 clutter/eglnative/clutter-egl.h delete mode 100644 clutter/eglnative/clutter-stage-egl.h delete mode 100644 clutter/eglx/clutter-backend-egl.c delete mode 100644 clutter/eglx/clutter-stage-egl.c diff --git a/clutter/Makefile.am b/clutter/Makefile.am index 4577e609f..8b95dae59 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -12,7 +12,7 @@ clutter_json_libadd = $(top_builddir)/clutter/json/libclutter-json.la clutter_json_gir = ClutterJson-@CLUTTER_API_VERSION@.gir endif -DIST_SUBDIRS = glx eglx eglnative cogl json osx x11 win32 fruity +DIST_SUBDIRS = glx egl cogl json osx x11 win32 fruity # common definitions CLEANFILES = diff --git a/clutter/cogl/cogl/Makefile.am b/clutter/cogl/cogl/Makefile.am index 0540166ee..81253f50e 100644 --- a/clutter/cogl/cogl/Makefile.am +++ b/clutter/cogl/cogl/Makefile.am @@ -165,12 +165,12 @@ libclutter_cogl_la_SOURCES += \ endif if SUPPORT_EGL_PLATFORM_POWERVR_X11 libclutter_cogl_la_SOURCES += \ - $(srcdir)/winsys/cogl-eglx.c \ + $(srcdir)/winsys/cogl-egl.c \ $(srcdir)/winsys/cogl-xlib.c endif if SUPPORT_EGL_PLATFORM_POWERVR_NULL libclutter_cogl_la_SOURCES += \ - $(srcdir)/winsys/cogl-eglnative.c + $(srcdir)/winsys/cogl-egl.c endif if SUPPORT_EGL_PLATFORM_FRUITY libclutter_cogl_la_SOURCES += \ diff --git a/clutter/cogl/cogl/winsys/cogl-eglx.c b/clutter/cogl/cogl/winsys/cogl-egl.c similarity index 100% rename from clutter/cogl/cogl/winsys/cogl-eglx.c rename to clutter/cogl/cogl/winsys/cogl-egl.c diff --git a/clutter/cogl/cogl/winsys/cogl-eglnative.c b/clutter/cogl/cogl/winsys/cogl-eglnative.c deleted file mode 100644 index 9c937e4bc..000000000 --- a/clutter/cogl/cogl/winsys/cogl-eglnative.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Cogl - * - * An object oriented GL/GLES Abstraction/Utility Layer - * - * Copyright (C) 2007,2008,2009 Intel Corporation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "cogl.h" - -CoglFuncPtr -_cogl_winsys_get_proc_address (const char *name) -{ - return NULL; -} - diff --git a/clutter/eglx/Makefile.am b/clutter/egl/Makefile.am similarity index 56% rename from clutter/eglx/Makefile.am rename to clutter/egl/Makefile.am index 37e476645..c3c78422e 100644 --- a/clutter/eglx/Makefile.am +++ b/clutter/egl/Makefile.am @@ -1,5 +1,5 @@ libclutterincludedir = $(includedir)/clutter-@CLUTTER_API_VERSION@/clutter -libclutterinclude_HEADERS = clutter-eglx.h +libclutterinclude_HEADERS = clutter-egl.h INCLUDES = \ -DG_LOG_DOMAIN=\"ClutterEGL\" \ @@ -7,24 +7,36 @@ INCLUDES = \ -I$(top_srcdir) \ -I$(top_srcdir)/clutter \ -I$(top_srcdir)/clutter/cogl \ - -I$(top_srcdir)/clutter/x11 \ -I$(top_builddir)/clutter \ -I$(top_builddir)/clutter/cogl \ $(CLUTTER_CFLAGS) \ $(CLUTTER_DEBUG_CFLAGS) \ $(MAINTAINER_CFLAGS) +if SUPPORT_X11 +INCLUDES += -I$(top_srcdir)/clutter/x11 +endif -LDADD = $(CLUTTER_LIBS) $(top_builddir)/clutter/x11/libclutter-x11.la +LDADD = $(CLUTTER_LIBS) +if SUPPORT_X11 +LDADD += $(top_builddir)/clutter/x11/libclutter-x11.la +endif -noinst_LTLIBRARIES = libclutter-eglx.la +noinst_LTLIBRARIES = libclutter-egl.la -libclutter_eglx_la_DEPENDENCIES = \ +if SUPPORT_X11 +libclutter_egl_la_DEPENDENCIES = \ $(top_builddir)/clutter/x11/libclutter-x11.la +endif -libclutter_eglx_la_SOURCES = \ +libclutter_egl_la_SOURCES = \ clutter-backend-egl.h \ clutter-backend-egl.c \ clutter-stage-egl.h \ clutter-stage-egl.c \ - clutter-eglx.h \ + clutter-egl.h \ clutter-egl-headers.h + +if USE_TSLIB +libclutter_egl_la_SOURCES += clutter-event-tslib.c +endif + diff --git a/clutter/eglnative/clutter-backend-egl.c b/clutter/egl/clutter-backend-egl.c similarity index 98% rename from clutter/eglnative/clutter-backend-egl.c rename to clutter/egl/clutter-backend-egl.c index babb3c61f..bad4b0e27 100644 --- a/clutter/eglnative/clutter-backend-egl.c +++ b/clutter/egl/clutter-backend-egl.c @@ -157,7 +157,9 @@ clutter_backend_egl_create_context (ClutterBackend *backend, EGL_BUFFER_SIZE, EGL_DONT_CARE, -#if defined (HAVE_COGL_GLES2) +#if defined (HAVE_COGL_GL) + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, +#elif defined (HAVE_COGL_GLES2) EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #else EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, @@ -206,6 +208,10 @@ retry: goto fail; } +#ifdef HAVE_COGL_GL + eglBindAPI (EGL_OPENGL_API); +#endif + if (backend_egl->egl_context == EGL_NO_CONTEXT) { #ifdef HAVE_COGL_GLES2 @@ -786,15 +792,6 @@ _clutter_backend_impl_get_type (void) } #ifdef COGL_HAS_XLIB_SUPPORT -/** - * clutter_eglx_display: - * - * Retrieves the EGLDisplay used by Clutter - * - * Return value: the EGL display - * - * Since: 0.4 - */ EGLDisplay clutter_eglx_display (void) { @@ -802,13 +799,6 @@ clutter_eglx_display (void) } #endif /* COGL_HAS_XLIB_SUPPORT */ -/** - * clutter_egl_display: - * - * Retrieves the EGLDisplay used by Clutter - * - * Return value: the EGL display - */ EGLDisplay clutter_egl_display (void) { diff --git a/clutter/eglx/clutter-backend-egl.h b/clutter/egl/clutter-backend-egl.h similarity index 99% rename from clutter/eglx/clutter-backend-egl.h rename to clutter/egl/clutter-backend-egl.h index c3893efd9..eb12899f9 100644 --- a/clutter/eglx/clutter-backend-egl.h +++ b/clutter/egl/clutter-backend-egl.h @@ -39,7 +39,7 @@ #include "../x11/clutter-backend-x11.h" #endif -#include "clutter-eglx.h" +#include "clutter-egl.h" G_BEGIN_DECLS diff --git a/clutter/eglx/clutter-egl-headers.h b/clutter/egl/clutter-egl-headers.h similarity index 100% rename from clutter/eglx/clutter-egl-headers.h rename to clutter/egl/clutter-egl-headers.h diff --git a/clutter/eglx/clutter-eglx.h b/clutter/egl/clutter-egl.h similarity index 68% rename from clutter/eglx/clutter-eglx.h rename to clutter/egl/clutter-egl.h index 5ef6819f4..f8495d3e7 100644 --- a/clutter/eglx/clutter-eglx.h +++ b/clutter/egl/clutter-egl.h @@ -24,11 +24,10 @@ */ /** - * SECTION:clutter-eglx - * @short_description: EGLX specific API + * SECTION:clutter-egl + * @short_description: EGL specific API * - * The EGLX backend for Clutter provides some specific API on - * top of the X11-specific one + * The EGL backend for Clutter provides some EGL specific API */ #ifndef __CLUTTER_EGL_H__ @@ -36,9 +35,11 @@ #include +#ifdef COGL_HAS_XLIB_SUPPORT #include #include #include +#endif #include "clutter-egl-headers.h" @@ -46,8 +47,29 @@ G_BEGIN_DECLS +#ifdef COGL_HAS_XLIB_SUPPORT +/** + * clutter_eglx_display: + * + * Retrieves the EGLDisplay used by Clutter + * + * Return value: the EGL display + * + * Since: 0.4 + */ EGLDisplay clutter_eglx_display (void); +#endif + +/** + * clutter_egl_display: + * + * Retrieves the EGLDisplay used by Clutter + * + * Return value: the EGL display + */ +EGLDisplay +clutter_egl_display (void); G_END_DECLS diff --git a/clutter/eglnative/clutter-event-tslib.c b/clutter/egl/clutter-event-tslib.c similarity index 100% rename from clutter/eglnative/clutter-event-tslib.c rename to clutter/egl/clutter-event-tslib.c diff --git a/clutter/eglnative/clutter-stage-egl.c b/clutter/egl/clutter-stage-egl.c similarity index 100% rename from clutter/eglnative/clutter-stage-egl.c rename to clutter/egl/clutter-stage-egl.c diff --git a/clutter/eglx/clutter-stage-egl.h b/clutter/egl/clutter-stage-egl.h similarity index 87% rename from clutter/eglx/clutter-stage-egl.h rename to clutter/egl/clutter-stage-egl.h index a778ef75a..511dd898e 100644 --- a/clutter/eglx/clutter-stage-egl.h +++ b/clutter/egl/clutter-stage-egl.h @@ -9,6 +9,7 @@ #include #include "clutter-egl-headers.h" +#include "clutter-backend-egl.h" #include "../x11/clutter-stage-x11.h" @@ -26,7 +27,19 @@ struct _ClutterStageEGL { ClutterStageX11 parent_instance; +#ifdef COGL_HAS_X11_SUPPORT + EGLSurface egl_surface; + +#else + + /* the stage wrapper */ + ClutterStage *wrapper; + + /* back pointer to the backend */ + ClutterBackendEGL *backend; + +#endif }; struct _ClutterStageEGLClass diff --git a/clutter/eglnative/Makefile.am b/clutter/eglnative/Makefile.am deleted file mode 100644 index 980e6afad..000000000 --- a/clutter/eglnative/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -libclutterincludedir = $(includedir)/clutter-@CLUTTER_API_VERSION@/clutter -libclutterinclude_HEADERS = clutter-egl.h - -INCLUDES = \ - -DG_LOG_DOMAIN=\"ClutterEGL\" \ - -DCLUTTER_COMPILATION \ - -I$(top_srcdir) \ - -I$(top_srcdir)/clutter \ - -I$(top_srcdir)/clutter/cogl \ - -I$(top_builddir)/clutter \ - -I$(top_builddir)/clutter/cogl - -common_ldadd = $(CLUTTER_LIBS) - -noinst_LTLIBRARIES = libclutter-eglnative.la - -libclutter_eglnative_la_SOURCES = \ - clutter-backend-egl.h \ - clutter-backend-egl.c \ - clutter-stage-egl.h \ - clutter-stage-egl.c \ - clutter-egl-headers.h - -if USE_TSLIB -libclutter_eglnative_la_SOURCES += clutter-event-tslib.c -endif - -libclutter_eglnative_la_CPPFLAGS = $(CLUTTER_CFLAGS) $(CLUTTER_DEBUG_CFLAGS) $(MAINTAINER_CFLAGS) -libclutter_eglnative_la_LIBADD = $(common_ldadd) diff --git a/clutter/eglnative/clutter-backend-egl.h b/clutter/eglnative/clutter-backend-egl.h deleted file mode 100644 index ca83718e8..000000000 --- a/clutter/eglnative/clutter-backend-egl.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Clutter. - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2006, 2007, 2008 OpenedHand - * Copyright (C) 2009, 2010 Intel Corp - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Authors: - * Matthew Allum - * Robert Bragg - */ - -#ifndef __CLUTTER_BACKEND_EGL_H__ -#define __CLUTTER_BACKEND_EGL_H__ - -#include -#include -#include -#ifdef COGL_HAS_XLIB_SUPPORT -#include -#include -#endif - -#include "clutter-egl-headers.h" - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_BACKEND_EGL (clutter_backend_egl_get_type ()) -#define CLUTTER_BACKEND_EGL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BACKEND_EGL, ClutterBackendEGL)) -#define CLUTTER_IS_BACKEND_EGL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_BACKEND_EGL)) -#define CLUTTER_BACKEND_EGL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND_EGL, ClutterBackendEGLClass)) -#define CLUTTER_IS_BACKEND_EGL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND_EGL)) -#define CLUTTER_BACKEND_EGL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND_EGL, ClutterBackendEGLClass)) - -typedef struct _ClutterBackendEGL ClutterBackendEGL; -typedef struct _ClutterBackendEGLClass ClutterBackendEGLClass; - -struct _ClutterBackendEGL -{ -#ifdef COGL_HAS_XLIB_SUPPORT - ClutterBackendX11 parent_instance; - - /* EGL Specific */ - EGLDisplay edpy; - EGLContext egl_context; - EGLConfig egl_config; - - Window dummy_xwin; - EGLSurface dummy_surface; - -#else /* COGL_HAS_X11_SUPPORT */ - - ClutterBackend parent_instance; - - /* EGL Specific */ - EGLDisplay edpy; - EGLSurface egl_surface; - EGLContext egl_context; - - /* from the backend */ - gint surface_width; - gint surface_height; - - /* main stage singleton */ - ClutterStageWindow *stage; - - /* event source */ - GSource *event_source; - - /* event timer */ - GTimer *event_timer; - - /* FB device */ - gint fb_device_id; - -#endif /* COGL_HAS_X11_SUPPORT */ - - gint egl_version_major; - gint egl_version_minor; -}; - -struct _ClutterBackendEGLClass -{ -#ifdef COGL_HAS_XLIB_SUPPORT - ClutterBackendX11Class parent_class; -#else - ClutterBackendClass parent_class; -#endif -}; - -GType clutter_backend_egl_get_type (void) G_GNUC_CONST; - -void _clutter_events_egl_init (ClutterBackendEGL *backend); -void _clutter_events_egl_uninit (ClutterBackendEGL *backend); - -G_END_DECLS - -#endif /* __CLUTTER_BACKEND_EGL_H__ */ diff --git a/clutter/eglnative/clutter-egl-headers.h b/clutter/eglnative/clutter-egl-headers.h deleted file mode 100644 index 15e908bdf..000000000 --- a/clutter/eglnative/clutter-egl-headers.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Clutter. - * An OpenGL based 'interactive canvas' library. - * Authored By Matthew Allum - * Copyright (C) 2006-2007 OpenedHand - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * - */ - -#ifndef __CLUTTER_EGL_HEADERS_H__ -#define __CLUTTER_EGL_HEADERS_H__ - -#ifdef HAVE_COGL_GLES2 -#include -#include -#else /* HAVE_COGL_GLES2 */ -#include -#include -#endif /* HAVE_COGL_GLES2 */ - -#endif /* __CLUTTER_EGL_HEADERS_H__ */ diff --git a/clutter/eglnative/clutter-egl.h b/clutter/eglnative/clutter-egl.h deleted file mode 100644 index 3139fb81d..000000000 --- a/clutter/eglnative/clutter-egl.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Matthew Allum - * - * Copyright (C) 2006 OpenedHand - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * - */ - -/** - * SECTION:clutter-eglnative - * @short_description: EGL specific API - * - * The EGL backend for Clutter provides some specific API. - */ - -#ifndef __CLUTTER_EGL_H__ -#define __CLUTTER_EGL_H__ - -#include - -#include "clutter-egl-headers.h" - -#include - -G_BEGIN_DECLS - -EGLDisplay clutter_egl_display (void); - -G_END_DECLS - -#endif /* __CLUTTER_EGL_H__ */ diff --git a/clutter/eglnative/clutter-stage-egl.h b/clutter/eglnative/clutter-stage-egl.h deleted file mode 100644 index 6167197a8..000000000 --- a/clutter/eglnative/clutter-stage-egl.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __CLUTTER_STAGE_EGL_H__ -#define __CLUTTER_STAGE_EGL_H__ - -#include -#include - -#include "clutter-egl-headers.h" -#include "clutter-backend-egl.h" - -#define CLUTTER_TYPE_STAGE_EGL (clutter_stage_egl_get_type ()) -#define CLUTTER_STAGE_EGL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STAGE_EGL, ClutterStageEGL)) -#define CLUTTER_IS_STAGE_EGL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STAGE_EGL)) -#define CLUTTER_STAGE_EGL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STAGE_EGL, ClutterStageEGLClass)) -#define CLUTTER_IS_STAGE_EGL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_STAGE_EGL)) -#define CLUTTER_STAGE_EGL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STAGE_EGL, ClutterStageEGLClass)) - -typedef struct _ClutterStageEGL ClutterStageEGL; -typedef struct _ClutterStageEGLClass ClutterStageEGLClass; - -struct _ClutterStageEGL -{ - ClutterActor parent_instance; - - /* the stage wrapper */ - ClutterStage *wrapper; - - /* back pointer to the backend */ - ClutterBackendEGL *backend; -}; - -struct _ClutterStageEGLClass -{ - ClutterActorClass parent_class; -}; - -GType clutter_stage_egl_get_type (void) G_GNUC_CONST; - -void clutter_stage_egl_redraw (ClutterStageEGL *stage_egl, - ClutterStage *stage); - -#endif /* __CLUTTER_STAGE_EGL_H__ */ diff --git a/clutter/eglx/clutter-backend-egl.c b/clutter/eglx/clutter-backend-egl.c deleted file mode 100644 index ffe163448..000000000 --- a/clutter/eglx/clutter-backend-egl.c +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2010 Intel Corporation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - - * Authors: - * Matthew Allum - * Emmanuele Bassi - * Robert Bragg - * Neil Roberts - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include - -#include "clutter-backend-egl.h" -#include "clutter-stage-egl.h" -#include "clutter-eglx.h" - -#include "../clutter-private.h" -#include "../clutter-main.h" -#include "../clutter-debug.h" -#include "../clutter-version.h" - -static ClutterBackendEGL *backend_singleton = NULL; - -static const gchar *clutter_fb_device = NULL; - -#ifdef COGL_HAS_X11_SUPPORT -G_DEFINE_TYPE (ClutterBackendEGL, clutter_backend_egl, CLUTTER_TYPE_BACKEND_X11); -#else -G_DEFINE_TYPE (ClutterBackendEGL, clutter_backend_egl, CLUTTER_TYPE_BACKEND); -#endif - -static void -clutter_backend_at_exit (void) -{ - if (backend_singleton) - g_object_run_dispose (G_OBJECT (backend_singleton)); -} - -static gboolean -clutter_backend_egl_pre_parse (ClutterBackend *backend, - GError **error) -{ - const gchar *env_string; -#ifdef COGL_HAS_X11_SUPPORT - ClutterBackendClass *backend_x11_class = - CLUTTER_BACKEND_CLASS (clutter_backend_egl_parent_class); - - if (!backend_x11_class->pre_parse (backend, error)) - return FALSE; -#endif - - env_string = g_getenv ("CLUTTER_FB_DEVICE"); - if (env_string != NULL && env_string[0] != '\0') - clutter_fb_device = g_strdup (env_string); - - return TRUE; -} - -static gboolean -clutter_backend_egl_post_parse (ClutterBackend *backend, - GError **error) -{ - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend); -#ifdef COGL_HAS_X11_SUPPORT - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend); - ClutterBackendClass *backend_x11_class = - CLUTTER_BACKEND_CLASS (clutter_backend_egl_parent_class); -#endif - EGLBoolean status; - -#ifdef COGL_HAS_X11_SUPPORT - if (!backend_x11_class->post_parse (backend, error)) - return FALSE; - -#ifndef COGL_HAS_XLIB_SUPPORT -#error "Clutter's EGL on X11 support currently only works with xlib Displays" -#endif - backend_egl->edpy = - eglGetDisplay ((NativeDisplayType) backend_x11->xdpy); - - status = eglInitialize (backend_egl->edpy, - &backend_egl->egl_version_major, - &backend_egl->egl_version_minor); -#else - backend_egl->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); - - status = eglInitialize (backend_egl->edpy, - &backend_egl->egl_version_major, - &backend_egl->egl_version_minor); -#endif - - g_atexit (clutter_backend_at_exit); - - if (status != EGL_TRUE) - { - g_set_error (error, CLUTTER_INIT_ERROR, - CLUTTER_INIT_ERROR_BACKEND, - "Unable to Initialize EGL"); - return FALSE; - } - - CLUTTER_NOTE (BACKEND, "EGL Reports version %i.%i", - backend_egl->egl_version_major, - backend_egl->egl_version_minor); - - return TRUE; -} - -static gboolean -clutter_backend_egl_create_context (ClutterBackend *backend, - GError **error) -{ - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend); -#ifdef COGL_HAS_X11_SUPPORT - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend); -#endif - EGLConfig config; - EGLint config_count = 0; - EGLBoolean status; - EGLint cfg_attribs[] = { - /* NB: This must be the first attribute, since we may - * try and fallback to no stencil buffer */ - EGL_STENCIL_SIZE, 2, - - EGL_RED_SIZE, 1, - EGL_GREEN_SIZE, 1, - EGL_BLUE_SIZE, 1, - EGL_ALPHA_SIZE, EGL_DONT_CARE, - - EGL_DEPTH_SIZE, 1, - - EGL_BUFFER_SIZE, EGL_DONT_CARE, - -#if defined (HAVE_COGL_GL) - EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, -#elif defined (HAVE_COGL_GLES2) - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, -#else - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, -#endif - - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - - EGL_NONE - }; - EGLDisplay edpy; - gint retry_cookie = 0; - const char *error_message = NULL; -#ifdef COGL_HAS_XLIB_SUPPORT - XVisualInfo *xvisinfo; - XSetWindowAttributes attrs; -#endif - - if (backend_egl->egl_context != EGL_NO_CONTEXT) - return TRUE; - - edpy = clutter_eglx_display (); - -/* XXX: we should get rid of this goto yukkyness, there is a fail: - * goto at the end and this retry: goto at the top, but we should just - * have a try_create_context() function and call it in a loop that - * tries a different fallback each iteration */ -retry: - /* Here we can change the attributes depending on the fallback count... */ - - /* Some GLES hardware can't support a stencil buffer: */ - if (retry_cookie == 1) - { - g_warning ("Trying with stencil buffer disabled..."); - cfg_attribs[1 /* EGL_STENCIL_SIZE */] = 0; - } - - /* XXX: at this point we only have one fallback */ - - status = eglChooseConfig (edpy, - cfg_attribs, - &config, 1, - &config_count); - if (status != EGL_TRUE || config_count == 0) - { - error_message = "Unable to select a valid EGL configuration"; - goto fail; - } - -#ifdef HAVE_COGL_GL - eglBindAPI (EGL_OPENGL_API); -#endif - - if (backend_egl->egl_context == EGL_NO_CONTEXT) - { -#ifdef HAVE_COGL_GLES2 - static const EGLint attribs[] = - { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; - - backend_egl->egl_context = eglCreateContext (edpy, - config, - EGL_NO_CONTEXT, - attribs); - -#else - backend_egl->egl_context = eglCreateContext (edpy, - config, - EGL_NO_CONTEXT, - NULL); - -#endif - if (backend_egl->egl_context == EGL_NO_CONTEXT) - { - error_message = "Unable to create a suitable EGL context"; - goto fail; - } - -#ifdef COGL_HAS_XLIB_SUPPORT - backend_egl->egl_config = config; -#endif - CLUTTER_NOTE (GL, "Created EGL Context"); - } - -#ifdef COGL_HAS_XLIB_SUPPORT - /* COGL assumes that there is always a GL context selected; in order - * to make sure that an EGL context exists and is made current, we use - * a dummy, offscreen override-redirect window to which we can always - * fall back if no stage is available */ - - xvisinfo = clutter_backend_x11_get_visual_info (backend_x11); - if (xvisinfo == NULL) - { - g_critical ("Unable to find suitable GL visual."); - return FALSE; - } - - attrs.override_redirect = True; - attrs.colormap = XCreateColormap (backend_x11->xdpy, - backend_x11->xwin_root, - xvisinfo->visual, - AllocNone); - attrs.border_pixel = 0; - - backend_egl->dummy_xwin = XCreateWindow (backend_x11->xdpy, - backend_x11->xwin_root, - -100, -100, 1, 1, - 0, - xvisinfo->depth, - CopyFromParent, - xvisinfo->visual, - CWOverrideRedirect | - CWColormap | - CWBorderPixel, - &attrs); - - XFree (xvisinfo); - - backend_egl->dummy_surface = - eglCreateWindowSurface (edpy, - backend_egl->egl_config, - (NativeWindowType) backend_egl->dummy_xwin, - NULL); - - if (backend_egl->dummy_surface == EGL_NO_SURFACE) - { - g_critical ("Unable to create an EGL surface"); - return FALSE; - } - - eglMakeCurrent (edpy, - backend_egl->dummy_surface, - backend_egl->dummy_surface, - backend_egl->egl_context); - -#else /* COGL_HAS_XLIB_SUPPORT */ - - if (clutter_fb_device != NULL) - { - int fd = open (clutter_fb_device, O_RDWR); - - if (fd < 0) - { - int errno_save = errno; - - g_set_error (error, CLUTTER_INIT_ERROR, - CLUTTER_INIT_ERROR_BACKEND, - "Unable to open the framebuffer device '%s': %s", - clutter_fb_device, - g_strerror (errno_save)); - - return FALSE; - } - else - backend_egl->fb_device_id = fd; - - backend_egl->egl_surface = - eglCreateWindowSurface (edpy, - config, - (NativeWindowType) backend_egl->fb_device_id, - NULL); - } - else - { - backend_egl->egl_surface = - eglCreateWindowSurface (edpy, - config, - (NativeWindowType) NULL, - NULL); - } - - if (backend_egl->egl_surface == EGL_NO_SURFACE) - { - g_set_error (error, CLUTTER_INIT_ERROR, - CLUTTER_INIT_ERROR_BACKEND, - "Unable to create EGL window surface"); - - return FALSE; - } - - CLUTTER_NOTE (BACKEND, "Setting context"); - - /* Without X we assume we can have only one stage, so we - * store the EGL surface in the backend itself, instead - * of the StageWindow implementation, and we make it - * current immediately to make sure the Cogl and Clutter - * can query the EGL context for features. - */ - status = eglMakeCurrent (backend_egl->edpy, - backend_egl->egl_surface, - backend_egl->egl_surface, - backend_egl->egl_context); - - eglQuerySurface (backend_egl->edpy, - backend_egl->egl_surface, - EGL_WIDTH, - &backend_egl->surface_width); - - eglQuerySurface (backend_egl->edpy, - backend_egl->egl_surface, - EGL_HEIGHT, - &backend_egl->surface_height); - - CLUTTER_NOTE (BACKEND, "EGL surface is %ix%i", - backend_egl->surface_width, - backend_egl->surface_height); - -#endif /* COGL_HAS_XLIB_SUPPORT */ - - return TRUE; - -fail: - - /* NB: We currently only support a single fallback option */ - if (retry_cookie == 0) - { - retry_cookie = 1; - goto retry; - } - - g_set_error (error, CLUTTER_INIT_ERROR, - CLUTTER_INIT_ERROR_BACKEND, - "%s", error_message); - - return FALSE; -} - -static void -clutter_backend_egl_ensure_context (ClutterBackend *backend, - ClutterStage *stage) -{ -#ifndef COGL_HAS_XLIB_SUPPORT - /* Without X we only have one EGL surface to worry about - * so we can assume it is permanently made current and - * don't have to do anything here. */ -#else - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend); - ClutterStageWindow *impl; - - if (stage == NULL || - (CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_ACTOR_IN_DESTRUCTION) || - ((impl = _clutter_stage_get_window (stage)) == NULL)) - { - CLUTTER_NOTE (BACKEND, "Clearing EGL context"); - eglMakeCurrent (backend_egl->edpy, - EGL_NO_SURFACE, - EGL_NO_SURFACE, - EGL_NO_CONTEXT); - } - else - { - ClutterStageEGL *stage_egl; - ClutterStageX11 *stage_x11; - - g_assert (impl != NULL); - - CLUTTER_NOTE (MULTISTAGE, "Setting context for stage of type %s [%p]", - g_type_name (G_OBJECT_TYPE (impl)), - impl); - - stage_egl = CLUTTER_STAGE_EGL (impl); - stage_x11 = CLUTTER_STAGE_X11 (impl); - - if (backend_egl->egl_context == EGL_NO_CONTEXT) - return; - - clutter_x11_trap_x_errors (); - - /* we might get here inside the final dispose cycle, so we - * need to handle this gracefully - */ - if (stage_x11->xwin == None || - stage_egl->egl_surface == EGL_NO_SURFACE) - { - CLUTTER_NOTE (MULTISTAGE, - "Received a stale stage, clearing all context"); - - if (backend_egl->dummy_surface == EGL_NO_SURFACE) - eglMakeCurrent (backend_egl->edpy, - EGL_NO_SURFACE, - EGL_NO_SURFACE, - EGL_NO_CONTEXT); - else - eglMakeCurrent (backend_egl->edpy, - backend_egl->dummy_surface, - backend_egl->dummy_surface, - backend_egl->egl_context); - } - else - { - CLUTTER_NOTE (MULTISTAGE, "Setting real surface current"); - eglMakeCurrent (backend_egl->edpy, - stage_egl->egl_surface, - stage_egl->egl_surface, - backend_egl->egl_context); - } - - if (clutter_x11_untrap_x_errors ()) - g_critical ("Unable to make the stage window 0x%x the current " - "EGLX drawable", - (int) stage_x11->xwin); - } -#endif /* COGL_HAS_XLIB_SUPPORT */ -} - -static void -clutter_backend_egl_redraw (ClutterBackend *backend, - ClutterStage *stage) -{ - ClutterStageWindow *impl; - - impl = _clutter_stage_get_window (stage); - if (!impl) - return; - - g_assert (CLUTTER_IS_STAGE_EGL (impl)); - - clutter_stage_egl_redraw (CLUTTER_STAGE_EGL (impl), stage); -} - -#ifdef HAVE_TSLIB -static void -clutter_backend_egl_init_events (ClutterBackend *backend) -{ - /* XXX: This should be renamed to _clutter_events_tslib_init */ - _clutter_events_egl_init (CLUTTER_BACKEND_EGL (backend)); -} -#endif - -static void -clutter_backend_egl_finalize (GObject *gobject) -{ - if (backend_singleton) - backend_singleton = NULL; - - G_OBJECT_CLASS (clutter_backend_egl_parent_class)->finalize (gobject); -} - -static void -clutter_backend_egl_dispose (GObject *gobject) -{ - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (gobject); -#ifdef COGL_HAS_X11_SUPPORT - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (gobject); -#else - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (backend_egl->stage); -#endif - - /* We chain up before disposing our own resources so that - ClutterBackendX11 will destroy all of the stages before we - destroy the egl context. Otherwise the actors may try to make GL - calls during destruction which causes a crash */ - G_OBJECT_CLASS (clutter_backend_egl_parent_class)->dispose (gobject); - -#ifdef HAVE_TSLIB - /* XXX: This should be renamed to _clutter_events_tslib_uninit */ - _clutter_events_egl_uninit (backend_egl); -#endif - -#ifdef COGL_HAS_XLIB_SUPPORT - if (backend_egl->dummy_surface != EGL_NO_SURFACE) - { - eglDestroySurface (backend_egl->edpy, backend_egl->dummy_surface); - backend_egl->dummy_surface = EGL_NO_SURFACE; - } - - if (backend_egl->dummy_xwin) - { - XDestroyWindow (backend_x11->xdpy, backend_egl->dummy_xwin); - backend_egl->dummy_xwin = None; - } - -#else /* COGL_HAS_XLIB_SUPPORT */ - - if (backend_egl->egl_surface != EGL_NO_SURFACE) - { - eglDestroySurface (backend_egl->edpy, backend_egl->egl_surface); - backend_egl->egl_surface = EGL_NO_SURFACE; - } - - if (backend_egl->stage != NULL) - { - clutter_actor_destroy (CLUTTER_ACTOR (stage_egl->wrapper)); - backend_egl->stage = NULL; - } - - if (backend_egl->fb_device_id != -1) - { - close (backend_egl->fb_device_id); - backend_egl->fb_device_id = -1; - } - -#endif /* COGL_HAS_XLIB_SUPPORT */ - - if (backend_egl->egl_context) - { - eglDestroyContext (backend_egl->edpy, backend_egl->egl_context); - backend_egl->egl_context = NULL; - } - - if (backend_egl->edpy) - { - eglTerminate (backend_egl->edpy); - backend_egl->edpy = 0; - } - -#ifdef HAVE_TSLIB - if (backend_egl->event_timer != NULL) - { - g_timer_destroy (backend_egl->event_timer); - backend_egl->event_timer = NULL; - } -#endif -} - -static GObject * -clutter_backend_egl_constructor (GType gtype, - guint n_params, - GObjectConstructParam *params) -{ - GObjectClass *parent_class; - GObject *retval; - - if (!backend_singleton) - { - parent_class = G_OBJECT_CLASS (clutter_backend_egl_parent_class); - retval = parent_class->constructor (gtype, n_params, params); - - backend_singleton = CLUTTER_BACKEND_EGL (retval); - - return retval; - } - - g_warning ("Attempting to create a new backend object. This should " - "never happen, so we return the singleton instance."); - - return g_object_ref (backend_singleton); -} - -static ClutterFeatureFlags -clutter_backend_egl_get_features (ClutterBackend *backend) -{ - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend); - ClutterFeatureFlags flags; - - g_assert (backend_egl->egl_context != NULL); - -#ifdef COGL_HAS_XLIB_SUPPORT - flags = clutter_backend_x11_get_features (backend); - flags |= CLUTTER_FEATURE_STAGE_MULTIPLE; -#else - flags = CLUTTER_FEATURE_STAGE_STATIC; -#endif - - CLUTTER_NOTE (BACKEND, "Checking features\n" - "GL_VENDOR: %s\n" - "GL_RENDERER: %s\n" - "GL_VERSION: %s\n" - "EGL_VENDOR: %s\n" - "EGL_VERSION: %s\n" - "EGL_EXTENSIONS: %s\n", - glGetString (GL_VENDOR), - glGetString (GL_RENDERER), - glGetString (GL_VERSION), - eglQueryString (backend_egl->edpy, EGL_VENDOR), - eglQueryString (backend_egl->edpy, EGL_VERSION), - eglQueryString (backend_egl->edpy, EGL_EXTENSIONS)); - - return flags; -} - -static ClutterStageWindow * -clutter_backend_egl_create_stage (ClutterBackend *backend, - ClutterStage *wrapper, - GError **error) -{ -#ifdef COGL_HAS_XLIB_SUPPORT - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend); - ClutterStageWindow *stage; - ClutterStageX11 *stage_x11; - - CLUTTER_NOTE (BACKEND, "Creating stage of type '%s'", - g_type_name (CLUTTER_STAGE_TYPE)); - - stage = g_object_new (CLUTTER_TYPE_STAGE_EGL, NULL); - - /* copy backend data into the stage */ - stage_x11 = CLUTTER_STAGE_X11 (stage); - stage_x11->wrapper = wrapper; - - CLUTTER_NOTE (MISC, "EGLX stage created (display:%p, screen:%d, root:%u)", - backend_x11->xdpy, - backend_x11->xscreen_num, - (unsigned int) backend_x11->xwin_root); - -#else /* COGL_HAS_XLIB_SUPPORT */ - - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend); - ClutterStageWindow *stage; - ClutterStageEGL *stage_egl; - - if (G_UNLIKELY (backend_egl->stage != NULL)) - { - g_set_error (error, CLUTTER_INIT_ERROR, - CLUTTER_INIT_ERROR_BACKEND, - "The EGL native backend does not support multiple stages"); - return backend_egl->stage; - } - - stage = g_object_new (CLUTTER_TYPE_STAGE_EGL, NULL); - - stage_egl = CLUTTER_STAGE_EGL (stage); - stage_egl->backend = backend_egl; - stage_egl->wrapper = wrapper; - - backend_egl->stage = stage; - -#endif /* COGL_HAS_XLIB_SUPPORT */ - - return stage; -} - -#ifdef COGL_HAS_XLIB_SUPPORT -static XVisualInfo * -clutter_backend_egl_get_visual_info (ClutterBackendX11 *backend_x11) -{ - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend_x11); - XVisualInfo visinfo_template; - int template_mask = 0; - XVisualInfo *visinfo = NULL; - int visinfos_count; - EGLint visualid, red_size, green_size, blue_size, alpha_size; - - if (!clutter_backend_egl_create_context (CLUTTER_BACKEND (backend_x11), NULL)) - return NULL; - - visinfo_template.screen = backend_x11->xscreen_num; - template_mask |= VisualScreenMask; - - eglGetConfigAttrib (backend_egl->edpy, backend_egl->egl_config, - EGL_NATIVE_VISUAL_ID, &visualid); - - if (visualid != 0) - { - visinfo_template.visualid = visualid; - template_mask |= VisualIDMask; - } - else - { - /* some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID - * attribute, so attempt to find the closest match. */ - - eglGetConfigAttrib (backend_egl->edpy, backend_egl->egl_config, - EGL_RED_SIZE, &red_size); - eglGetConfigAttrib (backend_egl->edpy, backend_egl->egl_config, - EGL_GREEN_SIZE, &green_size); - eglGetConfigAttrib (backend_egl->edpy, backend_egl->egl_config, - EGL_BLUE_SIZE, &blue_size); - eglGetConfigAttrib (backend_egl->edpy, backend_egl->egl_config, - EGL_ALPHA_SIZE, &alpha_size); - - visinfo_template.depth = red_size + green_size + blue_size + alpha_size; - template_mask |= VisualDepthMask; - } - - visinfo = XGetVisualInfo (backend_x11->xdpy, - template_mask, - &visinfo_template, - &visinfos_count); - - return visinfo; -} -#endif - -static void -clutter_backend_egl_class_init (ClutterBackendEGLClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - ClutterBackendClass *backend_class = CLUTTER_BACKEND_CLASS (klass); -#ifdef COGL_HAS_X11_SUPPORT - ClutterBackendX11Class *backendx11_class = CLUTTER_BACKEND_X11_CLASS (klass); -#endif - - gobject_class->constructor = clutter_backend_egl_constructor; - gobject_class->dispose = clutter_backend_egl_dispose; - gobject_class->finalize = clutter_backend_egl_finalize; - - backend_class->pre_parse = clutter_backend_egl_pre_parse; - backend_class->post_parse = clutter_backend_egl_post_parse; - backend_class->get_features = clutter_backend_egl_get_features; -#ifdef HAVE_TSLIB - backend_class->init_events = clutter_backend_egl_init_events; -#endif - backend_class->create_stage = clutter_backend_egl_create_stage; - backend_class->create_context = clutter_backend_egl_create_context; - backend_class->ensure_context = clutter_backend_egl_ensure_context; - backend_class->redraw = clutter_backend_egl_redraw; - -#ifdef COGL_HAS_XLIB_SUPPORT - backendx11_class->get_visual_info = clutter_backend_egl_get_visual_info; -#endif -} - -static void -clutter_backend_egl_init (ClutterBackendEGL *backend_egl) -{ -#ifndef COGL_HAS_XLIB_SUPPORT - ClutterBackend *backend = CLUTTER_BACKEND (backend_egl); - - clutter_backend_set_resolution (backend, 96.0); - clutter_backend_set_double_click_time (backend, 250); - clutter_backend_set_double_click_distance (backend, 5); - -#ifdef HAVE_TSLIB - backend_egl->event_timer = g_timer_new (); -#endif - - backend_egl->fb_device_id = -1; - -#else - - backend_egl->egl_context = EGL_NO_CONTEXT; - backend_egl->dummy_surface = EGL_NO_SURFACE; - -#endif -} - -GType -_clutter_backend_impl_get_type (void) -{ - return clutter_backend_egl_get_type (); -} - -#ifdef COGL_HAS_XLIB_SUPPORT -/** - * clutter_eglx_display: - * - * Retrieves the EGLDisplay used by Clutter - * - * Return value: the EGL display - * - * Since: 0.4 - */ -EGLDisplay -clutter_eglx_display (void) -{ - return backend_singleton->edpy; -} -#endif /* COGL_HAS_XLIB_SUPPORT */ - -/** - * clutter_egl_display: - * - * Retrieves the EGLDisplay used by Clutter - * - * Return value: the EGL display - */ -EGLDisplay -clutter_egl_display (void) -{ - return backend_singleton->edpy; -} - diff --git a/clutter/eglx/clutter-stage-egl.c b/clutter/eglx/clutter-stage-egl.c deleted file mode 100644 index 58f8b4b8f..000000000 --- a/clutter/eglx/clutter-stage-egl.c +++ /dev/null @@ -1,366 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "clutter-stage-egl.h" -#include "clutter-eglx.h" -#include "clutter-backend-egl.h" - -#include "../clutter-main.h" -#include "../clutter-feature.h" -#include "../clutter-color.h" -#include "../clutter-util.h" -#include "../clutter-event.h" -#include "../clutter-enum-types.h" -#include "../clutter-private.h" -#include "../clutter-debug.h" -#include "../clutter-units.h" -#include "../clutter-stage.h" -#include "../clutter-stage-window.h" - -#ifdef COGL_HAS_X11_SUPPORT -static ClutterStageWindowIface *clutter_stage_egl_parent_iface = NULL; -#endif - -static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface); - -G_DEFINE_TYPE_WITH_CODE (ClutterStageEGL, - clutter_stage_egl, -#ifdef COGL_HAS_X11_SUPPORT - CLUTTER_TYPE_STAGE_X11, -#else - G_TYPE_OBJECT, -#endif - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_STAGE_WINDOW, - clutter_stage_window_iface_init)); - -#ifdef COGL_HAS_XLIB_SUPPORT - -static void -clutter_stage_egl_unrealize (ClutterStageWindow *stage_window) -{ - ClutterBackend *backend = clutter_get_default_backend (); - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend); - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); - ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window); - - CLUTTER_NOTE (BACKEND, "Unrealizing stage"); - - clutter_x11_trap_x_errors (); - - if (!stage_x11->is_foreign_xwin && stage_x11->xwin != None) - { - XDestroyWindow (backend_x11->xdpy, stage_x11->xwin); - stage_x11->xwin = None; - } - else - stage_x11->xwin = None; - - if (stage_egl->egl_surface != EGL_NO_SURFACE) - { - eglDestroySurface (clutter_eglx_display (), stage_egl->egl_surface); - stage_egl->egl_surface = EGL_NO_SURFACE; - } - - XSync (backend_x11->xdpy, False); - - clutter_x11_untrap_x_errors (); -} - -static gboolean -clutter_stage_egl_realize (ClutterStageWindow *stage_window) -{ - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); - ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window); - ClutterBackend *backend; - ClutterBackendEGL *backend_egl; - ClutterBackendX11 *backend_x11; - EGLDisplay edpy; - - CLUTTER_NOTE (BACKEND, "Realizing main stage"); - - backend = clutter_get_default_backend (); - backend_egl = CLUTTER_BACKEND_EGL (backend); - backend_x11 = CLUTTER_BACKEND_X11 (backend); - - edpy = clutter_eglx_display (); - - if (stage_x11->xwin == None) - { - XSetWindowAttributes xattr; - unsigned long mask; - XVisualInfo *xvisinfo; - gfloat width, height; - - CLUTTER_NOTE (MISC, "Creating stage X window"); - - xvisinfo = clutter_backend_x11_get_visual_info (backend_x11); - if (xvisinfo == NULL) - { - g_critical ("Unable to find suitable GL visual."); - return FALSE; - } - - /* window attributes */ - xattr.background_pixel = WhitePixel (backend_x11->xdpy, - backend_x11->xscreen_num); - xattr.border_pixel = 0; - xattr.colormap = XCreateColormap (backend_x11->xdpy, - backend_x11->xwin_root, - xvisinfo->visual, - AllocNone); - mask = CWBorderPixel | CWColormap; - - /* Call get_size - this will either get the geometry size (which - * before we create the window is set to 640x480), or if a size - * is set, it will get that. This lets you set a size on the - * stage before it's realized. - */ - clutter_actor_get_size (CLUTTER_ACTOR (stage_x11->wrapper), - &width, - &height); - stage_x11->xwin_width = (gint)width; - stage_x11->xwin_height = (gint)height; - - stage_x11->xwin = XCreateWindow (backend_x11->xdpy, - backend_x11->xwin_root, - 0, 0, - stage_x11->xwin_width, - stage_x11->xwin_height, - 0, - xvisinfo->depth, - InputOutput, - xvisinfo->visual, - mask, &xattr); - - CLUTTER_NOTE (BACKEND, "Stage [%p], window: 0x%x, size: %dx%d", - stage_window, - (unsigned int) stage_x11->xwin, - stage_x11->xwin_width, - stage_x11->xwin_height); - - XFree (xvisinfo); - } - - if (stage_egl->egl_surface == EGL_NO_SURFACE) - { - stage_egl->egl_surface = - eglCreateWindowSurface (edpy, - backend_egl->egl_config, - (NativeWindowType) stage_x11->xwin, - NULL); - } - - if (stage_egl->egl_surface == EGL_NO_SURFACE) - g_warning ("Unable to create an EGL surface"); - - if (clutter_x11_has_event_retrieval ()) - { - if (clutter_x11_has_xinput ()) - { - XSelectInput (backend_x11->xdpy, stage_x11->xwin, - StructureNotifyMask | - FocusChangeMask | - ExposureMask | - EnterWindowMask | LeaveWindowMask | - PropertyChangeMask); -#ifdef USE_XINPUT - _clutter_x11_select_events (stage_x11->xwin); -#endif - } - else - XSelectInput (backend_x11->xdpy, stage_x11->xwin, - StructureNotifyMask | - FocusChangeMask | - ExposureMask | - PointerMotionMask | - KeyPressMask | KeyReleaseMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask | - PropertyChangeMask); - } - - /* no user resize... */ - clutter_stage_x11_fix_window_size (stage_x11, - stage_x11->xwin_width, - stage_x11->xwin_height); - clutter_stage_x11_set_wm_protocols (stage_x11); - - return clutter_stage_egl_parent_iface->realize (stage_window); -} - -#else /* COGL_HAS_XLIB_SUPPORT */ - -static void -clutter_stage_egl_unrealize (ClutterStageWindow *stage_window) -{ -} - -static gboolean -clutter_stage_egl_realize (ClutterStageWindow *stage_window) -{ - /* the EGL surface is created by the backend */ - return TRUE; -} - -static void -clutter_stage_egl_set_fullscreen (ClutterStageWindow *stage_window, - gboolean fullscreen) -{ - g_warning ("Stage of type '%s' do not support ClutterStage::set_fullscreen", - G_OBJECT_TYPE_NAME (stage_window)); -} - -static void -clutter_stage_egl_set_title (ClutterStageWindow *stage_window, - const gchar *title) -{ - g_warning ("Stage of type '%s' do not support ClutterStage::set_title", - G_OBJECT_TYPE_NAME (stage_window)); -} - -static void -clutter_stage_egl_set_cursor_visible (ClutterStageWindow *stage_window, - gboolean cursor_visible) -{ - g_warning ("Stage of type '%s' do not support ClutterStage::set_cursor_visible", - G_OBJECT_TYPE_NAME (stage_window)); -} - -static ClutterActor * -clutter_stage_egl_get_wrapper (ClutterStageWindow *stage_window) -{ - return CLUTTER_ACTOR (CLUTTER_STAGE_EGL (stage_window)->wrapper); -} - -static void -clutter_stage_egl_show (ClutterStageWindow *stage_window, - gboolean do_raise) -{ - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); - - clutter_actor_map (CLUTTER_ACTOR (stage_egl->wrapper)); -} - -static void -clutter_stage_egl_hide (ClutterStageWindow *stage_window) -{ - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); - - clutter_actor_unmap (CLUTTER_ACTOR (stage_egl->wrapper)); -} - -static void -clutter_stage_egl_get_geometry (ClutterStageWindow *stage_window, - ClutterGeometry *geometry) -{ - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); - ClutterBackendEGL *backend_egl = stage_egl->backend; - - if (geometry) - { - geometry->x = geometry->y = 0; - - geometry->width = backend_egl->surface_width; - geometry->height = backend_egl->surface_height; - } -} - -static void -clutter_stage_egl_resize (ClutterStageWindow *stage_window, - gint width, - gint height) -{ -} - -#endif /* COGL_HAS_XLIB_SUPPORT */ - -static void -clutter_stage_window_iface_init (ClutterStageWindowIface *iface) -{ -#ifdef COGL_HAS_X11_SUPPORT - clutter_stage_egl_parent_iface = g_type_interface_peek_parent (iface); - - iface->realize = clutter_stage_egl_realize; - iface->unrealize = clutter_stage_egl_unrealize; - - /* the rest is inherited from ClutterStageX11 */ - -#else /* COGL_HAS_X11_SUPPORT */ - - iface->realize = clutter_stage_egl_realize; - iface->unrealize = clutter_stage_egl_unrealize; - iface->set_fullscreen = clutter_stage_egl_set_fullscreen; - iface->set_title = clutter_stage_egl_set_title; - iface->set_cursor_visible = clutter_stage_egl_set_cursor_visible; - iface->get_wrapper = clutter_stage_egl_get_wrapper; - iface->get_geometry = clutter_stage_egl_get_geometry; - iface->resize = clutter_stage_egl_resize; - iface->show = clutter_stage_egl_show; - iface->hide = clutter_stage_egl_hide; - -#endif /* COGL_HAS_X11_SUPPORT */ -} - -#ifdef COGL_HAS_X11_SUPPORT -static void -clutter_stage_egl_dispose (GObject *gobject) -{ - G_OBJECT_CLASS (clutter_stage_egl_parent_class)->dispose (gobject); -} - -static void -clutter_stage_egl_class_init (ClutterStageEGLClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->dispose = clutter_stage_egl_dispose; -} - -static void -clutter_stage_egl_init (ClutterStageEGL *stage) -{ - stage->egl_surface = EGL_NO_SURFACE; -} - -#else /* COGL_HAS_X11_SUPPORT */ - -static void -clutter_stage_egl_class_init (ClutterStageEGLClass *klass) -{ -} - -static void -clutter_stage_egl_init (ClutterStageEGL *stage) -{ - /* Without X we only support one surface and that is associated - * with the backend directly instead of the stage */ -} - -#endif /* COGL_HAS_X11_SUPPORT */ - -void -clutter_stage_egl_redraw (ClutterStageEGL *stage_egl, - ClutterStage *stage) -{ - ClutterBackend *backend = clutter_get_default_backend (); - ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend); - ClutterActor *wrapper; - EGLSurface egl_surface; -#ifdef COGL_HAS_X11_SUPPORT - ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_egl); - - wrapper = CLUTTER_ACTOR (stage_x11->wrapper); - egl_surface = stage_egl->egl_surface; -#else - wrapper = CLUTTER_ACTOR (stage_egl->wrapper); - /* Without X we only support one surface and that is associated - * with the backend directly instead of the stage */ - egl_surface = backend_egl->egl_surface; -#endif - - clutter_actor_paint (wrapper); - cogl_flush (); - - eglSwapBuffers (backend_egl->edpy, egl_surface); -} diff --git a/configure.ac b/configure.ac index 3336eaffc..d4ac61365 100644 --- a/configure.ac +++ b/configure.ac @@ -176,7 +176,7 @@ AS_CASE([$CLUTTER_FLAVOUR], COGL_DRIVER="gl" - CLUTTER_WINSYS=eglx + CLUTTER_WINSYS=egl CLUTTER_WINSYS_BASE=x11 CLUTTER_WINSYS_BASE_LIB="x11/libclutter-x11.la" # I think this winsys can be API and ABI compatible with the @@ -199,7 +199,7 @@ AS_CASE([$CLUTTER_FLAVOUR], COGL_DRIVER="gles" - CLUTTER_WINSYS=eglx + CLUTTER_WINSYS=egl CLUTTER_WINSYS_BASE=x11 CLUTTER_WINSYS_BASE_LIB="x11/libclutter-x11.la" CLUTTER_SONAME_INFIX=eglx @@ -223,7 +223,7 @@ AS_CASE([$CLUTTER_FLAVOUR], FLAVOUR_LIBS="$FLAVOUR_LIBS $TSLIB_LIBS" FLAVOUR_CFLAGS="$FLAVOUR_CFLAGS $TSLIB_CFLAGS" - CLUTTER_WINSYS=eglnative + CLUTTER_WINSYS=egl CLUTTER_SONAME_INFIX=eglnative ], @@ -948,8 +948,7 @@ AC_CONFIG_FILES([ clutter/x11/Makefile clutter/x11/clutter-x11.pc clutter/glx/Makefile - clutter/eglx/Makefile - clutter/eglnative/Makefile + clutter/egl/Makefile clutter/fruity/Makefile clutter/osx/Makefile clutter/win32/Makefile diff --git a/doc/reference/clutter/Makefile.am b/doc/reference/clutter/Makefile.am index 417a7806d..b138fda60 100644 --- a/doc/reference/clutter/Makefile.am +++ b/doc/reference/clutter/Makefile.am @@ -51,15 +51,13 @@ HFILE_GLOB=$(top_srcdir)/clutter/*.h \ $(top_srcdir)/clutter/x11/clutter-x11.h \ $(top_srcdir)/clutter/x11/clutter-x11-texture-pixmap.h \ $(top_srcdir)/clutter/glx/clutter-glx-texture-pixmap.h \ - $(top_srcdir)/clutter/eglnative/clutter-egl.h \ - $(top_srcdir)/clutter/eglx/clutter-eglx.h \ + $(top_srcdir)/clutter/egl/clutter-egl.h \ $(top_srcdir)/clutter/win32/clutter-win32.h CFILE_GLOB=$(top_srcdir)/clutter/*.c \ $(top_srcdir)/clutter/x11/*.c \ $(top_srcdir)/clutter/glx/*.c \ $(top_srcdir)/clutter/win32/*.c \ - $(top_srcdir)/clutter/eglnative/*.c \ - $(top_srcdir)/clutter/eglx/*.c + $(top_srcdir)/clutter/egl/*.c # Header files to ignore when scanning. # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h @@ -83,8 +81,7 @@ IGNORE_HFILES=\ clutter-stage-window.h \ clutter-timeout-interval.h \ cogl \ - eglnative \ - eglx \ + egl \ fruity \ glx \ osx \ @@ -96,8 +93,7 @@ EXTRA_HFILES=\ $(top_srcdir)/clutter/x11/clutter-x11.h \ $(top_srcdir)/clutter/x11/clutter-x11-texture-pixmap.h \ $(top_srcdir)/clutter/glx/clutter-glx-texture-pixmap.h \ - $(top_srcdir)/clutter/eglnative/clutter-egl.h \ - $(top_srcdir)/clutter/eglx/clutter-eglx.h \ + $(top_srcdir)/clutter/egl/clutter-egl.h \ $(top_srcdir)/clutter/win32/clutter-win32.h # Images to copy into HTML directory. diff --git a/doc/reference/clutter/clutter-docs.xml.in b/doc/reference/clutter/clutter-docs.xml.in index 6433f790e..58b083885 100644 --- a/doc/reference/clutter/clutter-docs.xml.in +++ b/doc/reference/clutter/clutter-docs.xml.in @@ -205,8 +205,7 @@ - - + diff --git a/doc/reference/clutter/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt index d537988da..b6b51f039 100644 --- a/doc/reference/clutter/clutter-sections.txt +++ b/doc/reference/clutter/clutter-sections.txt @@ -1823,13 +1823,8 @@ ClutterGLXTexturePixmapPrivate
EGL Specific Support -clutter-eglnative +clutter-egl clutter_egl_display -
- -
-EGLX Specific Support -clutter-eglx clutter_eglx_display