glamor_egl: Properly free resources on init-error and exit
glamor_egl_init() was not undoing any of the init steps on init error, add an glamor_egl_cleanup() function and use this both on error and on exit to cleanup the various resources. Even on a clean exit eglTerminate() was not being called, causing the fd dup()-ed by eglInitialize() to stay open, call eglTerminate() from the new glamor_egl_cleanup() to fix this. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
80b6652c9f
commit
0d7cbd6f5a
|
@ -766,6 +766,21 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void glamor_egl_cleanup(struct glamor_egl_screen_private *glamor_egl)
|
||||||
|
{
|
||||||
|
if (glamor_egl->display != EGL_NO_DISPLAY) {
|
||||||
|
eglMakeCurrent(glamor_egl->display,
|
||||||
|
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
eglTerminate(glamor_egl->display);
|
||||||
|
}
|
||||||
|
#ifdef GLAMOR_HAS_GBM
|
||||||
|
if (glamor_egl->gbm)
|
||||||
|
gbm_device_destroy(glamor_egl->gbm);
|
||||||
|
#endif
|
||||||
|
free(glamor_egl->device_path);
|
||||||
|
free(glamor_egl);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
glamor_egl_free_screen(ScrnInfoPtr scrn)
|
glamor_egl_free_screen(ScrnInfoPtr scrn)
|
||||||
{
|
{
|
||||||
|
@ -773,17 +788,8 @@ glamor_egl_free_screen(ScrnInfoPtr scrn)
|
||||||
|
|
||||||
glamor_egl = glamor_egl_get_screen_private(scrn);
|
glamor_egl = glamor_egl_get_screen_private(scrn);
|
||||||
if (glamor_egl != NULL) {
|
if (glamor_egl != NULL) {
|
||||||
|
|
||||||
eglMakeCurrent(glamor_egl->display,
|
|
||||||
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
|
||||||
#ifdef GLAMOR_HAS_GBM
|
|
||||||
if (glamor_egl->gbm)
|
|
||||||
gbm_device_destroy(glamor_egl->gbm);
|
|
||||||
#endif
|
|
||||||
free(glamor_egl->device_path);
|
|
||||||
|
|
||||||
scrn->FreeScreen = glamor_egl->saved_free_screen;
|
scrn->FreeScreen = glamor_egl->saved_free_screen;
|
||||||
free(glamor_egl);
|
glamor_egl_cleanup(glamor_egl);
|
||||||
scrn->FreeScreen(scrn);
|
scrn->FreeScreen(scrn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -814,7 +820,7 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
||||||
glamor_egl->gbm = gbm_create_device(glamor_egl->fd);
|
glamor_egl->gbm = gbm_create_device(glamor_egl->fd);
|
||||||
if (glamor_egl->gbm == NULL) {
|
if (glamor_egl->gbm == NULL) {
|
||||||
ErrorF("couldn't get display device\n");
|
ErrorF("couldn't get display device\n");
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
glamor_egl->display = eglGetDisplay(glamor_egl->gbm);
|
glamor_egl->display = eglGetDisplay(glamor_egl->gbm);
|
||||||
#else
|
#else
|
||||||
|
@ -831,7 +837,8 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
||||||
if (!eglInitialize
|
if (!eglInitialize
|
||||||
(glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) {
|
(glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) {
|
||||||
xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglInitialize() failed\n");
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglInitialize() failed\n");
|
||||||
return FALSE;
|
glamor_egl->display = EGL_NO_DISPLAY;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
version = eglQueryString(glamor_egl->display, EGL_VERSION);
|
version = eglQueryString(glamor_egl->display, EGL_VERSION);
|
||||||
|
@ -840,14 +847,14 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
||||||
#define GLAMOR_CHECK_EGL_EXTENSION(EXT) \
|
#define GLAMOR_CHECK_EGL_EXTENSION(EXT) \
|
||||||
if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT)) { \
|
if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT)) { \
|
||||||
ErrorF("EGL_" #EXT " required.\n"); \
|
ErrorF("EGL_" #EXT " required.\n"); \
|
||||||
return FALSE; \
|
goto error; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GLAMOR_CHECK_EGL_EXTENSIONS(EXT1, EXT2) \
|
#define GLAMOR_CHECK_EGL_EXTENSIONS(EXT1, EXT2) \
|
||||||
if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT1) && \
|
if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT1) && \
|
||||||
!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT2)) { \
|
!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT2)) { \
|
||||||
ErrorF("EGL_" #EXT1 " or EGL_" #EXT2 " required.\n"); \
|
ErrorF("EGL_" #EXT1 " or EGL_" #EXT2 " required.\n"); \
|
||||||
return FALSE; \
|
goto error; \
|
||||||
}
|
}
|
||||||
|
|
||||||
GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
|
GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
|
||||||
|
@ -872,14 +879,14 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
||||||
config_attribs);
|
config_attribs);
|
||||||
if (glamor_egl->context == EGL_NO_CONTEXT) {
|
if (glamor_egl->context == EGL_NO_CONTEXT) {
|
||||||
xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to create EGL context\n");
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to create EGL context\n");
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!eglMakeCurrent(glamor_egl->display,
|
if (!eglMakeCurrent(glamor_egl->display,
|
||||||
EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
|
EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
|
||||||
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
"Failed to make EGL context current\n");
|
"Failed to make EGL context current\n");
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
glamor_egl->saved_free_screen = scrn->FreeScreen;
|
glamor_egl->saved_free_screen = scrn->FreeScreen;
|
||||||
scrn->FreeScreen = glamor_egl_free_screen;
|
scrn->FreeScreen = glamor_egl_free_screen;
|
||||||
|
@ -890,6 +897,10 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
||||||
"Indirect GLX may not work correctly.\n");
|
"Indirect GLX may not work correctly.\n");
|
||||||
#endif
|
#endif
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
error:
|
||||||
|
glamor_egl_cleanup(glamor_egl);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Stub to retain compatibility with pre-server-1.16 ABI. */
|
/** Stub to retain compatibility with pre-server-1.16 ABI. */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user