Fixed using uninitialized display data in iMX6 initialization

Sam Lantinga 2014-09-12 15:09:33 -07:00
parent 24c86b5501
commit 2bfb3c3e82
3 changed files with 21 additions and 26 deletions

View File

@ -48,12 +48,12 @@ if (!egl_viv_data->NAME) \
/* EGL implementation of SDL OpenGL support */ /* EGL implementation of SDL OpenGL support */
int 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. /* The definitions of egl_dll_handle and dll_handle were interchanged for some reason.
Just left them as is for compatibility */ Just left them as is for compatibility */
void *dll_handle = NULL, *egl_dll_handle = NULL; void *dll_handle = NULL, *egl_dll_handle = NULL;
char *path = NULL; char *path = NULL;
SDL_DisplayData *displaydata;
if (_this->egl_data) { if (_this->egl_data) {
return SDL_SetError("OpenGL ES context already created"); 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 (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) { if (_this->gl_config.major_version > 1) {
path = DEFAULT_OGL_ES2; path = DEFAULT_OGL_ES2;
egl_dll_handle = SDL_LoadObject(path); egl_dll_handle = SDL_LoadObject(path);
@ -84,11 +84,11 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) {
path = DEFAULT_OGL_ES; path = DEFAULT_OGL_ES;
egl_dll_handle = SDL_LoadObject(path); egl_dll_handle = SDL_LoadObject(path);
} }
} }
else { else {
path = DEFAULT_OGL; path = DEFAULT_OGL;
egl_dll_handle = SDL_LoadObject(path); egl_dll_handle = SDL_LoadObject(path);
} }
} }
_this->egl_data->egl_dll_handle = egl_dll_handle; _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) { if (egl_path != NULL) {
dll_handle = SDL_LoadObject(egl_path); dll_handle = SDL_LoadObject(egl_path);
} }
if (SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) { if (SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) {
if (dll_handle != NULL) { if (dll_handle != NULL) {
SDL_UnloadObject(dll_handle); SDL_UnloadObject(dll_handle);
@ -148,20 +148,16 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) {
LOAD_VIV_FUNC(fbGetPixmapGeometry); LOAD_VIV_FUNC(fbGetPixmapGeometry);
LOAD_VIV_FUNC(fbGetPixmapInfo); LOAD_VIV_FUNC(fbGetPixmapInfo);
LOAD_VIV_FUNC(fbDestroyPixmap); 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) { if (!_this->egl_data->egl_display) {
return SDL_SetError("Could not get EGL display"); return SDL_SetError("Could not get EGL display");
} }
if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) { if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) {
return SDL_SetError("Could not initialize EGL"); return SDL_SetError("Could not initialize EGL");
} }
displaydata->egl_display = _this->egl_data->egl_display;
_this->gl_config.driver_loaded = 1; _this->gl_config.driver_loaded = 1;
if (path) { if (path) {
@ -169,7 +165,7 @@ MX6_GLES_LoadLibrary(_THIS, const char *egl_path) {
} else { } else {
*_this->gl_config.driver_path = '\0'; *_this->gl_config.driver_path = '\0';
} }
return 0; return 0;
} }
@ -190,7 +186,7 @@ MX6_GLES_UnloadLibrary(_THIS)
SDL_UnloadObject(_this->egl_data->egl_dll_handle); SDL_UnloadObject(_this->egl_data->egl_dll_handle);
_this->egl_data->egl_dll_handle = NULL; _this->egl_data->egl_dll_handle = NULL;
} }
SDL_free(_this->egl_data); SDL_free(_this->egl_data);
_this->egl_data = NULL; _this->egl_data = NULL;

View File

@ -163,7 +163,7 @@ MX6_VideoInit(_THIS)
SDL_VideoDisplay display; SDL_VideoDisplay display;
SDL_DisplayMode current_mode; SDL_DisplayMode current_mode;
SDL_DisplayData *data; SDL_DisplayData *data;
data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData));
if (data == NULL) { if (data == NULL) {
return SDL_OutOfMemory(); return SDL_OutOfMemory();
@ -181,9 +181,9 @@ MX6_VideoInit(_THIS)
} }
MX6_UpdateDisplay(_this); MX6_UpdateDisplay(_this);
#ifdef SDL_INPUT_LINUXEV #ifdef SDL_INPUT_LINUXEV
SDL_EVDEV_Init(); SDL_EVDEV_Init();
#endif #endif
return 1; return 1;
} }
@ -191,9 +191,9 @@ MX6_VideoInit(_THIS)
void void
MX6_VideoQuit(_THIS) MX6_VideoQuit(_THIS)
{ {
#ifdef SDL_INPUT_LINUXEV #ifdef SDL_INPUT_LINUXEV
SDL_EVDEV_Quit(); SDL_EVDEV_Quit();
#endif #endif
} }
void void
@ -214,9 +214,9 @@ MX6_CreateWindow(_THIS, SDL_Window * window)
{ {
SDL_DisplayData *displaydata; SDL_DisplayData *displaydata;
SDL_WindowData *wdata; SDL_WindowData *wdata;
displaydata = SDL_GetDisplayDriverData(0); displaydata = SDL_GetDisplayDriverData(0);
/* Allocate window internal data */ /* Allocate window internal data */
wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData));
if (wdata == NULL) { if (wdata == NULL) {
@ -226,12 +226,12 @@ MX6_CreateWindow(_THIS, SDL_Window * window)
/* Setup driver data for this window */ /* Setup driver data for this window */
window->driverdata = wdata; window->driverdata = wdata;
window->flags |= SDL_WINDOW_OPENGL; window->flags |= SDL_WINDOW_OPENGL;
if (!_this->egl_data) { if (!_this->egl_data) {
return -1; 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) { if (!wdata->native_window) {
return SDL_SetError("MX6: Can't create native window"); return SDL_SetError("MX6: Can't create native window");
} }
@ -249,7 +249,7 @@ void
MX6_DestroyWindow(_THIS, SDL_Window * window) MX6_DestroyWindow(_THIS, SDL_Window * window)
{ {
SDL_WindowData *wdata; SDL_WindowData *wdata;
wdata = window->driverdata; wdata = window->driverdata;
if (wdata) { if (wdata) {
SDL_EGL_DestroySurface(_this, wdata->egl_surface); SDL_EGL_DestroySurface(_this, wdata->egl_surface);

View File

@ -34,7 +34,6 @@ typedef struct SDL_VideoData
typedef struct SDL_DisplayData typedef struct SDL_DisplayData
{ {
EGLNativeDisplayType native_display; EGLNativeDisplayType native_display;
EGLDisplay egl_display;
} SDL_DisplayData; } SDL_DisplayData;
typedef struct SDL_WindowData typedef struct SDL_WindowData