浏览代码

vbo: optimize vertex copying when 'wrapping'

Instead of calling memcpy() 'n' times, we can do it all at once since
the source and dest regions are all contiguous.

Reviewed-by: Matt Turner <mattst88@gmail.com>
tags/11.1-branchpoint
Brian Paul 9 年前
父节点
当前提交
9919f56099
共有 2 个文件被更改,包括 14 次插入17 次删除
  1. 7
    9
      src/mesa/vbo/vbo_exec_api.c
  2. 7
    8
      src/mesa/vbo/vbo_save_api.c

+ 7
- 9
src/mesa/vbo/vbo_exec_api.c 查看文件

static void static void
vbo_exec_vtx_wrap(struct vbo_exec_context *exec) vbo_exec_vtx_wrap(struct vbo_exec_context *exec)
{ {
fi_type *data = exec->vtx.copied.buffer;
GLuint i;
unsigned numComponents;


/* Run pipeline on current vertices, copy wrapped vertices /* Run pipeline on current vertices, copy wrapped vertices
* to exec->vtx.copied. * to exec->vtx.copied.
*/ */
assert(exec->vtx.max_vert - exec->vtx.vert_count > exec->vtx.copied.nr); assert(exec->vtx.max_vert - exec->vtx.vert_count > exec->vtx.copied.nr);


for (i = 0 ; i < exec->vtx.copied.nr ; i++) {
memcpy( exec->vtx.buffer_ptr, data,
exec->vtx.vertex_size * sizeof(GLfloat));
exec->vtx.buffer_ptr += exec->vtx.vertex_size;
data += exec->vtx.vertex_size;
exec->vtx.vert_count++;
}
numComponents = exec->vtx.copied.nr * exec->vtx.vertex_size;
memcpy(exec->vtx.buffer_ptr,
exec->vtx.copied.buffer,
numComponents * sizeof(fi_type));
exec->vtx.buffer_ptr += numComponents;
exec->vtx.vert_count += exec->vtx.copied.nr;


exec->vtx.copied.nr = 0; exec->vtx.copied.nr = 0;
} }

+ 7
- 8
src/mesa/vbo/vbo_save_api.c 查看文件

_save_wrap_filled_vertex(struct gl_context *ctx) _save_wrap_filled_vertex(struct gl_context *ctx)
{ {
struct vbo_save_context *save = &vbo_context(ctx)->save; struct vbo_save_context *save = &vbo_context(ctx)->save;
fi_type *data = save->copied.buffer;
GLuint i;
unsigned numComponents;


/* Emit a glEnd to close off the last vertex list. /* Emit a glEnd to close off the last vertex list.
*/ */
*/ */
assert(save->max_vert - save->vert_count > save->copied.nr); assert(save->max_vert - save->vert_count > save->copied.nr);


for (i = 0; i < save->copied.nr; i++) {
memcpy(save->buffer_ptr, data, save->vertex_size * sizeof(GLfloat));
data += save->vertex_size;
save->buffer_ptr += save->vertex_size;
save->vert_count++;
}
numComponents = save->copied.nr * save->vertex_size;
memcpy(save->buffer_ptr,
save->copied.buffer,
numComponents * sizeof(fi_type));
save->buffer_ptr += numComponents;
save->vert_count += save->copied.nr;
} }





正在加载...
取消
保存