summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryce Harrington <b.harrington@samsung.com>2013-08-19 19:38:26 -0700
committerBryce Harrington <b.harrington@samsung.com>2013-08-28 21:16:56 -0700
commit04b56459e4733acdc22845a73cc93e3982eef41f (patch)
tree02b67454026bfa98d5574c51929a1e60112d40b5
parent59e2a93b3c8a7b83d537bb2a4bbdd5f0f36a0cbc (diff)
cairo-gl: Make VBO size run-time settablevbo-size
Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
-rw-r--r--src/cairo-gl-composite.c2
-rw-r--r--src/cairo-gl-device.c2
-rw-r--r--src/cairo-gl-info.c22
-rw-r--r--src/cairo-gl-private.h8
4 files changed, 30 insertions, 4 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c
index 30b793130..65b0f26bb 100644
--- a/src/cairo-gl-composite.c
+++ b/src/cairo-gl-composite.c
@@ -875,7 +875,7 @@ _cairo_gl_composite_prepare_buffer (cairo_gl_context_t *ctx,
ctx->primitive_type = primitive_type;
}
- if (ctx->vb_offset + n_vertices * ctx->vertex_size > CAIRO_GL_VBO_SIZE)
+ if (ctx->vb_offset + n_vertices * ctx->vertex_size > _cairo_gl_get_vbo_size())
_cairo_gl_composite_flush (ctx);
}
diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c
index 054f1452f..dc2b6d6ec 100644
--- a/src/cairo-gl-device.c
+++ b/src/cairo-gl-device.c
@@ -297,7 +297,7 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx)
if (unlikely (status))
return status;
- ctx->vb = malloc (CAIRO_GL_VBO_SIZE);
+ ctx->vb = malloc (_cairo_gl_get_vbo_size());
if (unlikely (ctx->vb == NULL)) {
_cairo_cache_fini (&ctx->gradients);
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
diff --git a/src/cairo-gl-info.c b/src/cairo-gl-info.c
index 12a618da0..c47033ecd 100644
--- a/src/cairo-gl-info.c
+++ b/src/cairo-gl-info.c
@@ -29,6 +29,8 @@
* Alexandros Frantzis <alexandros.frantzis@linaro.org>
*/
+#include <errno.h>
+
#include "cairoint.h"
#include "cairo-gl-private.h"
@@ -71,6 +73,26 @@ _cairo_gl_get_flavor (void)
return flavor;
}
+long
+_cairo_gl_get_vbo_size (void)
+{
+ static long vbo_size = -1;
+
+ if (vbo_size < 0) {
+ 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 (const char *ext)
{
diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h
index 8379abc95..79b67a5d2 100644
--- a/src/cairo-gl-private.h
+++ b/src/cairo-gl-private.h
@@ -93,8 +93,9 @@
/* VBO size that we allocate, smaller size means we gotta flush more often,
* but larger means hogging more memory and can cause trouble for drivers
- * (especially on embedded devices). */
-#define CAIRO_GL_VBO_SIZE (16*1024)
+ * (especially on embedded devices). Use the CAIRO_GL_VBO_SIZE environment
+ * variable to set this to a different size. */
+#define CAIRO_GL_VBO_SIZE_DEFAULT (16*1024)
typedef struct _cairo_gl_surface cairo_gl_surface_t;
@@ -702,6 +703,9 @@ _cairo_gl_get_version (void);
cairo_private cairo_gl_flavor_t
_cairo_gl_get_flavor (void);
+cairo_private long
+_cairo_gl_get_vbo_size (void);
+
cairo_private cairo_bool_t
_cairo_gl_has_extension (const char *ext);