From 04b56459e4733acdc22845a73cc93e3982eef41f Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Mon, 19 Aug 2013 19:38:26 -0700 Subject: cairo-gl: Make VBO size run-time settable Signed-off-by: Bryce Harrington --- src/cairo-gl-composite.c | 2 +- src/cairo-gl-device.c | 2 +- src/cairo-gl-info.c | 22 ++++++++++++++++++++++ src/cairo-gl-private.h | 8 ++++++-- 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 */ +#include + #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); -- cgit v1.2.3