int X11_GLES_LoadLibrary(_THIS, const char *path) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; /* If the profile requested is not GL ES, switch over to X11_GL functions */ if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) { #if SDL_VIDEO_OPENGL_GLX X11_GLES_UnloadLibrary(_this); _this->GL_LoadLibrary = X11_GL_LoadLibrary; _this->GL_GetProcAddress = X11_GL_GetProcAddress; _this->GL_UnloadLibrary = X11_GL_UnloadLibrary; _this->GL_CreateContext = X11_GL_CreateContext; _this->GL_MakeCurrent = X11_GL_MakeCurrent; _this->GL_SetSwapInterval = X11_GL_SetSwapInterval; _this->GL_GetSwapInterval = X11_GL_GetSwapInterval; _this->GL_SwapWindow = X11_GL_SwapWindow; _this->GL_DeleteContext = X11_GL_DeleteContext; return X11_GL_LoadLibrary(_this, path); #else return SDL_SetError("SDL not configured with OpenGL/GLX support"); #endif } return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display); }
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; /* crappy fix */ X11_GLES_UnloadLibrary(_this); }
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); path = getenv("SDL_VIDEO_GL_DRIVER"); if (path == NULL) { path = DEFAULT_OPENGL; } 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); _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; } _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; }
int X11_GLES_LoadLibrary(_THIS, const char *path) { void *handle; int dlopen_flags; SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; if (_this->gles_data) { return SDL_SetError("OpenGL ES context already created"); } /* If SDL_GL_CONTEXT_EGL has been changed to 0, switch over to X11_GL functions */ if (_this->gl_config.use_egl == 0) { #if SDL_VIDEO_OPENGL_GLX _this->GL_LoadLibrary = X11_GL_LoadLibrary; _this->GL_GetProcAddress = X11_GL_GetProcAddress; _this->GL_UnloadLibrary = X11_GL_UnloadLibrary; _this->GL_CreateContext = X11_GL_CreateContext; _this->GL_MakeCurrent = X11_GL_MakeCurrent; _this->GL_SetSwapInterval = X11_GL_SetSwapInterval; _this->GL_GetSwapInterval = X11_GL_GetSwapInterval; _this->GL_SwapWindow = X11_GL_SwapWindow; _this->GL_DeleteContext = X11_GL_DeleteContext; return X11_GL_LoadLibrary(_this, path); #else return SDL_SetError("SDL not configured with OpenGL/GLX support"); #endif } #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); path = getenv("SDL_VIDEO_EGL_DRIVER"); if (path == NULL) { path = DEFAULT_EGL; } handle = dlopen(path, dlopen_flags); } if (handle == NULL) { return SDL_SetError("Could not load OpenGL ES/EGL library"); } /* Unload the old driver and reset the pointers */ X11_GLES_UnloadLibrary(_this); _this->gles_data = (struct SDL_PrivateGLESData *) SDL_calloc(1, sizeof(SDL_PrivateGLESData)); if (!_this->gles_data) { return SDL_OutOfMemory(); } /* 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); LOAD_FUNC(eglSwapInterval); _this->gles_data->egl_display = _this->gles_data->eglGetDisplay((NativeDisplayType) data->display); if (!_this->gles_data->egl_display) { return SDL_SetError("Could not get EGL display"); } if (_this->gles_data-> eglInitialize(_this->gles_data->egl_display, NULL, NULL) != EGL_TRUE) { return SDL_SetError("Could not initialize EGL"); } _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) { return SDL_SetError("Could not initialize OpenGL ES library"); } _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; }