Set EGL surface for foreign X11 windows

Also slightly changes up the cleanup code for SetupWindowData, to avoid copy pasting.

See #10611
This commit is contained in:
CasualPokePlayer 2024-08-30 18:13:50 -07:00
parent 4eac44bed4
commit b905583dc6
1 changed files with 38 additions and 27 deletions

View File

@ -285,8 +285,8 @@ static int SetupWindowData(_THIS, SDL_Window *window, Window w, BOOL created)
1) *
sizeof(*windowlist));
if (!windowlist) {
SDL_free(data);
return SDL_OutOfMemory();
SDL_OutOfMemory();
goto error_cleanup;
}
windowlist[numwindows] = data;
videodata->numwindows++;
@ -331,9 +331,45 @@ static int SetupWindowData(_THIS, SDL_Window *window, Window w, BOOL created)
}
}
#if defined(SDL_VIDEO_OPENGL_ES) || defined(SDL_VIDEO_OPENGL_ES2) || defined(SDL_VIDEO_OPENGL_EGL)
if ((window->flags & SDL_WINDOW_OPENGL) &&
((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) ||
SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_FORCE_EGL, SDL_FALSE))
#ifdef SDL_VIDEO_OPENGL_GLX
&& (!_this->gl_data || X11_GL_UseEGL(_this) )
#endif
) {
#ifdef SDL_VIDEO_OPENGL_EGL
if (!_this->egl_data) {
goto error_cleanup;
}
/* Create the GLES window surface */
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType)w);
if (data->egl_surface == EGL_NO_SURFACE) {
SDL_SetError("Could not create GLES window surface");
goto error_cleanup;
}
#else
SDL_SetError("Could not create GLES window surface (EGL support not configured)");
goto error_cleanup;
#endif /* SDL_VIDEO_OPENGL_EGL */
}
#endif
/* All done! */
window->driverdata = data;
return 0;
error_cleanup:
#ifdef X_HAVE_UTF8_STRING
if (data->ic) {
X11_XDestroyIC(data->ic);
}
#endif
SDL_free(data);
return -1;
}
static void SetWindowBordered(Display *display, int screen, Window window, SDL_bool border)
@ -634,31 +670,6 @@ int X11_CreateWindow(_THIS, SDL_Window *window)
}
windowdata = (SDL_WindowData *)window->driverdata;
#if defined(SDL_VIDEO_OPENGL_ES) || defined(SDL_VIDEO_OPENGL_ES2) || defined(SDL_VIDEO_OPENGL_EGL)
if ((window->flags & SDL_WINDOW_OPENGL) &&
((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) ||
SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_FORCE_EGL, SDL_FALSE))
#ifdef SDL_VIDEO_OPENGL_GLX
&& (!_this->gl_data || X11_GL_UseEGL(_this) )
#endif
) {
#ifdef SDL_VIDEO_OPENGL_EGL
if (!_this->egl_data) {
return -1;
}
/* Create the GLES window surface */
windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType)w);
if (windowdata->egl_surface == EGL_NO_SURFACE) {
return SDL_SetError("Could not create GLES window surface");
}
#else
return SDL_SetError("Could not create GLES window surface (EGL support not configured)");
#endif /* SDL_VIDEO_OPENGL_EGL */
}
#endif
#ifdef X_HAVE_UTF8_STRING
if (SDL_X11_HAVE_UTF8 && windowdata->ic) {
X11_XGetICValues(windowdata->ic, XNFilterEvents, &fevent, NULL);