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
This commit is contained in:
Simon Ser 2021-06-24 13:11:21 +02:00 committed by Simon Zeni
parent 1c4b5bcab3
commit 1db976cecb
3 changed files with 17 additions and 21 deletions

View File

@ -11,10 +11,11 @@ struct wlr_egl_context {
}; };
/** /**
* Initializes an EGL context for the given platform and remote display. * Initializes an EGL context for the given DRM FD.
* Will attempt to load all possibly required api functions. *
* 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 * Frees all related EGL resources, makes the context not-current and

View File

@ -156,7 +156,7 @@ out:
free(formats); 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)); struct wlr_egl *egl = calloc(1, sizeof(struct wlr_egl));
if (egl == NULL) { if (egl == NULL) {
wlr_log_errno(WLR_ERROR, "Allocation failed"); wlr_log_errno(WLR_ERROR, "Allocation failed");
@ -173,11 +173,9 @@ struct wlr_egl *wlr_egl_create(EGLenum platform, void *remote_display) {
return NULL; return NULL;
} }
if (platform == EGL_PLATFORM_GBM_KHR) { if (!check_egl_ext(client_exts_str, "EGL_KHR_platform_gbm")) {
if (!check_egl_ext(client_exts_str, "EGL_KHR_platform_gbm")) { wlr_log(WLR_ERROR, "EGL_KHR_platform_gbm not supported");
wlr_log(WLR_ERROR, "EGL_KHR_platform_gbm not supported"); return NULL;
return NULL;
}
} }
if (!check_egl_ext(client_exts_str, "EGL_EXT_platform_base")) { 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; goto error;
} }
egl->display = egl->procs.eglGetPlatformDisplayEXT(platform, egl->gbm_device = gbm_create_device(drm_fd);
remote_display, NULL); 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) { if (egl->display == EGL_NO_DISPLAY) {
wlr_log(WLR_ERROR, "Failed to create EGL display"); wlr_log(WLR_ERROR, "Failed to create EGL display");
goto error; goto error;

View File

@ -733,21 +733,12 @@ extern const GLchar tex_fragment_src_rgbx[];
extern const GLchar tex_fragment_src_external[]; extern const GLchar tex_fragment_src_external[];
struct wlr_renderer *wlr_gles2_renderer_create_with_drm_fd(int drm_fd) { struct wlr_renderer *wlr_gles2_renderer_create_with_drm_fd(int drm_fd) {
struct gbm_device *gbm_device = gbm_create_device(drm_fd); struct wlr_egl *egl = wlr_egl_create_with_drm_fd(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);
if (egl == NULL) { if (egl == NULL) {
wlr_log(WLR_ERROR, "Could not initialize EGL"); wlr_log(WLR_ERROR, "Could not initialize EGL");
gbm_device_destroy(gbm_device);
return NULL; return NULL;
} }
egl->gbm_device = gbm_device;
struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl); struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl);
if (!renderer) { if (!renderer) {
wlr_log(WLR_ERROR, "Failed to create GLES2 renderer"); wlr_log(WLR_ERROR, "Failed to create GLES2 renderer");