2009-06-10 13:54:13 +00:00
|
|
|
/*
|
2011-04-08 13:03:26 -07:00
|
|
|
Simple DirectMedia Layer
|
2011-12-31 09:28:07 -05:00
|
|
|
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
2011-04-08 13:03:26 -07:00
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
|
|
warranty. In no event will the authors be held liable for any damages
|
|
|
|
arising from the use of this software.
|
|
|
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
including commercial applications, and to alter it and redistribute it
|
|
|
|
freely, subject to the following restrictions:
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
|
|
claim that you wrote the original software. If you use this software
|
|
|
|
in a product, an acknowledgment in the product documentation would be
|
|
|
|
appreciated but is not required.
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
misrepresented as being the original software.
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
2009-06-10 13:54:13 +00:00
|
|
|
*/
|
|
|
|
#include "SDL_config.h"
|
|
|
|
|
2011-10-31 05:56:58 -04:00
|
|
|
#if SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_ES
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
#include "SDL_x11video.h"
|
|
|
|
#include "SDL_x11opengles.h"
|
|
|
|
|
2012-01-08 13:31:22 -05:00
|
|
|
#define DEFAULT_EGL "libEGL.so"
|
|
|
|
#define DEFAULT_OGL_ES2 "libGLESv2.so"
|
|
|
|
#define DEFAULT_OGL_ES_PVR "libGLES_CM.so"
|
|
|
|
#define DEFAULT_OGL_ES "libGLESv1_CM.so"
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
#define LOAD_FUNC(NAME) \
|
|
|
|
*((void**)&_this->gles_data->NAME) = dlsym(handle, #NAME); \
|
|
|
|
if (!_this->gles_data->NAME) \
|
|
|
|
{ \
|
|
|
|
SDL_SetError("Could not retrieve EGL function " #NAME); \
|
|
|
|
return -1; \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* GLES implementation of SDL OpenGL support */
|
|
|
|
|
|
|
|
void *
|
|
|
|
X11_GLES_GetProcAddress(_THIS, const char *proc)
|
|
|
|
{
|
|
|
|
static char procname[1024];
|
|
|
|
void *handle;
|
|
|
|
void *retval;
|
|
|
|
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
handle = _this->gles_data->egl_dll_handle;
|
2009-06-10 13:54:13 +00:00
|
|
|
if (_this->gles_data->eglGetProcAddress) {
|
|
|
|
retval = _this->gles_data->eglGetProcAddress(proc);
|
|
|
|
if (retval) {
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
}
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
|
|
|
|
handle = _this->gl_config.dll_handle;
|
2009-06-10 13:54:13 +00:00
|
|
|
#if defined(__OpenBSD__) && !defined(__ELF__)
|
|
|
|
#undef dlsym(x,y);
|
|
|
|
#endif
|
|
|
|
retval = dlsym(handle, proc);
|
|
|
|
if (!retval && strlen(proc) <= 1022) {
|
|
|
|
procname[0] = '_';
|
|
|
|
strcpy(procname + 1, proc);
|
|
|
|
retval = dlsym(handle, procname);
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
X11_GLES_UnloadLibrary(_THIS)
|
|
|
|
{
|
|
|
|
if (_this->gl_config.driver_loaded) {
|
|
|
|
_this->gles_data->eglTerminate(_this->gles_data->egl_display);
|
|
|
|
|
|
|
|
dlclose(_this->gl_config.dll_handle);
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
dlclose(_this->gles_data->egl_dll_handle);
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
_this->gles_data->eglGetProcAddress = NULL;
|
|
|
|
_this->gles_data->eglChooseConfig = NULL;
|
|
|
|
_this->gles_data->eglCreateContext = NULL;
|
|
|
|
_this->gles_data->eglCreateWindowSurface = NULL;
|
|
|
|
_this->gles_data->eglDestroyContext = NULL;
|
|
|
|
_this->gles_data->eglDestroySurface = NULL;
|
|
|
|
_this->gles_data->eglMakeCurrent = NULL;
|
|
|
|
_this->gles_data->eglSwapBuffers = NULL;
|
|
|
|
_this->gles_data->eglGetDisplay = NULL;
|
|
|
|
_this->gles_data->eglTerminate = NULL;
|
|
|
|
|
|
|
|
_this->gl_config.dll_handle = NULL;
|
|
|
|
_this->gl_config.driver_loaded = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
X11_GLES_LoadLibrary(_THIS, const char *path)
|
|
|
|
{
|
|
|
|
void *handle;
|
|
|
|
int dlopen_flags;
|
|
|
|
|
|
|
|
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
|
|
|
|
|
|
|
if (_this->gles_data->egl_active) {
|
|
|
|
SDL_SetError("OpenGL ES context already created");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
#ifdef RTLD_GLOBAL
|
|
|
|
dlopen_flags = RTLD_LAZY | RTLD_GLOBAL;
|
|
|
|
#else
|
|
|
|
dlopen_flags = RTLD_LAZY;
|
|
|
|
#endif
|
|
|
|
handle = dlopen(path, dlopen_flags);
|
|
|
|
/* Catch the case where the application isn't linked with EGL */
|
|
|
|
if ((dlsym(handle, "eglChooseConfig") == NULL) && (path == NULL)) {
|
|
|
|
|
|
|
|
dlclose(handle);
|
2012-07-18 15:01:41 -07:00
|
|
|
path = getenv("SDL_VIDEO_EGL_DRIVER");
|
2009-06-10 13:54:13 +00:00
|
|
|
if (path == NULL) {
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
path = DEFAULT_EGL;
|
2009-06-10 13:54:13 +00:00
|
|
|
}
|
|
|
|
handle = dlopen(path, dlopen_flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (handle == NULL) {
|
|
|
|
SDL_SetError("Could not load OpenGL ES/EGL library");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Unload the old driver and reset the pointers */
|
|
|
|
X11_GLES_UnloadLibrary(_this);
|
|
|
|
|
|
|
|
/* Load new function pointers */
|
|
|
|
LOAD_FUNC(eglGetDisplay);
|
|
|
|
LOAD_FUNC(eglInitialize);
|
|
|
|
LOAD_FUNC(eglTerminate);
|
|
|
|
LOAD_FUNC(eglGetProcAddress);
|
|
|
|
LOAD_FUNC(eglChooseConfig);
|
|
|
|
LOAD_FUNC(eglGetConfigAttrib);
|
|
|
|
LOAD_FUNC(eglCreateContext);
|
|
|
|
LOAD_FUNC(eglDestroyContext);
|
|
|
|
LOAD_FUNC(eglCreateWindowSurface);
|
|
|
|
LOAD_FUNC(eglDestroySurface);
|
|
|
|
LOAD_FUNC(eglMakeCurrent);
|
|
|
|
LOAD_FUNC(eglSwapBuffers);
|
2012-01-08 13:31:22 -05:00
|
|
|
LOAD_FUNC(eglSwapInterval);
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
_this->gles_data->egl_display =
|
|
|
|
_this->gles_data->eglGetDisplay((NativeDisplayType) data->display);
|
|
|
|
|
|
|
|
if (!_this->gles_data->egl_display) {
|
|
|
|
SDL_SetError("Could not get EGL display");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_this->gles_data->
|
|
|
|
eglInitialize(_this->gles_data->egl_display, NULL,
|
|
|
|
NULL) != EGL_TRUE) {
|
|
|
|
SDL_SetError("Could not initialize EGL");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
_this->gles_data->egl_dll_handle = handle;
|
|
|
|
|
|
|
|
path = getenv("SDL_VIDEO_GL_DRIVER");
|
|
|
|
handle = dlopen(path, dlopen_flags);
|
|
|
|
if ((path == NULL) | (handle == NULL)) {
|
|
|
|
if (_this->gl_config.major_version > 1) {
|
|
|
|
path = DEFAULT_OGL_ES2;
|
|
|
|
handle = dlopen(path, dlopen_flags);
|
|
|
|
} else {
|
|
|
|
path = DEFAULT_OGL_ES;
|
|
|
|
handle = dlopen(path, dlopen_flags);
|
|
|
|
if (handle == NULL) {
|
|
|
|
path = DEFAULT_OGL_ES_PVR;
|
|
|
|
handle = dlopen(path, dlopen_flags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (handle == NULL) {
|
|
|
|
SDL_SetError("Could not initialize OpenGL ES library");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-06-10 13:54:13 +00:00
|
|
|
_this->gl_config.dll_handle = handle;
|
|
|
|
_this->gl_config.driver_loaded = 1;
|
|
|
|
|
|
|
|
if (path) {
|
|
|
|
strncpy(_this->gl_config.driver_path, path,
|
|
|
|
sizeof(_this->gl_config.driver_path) - 1);
|
|
|
|
} else {
|
|
|
|
strcpy(_this->gl_config.driver_path, "");
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
XVisualInfo *
|
|
|
|
X11_GLES_GetVisual(_THIS, Display * display, int screen)
|
|
|
|
{
|
|
|
|
/* 64 seems nice. */
|
|
|
|
EGLint attribs[64];
|
|
|
|
EGLint found_configs = 0;
|
|
|
|
VisualID visual_id;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* load the gl driver from a default path */
|
|
|
|
if (!_this->gl_config.driver_loaded) {
|
|
|
|
/* no driver has been loaded, use default (ourselves) */
|
|
|
|
if (X11_GLES_LoadLibrary(_this, NULL) < 0) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
attribs[i++] = EGL_RED_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.red_size;
|
|
|
|
attribs[i++] = EGL_GREEN_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.green_size;
|
|
|
|
attribs[i++] = EGL_BLUE_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.blue_size;
|
|
|
|
|
|
|
|
if (_this->gl_config.alpha_size) {
|
|
|
|
attribs[i++] = EGL_ALPHA_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.alpha_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_this->gl_config.buffer_size) {
|
|
|
|
attribs[i++] = EGL_BUFFER_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.buffer_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
attribs[i++] = EGL_DEPTH_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.depth_size;
|
|
|
|
|
|
|
|
if (_this->gl_config.stencil_size) {
|
|
|
|
attribs[i++] = EGL_STENCIL_SIZE;
|
|
|
|
attribs[i++] = _this->gl_config.stencil_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_this->gl_config.multisamplebuffers) {
|
|
|
|
attribs[i++] = EGL_SAMPLE_BUFFERS;
|
|
|
|
attribs[i++] = _this->gl_config.multisamplebuffers;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_this->gl_config.multisamplesamples) {
|
|
|
|
attribs[i++] = EGL_SAMPLES;
|
|
|
|
attribs[i++] = _this->gl_config.multisamplesamples;
|
|
|
|
}
|
|
|
|
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
attribs[i++] = EGL_RENDERABLE_TYPE;
|
|
|
|
if (_this->gl_config.major_version == 2) {
|
|
|
|
attribs[i++] = EGL_OPENGL_ES2_BIT;
|
|
|
|
} else {
|
|
|
|
attribs[i++] = EGL_OPENGL_ES_BIT;
|
|
|
|
}
|
|
|
|
|
2009-06-10 13:54:13 +00:00
|
|
|
attribs[i++] = EGL_NONE;
|
|
|
|
|
|
|
|
if (_this->gles_data->eglChooseConfig(_this->gles_data->egl_display,
|
|
|
|
attribs,
|
|
|
|
&_this->gles_data->egl_config, 1,
|
|
|
|
&found_configs) == EGL_FALSE ||
|
|
|
|
found_configs == 0) {
|
|
|
|
SDL_SetError("Couldn't find matching EGL config");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_this->gles_data->eglGetConfigAttrib(_this->gles_data->egl_display,
|
|
|
|
_this->gles_data->egl_config,
|
|
|
|
EGL_NATIVE_VISUAL_ID,
|
|
|
|
(EGLint *) & visual_id) ==
|
|
|
|
EGL_FALSE || !visual_id) {
|
|
|
|
/* Use the default visual when all else fails */
|
|
|
|
XVisualInfo vi_in;
|
|
|
|
int out_count;
|
|
|
|
vi_in.screen = screen;
|
|
|
|
|
|
|
|
_this->gles_data->egl_visualinfo = XGetVisualInfo(display,
|
|
|
|
VisualScreenMask,
|
|
|
|
&vi_in, &out_count);
|
|
|
|
} else {
|
|
|
|
XVisualInfo vi_in;
|
|
|
|
int out_count;
|
|
|
|
|
|
|
|
vi_in.screen = screen;
|
|
|
|
vi_in.visualid = visual_id;
|
|
|
|
_this->gles_data->egl_visualinfo = XGetVisualInfo(display,
|
|
|
|
VisualScreenMask |
|
|
|
|
VisualIDMask,
|
|
|
|
&vi_in, &out_count);
|
|
|
|
}
|
|
|
|
|
|
|
|
return _this->gles_data->egl_visualinfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_GLContext
|
|
|
|
X11_GLES_CreateContext(_THIS, SDL_Window * window)
|
|
|
|
{
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
EGLint context_attrib_list[] = {
|
|
|
|
EGL_CONTEXT_CLIENT_VERSION,
|
|
|
|
1,
|
|
|
|
EGL_NONE
|
|
|
|
};
|
|
|
|
|
2009-06-10 13:54:13 +00:00
|
|
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
|
Display *display = data->videodata->display;
|
2012-01-08 13:31:22 -05:00
|
|
|
SDL_GLContext context = 1;
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
XSync(display, False);
|
|
|
|
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
if (_this->gl_config.major_version) {
|
|
|
|
context_attrib_list[1] = _this->gl_config.major_version;
|
|
|
|
}
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
_this->gles_data->egl_context =
|
|
|
|
_this->gles_data->eglCreateContext(_this->gles_data->egl_display,
|
|
|
|
_this->gles_data->egl_config,
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
EGL_NO_CONTEXT, context_attrib_list);
|
2009-06-10 13:54:13 +00:00
|
|
|
XSync(display, False);
|
|
|
|
|
|
|
|
if (_this->gles_data->egl_context == EGL_NO_CONTEXT) {
|
|
|
|
SDL_SetError("Could not create EGL context");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
_this->gles_data->egl_active = 1;
|
2012-01-08 13:31:22 -05:00
|
|
|
_this->gles_data->egl_swapinterval = 0;
|
2009-06-10 13:54:13 +00:00
|
|
|
|
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.
2012-01-08 02:23:37 -05:00
|
|
|
if (X11_GLES_MakeCurrent(_this, window, context) < 0) {
|
|
|
|
X11_GLES_DeleteContext(_this, context);
|
|
|
|
return NULL;
|
|
|
|
}
|
2009-06-10 13:54:13 +00:00
|
|
|
|
2012-01-08 13:31:22 -05:00
|
|
|
return context;
|
2009-06-10 13:54:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
X11_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
|
|
|
|
{
|
|
|
|
int retval;
|
|
|
|
|
2009-07-30 14:53:57 +00:00
|
|
|
// SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
|
// Display *display = data->videodata->display;
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
retval = 1;
|
|
|
|
if (!_this->gles_data->eglMakeCurrent(_this->gles_data->egl_display,
|
|
|
|
_this->gles_data->egl_surface,
|
|
|
|
_this->gles_data->egl_surface,
|
|
|
|
_this->gles_data->egl_context)) {
|
|
|
|
SDL_SetError("Unable to make EGL context current");
|
|
|
|
retval = -1;
|
|
|
|
}
|
2009-07-30 14:53:57 +00:00
|
|
|
// XSync(display, False);
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
return (retval);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
X11_GLES_SetSwapInterval(_THIS, int interval)
|
|
|
|
{
|
2012-01-08 13:31:22 -05:00
|
|
|
if (_this->gles_data->egl_active != 1) {
|
|
|
|
SDL_SetError("OpenGL ES context not active");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EGLBoolean status;
|
|
|
|
status = _this->gles_data->eglSwapInterval(_this->gles_data->egl_display, interval);
|
|
|
|
if (status == EGL_TRUE) {
|
|
|
|
_this->gles_data->egl_swapinterval = interval;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_SetError("Unable to set the EGL swap interval");
|
|
|
|
return -1;
|
2009-06-10 13:54:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
X11_GLES_GetSwapInterval(_THIS)
|
|
|
|
{
|
2012-01-08 13:31:22 -05:00
|
|
|
if (_this->gles_data->egl_active != 1) {
|
|
|
|
SDL_SetError("OpenGL ES context not active");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return _this->gles_data->egl_swapinterval;
|
2009-06-10 13:54:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
X11_GLES_SwapWindow(_THIS, SDL_Window * window)
|
|
|
|
{
|
|
|
|
_this->gles_data->eglSwapBuffers(_this->gles_data->egl_display,
|
|
|
|
_this->gles_data->egl_surface);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
X11_GLES_DeleteContext(_THIS, SDL_GLContext context)
|
|
|
|
{
|
|
|
|
/* Clean up GLES and EGL */
|
|
|
|
if (_this->gles_data->egl_context != EGL_NO_CONTEXT ||
|
|
|
|
_this->gles_data->egl_surface != EGL_NO_SURFACE) {
|
|
|
|
_this->gles_data->eglMakeCurrent(_this->gles_data->egl_display,
|
|
|
|
EGL_NO_SURFACE, EGL_NO_SURFACE,
|
|
|
|
EGL_NO_CONTEXT);
|
|
|
|
|
|
|
|
if (_this->gles_data->egl_context != EGL_NO_CONTEXT) {
|
|
|
|
_this->gles_data->eglDestroyContext(_this->gles_data->egl_display,
|
|
|
|
_this->gles_data->
|
|
|
|
egl_context);
|
|
|
|
_this->gles_data->egl_context = EGL_NO_CONTEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_this->gles_data->egl_surface != EGL_NO_SURFACE) {
|
|
|
|
_this->gles_data->eglDestroySurface(_this->gles_data->egl_display,
|
|
|
|
_this->gles_data->
|
|
|
|
egl_surface);
|
|
|
|
_this->gles_data->egl_surface = EGL_NO_SURFACE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_this->gles_data->egl_active = 0;
|
2009-07-30 14:53:57 +00:00
|
|
|
|
|
|
|
/* crappy fix */
|
|
|
|
X11_GLES_UnloadLibrary(_this);
|
|
|
|
|
2009-06-10 13:54:13 +00:00
|
|
|
}
|
|
|
|
|
2011-10-31 05:56:58 -04:00
|
|
|
#endif /* SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_ES */
|
2009-06-10 13:54:13 +00:00
|
|
|
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|