[Cogl] [PATCH 2/2] Add support for the WebOS version of SDL

Robert Bragg robert at sixbynine.org
Tue May 8 11:45:48 PDT 2012


Ah, cool, yeah this looks good to me.

Reviewed-by: Robert Bragg <robert at linux.intel.com>

Regards,
Robert
On May 8, 2012 6:34 PM, "Neil Roberts" <neil at linux.intel.com> wrote:

> The stock 1.2.x version of SDL only supports regular OpenGL. The
> version on WebOS is specially patched to add some extra API to request
> a GLES1 or GLES2 context. This patch adds a configure check to detect
> when Cogl is being built with the patched version of SDL. In that case
> it will additionally allow the gles1 and gles2 drivers and set the
> right video mode attributes to get the corresponding context.
> ---
>  cogl/winsys/cogl-winsys-sdl.c |   40 +++++++++++++++++++++++-
>  configure.ac                  |   68
> ++++++++++++++++++++++++++--------------
>  2 files changed, 82 insertions(+), 26 deletions(-)
>
> diff --git a/cogl/winsys/cogl-winsys-sdl.c b/cogl/winsys/cogl-winsys-sdl.c
> index a8c3520..58c177a 100644
> --- a/cogl/winsys/cogl-winsys-sdl.c
> +++ b/cogl/winsys/cogl-winsys-sdl.c
> @@ -47,12 +47,18 @@ typedef struct _CoglDisplaySdl
>  {
>   SDL_Surface *surface;
>   CoglBool has_onscreen;
> +  Uint32 video_mode_flags;
>  } CoglDisplaySdl;
>
>  static CoglFuncPtr
>  _cogl_winsys_renderer_get_proc_address (CoglRenderer *renderer,
>                                         const char *name)
>  {
> +#ifdef COGL_HAS_SDL_GLES_SUPPORT
> +  if (renderer->driver != COGL_DRIVER_GL)
> +    return SDL_GLES_GetProcAddress (name);
> +#endif
> +
>   return SDL_GL_GetProcAddress (name);
>  }
>
> @@ -68,6 +74,7 @@ static CoglBool
>  _cogl_winsys_renderer_connect (CoglRenderer *renderer,
>                                GError **error)
>  {
> +#ifndef COGL_HAS_SDL_GLES_SUPPORT
>   if (renderer->driver != COGL_DRIVER_GL)
>     {
>       g_set_error (error, COGL_WINSYS_ERROR,
> @@ -75,6 +82,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
>                    "The SDL winsys only supports the GL driver");
>       return FALSE;
>     }
> +#endif /* COGL_HAS_SDL_GLES_SUPPORT */
>
>   if (SDL_Init (SDL_INIT_VIDEO) == -1)
>     {
> @@ -134,11 +142,37 @@ _cogl_winsys_display_setup (CoglDisplay *display,
>
>   set_gl_attribs_from_framebuffer_config
> (&display->onscreen_template->config);
>
> +  switch (display->renderer->driver)
> +    {
> +    case COGL_DRIVER_GL:
> +      sdl_display->video_mode_flags = SDL_OPENGL;
> +      break;
> +
> +#ifdef COGL_HAS_SDL_GLES_SUPPORT
> +    case COGL_DRIVER_GLES2:
> +      sdl_display->video_mode_flags = SDL_OPENGLES;
> +      SDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 2);
> +      SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 0);
> +      break;
> +
> +    case COGL_DRIVER_GLES1:
> +      sdl_display->video_mode_flags = SDL_OPENGLES;
> +      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 */
> +
> +    default:
> +      g_assert_not_reached ();
> +    }
> +
>   /* There's no way to know what size the application will need until
>      it creates the first onscreen but we need to set the video mode
>      now so that we can get a GL context. We'll have to just guess at
>      a size an resize it later */
> -  sdl_display->surface = SDL_SetVideoMode (640, 480, 0, SDL_OPENGL);
> +  sdl_display->surface = SDL_SetVideoMode (640, 480, /* width/height */
> +                                           0, /* bitsperpixel */
> +                                           sdl_display->video_mode_flags);
>
>   if (sdl_display->surface == NULL)
>     {
> @@ -213,7 +247,9 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
>   if (width != sdl_display->surface->w ||
>       height != sdl_display->surface->h)
>     {
> -      sdl_display->surface = SDL_SetVideoMode (width, height, 0,
> SDL_OPENGL);
> +      sdl_display->surface = SDL_SetVideoMode (width, height,
> +                                               0, /* bitsperpixel */
> +
> sdl_display->video_mode_flags);
>
>       if (sdl_display->surface == NULL)
>         {
> diff --git a/configure.ac b/configure.ac
> index 88ab27d..2ba1a7c 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -447,7 +447,6 @@ AS_IF([test "x$enable_gles1" = "xyes"],
>         PKG_CHECK_EXISTS([glesv1_cm],
>           [COGL_PKG_REQUIRES_GL="$COGL_PKG_REQUIRES_GL glesv1_cm"
>            COGL_GLES1_LIBNAME="libGLESv1_CM.so"
> -           NEED_EGL=yes
>           ],
>           [
>             # We have to check the two headers independently as
> GLES/glext.h
> @@ -542,8 +541,6 @@ AS_IF([test "x$enable_gles2" = "xyes"],
>
>             COGL_GLES2_LIBNAME="libGLESv2.so"
>           ])
> -
> -        NEED_EGL=yes
>       ])
>
>  HAVE_GL=0
> @@ -681,6 +678,46 @@ AS_IF([test "x$enable_wgl" = "xyes"],
>       ])
>  AM_CONDITIONAL(SUPPORT_WGL, [test "x$SUPPORT_WGL" = "xyes"])
>
> +AC_ARG_ENABLE(
> +  [sdl],
> +  [AC_HELP_STRING([--enable-sdl=@<:@no/yes@:>@], [Enable support SDL
> @<:@default=no@:>@])],
> +  [],
> +  [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])])
> +
> +        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")
> +      ],
> +      [SUPPORT_SDL=no])
> +AM_CONDITIONAL(SUPPORT_SDL, [test "x$SUPPORT_SDL" = "xyes"])
> +
>  EGL_PLATFORM_COUNT=0
>
>  AC_ARG_ENABLE(
> @@ -823,7 +860,7 @@ 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 $EGL_PLATFORM_COUNT -eq 0],
> +  AS_IF([test "x$enable_gles1" = "xyes" -o "x$enable_gles2" = "xyes" &&
> test "x$SUPPORT_SDL_GLES" != "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"],
> @@ -875,26 +912,6 @@ AS_IF([test "x$NEED_EGL" = "xyes"],
>
>  AM_CONDITIONAL(SUPPORT_EGL, [test "x$SUPPORT_EGL" = "xyes"])
>
> -AC_ARG_ENABLE(
> -  [sdl],
> -  [AC_HELP_STRING([--enable-sdl=@<:@no/yes@:>@], [Enable support SDL
> @<:@default=no@:>@])],
> -  [],
> -  [enable_sdl=no])
> -AS_IF([test "x$enable_sdl" = "xyes"],
> -      [
> -        PKG_CHECK_EXISTS([sdl],
> -                         [],
> -                         [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"
> -      ],
> -      [SUPPORT_SDL=no])
> -AM_CONDITIONAL(SUPPORT_SDL, [test "x$SUPPORT_SDL" = "xyes"])
> -
>  dnl         ========================================================
>  dnl         Check X11 dependencies if required
>  dnl         ========================================================
> @@ -1165,6 +1182,9 @@ if test "x$SUPPORT_EGL" = "xyes"; then
>  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}"
> +fi
>  echo "        Image backend: ${COGL_IMAGE_BACKEND}"
>  echo "        Cogl Pango: ${enable_cogl_pango}"
>  echo "        Profiling: ${enable_profile}"
> --
> 1.7.3.16.g9464b
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/cogl/attachments/20120508/2468d285/attachment.html>


More information about the Cogl mailing list