gsize vertex_data_size)
{
const Program *program = NULL;
- gsize buffer_index = 0;
- float *vertex_data = g_malloc (vertex_data_size);
- OpBuffer *buffer;
+ float *vertex_data = (float*)self->op_builder.vertices->data;
OpBufferIter iter;
OpKind kind;
gpointer ptr;
glGenBuffers (1, &buffer_id);
glBindBuffer (GL_ARRAY_BUFFER, buffer_id);
- // Fill buffer data
- buffer = ops_get_buffer (&self->op_builder);
- op_buffer_iter_init (&iter, buffer);
- while ((ptr = op_buffer_iter_next (&iter, &kind)))
- {
- if (kind == OP_CHANGE_VAO)
- {
- const OpVao *vao = ptr;
-
- memcpy (vertex_data + buffer_index, &vao->vertex_data, sizeof (GskQuadVertex) * GL_N_VERTICES);
- buffer_index += sizeof (GskQuadVertex) * GL_N_VERTICES / sizeof (float);
- }
- }
-
// Set buffer data
glBufferData (GL_ARRAY_BUFFER, vertex_data_size, vertex_data, GL_STATIC_DRAW);
op_buffer_iter_init (&iter, ops_get_buffer (&self->op_builder));
while ((ptr = op_buffer_iter_next (&iter, &kind)))
{
- if (kind == OP_NONE || kind == OP_CHANGE_VAO)
+ if (kind == OP_NONE)
continue;
if (program == NULL &&
gdk_gl_context_pop_debug_group (self->gl_context);
break;
- case OP_CHANGE_VAO:
case OP_NONE:
case OP_LAST:
default:
OP_PRINT ("\n");
}
- /* Done drawing, destroy the buffer again.
- * TODO: Can we reuse the memory, though? */
- g_free (vertex_data);
glDeleteVertexArrays (1, &vao_id);
glDeleteBuffers (1, &buffer_id);
}
builder->current_opacity = 1.0f;
op_buffer_init (&builder->render_ops);
+ builder->vertices = g_array_new (FALSE, TRUE, sizeof (GskQuadVertex));
for (i = 0; i < GL_N_PROGRAMS; i ++)
{
gsk_transform_unref (builder->program_state[i].modelview);
}
+ g_array_unref (builder->vertices);
op_buffer_destroy (&builder->render_ops);
}
const GskQuadVertex vertex_data[GL_N_VERTICES])
{
OpDraw *op;
- OpVao *vao;
if ((op = op_buffer_peek_tail_checked (&builder->render_ops, OP_DRAW)))
{
- gsize old_vao_offset = op->vao_offset;
- gsize old_vao_size = op->vao_size;
-
- op_buffer_pop_tail (&builder->render_ops);
-
- vao = op_buffer_add (&builder->render_ops, OP_CHANGE_VAO);
- memcpy (vao->vertex_data, vertex_data, sizeof vao->vertex_data);
-
- op = op_buffer_add (&builder->render_ops, OP_DRAW);
- op->vao_offset = old_vao_offset;
- op->vao_size = old_vao_size + GL_N_VERTICES;
+ op->vao_size += GL_N_VERTICES;
}
else
{
gsize offset = builder->buffer_size / sizeof (GskQuadVertex);
- vao = op_buffer_add (&builder->render_ops, OP_CHANGE_VAO);
- memcpy (vao->vertex_data, vertex_data, sizeof vao->vertex_data);
-
op = op_buffer_add (&builder->render_ops, OP_DRAW);
op->vao_offset = offset;
op->vao_size = GL_N_VERTICES;
}
- /* We added new vertex data in both cases so increase the buffer size */
+ g_array_append_vals (builder->vertices, vertex_data, GL_N_VERTICES);
builder->buffer_size += sizeof (GskQuadVertex) * GL_N_VERTICES;
}
ops_reset (RenderOpBuilder *builder)
{
op_buffer_clear (&builder->render_ops);
+ g_array_set_size (builder->vertices, 0);
}
OpBuffer *
OP_CHANGE_CLIP = 7,
OP_CHANGE_VIEWPORT = 8,
OP_CHANGE_SOURCE_TEXTURE = 9,
- OP_CHANGE_VAO = 10,
+ OP_CHANGE_REPEAT = 10,
OP_CHANGE_LINEAR_GRADIENT = 11,
OP_CHANGE_COLOR_MATRIX = 12,
OP_CHANGE_BLUR = 13,
OP_PUSH_DEBUG_GROUP = 24,
OP_POP_DEBUG_GROUP = 25,
OP_CHANGE_BLEND = 26,
- OP_CHANGE_REPEAT = 27,
OP_LAST
} OpKind;
gsize vao_size;
} OpDraw;
-typedef struct
-{
- GskQuadVertex vertex_data[6];
-} OpVao;
-
typedef struct
{
float color_offsets[8];