From 2bfb3c3e82407459c0a733fb89e14cc77ba26e68 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 12 Sep 2014 15:09:33 -0700 Subject: [PATCH] Fixed using uninitialized display data in iMX6 initialization --- src/video/mx6/SDL_mx6opengles.c | 26 +++++++++++--------------- src/video/mx6/SDL_mx6video.c | 20 ++++++++++---------- src/video/mx6/SDL_mx6video.h | 1 - 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/video/mx6/SDL_mx6opengles.c b/src/video/mx6/SDL_mx6opengles.c index 375a14a58..1e513751d 100644 --- a/src/video/mx6/SDL_mx6opengles.c +++ b/src/video/mx6/SDL_mx6opengles.c @@ -48,12 +48,12 @@ if (!egl_viv_data->NAME) \ /* EGL implementation of SDL OpenGL support */ int -MX6_GLES_LoadLibrary(_THIS, const char *egl_path) { +MX6_GLES_LoadLibrary(_THIS, const char *egl_path) +{ /* The definitions of egl_dll_handle and dll_handle were interchanged for some reason. Just left them as is for compatibility */ void *dll_handle = NULL, *egl_dll_handle = NULL; char *path = NULL; - SDL_DisplayData *displaydata; if (_this->egl_data) { return SDL_SetError("OpenGL ES context already created"); @@ -75,7 +75,7 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) { } if (egl_dll_handle == NULL) { - if(_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { + if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { if (_this->gl_config.major_version > 1) { path = DEFAULT_OGL_ES2; egl_dll_handle = SDL_LoadObject(path); @@ -84,11 +84,11 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) { path = DEFAULT_OGL_ES; egl_dll_handle = SDL_LoadObject(path); } - } + } else { path = DEFAULT_OGL; egl_dll_handle = SDL_LoadObject(path); - } + } } _this->egl_data->egl_dll_handle = egl_dll_handle; @@ -98,8 +98,8 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) { if (egl_path != NULL) { dll_handle = SDL_LoadObject(egl_path); - } - + } + if (SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) { if (dll_handle != NULL) { SDL_UnloadObject(dll_handle); @@ -148,20 +148,16 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) { LOAD_VIV_FUNC(fbGetPixmapGeometry); LOAD_VIV_FUNC(fbGetPixmapInfo); LOAD_VIV_FUNC(fbDestroyPixmap); - - displaydata = SDL_GetDisplayDriverData(0); - _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(displaydata->native_display); + _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(egl_viv_data->fbGetDisplayByIndex(0)); if (!_this->egl_data->egl_display) { return SDL_SetError("Could not get EGL display"); } - + if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { return SDL_SetError("Could not initialize EGL"); } - displaydata->egl_display = _this->egl_data->egl_display; - _this->gl_config.driver_loaded = 1; if (path) { @@ -169,7 +165,7 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) { } else { *_this->gl_config.driver_path = '\0'; } - + return 0; } @@ -190,7 +186,7 @@ MX6_GLES_UnloadLibrary(_THIS) SDL_UnloadObject(_this->egl_data->egl_dll_handle); _this->egl_data->egl_dll_handle = NULL; } - + SDL_free(_this->egl_data); _this->egl_data = NULL; diff --git a/src/video/mx6/SDL_mx6video.c b/src/video/mx6/SDL_mx6video.c index 2f9c04f2a..d449ef636 100644 --- a/src/video/mx6/SDL_mx6video.c +++ b/src/video/mx6/SDL_mx6video.c @@ -163,7 +163,7 @@ MX6_VideoInit(_THIS) SDL_VideoDisplay display; SDL_DisplayMode current_mode; SDL_DisplayData *data; - + data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); if (data == NULL) { return SDL_OutOfMemory(); @@ -181,9 +181,9 @@ MX6_VideoInit(_THIS) } MX6_UpdateDisplay(_this); -#ifdef SDL_INPUT_LINUXEV +#ifdef SDL_INPUT_LINUXEV SDL_EVDEV_Init(); -#endif +#endif return 1; } @@ -191,9 +191,9 @@ MX6_VideoInit(_THIS) void MX6_VideoQuit(_THIS) { -#ifdef SDL_INPUT_LINUXEV +#ifdef SDL_INPUT_LINUXEV SDL_EVDEV_Quit(); -#endif +#endif } void @@ -214,9 +214,9 @@ MX6_CreateWindow(_THIS, SDL_Window * window) { SDL_DisplayData *displaydata; SDL_WindowData *wdata; - + displaydata = SDL_GetDisplayDriverData(0); - + /* Allocate window internal data */ wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); if (wdata == NULL) { @@ -226,12 +226,12 @@ MX6_CreateWindow(_THIS, SDL_Window * window) /* Setup driver data for this window */ window->driverdata = wdata; window->flags |= SDL_WINDOW_OPENGL; - + if (!_this->egl_data) { return -1; } - wdata->native_window = egl_viv_data->fbCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h); + wdata->native_window = egl_viv_data->fbCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h); if (!wdata->native_window) { return SDL_SetError("MX6: Can't create native window"); } @@ -249,7 +249,7 @@ void MX6_DestroyWindow(_THIS, SDL_Window * window) { SDL_WindowData *wdata; - + wdata = window->driverdata; if (wdata) { SDL_EGL_DestroySurface(_this, wdata->egl_surface); diff --git a/src/video/mx6/SDL_mx6video.h b/src/video/mx6/SDL_mx6video.h index 7827337f8..9dcae5a33 100644 --- a/src/video/mx6/SDL_mx6video.h +++ b/src/video/mx6/SDL_mx6video.h @@ -34,7 +34,6 @@ typedef struct SDL_VideoData typedef struct SDL_DisplayData { EGLNativeDisplayType native_display; - EGLDisplay egl_display; } SDL_DisplayData; typedef struct SDL_WindowData