[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