summaryrefslogtreecommitdiff
path: root/src/cairo-gl-info.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-gl-info.c')
-rw-r--r--[-rwxr-xr-x]src/cairo-gl-info.c78
1 files changed, 67 insertions, 11 deletions
diff --git a/src/cairo-gl-info.c b/src/cairo-gl-info.c
index 33dc0cc56..fffea58b1 100755..100644
--- a/src/cairo-gl-info.c
+++ b/src/cairo-gl-info.c
@@ -32,6 +32,29 @@
#include "cairoint.h"
#include "cairo-gl-private.h"
+#include <errno.h>
+int _cairo_glsl_get_version (cairo_gl_dispatch_t *dispatch)
+{
+ int major, minor;
+ const char *version = (const char *) dispatch->GetString (GL_SHADING_LANGUAGE_VERSION);
+ const char *dot = version == NULL ? NULL : strchr (version, '.');
+ const char *major_start = dot;
+
+ /* Sanity check */
+ if (dot == NULL || dot == version || *(dot + 1) == '\0') {
+ major = 0;
+ minor = 0;
+ } else {
+ /* Find the start of the major version in the string */
+ while (major_start > version && *major_start != ' ')
+ --major_start;
+ major = strtol (major_start, NULL, 10);
+ minor = strtol (dot + 1, NULL, 10);
+ }
+
+ return CAIRO_GL_VERSION_ENCODE (major, minor);
+}
+
int _cairo_gl_get_version (cairo_gl_dispatch_t *dispatch)
{
int major, minor;
@@ -78,21 +101,54 @@ _cairo_gl_get_flavor (cairo_gl_dispatch_t *dispatch)
return flavor;
}
+unsigned long
+_cairo_gl_get_vbo_size (void)
+{
+ unsigned long vbo_size;
+
+ const char *env = getenv ("CAIRO_GL_VBO_SIZE");
+ if (env == NULL) {
+ vbo_size = CAIRO_GL_VBO_SIZE_DEFAULT;
+ } else {
+ errno = 0;
+ vbo_size = strtol (env, NULL, 10);
+ assert (errno == 0);
+ assert (vbo_size > 0);
+ }
+
+ return vbo_size;
+}
+
cairo_bool_t
_cairo_gl_has_extension (cairo_gl_dispatch_t *dispatch, const char *ext)
{
- const char *extensions = (const char *) dispatch->GetString (GL_EXTENSIONS);
- size_t len = strlen (ext);
- const char *ext_ptr = extensions;
+ int version = _cairo_gl_get_version (dispatch);
+ if (version >= CAIRO_GL_VERSION_ENCODE (3, 0)) {
+ GLuint max_num_extensions;
+ int i;
+ dispatch->GetIntegerv (GL_NUM_EXTENSIONS, &max_num_extensions);
- if (unlikely (ext_ptr == NULL))
- return 0;
+ for (i = 0; i < max_num_extensions; i++) {
+ const char *extension = (const char *) dispatch->GetStringi (GL_EXTENSIONS, i);
+ if (strstr (extension, ext) == 0)
+ return TRUE;
+ }
+ return FALSE;
+ } else {
+ const char *extensions = (const char *) dispatch->GetString (GL_EXTENSIONS);
+ size_t len = strlen (ext);
+ const char *ext_ptr = extensions;
+
- while ((ext_ptr = strstr (ext_ptr, ext)) != NULL) {
- if (ext_ptr[len] == ' ' || ext_ptr[len] == '\0')
- break;
- ext_ptr += len;
- }
+ 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);
+ return (ext_ptr != NULL);
+ }
}