summarylogtreecommitdiffstats
path: root/0003-gl-renderer-Implement-use-check_extension.patch
blob: deed6e719faaff1856d33b536003f63ea8527c37 (plain)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
From c513bd330d06c7e57ca294f5e3cf7f0824afefc4 Mon Sep 17 00:00:00 2001
From: "Miguel A. Vico" <mvicomoya@nvidia.com>
Date: Mon, 21 Mar 2016 17:37:33 +0100
Subject: [PATCH 3/7] gl-renderer: Implement & use check_extension
X-NVConfidentiality: public

Using strstr(3) for checking for extensions is an error-prone mechanism
as extension names can be prefixes of other extension names (see
https://www.opengl.org/registry/doc/rules.html#using).

This change implements the check_extension() function to properly check
for an extension and replaces all usages of strstr(3).

Signed-off-by: Miguel A Vico Moya <mvicomoya@nvidia.com>
Reviewed-by: Andy Ritger <aritger@nvidia.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
[Pekka: move 'bool' to the same line with 'static']
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>

(cherry picked from commit cc3a192b448153a7911d44aa0fa549099607911d)
---
 src/gl-renderer.c | 56 +++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 42 insertions(+), 14 deletions(-)

diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index 1d6d98c9b86b..887d131674f5 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -2701,6 +2701,34 @@ gl_renderer_destroy(struct weston_compositor *ec)
 	free(gr);
 }
 
+static bool
+check_extension(const char *extensions, const char *extension)
+{
+	size_t extlen = strlen(extension);
+	const char *end = extensions + strlen(extensions);
+
+	while (extensions < end) {
+		size_t n = 0;
+
+		/* Skip whitespaces, if any */
+		if (*extensions == ' ') {
+			extensions++;
+			continue;
+		}
+
+		n = strcspn(extensions, " ");
+
+		/* Compare strings */
+		if (n == extlen && strncmp(extension, extensions, n) == 0)
+			return true; /* Found */
+
+		extensions += n;
+	}
+
+	/* Not found */
+	return false;
+}
+
 static void
 renderer_setup_egl_client_extensions(struct gl_renderer *gr)
 {
@@ -2712,7 +2740,7 @@ renderer_setup_egl_client_extensions(struct gl_renderer *gr)
 		return;
 	}
 
-	if (strstr(extensions, "EGL_EXT_platform_base"))
+	if (check_extension(extensions, "EGL_EXT_platform_base"))
 		gr->create_platform_window =
 			(void *) eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
 	else
@@ -2742,7 +2770,7 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
 		return -1;
 	}
 
-	if (strstr(extensions, "EGL_WL_bind_wayland_display"))
+	if (check_extension(extensions, "EGL_WL_bind_wayland_display"))
 		gr->has_bind_display = 1;
 	if (gr->has_bind_display) {
 		ret = gr->bind_display(gr->egl_display, ec->wl_display);
@@ -2750,14 +2778,14 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
 			gr->has_bind_display = 0;
 	}
 
-	if (strstr(extensions, "EGL_EXT_buffer_age"))
+	if (check_extension(extensions, "EGL_EXT_buffer_age"))
 		gr->has_egl_buffer_age = 1;
 	else
 		weston_log("warning: EGL_EXT_buffer_age not supported. "
 			   "Performance could be affected.\n");
 
 #ifdef EGL_EXT_swap_buffers_with_damage
-	if (strstr(extensions, "EGL_EXT_swap_buffers_with_damage"))
+	if (check_extension(extensions, "EGL_EXT_swap_buffers_with_damage"))
 		gr->swap_buffers_with_damage =
 			(void *) eglGetProcAddress("eglSwapBuffersWithDamageEXT");
 	else
@@ -2766,12 +2794,12 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
 #endif
 
 #ifdef EGL_MESA_configless_context
-	if (strstr(extensions, "EGL_MESA_configless_context"))
+	if (check_extension(extensions, "EGL_MESA_configless_context"))
 		gr->has_configless_context = 1;
 #endif
 
 #ifdef EGL_EXT_image_dma_buf_import
-	if (strstr(extensions, "EGL_EXT_image_dma_buf_import"))
+	if (check_extension(extensions, "EGL_EXT_image_dma_buf_import"))
 		gr->has_dmabuf_import = 1;
 #endif
 
@@ -2840,19 +2868,19 @@ gl_renderer_supports(struct weston_compositor *ec,
 			       extensions);
 	}
 
-	if (!strstr(extensions, "EGL_EXT_platform_base"))
+	if (!check_extension(extensions, "EGL_EXT_platform_base"))
 		return 0;
 
 	snprintf(s, sizeof s, "EGL_KHR_platform_%s", extension_suffix);
-	if (strstr(extensions, s))
+	if (check_extension(extensions, s))
 		return 1;
 
 	snprintf(s, sizeof s, "EGL_EXT_platform_%s", extension_suffix);
-	if (strstr(extensions, s))
+	if (check_extension(extensions, s))
 		return 1;
 
 	snprintf(s, sizeof s, "EGL_MESA_platform_%s", extension_suffix);
-	if (strstr(extensions, s))
+	if (check_extension(extensions, s))
 		return 1;
 
 	/* at this point we definitely have some platform extensions but
@@ -3104,22 +3132,22 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface)
 		return -1;
 	}
 
-	if (!strstr(extensions, "GL_EXT_texture_format_BGRA8888")) {
+	if (!check_extension(extensions, "GL_EXT_texture_format_BGRA8888")) {
 		weston_log("GL_EXT_texture_format_BGRA8888 not available\n");
 		return -1;
 	}
 
-	if (strstr(extensions, "GL_EXT_read_format_bgra"))
+	if (check_extension(extensions, "GL_EXT_read_format_bgra"))
 		ec->read_format = PIXMAN_a8r8g8b8;
 	else
 		ec->read_format = PIXMAN_a8b8g8r8;
 
 #ifdef GL_EXT_unpack_subimage
-	if (strstr(extensions, "GL_EXT_unpack_subimage"))
+	if (check_extension(extensions, "GL_EXT_unpack_subimage"))
 		gr->has_unpack_subimage = 1;
 #endif
 
-	if (strstr(extensions, "GL_OES_EGL_image_external"))
+	if (check_extension(extensions, "GL_OES_EGL_image_external"))
 		gr->has_egl_image_external = 1;
 
 	glActiveTexture(GL_TEXTURE0);
-- 
2.7.4