diff options
author | Simon Ser <contact@emersion.fr> | 2021-06-24 13:11:21 +0200 |
---|---|---|
committer | Simon Zeni <simon@bl4ckb0ne.ca> | 2021-06-30 14:02:26 -0400 |
commit | 1db976cecb6968b2d989840c6f16aa00bb83d026 (patch) | |
tree | 79f47a4e2d0e11a648dc4f9b10b25a18762e3796 | |
parent | 1c4b5bcab3aa1ca7b2c40fd64f77f90b8dde11d7 (diff) |
render/egl: replace wlr_egl_create with wlr_egl_create_with_drm_fd
We never create an EGL context with the platform set to something
other than EGL_PLATFORM_GBM_KHR. Let's simplify wlr_egl_create by
taking a DRM FD instead of a (platform, remote_display) tuple.
This hides the internal details of creating an EGL context for a
specific device. This will allow us to transparently use the device
platform [1] when the time comes.
[1]: https://github.com/swaywm/wlroots/pull/2671
-rw-r--r-- | include/render/egl.h | 7 | ||||
-rw-r--r-- | render/egl.c | 20 | ||||
-rw-r--r-- | render/gles2/renderer.c | 11 |
3 files changed, 17 insertions, 21 deletions
diff --git a/include/render/egl.h b/include/render/egl.h index 7d593f69..191293bf 100644 --- a/include/render/egl.h +++ b/include/render/egl.h @@ -11,10 +11,11 @@ struct wlr_egl_context { }; /** - * Initializes an EGL context for the given platform and remote display. - * Will attempt to load all possibly required api functions. + * Initializes an EGL context for the given DRM FD. + * + * Will attempt to load all possibly required API functions. */ -struct wlr_egl *wlr_egl_create(EGLenum platform, void *remote_display); +struct wlr_egl *wlr_egl_create_with_drm_fd(int drm_fd); /** * Frees all related EGL resources, makes the context not-current and diff --git a/render/egl.c b/render/egl.c index 7f88880c..b01f7d54 100644 --- a/render/egl.c +++ b/render/egl.c @@ -156,7 +156,7 @@ out: free(formats); } -struct wlr_egl *wlr_egl_create(EGLenum platform, void *remote_display) { +struct wlr_egl *wlr_egl_create_with_drm_fd(int drm_fd) { struct wlr_egl *egl = calloc(1, sizeof(struct wlr_egl)); if (egl == NULL) { wlr_log_errno(WLR_ERROR, "Allocation failed"); @@ -173,11 +173,9 @@ struct wlr_egl *wlr_egl_create(EGLenum platform, void *remote_display) { return NULL; } - if (platform == EGL_PLATFORM_GBM_KHR) { - if (!check_egl_ext(client_exts_str, "EGL_KHR_platform_gbm")) { - wlr_log(WLR_ERROR, "EGL_KHR_platform_gbm not supported"); - return NULL; - } + if (!check_egl_ext(client_exts_str, "EGL_KHR_platform_gbm")) { + wlr_log(WLR_ERROR, "EGL_KHR_platform_gbm not supported"); + return NULL; } if (!check_egl_ext(client_exts_str, "EGL_EXT_platform_base")) { @@ -206,8 +204,14 @@ struct wlr_egl *wlr_egl_create(EGLenum platform, void *remote_display) { goto error; } - egl->display = egl->procs.eglGetPlatformDisplayEXT(platform, - remote_display, NULL); + egl->gbm_device = gbm_create_device(drm_fd); + if (!egl->gbm_device) { + wlr_log(WLR_ERROR, "Failed to create GBM device"); + goto error; + } + + egl->display = egl->procs.eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR, + egl->gbm_device, NULL); if (egl->display == EGL_NO_DISPLAY) { wlr_log(WLR_ERROR, "Failed to create EGL display"); goto error; diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index e0534749..9bfaebd7 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -733,21 +733,12 @@ extern const GLchar tex_fragment_src_rgbx[]; extern const GLchar tex_fragment_src_external[]; struct wlr_renderer *wlr_gles2_renderer_create_with_drm_fd(int drm_fd) { - struct gbm_device *gbm_device = gbm_create_device(drm_fd); - if (!gbm_device) { - wlr_log(WLR_ERROR, "Failed to create GBM device"); - return NULL; - } - - struct wlr_egl *egl = wlr_egl_create(EGL_PLATFORM_GBM_KHR, gbm_device); + struct wlr_egl *egl = wlr_egl_create_with_drm_fd(drm_fd); if (egl == NULL) { wlr_log(WLR_ERROR, "Could not initialize EGL"); - gbm_device_destroy(gbm_device); return NULL; } - egl->gbm_device = gbm_device; - struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl); if (!renderer) { wlr_log(WLR_ERROR, "Failed to create GLES2 renderer"); |