kms-winsys: clean up error handling in _cogl_winsys_renderer_connect
If cogl fails to open the drm device, initialize gbm, or open the egl display, then it closes the drm fd, uninitializes gbm, closes the display and then calls _cogl_winsys_renderer_disconnect which does most of those things again, on the, now deinitialized, members. This commit removes the explicit failure handling in renderer_connect and defers cleanup to disconnect. https://bugzilla.gnome.org/show_bug.cgi?id=754540
This commit is contained in:
parent
181176bdb1
commit
78c44ab132
@ -124,7 +124,11 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
|
|||||||
CoglRendererEGL *egl_renderer = renderer->winsys;
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
CoglRendererKMS *kms_renderer = egl_renderer->platform;
|
CoglRendererKMS *kms_renderer = egl_renderer->platform;
|
||||||
|
|
||||||
eglTerminate (egl_renderer->edpy);
|
if (egl_renderer->edpy != EGL_NO_DISPLAY)
|
||||||
|
eglTerminate (egl_renderer->edpy);
|
||||||
|
|
||||||
|
if (kms_renderer->gbm != NULL)
|
||||||
|
gbm_device_destroy (kms_renderer->gbm);
|
||||||
|
|
||||||
if (kms_renderer->opened_fd >= 0)
|
if (kms_renderer->opened_fd >= 0)
|
||||||
close (kms_renderer->opened_fd);
|
close (kms_renderer->opened_fd);
|
||||||
@ -308,6 +312,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
|||||||
kms_renderer->fd = -1;
|
kms_renderer->fd = -1;
|
||||||
kms_renderer->opened_fd = -1;
|
kms_renderer->opened_fd = -1;
|
||||||
|
|
||||||
|
egl_renderer->edpy = EGL_NO_DISPLAY;
|
||||||
|
|
||||||
if (renderer->kms_fd >= 0)
|
if (renderer->kms_fd >= 0)
|
||||||
{
|
{
|
||||||
kms_renderer->fd = renderer->kms_fd;
|
kms_renderer->fd = renderer->kms_fd;
|
||||||
@ -332,7 +338,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
|||||||
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
COGL_WINSYS_ERROR_INIT,
|
COGL_WINSYS_ERROR_INIT,
|
||||||
"Couldn't create gbm device");
|
"Couldn't create gbm device");
|
||||||
goto close_fd;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
egl_renderer->edpy = eglGetDisplay ((EGLNativeDisplayType)kms_renderer->gbm);
|
egl_renderer->edpy = eglGetDisplay ((EGLNativeDisplayType)kms_renderer->gbm);
|
||||||
@ -341,11 +347,11 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
|||||||
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
COGL_WINSYS_ERROR_INIT,
|
COGL_WINSYS_ERROR_INIT,
|
||||||
"Couldn't get eglDisplay");
|
"Couldn't get eglDisplay");
|
||||||
goto destroy_gbm_device;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
|
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
|
||||||
goto egl_terminate;
|
goto fail;
|
||||||
|
|
||||||
_cogl_poll_renderer_add_fd (renderer,
|
_cogl_poll_renderer_add_fd (renderer,
|
||||||
kms_renderer->fd,
|
kms_renderer->fd,
|
||||||
@ -356,14 +362,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
egl_terminate:
|
fail:
|
||||||
eglTerminate (egl_renderer->edpy);
|
|
||||||
destroy_gbm_device:
|
|
||||||
gbm_device_destroy (kms_renderer->gbm);
|
|
||||||
close_fd:
|
|
||||||
if (kms_renderer->opened_fd >= 0)
|
|
||||||
close (kms_renderer->opened_fd);
|
|
||||||
|
|
||||||
_cogl_winsys_renderer_disconnect (renderer);
|
_cogl_winsys_renderer_disconnect (renderer);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user