summaryrefslogtreecommitdiff
path: root/src/cairo-gl-info.c
diff options
context:
space:
mode:
authormh0310.choi <mh0310.choi@samsung.com>2015-07-28 10:46:57 +0900
committermh0310.choi <mh0310.choi@samsung.com>2015-07-28 13:08:12 +0900
commit5e67a6f721eaedda61300baf0799199c7771ebd0 (patch)
tree6cd50b52498aab50e79b966cdccc2a137db316d9 /src/cairo-gl-info.c
parentd3aeffba37161d2b76b29c4ea13369bd67a47a8e (diff)
downloadcairo-5e67a6f721eaedda61300baf0799199c7771ebd0.tar.gz
cairo-5e67a6f721eaedda61300baf0799199c7771ebd0.tar.bz2
cairo-5e67a6f721eaedda61300baf0799199c7771ebd0.zip
- from 1.12.14 to 1.14.2 Change-Id: I3b62d212041b337bbb926d579f9ce74f42a45c3b
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);
+ }
}