diff mbox

[1/9] gl: Add functions to query GL version and extensions

Message ID 1311602713-6182-1-git-send-email-alexandros.frantzis@linaro.org
State Accepted
Headers show

Commit Message

alexandros.frantzis@linaro.org July 25, 2011, 2:05 p.m. UTC
From: Alexandros Frantzis <alexandros.frantzis@linaro.org>

---
 src/Makefile.sources   |    1 +
 src/cairo-gl-info.c    |   70 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/cairo-gl-private.h |   10 +++++++
 3 files changed, 81 insertions(+), 0 deletions(-)
 create mode 100644 src/cairo-gl-info.c
diff mbox

Patch

diff --git a/src/Makefile.sources b/src/Makefile.sources
index 5ded771..ae19e7f 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -321,6 +321,7 @@  cairo_gl_sources = cairo-gl-composite.c \
 		   cairo-gl-device.c \
 		   cairo-gl-glyphs.c \
 		   cairo-gl-gradient.c \
+		   cairo-gl-info.c \
 		   cairo-gl-shaders.c \
 		   cairo-gl-surface.c
 if BUILD_PRIVATE_GLEW
diff --git a/src/cairo-gl-info.c b/src/cairo-gl-info.c
new file mode 100644
index 0000000..95995b4
--- /dev/null
+++ b/src/cairo-gl-info.c
@@ -0,0 +1,70 @@ 
+/* cairo - a vector graphics library with display and print output
+ *
+ * Copyright © 2010 Linaro Limited
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it either under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation
+ * (the "LGPL") or, at your option, under the terms of the Mozilla
+ * Public License Version 1.1 (the "MPL"). If you do not alter this
+ * notice, a recipient may use your version of this file under either
+ * the MPL or the LGPL.
+ *
+ * You should have received a copy of the LGPL along with this library
+ * in the file COPYING-LGPL-2.1; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
+ * You should have received a copy of the MPL along with this library
+ * in the file COPYING-MPL-1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
+ * OF ANY KIND, either express or implied. See the LGPL or the MPL for
+ * the specific language governing rights and limitations.
+ *
+ * Contributor(s):
+ *      Alexandros Frantzis <alexandros.frantzis@linaro.org>
+ */
+
+#include "cairo-gl-private.h"
+
+int
+_cairo_gl_get_version (void)
+{
+    int major, minor;
+    const char *version = (const char *) glGetString (GL_VERSION);
+    const char *dot = version == NULL ? NULL : strchr (version, '.');
+
+    /* Sanity check */
+    if (dot == NULL || dot == version || *(dot + 1) == '\0') {
+	major = 0;
+	minor = 0;
+    } else {
+	major = strtol (version, NULL, 10);
+	minor = strtol (dot + 1, NULL, 10);
+    }
+
+    return CAIRO_GL_VERSION_ENCODE (major, minor);
+}
+
+cairo_bool_t
+_cairo_gl_has_extension (const char *ext)
+{
+    const char *extensions = (const char *) glGetString (GL_EXTENSIONS);
+    size_t len = strlen (ext);
+    const char *ext_ptr = extensions;
+
+    if (unlikely (ext_ptr == NULL))
+	return 0;
+
+    while ((ext_ptr = strstr (ext_ptr, ext)) != NULL) {
+	if (ext_ptr[len] == ' ' || ext_ptr[len] == '\0')
+	    break;
+	ext_ptr += len;
+    }
+
+    return (ext_ptr != NULL);
+}
diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h
index 042c6a1..2a818aa 100644
--- a/src/cairo-gl-private.h
+++ b/src/cairo-gl-private.h
@@ -73,6 +73,10 @@ 
 #define UNSUPPORTED(reason) CAIRO_INT_STATUS_UNSUPPORTED
 #endif
 
+#define CAIRO_GL_VERSION_ENCODE(major, minor) (	\
+	  ((major) * 256)			\
+	+ ((minor) *   1))
+
 /* maximal number of shaders we keep in the cache.
  * Random number that is hopefully big enough to not cause many cache evictions. */
 #define CAIRO_GL_MAX_SHADERS_PER_CONTEXT 64
@@ -479,6 +483,12 @@  _cairo_gl_set_shader (cairo_gl_context_t *ctx,
 cairo_private void
 _cairo_gl_shader_fini (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader);
 
+cairo_private int
+_cairo_gl_get_version (void);
+
+cairo_private cairo_bool_t
+_cairo_gl_has_extension (const char *ext);
+
 slim_hidden_proto (cairo_gl_surface_create);
 slim_hidden_proto (cairo_gl_surface_create_for_texture);