src/video/x11/SDL_x11opengles.h
author Sam Lantinga <slouken@libsdl.org>
Sun, 08 Jan 2012 02:23:37 -0500
changeset 6188 e82023802002
parent 6138 4c64952a58fb
child 6190 519380462400
permissions -rwxr-xr-x
Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11

Scott Percival 2011-07-03 06:41:51 PDT

This submission is aimed at making life easier for OpenGL ES capable devices
running a X11 stack (e.g. Maemo, Meego, TrimSlice, other ARM SoC boards not
running Android). SDL's Pandora support already has the neccesary GLES-to-X11
glue code, however it's all ghetto'd off in Makefile.pandora and not very
flexible.

The patch:
- adds an awesome --enable-video-opengles option to configure
- re-modifies the opengles and opengles2 SDL_renderers to use function pointers
- no idea why this was removed?
- for SDL_Renderers, links in libGLESv1_CM, libGLES_CM (for PowerVR fans) or
libGLESv2 at runtime
- links in libEGL.so at runtime - the old code made an assumption that
eglFunctions could be pulled from the active GLES library, PowerVR for one
doesn't let you do that with their libGLESv2
- allows you to pick which of GLES v1 or v2 to load via
SDL_GL_CONTEXT_MAJOR_VERSION

So far I've tested this on a Nokia N900 (OMAP 3430/SGX 530 running Maemo 5) and
a Toshiba AC100 (Tegra 2 running Ubuntu 10.10). I haven't tested it on... well,
everything that isn't those two, such as a Pandora, iOS or Android device. The
Pandora specific code should be kept intact (fingers crossed), and nothing
painfully drastic has been added to the SDL_renderers. The library loading
sequence in SDL_x11opengles has been updated to accomodate both NVIDIA's
propensity to let developers get away with murder and PowerVR's alternative of
punishing every missed step.

The test apps work okay with GLES or GLES2 as the renderer. For some reason
alpha blending doesn't seem to work on the Tegra 2; last week NVIDIA pushed out
a new set of X11 GLES drivers, so I'll try and investigate once I upgrade
those. Also, this patch adds things to configure.in, include/SDL_config.h.in
and test/configure.in. I didn't know what the policy was re. committing
generated spaghetti from autotools, so ./autogen.sh has to be run again. Sorry.

I think that's about everything, let me know if there's anything I've
overlooked.
slouken@3190
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@6138
     3
  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
slouken@3190
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@3190
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@3190
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@3190
    20
*/
slouken@3190
    21
slouken@3190
    22
#include <GLES/gl.h>
slouken@3190
    23
#include <GLES/egl.h>
slouken@3190
    24
#include <dlfcn.h>
slouken@3190
    25
#if defined(__OpenBSD__) && !defined(__ELF__)
slouken@3190
    26
#define dlsym(x,y) dlsym(x, "_" y)
slouken@3190
    27
#endif
slouken@3190
    28
slouken@3190
    29
#include "../SDL_sysvideo.h"
slouken@3190
    30
slouken@3190
    31
typedef struct SDL_PrivateGLESData
slouken@3190
    32
{
slouken@3190
    33
    int egl_active;             /* to stop switching drivers while we have a valid context */
slouken@3190
    34
    XVisualInfo *egl_visualinfo;
slouken@6188
    35
    void *egl_dll_handle;
slouken@3190
    36
    EGLDisplay egl_display;
slouken@3190
    37
    EGLContext egl_context;     /* Current GLES context */
slouken@3190
    38
    EGLSurface egl_surface;
slouken@3190
    39
    EGLConfig egl_config;
slouken@3190
    40
slouken@3190
    41
      EGLDisplay(*eglGetDisplay) (NativeDisplayType display);
slouken@3190
    42
      EGLBoolean(*eglInitialize) (EGLDisplay dpy, EGLint * major,
slouken@3190
    43
                                  EGLint * minor);
slouken@3190
    44
      EGLBoolean(*eglTerminate) (EGLDisplay dpy);
slouken@3190
    45
slouken@3190
    46
    void *(*eglGetProcAddress) (const GLubyte * procName);
slouken@3190
    47
slouken@3190
    48
      EGLBoolean(*eglChooseConfig) (EGLDisplay dpy,
slouken@3190
    49
                                    const EGLint * attrib_list,
slouken@3190
    50
                                    EGLConfig * configs,
slouken@3190
    51
                                    EGLint config_size, EGLint * num_config);
slouken@3190
    52
slouken@3190
    53
      EGLContext(*eglCreateContext) (EGLDisplay dpy,
slouken@3190
    54
                                     EGLConfig config,
slouken@3190
    55
                                     EGLContext share_list,
slouken@3190
    56
                                     const EGLint * attrib_list);
slouken@3190
    57
slouken@3190
    58
      EGLBoolean(*eglDestroyContext) (EGLDisplay dpy, EGLContext ctx);
slouken@3190
    59
slouken@3190
    60
      EGLSurface(*eglCreateWindowSurface) (EGLDisplay dpy,
slouken@3190
    61
                                           EGLConfig config,
slouken@3190
    62
                                           NativeWindowType window,
slouken@3190
    63
                                           const EGLint * attrib_list);
slouken@3190
    64
      EGLBoolean(*eglDestroySurface) (EGLDisplay dpy, EGLSurface surface);
slouken@3190
    65
slouken@3190
    66
      EGLBoolean(*eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw,
slouken@3190
    67
                                   EGLSurface read, EGLContext ctx);
slouken@3190
    68
slouken@3190
    69
      EGLBoolean(*eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw);
slouken@3190
    70
slouken@3190
    71
    const char *(*eglQueryString) (EGLDisplay dpy, EGLint name);
slouken@3190
    72
slouken@3190
    73
      EGLBoolean(*eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config,
slouken@3190
    74
                                       EGLint attribute, EGLint * value);
slouken@3190
    75
slouken@3190
    76
} SDL_PrivateGLESData;
slouken@3190
    77
slouken@3190
    78
/* OpenGLES functions */
slouken@3190
    79
extern SDL_GLContext X11_GLES_CreateContext(_THIS, SDL_Window * window);
slouken@3190
    80
extern XVisualInfo *X11_GLES_GetVisual(_THIS, Display * display, int screen);
slouken@3190
    81
extern int X11_GLES_MakeCurrent(_THIS, SDL_Window * window,
slouken@3190
    82
                                SDL_GLContext context);
slouken@3190
    83
extern int X11_GLES_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
slouken@3190
    84
extern int X11_GLES_LoadLibrary(_THIS, const char *path);
slouken@3190
    85
extern void *X11_GLES_GetProcAddress(_THIS, const char *proc);
slouken@3190
    86
extern void X11_GLES_UnloadLibrary(_THIS);
slouken@3190
    87
slouken@3190
    88
extern int X11_GLES_SetSwapInterval(_THIS, int interval);
slouken@3190
    89
extern int X11_GLES_GetSwapInterval(_THIS);
slouken@3190
    90
extern void X11_GLES_SwapWindow(_THIS, SDL_Window * window);
slouken@3190
    91
extern void X11_GLES_DeleteContext(_THIS, SDL_GLContext context);