mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-08 16:08:20 +02:00
[gl] Make the VBO once at startup instead of recreating per glyphs/spans.
This shaves 2% off of firefox-talos-gfx.
This commit is contained in:
parent
696a715702
commit
b028d287e6
3 changed files with 6 additions and 13 deletions
|
|
@ -457,7 +457,6 @@ _render_glyphs (cairo_gl_surface_t *dst,
|
||||||
cairo_gl_composite_setup_t composite_setup;
|
cairo_gl_composite_setup_t composite_setup;
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
GLuint vbo = 0;
|
|
||||||
|
|
||||||
*has_component_alpha = FALSE;
|
*has_component_alpha = FALSE;
|
||||||
|
|
||||||
|
|
@ -505,8 +504,7 @@ _render_glyphs (cairo_gl_surface_t *dst,
|
||||||
setup.op = op;
|
setup.op = op;
|
||||||
setup.in = CAIRO_GL_SHADER_IN_COUNT; /* unset */
|
setup.in = CAIRO_GL_SHADER_IN_COUNT; /* unset */
|
||||||
|
|
||||||
glGenBuffersARB (1, &vbo);
|
glBindBufferARB (GL_ARRAY_BUFFER_ARB, ctx->vbo);
|
||||||
glBindBufferARB (GL_ARRAY_BUFFER_ARB, vbo);
|
|
||||||
|
|
||||||
glVertexPointer (2, GL_FLOAT, setup.vertex_size * sizeof (GLfloat),
|
glVertexPointer (2, GL_FLOAT, setup.vertex_size * sizeof (GLfloat),
|
||||||
(void *)(uintptr_t)(0));
|
(void *)(uintptr_t)(0));
|
||||||
|
|
@ -622,11 +620,7 @@ _render_glyphs (cairo_gl_surface_t *dst,
|
||||||
glDisable (GL_TEXTURE_2D);
|
glDisable (GL_TEXTURE_2D);
|
||||||
_cairo_gl_use_program (NULL);
|
_cairo_gl_use_program (NULL);
|
||||||
|
|
||||||
if (vbo != 0) {
|
glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0);
|
||||||
glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0);
|
|
||||||
glDeleteBuffersARB (1, &vbo);
|
|
||||||
}
|
|
||||||
|
|
||||||
_cairo_gl_context_release (ctx);
|
_cairo_gl_context_release (ctx);
|
||||||
|
|
||||||
_cairo_gl_operand_destroy (&composite_setup.src);
|
_cairo_gl_operand_destroy (&composite_setup.src);
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,7 @@ typedef struct _cairo_gl_context {
|
||||||
|
|
||||||
GLuint dummy_tex;
|
GLuint dummy_tex;
|
||||||
GLuint texture_load_pbo;
|
GLuint texture_load_pbo;
|
||||||
|
GLuint vbo;
|
||||||
GLint max_framebuffer_size;
|
GLint max_framebuffer_size;
|
||||||
GLint max_texture_size;
|
GLint max_texture_size;
|
||||||
cairo_bool_t using_glsl;
|
cairo_bool_t using_glsl;
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,7 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx)
|
||||||
|
|
||||||
/* PBO for any sort of texture upload */
|
/* PBO for any sort of texture upload */
|
||||||
glGenBuffersARB (1, &ctx->texture_load_pbo);
|
glGenBuffersARB (1, &ctx->texture_load_pbo);
|
||||||
|
glGenBuffersARB (1, &ctx->vbo);
|
||||||
|
|
||||||
ctx->max_framebuffer_size = 0;
|
ctx->max_framebuffer_size = 0;
|
||||||
glGetIntegerv (GL_MAX_RENDERBUFFER_SIZE, &ctx->max_framebuffer_size);
|
glGetIntegerv (GL_MAX_RENDERBUFFER_SIZE, &ctx->max_framebuffer_size);
|
||||||
|
|
@ -2481,7 +2482,6 @@ typedef struct _cairo_gl_surface_span_renderer {
|
||||||
cairo_gl_context_t *ctx;
|
cairo_gl_context_t *ctx;
|
||||||
cairo_region_t *clip;
|
cairo_region_t *clip;
|
||||||
|
|
||||||
GLuint vbo;
|
|
||||||
void *vbo_base;
|
void *vbo_base;
|
||||||
unsigned int vbo_size;
|
unsigned int vbo_size;
|
||||||
unsigned int vbo_offset;
|
unsigned int vbo_offset;
|
||||||
|
|
@ -2525,10 +2525,9 @@ _cairo_gl_span_renderer_get_vbo (cairo_gl_surface_span_renderer_t *renderer,
|
||||||
{
|
{
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
|
|
||||||
if (renderer->vbo == 0) {
|
if (renderer->vbo_size == 0) {
|
||||||
renderer->vbo_size = 16384;
|
renderer->vbo_size = 16384;
|
||||||
glGenBuffersARB (1, &renderer->vbo);
|
glBindBufferARB (GL_ARRAY_BUFFER_ARB, renderer->ctx->vbo);
|
||||||
glBindBufferARB (GL_ARRAY_BUFFER_ARB, renderer->vbo);
|
|
||||||
|
|
||||||
if (renderer->setup.src.type == OPERAND_TEXTURE)
|
if (renderer->setup.src.type == OPERAND_TEXTURE)
|
||||||
renderer->vertex_size = 4 * sizeof (float) + sizeof (uint32_t);
|
renderer->vertex_size = 4 * sizeof (float) + sizeof (uint32_t);
|
||||||
|
|
@ -2701,7 +2700,6 @@ _cairo_gl_surface_span_renderer_finish (void *abstract_renderer)
|
||||||
_cairo_gl_span_renderer_flush (renderer);
|
_cairo_gl_span_renderer_flush (renderer);
|
||||||
|
|
||||||
glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0);
|
glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0);
|
||||||
glDeleteBuffersARB (1, &renderer->vbo);
|
|
||||||
glDisableClientState (GL_VERTEX_ARRAY);
|
glDisableClientState (GL_VERTEX_ARRAY);
|
||||||
glDisableClientState (GL_COLOR_ARRAY);
|
glDisableClientState (GL_COLOR_ARRAY);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue