mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-31 22:25:21 -04:00
render/egl: replace init/finish with create/destroy
This ensures wlr_gles2_renderer can properly take ownership of the wlr_egl. Closes: https://github.com/swaywm/wlroots/issues/2612
This commit is contained in:
parent
50b120927d
commit
1d461687d2
12 changed files with 62 additions and 68 deletions
21
render/egl.c
21
render/egl.c
|
|
@ -149,8 +149,14 @@ out:
|
|||
free(formats);
|
||||
}
|
||||
|
||||
bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
|
||||
struct wlr_egl *wlr_egl_create(EGLenum platform, void *remote_display,
|
||||
const EGLint *config_attribs) {
|
||||
struct wlr_egl *egl = calloc(1, sizeof(struct wlr_egl));
|
||||
if (egl == NULL) {
|
||||
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *client_exts_str = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
||||
if (client_exts_str == NULL) {
|
||||
if (eglGetError() == EGL_BAD_DISPLAY) {
|
||||
|
|
@ -158,12 +164,12 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
|
|||
} else {
|
||||
wlr_log(WLR_ERROR, "Failed to query EGL client extensions");
|
||||
}
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!check_egl_ext(client_exts_str, "EGL_EXT_platform_base")) {
|
||||
wlr_log(WLR_ERROR, "EGL_EXT_platform_base not supported");
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
load_egl_proc(&egl->procs.eglGetPlatformDisplayEXT,
|
||||
"eglGetPlatformDisplayEXT");
|
||||
|
|
@ -205,7 +211,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
|
|||
const char *display_exts_str = eglQueryString(egl->display, EGL_EXTENSIONS);
|
||||
if (display_exts_str == NULL) {
|
||||
wlr_log(WLR_ERROR, "Failed to query EGL display extensions");
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (check_egl_ext(display_exts_str, "EGL_KHR_image_base")) {
|
||||
|
|
@ -343,7 +349,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
|
|||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return egl;
|
||||
|
||||
error:
|
||||
eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
|
|
@ -351,10 +357,10 @@ error:
|
|||
eglTerminate(egl->display);
|
||||
}
|
||||
eglReleaseThread();
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void wlr_egl_finish(struct wlr_egl *egl) {
|
||||
void wlr_egl_destroy(struct wlr_egl *egl) {
|
||||
if (egl == NULL) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -371,6 +377,7 @@ void wlr_egl_finish(struct wlr_egl *egl) {
|
|||
eglDestroyContext(egl->display, egl->context);
|
||||
eglTerminate(egl->display);
|
||||
eglReleaseThread();
|
||||
free(egl);
|
||||
}
|
||||
|
||||
bool wlr_egl_bind_display(struct wlr_egl *egl, struct wl_display *local_display) {
|
||||
|
|
|
|||
|
|
@ -694,9 +694,7 @@ static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
|
|||
}
|
||||
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
|
||||
wlr_egl_finish(renderer->egl);
|
||||
free(renderer->egl);
|
||||
wlr_egl_destroy(renderer->egl);
|
||||
|
||||
if (renderer->drm_fd >= 0) {
|
||||
close(renderer->drm_fd);
|
||||
|
|
|
|||
|
|
@ -249,25 +249,16 @@ bool wlr_renderer_init_wl_display(struct wlr_renderer *r,
|
|||
|
||||
struct wlr_renderer *wlr_renderer_autocreate(EGLenum platform,
|
||||
void *remote_display) {
|
||||
struct wlr_egl *egl = calloc(1, sizeof(*egl));
|
||||
struct wlr_egl *egl = wlr_egl_create(platform, remote_display, NULL);
|
||||
if (egl == NULL) {
|
||||
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!wlr_egl_init(egl, platform, remote_display, NULL)) {
|
||||
wlr_log(WLR_ERROR, "Could not initialize EGL");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* wlr_renderer becomes the owner of the previously wlr_egl, and will
|
||||
* take care of freeing the allocated memory
|
||||
* TODO: move the wlr_egl logic to wlr_gles2_renderer
|
||||
*/
|
||||
struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl);
|
||||
if (!renderer) {
|
||||
wlr_egl_finish(egl);
|
||||
wlr_log(WLR_ERROR, "Failed to create GLES2 renderer");
|
||||
wlr_egl_destroy(egl);
|
||||
}
|
||||
|
||||
return renderer;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue