From ed68f6d00e47bdca93859b36a3c78f6fb555cd25 Mon Sep 17 00:00:00 2001 From: "Miguel A. Vico" Date: Mon, 2 May 2016 15:56:37 +0200 Subject: [PATCH 02/10] gl-renderer: Add EGLDevice enumeration support X-NVConfidentiality: public EGLDevice provides means to enumerate native devices. In preparation for follow-on changes to support frame presentation through EGLDevice+EGLOutput, this change adds both gl_renderer_get_devices() and gl_renderer_get_drm_device_file() functions which will help to enumerate EGLDevices and match them to DRM devices. Signed-off-by: Miguel A Vico Moya Reviewed-by: Andy Ritger Reviewed-by: Adam Cheney Reviewed-by: James Jones --- libweston/gl-renderer.c | 89 ++++++++++++++++++++++++++++++++++++++++- libweston/gl-renderer.h | 8 ++++ 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c index a03e45ea..74315347 100644 --- a/libweston/gl-renderer.c +++ b/libweston/gl-renderer.c @@ -3990,6 +3990,90 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface) return 0; } +static int +gl_renderer_get_devices(EGLint max_devices, EGLDeviceEXT *devices, + EGLint *num_devices) +{ + const char *extensions; + PFNEGLQUERYDEVICESEXTPROC query_devices; + + extensions = (const char *)eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + if (!extensions) { + weston_log("Retrieving EGL extension string failed.\n"); + return -1; + } + + if (!weston_check_egl_extension(extensions, "EGL_EXT_device_base") && + (!weston_check_egl_extension(extensions, "EGL_EXT_device_query") || + !weston_check_egl_extension(extensions, "EGL_EXT_device_enumeration"))) { + weston_log("EGL_EXT_device_base not supported\n"); + return -1; + } + + query_devices = (void *) eglGetProcAddress("eglQueryDevicesEXT"); + if (!query_devices) { + weston_log("Failed to get eglQueryDevicesEXT function\n"); + return -1; + } + + if (query_devices(max_devices, devices, num_devices) != EGL_TRUE) { + weston_log("Failed to query EGL Devices\n"); + gl_renderer_print_egl_error_state(); + return -1; + } + + return 0; +} + +static int +gl_renderer_get_drm_device_file(EGLDeviceEXT device, + const char **drm_device_file) +{ + const char *exts; + PFNEGLQUERYDEVICESTRINGEXTPROC query_device_string; + + exts = (const char *)eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + if (!exts) { + weston_log("Retrieving EGL extension string failed.\n"); + return -1; + } + + if (!weston_check_egl_extension(exts, "EGL_EXT_device_base") && + (!weston_check_egl_extension(exts, "EGL_EXT_device_query") || + !weston_check_egl_extension(exts, "EGL_EXT_device_enumeration"))) { + weston_log("EGL_EXT_device_base not supported.\n"); + return -1; + } + + query_device_string = + (void *) eglGetProcAddress("eglQueryDeviceStringEXT"); + if (!query_device_string) { + weston_log("Failed to get eglQueryDeviceStringEXT function\n"); + return -1; + } + + exts = query_device_string(device, EGL_EXTENSIONS); + if (!exts) { + weston_log("Retrieving EGL extension string failed.\n"); + return -1; + } + + if (!weston_check_egl_extension(exts, "EGL_EXT_device_drm")) { + weston_log("EGL_EXT_device_drm not supported.\n"); + return -1; + } + + (*drm_device_file) = query_device_string(device, + EGL_DRM_DEVICE_FILE_EXT); + if (*drm_device_file == NULL) { + weston_log("Failed to query DRM device name.\n"); + gl_renderer_print_egl_error_state(); + return -1; + } + + return 0; +} + WL_EXPORT struct gl_renderer_interface gl_renderer_interface = { .opaque_attribs = gl_renderer_opaque_attribs, .alpha_attribs = gl_renderer_alpha_attribs, @@ -4001,5 +4085,8 @@ WL_EXPORT struct gl_renderer_interface gl_renderer_interface = { .output_surface = gl_renderer_output_surface, .output_set_border = gl_renderer_output_set_border, .create_fence_fd = gl_renderer_create_fence_fd, - .print_egl_error_state = gl_renderer_print_egl_error_state + .print_egl_error_state = gl_renderer_print_egl_error_state, + + .get_devices = gl_renderer_get_devices, + .get_drm_device_file = gl_renderer_get_drm_device_file }; diff --git a/libweston/gl-renderer.h b/libweston/gl-renderer.h index 202702b5..151879da 100644 --- a/libweston/gl-renderer.h +++ b/libweston/gl-renderer.h @@ -38,6 +38,7 @@ typedef int EGLint; typedef int EGLenum; +typedef void *EGLDeviceEXT; typedef void *EGLDisplay; typedef void *EGLSurface; typedef void *EGLConfig; @@ -121,5 +122,12 @@ struct gl_renderer_interface { int (*create_fence_fd)(struct weston_output *output); void (*print_egl_error_state)(void); + + int (*get_devices)(EGLint max_devices, + EGLDeviceEXT *devices, + EGLint *num_devices); + + int (*get_drm_device_file)(EGLDeviceEXT device, + const char **drm_device_file); }; -- 2.21.0