Stream vertex data to VBOs.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
Michel Dänzer 2012-07-12 18:57:06 +08:00 committed by Eric Anholt
parent 551ca11c77
commit 006fe0e66d

View File

@ -725,34 +725,34 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts)
glamor_get_screen_private(screen);
glamor_gl_dispatch *dispatch;
int vert_size;
Bool need_new_buffer = FALSE;
glamor_priv->vbo_offset = 0;
glamor_priv->render_nr_verts = 0;
vert_size = n_verts * sizeof(float) * 2;
if (glamor_priv->vbo_size < vert_size) {
glamor_priv->vbo_size = vert_size;
need_new_buffer = TRUE;
}
glamor_priv->vb_stride = 2 * sizeof(float);
if (glamor_priv->has_source_coords)
glamor_priv->vb_stride += 2 * sizeof(float);
if (glamor_priv->has_mask_coords)
glamor_priv->vb_stride += 2 * sizeof(float);
vert_size = n_verts * glamor_priv->vb_stride;
dispatch = glamor_get_dispatch(glamor_priv);
dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
if (need_new_buffer)
if (glamor_priv->vbo_size < (glamor_priv->vbo_offset + vert_size)) {
glamor_priv->vbo_size = GLAMOR_COMPOSITE_VBO_VERT_CNT *
glamor_priv->vb_stride;
glamor_priv->vbo_offset = 0;
dispatch->glBufferData(GL_ARRAY_BUFFER,
vert_size,
NULL, GL_DYNAMIC_DRAW);
glamor_priv->vb = dispatch->glMapBufferRange(GL_ARRAY_BUFFER, 0,
vert_size,
GL_MAP_READ_BIT | GL_MAP_WRITE_BIT);
glamor_priv->vbo_size,
NULL, GL_STREAM_DRAW);
}
glamor_priv->vb = dispatch->glMapBufferRange(GL_ARRAY_BUFFER,
glamor_priv->vbo_offset,
vert_size,
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
assert(glamor_priv->vb != NULL);
glamor_priv->vb -= glamor_priv->vbo_offset;
}
dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);