[Cogl] [PATCH] Adds Emscripten support to Cogl
Robert Bragg
robert at sixbynine.org
Tue May 28 13:51:06 PDT 2013
On Wed, May 15, 2013 at 1:18 PM, Neil Roberts <neil at linux.intel.com> wrote:
> This looks good but I'm not sure about the bits for handling the
> ENABLE_NLS define. In the suggested configure options you aren't passing
> --disable-nls so does that mean they are irrelevant to the emscripten
> use case?
enable_nls is explicitly set to no in the configure.ac when
--enable-standalone is used and in this patch it explicitly sets
enable_standalone=yes
>
> It doesn't look like it would work to skip out including gi18n-lib.h
> because then it also won't define the _() macro and it doesn't build.
> Maybe if we want to make --disable-nls work we could have a cogl-i18n.h
> header which defines the _() macro to a no-op if ENABLE_NLS isn't
> defined. But if it isn't relevant to emscripten perhaps we could do that
> in a separate patch, or just not bother until it causes a problem.
It works because luckily "undefined symbols" when you've compiled to
javascript don't actually cause a problem until you try and call them
and we have very few translated strings so I've got away with it. The
compiler was nagging me to fix these though and I forgot. I can look
at ensuring the functions are defined in the case that ENABLE_NLS
isn't defined and send out another patch. Incidentally if the includes
for gi18n-lib.h aren't guarded that leads to a compilation error when
libintl.h can't be found.
regards,
- Robert
>
> Regards,
> - Neil
>
> Robert Bragg <robert at sixbynine.org> writes:
>
>> From: Robert Bragg <robert at linux.intel.com>
>>
>> This enables Emscripten support in Cogl via the SDL winsys. Assuming you
>> have setup an emscripten toolchain you can configure Cogl like this:
>>
>> emconfigure ./configure --enable-debug --enable-emscripten
>>
>> Building the examples will build .html files that can be loaded directly
>> by a WebGL enabled browser.
>> ---
>> cogl/cogl-debug.c | 2 +
>> cogl/cogl.c | 4 +
>> cogl/winsys/cogl-winsys-sdl.c | 22 +++-
>> configure.ac | 272 ++++++++++++++++++++++++++-------------
>> examples/Makefile.am | 20 +++
>> examples/cogl-emscripten-hello.c | 144 +++++++++++++++++++++
>> examples/cogl-info.c | 4 +
>> tests/conform/Makefile.am | 8 +-
>> 8 files changed, 379 insertions(+), 97 deletions(-)
>> create mode 100644 examples/cogl-emscripten-hello.c
>>
>> diff --git a/cogl/cogl-debug.c b/cogl/cogl-debug.c
>> index 01af450..eea6157 100644
>> --- a/cogl/cogl-debug.c
>> +++ b/cogl/cogl-debug.c
>> @@ -26,7 +26,9 @@
>> #endif
>>
>> #include <stdlib.h>
>> +#ifdef ENABLE_NLS
>> #include <glib/gi18n-lib.h>
>> +#endif
>>
>> #include "cogl-private.h"
>> #include "cogl-debug.h"
>> diff --git a/cogl/cogl.c b/cogl/cogl.c
>> index 578f0b4..a0ba821 100644
>> --- a/cogl/cogl.c
>> +++ b/cogl/cogl.c
>> @@ -28,7 +28,9 @@
>> #include <string.h>
>> #include <math.h>
>> #include <stdlib.h>
>> +#ifdef ENABLE_NLS
>> #include <glib/gi18n-lib.h>
>> +#endif
>>
>> #include "cogl-debug.h"
>> #include "cogl-util.h"
>> @@ -161,8 +163,10 @@ _cogl_init (void)
>>
>> if (initialized == FALSE)
>> {
>> +#ifdef ENABLE_NLS
>> bindtextdomain (GETTEXT_PACKAGE, COGL_LOCALEDIR);
>> bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
>> +#endif
>>
>> #ifdef COGL_HAS_GTYPE_SUPPORT
>> g_type_init ();
>> diff --git a/cogl/winsys/cogl-winsys-sdl.c b/cogl/winsys/cogl-winsys-sdl.c
>> index ed8212e..8af11ac 100644
>> --- a/cogl/winsys/cogl-winsys-sdl.c
>> +++ b/cogl/winsys/cogl-winsys-sdl.c
>> @@ -57,6 +57,8 @@ _cogl_winsys_renderer_get_proc_address (CoglRenderer *renderer,
>> const char *name,
>> CoglBool in_core)
>> {
>> + CoglFuncPtr ptr;
>> +
>> /* XXX: It's not totally clear whether it's safe to call this for
>> * core functions. From the code it looks like the implementations
>> * will fall back to using some form of dlsym if the winsys
>> @@ -87,7 +89,16 @@ static CoglBool
>> _cogl_winsys_renderer_connect (CoglRenderer *renderer,
>> CoglError **error)
>> {
>> -#ifndef COGL_HAS_SDL_GLES_SUPPORT
>> +#ifdef USING_EMSCRIPTEN
>> + if (renderer->driver != COGL_DRIVER_GLES2)
>> + {
>> + _cogl_set_error (error, COGL_WINSYS_ERROR,
>> + COGL_WINSYS_ERROR_INIT,
>> + "The SDL winsys with emscripten only supports "
>> + "the GLES2 driver");
>> + return FALSE;
>> + }
>> +#elif !defined (COGL_HAS_SDL_GLES_SUPPORT)
>> if (renderer->driver != COGL_DRIVER_GL)
>> {
>> _cogl_set_error (error, COGL_WINSYS_ERROR,
>> @@ -95,7 +106,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
>> "The SDL winsys only supports the GL driver");
>> return FALSE;
>> }
>> -#endif /* COGL_HAS_SDL_GLES_SUPPORT */
>> +#endif
>>
>> if (SDL_Init (SDL_INIT_VIDEO) == -1)
>> {
>> @@ -180,7 +191,12 @@ _cogl_winsys_display_setup (CoglDisplay *display,
>> SDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 1);
>> SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 1);
>> break;
>> -#endif /* COGL_HAS_SDL_GLES_SUPPORT */
>> +
>> +#elif defined (USING_EMSCRIPTEN)
>> + case COGL_DRIVER_GLES2:
>> + sdl_display->video_mode_flags = SDL_OPENGL;
>> + break;
>> +#endif
>>
>> default:
>> g_assert_not_reached ();
>> diff --git a/configure.ac b/configure.ac
>> index f0bb096..a4184b7 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -197,6 +197,30 @@ dnl ================================================================
>> dnl Handle extra configure options
>> dnl ================================================================
>>
>> +
>> +dnl ============================================================
>> +dnl Emscripten support
>> +dnl ============================================================
>> +
>> +AC_ARG_ENABLE(
>> + [emscripten],
>> + [AC_HELP_STRING([--enable-emscripten=@<:@no/yes@:>@], [Support building for emscripten])],
>> + [],
>> + enable_emscripten=no
>> +)
>> +AS_IF([test "x$enable_emscripten" = "xyes"],
>> + [
>> + enable_standalone=yes
>> + enable_sdl=yes
>> + enable_gles2=yes
>> + enable_gl=no
>> + AC_DEFINE([USING_EMSCRIPTEN], 1, [Cogl is being compiled with emscripten])
>> + COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_EMSCRIPTEN_SUPPORT"
>> + ]
>> +)
>> +AM_CONDITIONAL(USING_EMSCRIPTEN, [test "$enable_emscripten" = "yes"])
>> +
>> +
>> dnl ============================================================
>> dnl Standalone cogl
>> dnl ============================================================
>> @@ -376,19 +400,24 @@ dnl ================================================================
>> dnl ============================================================
>> dnl Should glib be used?
>> dnl ============================================================
>> -AM_PATH_GLIB_2_0([glib_req_version],
>> - [have_glib=yes], [have_glib=no],
>> - [gobject gthread gmodule-no-export])
>> -AC_ARG_ENABLE(
>> - [glib],
>> - [AC_HELP_STRING([--enable-glib=@<:@no/yes@:>@], [Enable glib support @<:@default=yes@:>@])],
>> - [],
>> - enable_glib=yes
>> +AS_IF([test "x$enable_standalone" = "xno"],
>> + [
>> + AM_PATH_GLIB_2_0([glib_req_version],
>> + [have_glib=yes], [have_glib=no],
>> + [gobject gthread gmodule-no-export])
>> + AC_ARG_ENABLE(
>> + [glib],
>> + [AC_HELP_STRING([--enable-glib=@<:@no/yes@:>@], [Enable glib support @<:@default=yes@:>@])],
>> + [],
>> + enable_glib=yes
>> + )
>> +
>> + AS_IF([test "x$have_glib" = "xno" && test "x$enable_glib" = "xyes"],
>> + [AC_MSG_ERROR([gobject-2.0 is required])])
>> + ],
>> + [enable_glib=no]
>> )
>>
>> -AS_IF([test "x$have_glib" = "xno" && test "x$enable_glib" = "xyes"],
>> - [AC_MSG_ERROR([gobject-2.0 is required])])
>> -
>> AM_CONDITIONAL([USE_GLIB], [test "x$enable_glib" = "xyes"])
>>
>> AS_IF([test "x$enable_glib" = "xyes"],
>> @@ -648,24 +677,32 @@ AS_IF([test "x$enable_gles2" = "xyes"],
>> COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_GLES2"
>> HAVE_GLES2=1
>>
>> - PKG_CHECK_EXISTS([glesv2],
>> - [COGL_PKG_REQUIRES_GL="$COGL_PKG_REQUIRES_GL glesv2"
>> - COGL_GLES2_LIBNAME="libGLESv2.so"
>> - ],
>> - [
>> - # We have to check the two headers independently as GLES2/gl2ext.h
>> - # needs to include GLES2/gl2.h to have the GL types defined (eg.
>> - # GLenum).
>> - AC_CHECK_HEADER([GLES2/gl2.h],
>> - [],
>> - [AC_MSG_ERROR([Unable to locate GLES2/gl2.h])])
>> - AC_CHECK_HEADER([GLES2/gl2ext.h],
>> - [],
>> - [AC_MSG_ERROR([Unable to locate GLES2/gl2ext.h])],
>> - [#include <GLES2/gl2.h>])
>> + AS_IF([test "x$enable_emscripten" = "xyes"],
>> + [
>> + GL_LIBRARY_DIRECTLY_LINKED=yes
>> + COGL_GLES2_LIBNAME=""
>> + ],
>>
>> - COGL_GLES2_LIBNAME="libGLESv2.so"
>> - ])
>> + [
>> + PKG_CHECK_EXISTS([glesv2],
>> + [COGL_PKG_REQUIRES_GL="$COGL_PKG_REQUIRES_GL glesv2"
>> + COGL_GLES2_LIBNAME="libGLESv2.so"
>> + ],
>> + [
>> + # We have to check the two headers independently as GLES2/gl2ext.h
>> + # needs to include GLES2/gl2.h to have the GL types defined (eg.
>> + # GLenum).
>> + AC_CHECK_HEADER([GLES2/gl2.h],
>> + [],
>> + [AC_MSG_ERROR([Unable to locate GLES2/gl2.h])])
>> + AC_CHECK_HEADER([GLES2/gl2ext.h],
>> + [],
>> + [AC_MSG_ERROR([Unable to locate GLES2/gl2ext.h])],
>> + [#include <GLES2/gl2.h>])
>> +
>> + COGL_GLES2_LIBNAME="libGLESv2.so"
>> + ])
>> + ])
>> ])
>>
>> HAVE_GL=0
>> @@ -833,35 +870,58 @@ AC_ARG_ENABLE(
>> [enable_sdl=no])
>> AS_IF([test "x$enable_sdl" = "xyes"],
>> [
>> - PKG_CHECK_MODULES([SDL],
>> - [sdl],
>> - [],
>> - [AC_MSG_ERROR([SDL support requested but SDL not found])])
>> + AS_IF([test "x$enable_emscripten" = "xno"],
>> + [
>> + PKG_CHECK_MODULES([SDL],
>> + [sdl],
>> + [
>> + COGL_PKG_REQUIRES="$COGL_PKG_REQUIRES sdl"
>> + ],
>> + [
>> + AC_CHECK_HEADER([SDL/SDL.h],
>> + [],
>> + [AC_MSG_ERROR([SDL support requested but SDL not found])])
>> + ])
>> + ])
>>
>> SUPPORT_SDL=yes
>> GL_WINSYS_APIS="$GL_WINSYS_APIS sdl"
>> - COGL_PKG_REQUIRES="$COGL_PKG_REQUIRES sdl"
>>
>> COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_SDL_SUPPORT"
>>
>> - dnl WebOS has a specially patched version of SDL to add
>> - dnl support for creating a GLES1/2 context. This tries to
>> - dnl detect that patch so we can use it if the GLES2 driver is
>> - dnl selected.
>> - cogl_save_CPPFLAGS="$CPPFLAGS"
>> - CPPFLAGS="$CPPFLAGS $SDL_CFLAGS"
>> - AC_CHECK_DECL([SDL_OPENGLES],
>> - [SUPPORT_SDL_GLES=yes],
>> - [SUPPORT_SDL_GLES=no],
>> - [#include <SDL.h>])
>> - AC_CHECK_DECL([SDL_GL_CONTEXT_MAJOR_VERSION], [], [SUPPORT_SDL_GLES=no],
>> - [#include <SDL.h>])
>> - AC_CHECK_DECL([SDL_GL_CONTEXT_MINOR_VERSION], [], [SUPPORT_SDL_GLES=no],
>> - [#include <SDL.h>])
>> - CPPFLAGS="$cogl_save_CPPFLAGS"
>> -
>> - AS_IF([test "x$SUPPORT_SDL_GLES" = "xyes"],
>> - COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_SDL_GLES_SUPPORT")
>> + dnl If we are building with emscripten then that simply implies we are
>> + dnl using SDL in conjunction with WebGL (GLES2)
>> + AS_IF([test "x$enable_emscripten" = "xyes"],
>> + [
>> + SUPPORTED_SDL_GL_APIS="webgl"
>> + SUPPORT_SDL_WEBGL=yes
>> + SUPPORT_SDL_GLES=no
>> + COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_SDL_WEBGL_SUPPORT"
>> + ],
>> + [
>> + dnl WebOS has a specially patched version of SDL to add
>> + dnl support for creating a GLES1/2 context. This tries to
>> + dnl detect that patch so we can use it if the GLES2 driver is
>> + dnl selected.
>> + cogl_save_CPPFLAGS="$CPPFLAGS"
>> + CPPFLAGS="$CPPFLAGS $SDL_CFLAGS"
>> + AC_CHECK_DECL([SDL_OPENGLES],
>> + [SUPPORT_SDL_GLES=yes],
>> + [SUPPORT_SDL_GLES=no],
>> + [#include <SDL.h>])
>> + AC_CHECK_DECL([SDL_GL_CONTEXT_MAJOR_VERSION], [], [SUPPORT_SDL_GLES=no],
>> + [#include <SDL.h>])
>> + AC_CHECK_DECL([SDL_GL_CONTEXT_MINOR_VERSION], [], [SUPPORT_SDL_GLES=no],
>> + [#include <SDL.h>])
>> + CPPFLAGS="$cogl_save_CPPFLAGS"
>> +
>> + AS_IF([test "x$SUPPORT_SDL_GLES" = "xyes"],
>> + [
>> + SUPPORTED_SDL_GL_APIS="gles1 gles2"
>> + COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_SDL_GLES_SUPPORT"
>> + ],
>> + [ SUPPORTED_SDL_GL_APIS="gl" ])
>> + ])
>> ],
>> [SUPPORT_SDL=no])
>> AM_CONDITIONAL(SUPPORT_SDL, [test "x$SUPPORT_SDL" = "xyes"])
>> @@ -1043,7 +1103,12 @@ AC_ARG_ENABLE(
>> [xlib-egl-platform],
>> [AC_HELP_STRING([--enable-xlib-egl-platform=@<:@no/yes@:>@], [Enable support for the Xlib egl platform @<:@default=auto@:>@])],
>> [],
>> - AS_IF([test "x$enable_gles1" = "xyes" -o "x$enable_gles2" = "xyes" && test "x$SUPPORT_SDL_GLES" != "xyes" && test "x$SUPPORT_SDL2" != "xyes" && test $EGL_PLATFORM_COUNT -eq 0],
>> + AS_IF([test "x$enable_gles1" = "xyes" -o \
>> + "x$enable_gles2" = "xyes" && \
>> + test "x$SUPPORT_SDL_GLES" != "xyes" && \
>> + test "x$SUPPORT_SDL_WEBGL" != "xyes" && \
>> + test "x$SUPPORT_SDL2" != "xyes" && \
>> + test $EGL_PLATFORM_COUNT -eq 0],
>> [enable_xlib_egl_platform=yes], [enable_xlib_egl_platform=no])
>> )
>> AS_IF([test "x$enable_xlib_egl_platform" = "xyes"],
>> @@ -1146,22 +1211,25 @@ AS_ALL_LINGUAS
>>
>>
>> AC_SUBST(COGL_PKG_REQUIRES)
>> -PKG_CHECK_MODULES(COGL_DEP, [$COGL_PKG_REQUIRES])
>> -if test -n "$COGL_PKG_REQUIRES_GL"; then
>> - PKG_CHECK_MODULES(COGL_DEP_GL, [$COGL_PKG_REQUIRES_GL])
>> -
>> - dnl Strip out the GL libraries from the GL pkg-config files so we can
>> - dnl dynamically load them instead
>> - gl_libs=""
>> - for x in $COGL_DEP_GL_LIBS; do
>> - AS_CASE([$x],
>> - [-lGL], [],
>> - [-lGLESv2], [],
>> - [-lGLESv1_CM], [],
>> - [*], [gl_libs="$gl_libs $x"])
>> - done
>> - COGL_DEP_CFLAGS="$COGL_DEP_CFLAGS $COGL_DEP_CFLAGS_GL"
>> - COGL_DEP_LIBS="$COGL_DEP_LIBS $gl_libs"
>> +if test -n "$COGL_PKG_REQUIRES"; then
>> + PKG_CHECK_MODULES(COGL_DEP, [$COGL_PKG_REQUIRES])
>> +
>> + if test -n "$COGL_PKG_REQUIRES_GL"; then
>> + PKG_CHECK_MODULES(COGL_DEP_GL, [$COGL_PKG_REQUIRES_GL])
>> +
>> + dnl Strip out the GL libraries from the GL pkg-config files so we can
>> + dnl dynamically load them instead
>> + gl_libs=""
>> + for x in $COGL_DEP_GL_LIBS; do
>> + AS_CASE([$x],
>> + [-lGL], [],
>> + [-lGLESv2], [],
>> + [-lGLESv1_CM], [],
>> + [*], [gl_libs="$gl_libs $x"])
>> + done
>> + COGL_DEP_CFLAGS="$COGL_DEP_CFLAGS $COGL_DEP_CFLAGS_GL"
>> + COGL_DEP_LIBS="$COGL_DEP_LIBS $gl_libs"
>> + fi
>> fi
>> AC_SUBST(COGL_PANGO_PKG_REQUIRES)
>>
>> @@ -1211,7 +1279,11 @@ dnl ================================================================
>>
>> dnl The 'ffs' function is part of C99 so it isn't always
>> dnl available. Cogl has a fallback if needed.
>> -AC_CHECK_FUNCS([ffs])
>> +dnl
>> +dnl XXX: ffs isnt available with the emscripten toolchain currently
>> +dnl but the check passes so we manually skip the check in this case
>> +AS_IF([test "x$enable_emscripten" = "xno"],
>> + [AC_CHECK_FUNCS([ffs])])
>>
>> dnl 'memmem' is a GNU extension but we have a simple fallback
>> AC_CHECK_FUNCS([memmem])
>> @@ -1228,29 +1300,42 @@ dnl ================================================================
>>
>> dnl These are values from system headers that we want to copy into the
>> dnl public Cogl headers without having to include the system header
>> -AC_CHECK_HEADER(poll.h,
>> - [
>> - AC_COMPUTE_INT(COGL_SYSDEF_POLLIN, POLLIN, [#include <poll.h>],
>> - AC_MSG_ERROR([Unable to get value of POLLIN]))
>> - AC_COMPUTE_INT(COGL_SYSDEF_POLLPRI, POLLPRI, [#include <poll.h>],
>> - AC_MSG_ERROR([Unable to get value of POLLPRI]))
>> - AC_COMPUTE_INT(COGL_SYSDEF_POLLOUT, POLLOUT, [#include <poll.h>],
>> - AC_MSG_ERROR([Unable to get value of POLLOUT]))
>> - AC_COMPUTE_INT(COGL_SYSDEF_POLLERR, POLLERR, [#include <poll.h>],
>> - AC_MSG_ERROR([Unable to get value of POLLERR]))
>> - AC_COMPUTE_INT(COGL_SYSDEF_POLLHUP, POLLHUP, [#include <poll.h>],
>> - AC_MSG_ERROR([Unable to get value of POLLHUP]))
>> - AC_COMPUTE_INT(COGL_SYSDEF_POLLNVAL, POLLNVAL, [#include <poll.h>],
>> - AC_MSG_ERROR([Unable to get value of POLLNVAL]))
>> - ],
>> - [
>> - COGL_SYSDEF_POLLIN=1
>> - COGL_SYSDEF_POLLPRI=2
>> - COGL_SYSDEF_POLLOUT=4
>> - COGL_SYSDEF_POLLERR=8
>> - COGL_SYSDEF_POLLHUP=16
>> - COGL_SYSDEF_POLLNVAL=32
>> - ])
>> +dnl
>> +dnl XXX: poll(2) can't currently be used with emscripten even though
>> +dnl poll.h is in the toolchain headers so we manually skip the check
>> +dnl in this case
>> +have_poll_h=no
>> +AS_IF([test "x$enable_emscripten" = "xno"],
>> + [
>> + AC_CHECK_HEADER(poll.h,
>> + [
>> + AC_COMPUTE_INT(COGL_SYSDEF_POLLIN, POLLIN, [#include <poll.h>],
>> + AC_MSG_ERROR([Unable to get value of POLLIN]))
>> + AC_COMPUTE_INT(COGL_SYSDEF_POLLPRI, POLLPRI, [#include <poll.h>],
>> + AC_MSG_ERROR([Unable to get value of POLLPRI]))
>> + AC_COMPUTE_INT(COGL_SYSDEF_POLLOUT, POLLOUT, [#include <poll.h>],
>> + AC_MSG_ERROR([Unable to get value of POLLOUT]))
>> + AC_COMPUTE_INT(COGL_SYSDEF_POLLERR, POLLERR, [#include <poll.h>],
>> + AC_MSG_ERROR([Unable to get value of POLLERR]))
>> + AC_COMPUTE_INT(COGL_SYSDEF_POLLHUP, POLLHUP, [#include <poll.h>],
>> + AC_MSG_ERROR([Unable to get value of POLLHUP]))
>> + AC_COMPUTE_INT(COGL_SYSDEF_POLLNVAL, POLLNVAL, [#include <poll.h>],
>> + AC_MSG_ERROR([Unable to get value of POLLNVAL]))
>> + COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_POLL_SUPPORT"
>> + have_poll_h=yes
>> + ])
>> + ])
>> +
>> +AS_IF([test "x$have_poll_h" = "xno"],
>> + [
>> + COGL_SYSDEF_POLLIN=1
>> + COGL_SYSDEF_POLLPRI=2
>> + COGL_SYSDEF_POLLOUT=4
>> + COGL_SYSDEF_POLLERR=8
>> + COGL_SYSDEF_POLLHUP=16
>> + COGL_SYSDEF_POLLNVAL=32
>> + ])
>> +
>> COGL_DEFINES_EXTRA="$COGL_DEFINES_EXTRA
>> #define COGL_SYSDEF_POLLIN $COGL_SYSDEF_POLLIN
>> #define COGL_SYSDEF_POLLPRI $COGL_SYSDEF_POLLPRI
>> @@ -1375,8 +1460,9 @@ echo " EGL Platforms:${EGL_PLATFORMS}"
>> echo " Wayland compositor support: ${enable_wayland_egl_server}"
>> fi
>> if test "x$SUPPORT_SDL" = "xyes"; then
>> -echo " Support GLES under SDL: ${SUPPORT_SDL_GLES}"
>> +echo " Supported SDL GL APIs: ${SUPPORTED_SDL_GL_APIS}"
>> fi
>> +echo " Building for emscripten environment: $enable_emscripten"
>> echo " Build libcogl-gles2 GLES 2.0 frontend api: ${enable_cogl_gles2}"
>> echo " Image backend: ${COGL_IMAGE_BACKEND}"
>> echo " Cogl Pango: ${enable_cogl_pango}"
>> diff --git a/examples/Makefile.am b/examples/Makefile.am
>> index 87deb28..cd772fe 100644
>> --- a/examples/Makefile.am
>> +++ b/examples/Makefile.am
>> @@ -82,18 +82,38 @@ endif
>>
>> endif #USE_GLIB
>>
>> +# XXX although emscripten "supports sdl" we can't build cogl-sdl-hello
>> +# un-modified for emscripten since emscripten doesn't support
>> +# SDL_WaitEvent() and we need to use some special emscripten apis
>> +# to create a mainloop....
>> +if USING_EMSCRIPTEN
>> +
>> +programs += cogl-emscripten-hello
>> +cogl_emscripten_hello_SOURCES = cogl-emscripten-hello.c
>> +cogl_emscripten_hello_LDADD = $(common_ldadd)
>> +
>> +else # USING_EMSCRIPTEN
>> +
>> if SUPPORT_SDL
>> programs += cogl-sdl-hello
>> cogl_sdl_hello_SOURCES = cogl-sdl-hello.c
>> cogl_sdl_hello_LDADD = $(common_ldadd)
>> endif
>>
>> +endif # USING_EMSCRIPTEN
>> +
>> if SUPPORT_SDL2
>> programs += cogl-sdl2-hello
>> cogl_sdl2_hello_SOURCES = cogl-sdl2-hello.c
>> cogl_sdl2_hello_LDADD = $(common_ldadd)
>> endif
>>
>> +if USING_EMSCRIPTEN
>> +%.html: %.o $(top_builddir)/cogl/.libs/libcogl2.so $(top_builddir)/deps/glib/.libs/libglib.a
>> + emcc --minify 0 -o $@ $^
>> +
>> +all-local: $(addsuffix .html, $(programs))
>> +endif
>>
>> if INSTALL_EXAMPLES
>> bin_PROGRAMS = $(programs)
>> diff --git a/examples/cogl-emscripten-hello.c b/examples/cogl-emscripten-hello.c
>> new file mode 100644
>> index 0000000..3932091
>> --- /dev/null
>> +++ b/examples/cogl-emscripten-hello.c
>> @@ -0,0 +1,144 @@
>> +#include <cogl/cogl.h>
>> +#include <stdio.h>
>> +#include <SDL.h>
>> +#include <emscripten.h>
>> +
>> +/* This short example is just to demonstrate mixing SDL with Cogl as a
>> + simple way to get portable support for events */
>> +
>> +typedef struct Data
>> +{
>> + CoglPrimitive *triangle;
>> + CoglPipeline *pipeline;
>> + float center_x, center_y;
>> + CoglFramebuffer *fb;
>> + CoglBool quit;
>> + CoglBool redraw_queued;
>> + CoglBool ready_to_draw;
>> +} Data;
>> +
>> +static Data data;
>> +static CoglContext *ctx;
>> +
>> +static void
>> +redraw (Data *data)
>> +{
>> + CoglFramebuffer *fb = data->fb;
>> +
>> + cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
>> +
>> + cogl_framebuffer_push_matrix (fb);
>> + cogl_framebuffer_translate (fb, data->center_x, -data->center_y, 0.0f);
>> +
>> + cogl_framebuffer_draw_primitive (fb, data->pipeline, data->triangle);
>> + cogl_framebuffer_pop_matrix (fb);
>> +
>> + cogl_onscreen_swap_buffers (COGL_ONSCREEN (fb));
>> +}
>> +
>> +static void
>> +handle_event (Data *data, SDL_Event *event)
>> +{
>> + switch (event->type)
>> + {
>> + case SDL_VIDEOEXPOSE:
>> + data->redraw_queued = TRUE;
>> + break;
>> +
>> + case SDL_MOUSEMOTION:
>> + {
>> + int width =
>> + cogl_framebuffer_get_width (COGL_FRAMEBUFFER (data->fb));
>> + int height =
>> + cogl_framebuffer_get_height (COGL_FRAMEBUFFER (data->fb));
>> +
>> + data->center_x = event->motion.x * 2.0f / width - 1.0f;
>> + data->center_y = event->motion.y * 2.0f / height - 1.0f;
>> +
>> + data->redraw_queued = TRUE;
>> + }
>> + break;
>> +
>> + case SDL_QUIT:
>> + data->quit = TRUE;
>> + break;
>> + }
>> +}
>> +
>> +static void
>> +frame_cb (CoglOnscreen *onscreen,
>> + CoglFrameEvent event,
>> + CoglFrameInfo *info,
>> + void *user_data)
>> +{
>> + Data *data = user_data;
>> +
>> + if (event == COGL_FRAME_EVENT_SYNC)
>> + data->ready_to_draw = TRUE;
>> +}
>> +
>> +static void
>> +mainloop (void)
>> +{
>> + SDL_Event event;
>> + while (SDL_PollEvent (&event) && !data.quit)
>> + {
>> + handle_event (&data, &event);
>> + cogl_sdl_handle_event (ctx, &event);
>> + }
>> +
>> + if (data.quit)
>> + emscripten_cancel_main_loop ();
>> +
>> + redraw (&data);
>> + data.redraw_queued = FALSE;
>> + data.ready_to_draw = FALSE;
>> +
>> + cogl_sdl_idle (ctx);
>> +}
>> +
>> +int
>> +main (int argc, char **argv)
>> +{
>> + CoglOnscreen *onscreen;
>> + CoglError *error = NULL;
>> + CoglVertexP2C4 triangle_vertices[] = {
>> + {0, 0.7, 0xff, 0x00, 0x00, 0xff},
>> + {-0.7, -0.7, 0x00, 0xff, 0x00, 0xff},
>> + {0.7, -0.7, 0x00, 0x00, 0xff, 0xff}
>> + };
>> +
>> + ctx = cogl_sdl_context_new (SDL_USEREVENT, &error);
>> + if (!ctx)
>> + {
>> + fprintf (stderr, "Failed to create context: %s\n", error->message);
>> + return 1;
>> + }
>> +
>> + onscreen = cogl_onscreen_new (ctx, 800, 600);
>> + data.fb = COGL_FRAMEBUFFER (onscreen);
>> +
>> + cogl_onscreen_add_frame_callback (onscreen,
>> + frame_cb,
>> + &data,
>> + NULL /* destroy callback */);
>> +
>> + data.center_x = 0.0f;
>> + data.center_y = 0.0f;
>> + data.quit = FALSE;
>> +
>> + cogl_onscreen_show (onscreen);
>> +
>> + data.triangle = cogl_primitive_new_p2c4 (ctx, COGL_VERTICES_MODE_TRIANGLES,
>> + 3, triangle_vertices);
>> + data.pipeline = cogl_pipeline_new (ctx);
>> +
>> + data.redraw_queued = TRUE;
>> + data.ready_to_draw = TRUE;
>> +
>> + emscripten_set_main_loop (mainloop, -1, TRUE);
>> +
>> + cogl_object_unref (ctx);
>> +
>> + return 0;
>> +}
>> diff --git a/examples/cogl-info.c b/examples/cogl-info.c
>> index 1680f7d..0a29d99 100644
>> --- a/examples/cogl-info.c
>> +++ b/examples/cogl-info.c
>> @@ -222,7 +222,11 @@ main (int argc, char **argv)
>> const char *winsys_name;
>> OutputState output_state;
>>
>> +#ifdef COGL_HAS_EMSCRIPTEN_SUPPORT
>> + ctx = cogl_sdl_context_new (SDL_USEREVENT, &error);
>> +#else
>> ctx = cogl_context_new (NULL, &error);
>> +#endif
>> if (!ctx) {
>> fprintf (stderr, "Failed to create context: %s\n", error->message);
>> return 1;
>> diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
>> index d5c25db..e07f117 100644
>> --- a/tests/conform/Makefile.am
>> +++ b/tests/conform/Makefile.am
>> @@ -27,7 +27,6 @@ unported_test_sources = \
>>
>> test_sources = \
>> test-atlas-migration.c \
>> - test-bitmask.c \
>> test-blend-strings.c \
>> test-depth-test.c \
>> test-color-mask.c \
>> @@ -67,6 +66,13 @@ test_sources = \
>> test-pipeline-cache-unrefs-texture.c \
>> $(NULL)
>>
>> +# XXX: the emscripten toolchain gets upset about multiple definitions
>> +# of symbols due to the tricks we play in test-bitmask.c with
>> +# including cogl-util.c
>> +if !USING_EMSCRIPTEN
>> +test_sources += test-bitmask.c
>> +endif
>> +
>> test_conformance_SOURCES = $(common_sources) $(test_sources)
>>
>> if OS_WIN32
>> --
>> 1.8.2.1
>>
>> _______________________________________________
>> Cogl mailing list
>> Cogl at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/cogl
> ---------------------------------------------------------------------
> Intel Corporation (UK) Limited
> Registered No. 1134945 (England)
> Registered Office: Pipers Way, Swindon SN3 1RJ
> VAT No: 860 2173 47
>
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list