diff options
Diffstat (limited to 'src/cairo-gl-info.c')
-rw-r--r--[-rwxr-xr-x] | src/cairo-gl-info.c | 78 |
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); + } } |