1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
From e1cb3214647b044f1ba39fa8b0eff02a26bb894a Mon Sep 17 00:00:00 2001
From: "Miguel A. Vico" <mvicomoya@nvidia.com>
Date: Mon, 2 May 2016 15:56:37 +0200
Subject: [PATCH 1/6] gl-renderer: Add EGLDevice enumeration support
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 <mvicomoya@nvidia.com>
Reviewed-by: Andy Ritger <aritger@nvidia.com>
Reviewed-by: Adam Cheney <acheney@nvidia.com>
Reviewed-by: James Jones <jajones@nvidia.com>
---
libweston/renderer-gl/gl-renderer.c | 86 +++++++++++++++++++++++++++++
libweston/renderer-gl/gl-renderer.h | 8 +++
2 files changed, 94 insertions(+)
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
index 6c435507..4bf95e60 100644
--- a/libweston/renderer-gl/gl-renderer.c
+++ b/libweston/renderer-gl/gl-renderer.c
@@ -3826,6 +3826,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 = {
.display_create = gl_renderer_display_create,
.output_window_create = gl_renderer_output_window_create,
@@ -3833,4 +3917,6 @@ WL_EXPORT struct gl_renderer_interface gl_renderer_interface = {
.output_destroy = gl_renderer_output_destroy,
.output_set_border = gl_renderer_output_set_border,
.create_fence_fd = gl_renderer_create_fence_fd,
+ .get_devices = gl_renderer_get_devices,
+ .get_drm_device_file = gl_renderer_get_drm_device_file
};
diff --git a/libweston/renderer-gl/gl-renderer.h b/libweston/renderer-gl/gl-renderer.h
index 2bca2d00..b60a6463 100644
--- a/libweston/renderer-gl/gl-renderer.h
+++ b/libweston/renderer-gl/gl-renderer.h
@@ -40,6 +40,7 @@
typedef int EGLint;
typedef int EGLenum;
+typedef void *EGLDeviceEXT;
typedef void *EGLDisplay;
typedef void *EGLSurface;
typedef void *EGLConfig;
@@ -202,4 +203,11 @@ struct gl_renderer_interface {
* EGL_ANDROID_native_fence_sync extension.
*/
int (*create_fence_fd)(struct weston_output *output);
+
+ int (*get_devices)(EGLint max_devices,
+ EGLDeviceEXT *devices,
+ EGLint *num_devices);
+
+ int (*get_drm_device_file)(EGLDeviceEXT device,
+ const char **drm_device_file);
};
--
2.20.1
|