summarylogtreecommitdiffstats
path: root/0003-gl-renderer-Implement-use-check_extension.patch
diff options
context:
space:
mode:
Diffstat (limited to '0003-gl-renderer-Implement-use-check_extension.patch')
-rw-r--r--0003-gl-renderer-Implement-use-check_extension.patch167
1 files changed, 167 insertions, 0 deletions
diff --git a/0003-gl-renderer-Implement-use-check_extension.patch b/0003-gl-renderer-Implement-use-check_extension.patch
new file mode 100644
index 000000000000..deed6e719faa
--- /dev/null
+++ b/0003-gl-renderer-Implement-use-check_extension.patch
@@ -0,0 +1,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
+