vbo: rename some vars, add new comments, fix formatting, etc.
This commit is contained in:
parent
8b2598d000
commit
ae4b6e04cd
|
@ -159,8 +159,7 @@ static void vbo_exec_copy_to_current( struct vbo_exec_context *exec )
|
||||||
exec->vtx.attrsz[i],
|
exec->vtx.attrsz[i],
|
||||||
exec->vtx.attrptr[i]);
|
exec->vtx.attrptr[i]);
|
||||||
|
|
||||||
if (memcmp(current, tmp, sizeof(tmp)) != 0)
|
if (memcmp(current, tmp, sizeof(tmp)) != 0) {
|
||||||
{
|
|
||||||
memcpy(current, tmp, sizeof(tmp));
|
memcpy(current, tmp, sizeof(tmp));
|
||||||
|
|
||||||
/* Given that we explicitly state size here, there is no need
|
/* Given that we explicitly state size here, there is no need
|
||||||
|
@ -192,14 +191,18 @@ static void vbo_exec_copy_to_current( struct vbo_exec_context *exec )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void vbo_exec_copy_from_current( struct vbo_exec_context *exec )
|
/**
|
||||||
|
* Copy current vertex attribute values into the current vertex.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
vbo_exec_copy_from_current(struct vbo_exec_context *exec)
|
||||||
{
|
{
|
||||||
struct gl_context *ctx = exec->ctx;
|
struct gl_context *ctx = exec->ctx;
|
||||||
struct vbo_context *vbo = vbo_context(ctx);
|
struct vbo_context *vbo = vbo_context(ctx);
|
||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
|
for (i = VBO_ATTRIB_POS + 1; i < VBO_ATTRIB_MAX; i++) {
|
||||||
const GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
|
const GLfloat *current = (GLfloat *) vbo->currval[i].Ptr;
|
||||||
switch (exec->vtx.attrsz[i]) {
|
switch (exec->vtx.attrsz[i]) {
|
||||||
case 4: exec->vtx.attrptr[i][3] = current[3];
|
case 4: exec->vtx.attrptr[i][3] = current[3];
|
||||||
case 3: exec->vtx.attrptr[i][2] = current[2];
|
case 3: exec->vtx.attrptr[i][2] = current[2];
|
||||||
|
@ -213,17 +216,21 @@ static void vbo_exec_copy_from_current( struct vbo_exec_context *exec )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flush existing data, set new attrib size, replay copied vertices.
|
* Flush existing data, set new attrib size, replay copied vertices.
|
||||||
|
* This is called when we transition from a small vertex attribute size
|
||||||
|
* to a larger one. Ex: glTexCoord2f -> glTexCoord4f.
|
||||||
|
* We need to go back over the previous 2-component texcoords and insert
|
||||||
|
* zero and one values.
|
||||||
*/
|
*/
|
||||||
static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
|
static void
|
||||||
GLuint attr,
|
vbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,
|
||||||
GLuint newsz )
|
GLuint attr, GLuint newSize )
|
||||||
{
|
{
|
||||||
struct gl_context *ctx = exec->ctx;
|
struct gl_context *ctx = exec->ctx;
|
||||||
struct vbo_context *vbo = vbo_context(ctx);
|
struct vbo_context *vbo = vbo_context(ctx);
|
||||||
GLint lastcount = exec->vtx.vert_count;
|
const GLint lastcount = exec->vtx.vert_count;
|
||||||
GLfloat *old_attrptr[VBO_ATTRIB_MAX];
|
GLfloat *old_attrptr[VBO_ATTRIB_MAX];
|
||||||
GLuint old_vtx_size = exec->vtx.vertex_size;
|
const GLuint old_vtx_size = exec->vtx.vertex_size; /* floats per vertex */
|
||||||
GLuint oldsz = exec->vtx.attrsz[attr];
|
const GLuint oldSize = exec->vtx.attrsz[attr];
|
||||||
GLuint i;
|
GLuint i;
|
||||||
|
|
||||||
/* Run pipeline on current vertices, copy wrapped vertices
|
/* Run pipeline on current vertices, copy wrapped vertices
|
||||||
|
@ -239,7 +246,7 @@ static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
|
||||||
memcpy(old_attrptr, exec->vtx.attrptr, sizeof(old_attrptr));
|
memcpy(old_attrptr, exec->vtx.attrptr, sizeof(old_attrptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(oldsz)) {
|
if (unlikely(oldSize)) {
|
||||||
/* Do a COPY_TO_CURRENT to ensure back-copying works for the
|
/* Do a COPY_TO_CURRENT to ensure back-copying works for the
|
||||||
* case when the attribute already exists in the vertex and is
|
* case when the attribute already exists in the vertex and is
|
||||||
* having its size increased.
|
* having its size increased.
|
||||||
|
@ -251,21 +258,21 @@ static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
|
||||||
* begin/end so that they don't bloat the vertices.
|
* begin/end so that they don't bloat the vertices.
|
||||||
*/
|
*/
|
||||||
if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END &&
|
if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END &&
|
||||||
!oldsz && lastcount > 8 && exec->vtx.vertex_size) {
|
!oldSize && lastcount > 8 && exec->vtx.vertex_size) {
|
||||||
vbo_exec_copy_to_current( exec );
|
vbo_exec_copy_to_current( exec );
|
||||||
reset_attrfv( exec );
|
reset_attrfv( exec );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fix up sizes:
|
/* Fix up sizes:
|
||||||
*/
|
*/
|
||||||
exec->vtx.attrsz[attr] = newsz;
|
exec->vtx.attrsz[attr] = newSize;
|
||||||
exec->vtx.vertex_size += newsz - oldsz;
|
exec->vtx.vertex_size += newSize - oldSize;
|
||||||
exec->vtx.max_vert = ((VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) /
|
exec->vtx.max_vert = ((VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) /
|
||||||
(exec->vtx.vertex_size * sizeof(GLfloat)));
|
(exec->vtx.vertex_size * sizeof(GLfloat)));
|
||||||
exec->vtx.vert_count = 0;
|
exec->vtx.vert_count = 0;
|
||||||
exec->vtx.buffer_ptr = exec->vtx.buffer_map;
|
exec->vtx.buffer_ptr = exec->vtx.buffer_map;
|
||||||
|
|
||||||
if (unlikely(oldsz)) {
|
if (unlikely(oldSize)) {
|
||||||
/* Size changed, recalculate all the attrptr[] values
|
/* Size changed, recalculate all the attrptr[] values
|
||||||
*/
|
*/
|
||||||
GLfloat *tmp = exec->vtx.vertex;
|
GLfloat *tmp = exec->vtx.vertex;
|
||||||
|
@ -283,11 +290,11 @@ static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
|
||||||
* values.
|
* values.
|
||||||
*/
|
*/
|
||||||
vbo_exec_copy_from_current( exec );
|
vbo_exec_copy_from_current( exec );
|
||||||
|
}
|
||||||
} else {
|
else {
|
||||||
/* Just have to append the new attribute at the end */
|
/* Just have to append the new attribute at the end */
|
||||||
exec->vtx.attrptr[attr] = exec->vtx.vertex +
|
exec->vtx.attrptr[attr] = exec->vtx.vertex +
|
||||||
exec->vtx.vertex_size - newsz;
|
exec->vtx.vertex_size - newSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replay stored vertices to translate them
|
/* Replay stored vertices to translate them
|
||||||
|
@ -311,10 +318,10 @@ static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
|
||||||
GLint new_offset = exec->vtx.attrptr[j] - exec->vtx.vertex;
|
GLint new_offset = exec->vtx.attrptr[j] - exec->vtx.vertex;
|
||||||
|
|
||||||
if (j == attr) {
|
if (j == attr) {
|
||||||
if (oldsz) {
|
if (oldSize) {
|
||||||
GLfloat tmp[4];
|
GLfloat tmp[4];
|
||||||
COPY_CLEAN_4V(tmp, oldsz, data + old_offset);
|
COPY_CLEAN_4V(tmp, oldSize, data + old_offset);
|
||||||
COPY_SZ_4V(dest + new_offset, newsz, tmp);
|
COPY_SZ_4V(dest + new_offset, newSize, tmp);
|
||||||
} else {
|
} else {
|
||||||
GLfloat *current = (GLfloat *)vbo->currval[j].Ptr;
|
GLfloat *current = (GLfloat *)vbo->currval[j].Ptr;
|
||||||
COPY_SZ_4V(dest + new_offset, sz, current);
|
COPY_SZ_4V(dest + new_offset, sz, current);
|
||||||
|
@ -337,29 +344,34 @@ static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void vbo_exec_fixup_vertex( struct gl_context *ctx,
|
/**
|
||||||
GLuint attr, GLuint sz )
|
* This is when a vertex attribute transitions to a different size.
|
||||||
|
* For example, we saw a bunch of glTexCoord2f() calls and now we got a
|
||||||
|
* glTexCoord4f() call. We promote the array from size=2 to size=4.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
vbo_exec_fixup_vertex(struct gl_context *ctx, GLuint attr, GLuint newSize)
|
||||||
{
|
{
|
||||||
struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
|
struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (sz > exec->vtx.attrsz[attr]) {
|
if (newSize > exec->vtx.attrsz[attr]) {
|
||||||
/* New size is larger. Need to flush existing vertices and get
|
/* New size is larger. Need to flush existing vertices and get
|
||||||
* an enlarged vertex format.
|
* an enlarged vertex format.
|
||||||
*/
|
*/
|
||||||
vbo_exec_wrap_upgrade_vertex( exec, attr, sz );
|
vbo_exec_wrap_upgrade_vertex( exec, attr, newSize );
|
||||||
}
|
}
|
||||||
else if (sz < exec->vtx.active_sz[attr]) {
|
else if (newSize < exec->vtx.active_sz[attr]) {
|
||||||
static const GLfloat id[4] = { 0, 0, 0, 1 };
|
static const GLfloat id[4] = { 0, 0, 0, 1 };
|
||||||
|
GLuint i;
|
||||||
|
|
||||||
/* New size is smaller - just need to fill in some
|
/* New size is smaller - just need to fill in some
|
||||||
* zeros. Don't need to flush or wrap.
|
* zeros. Don't need to flush or wrap.
|
||||||
*/
|
*/
|
||||||
for (i = sz ; i <= exec->vtx.attrsz[attr] ; i++)
|
for (i = newSize; i <= exec->vtx.attrsz[attr]; i++)
|
||||||
exec->vtx.attrptr[attr][i-1] = id[i-1];
|
exec->vtx.attrptr[attr][i-1] = id[i-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
exec->vtx.active_sz[attr] = sz;
|
exec->vtx.active_sz[attr] = newSize;
|
||||||
|
|
||||||
/* Does setting NeedFlush belong here? Necessitates resetting
|
/* Does setting NeedFlush belong here? Necessitates resetting
|
||||||
* vtxfmt on each flush (otherwise flags won't get reset
|
* vtxfmt on each flush (otherwise flags won't get reset
|
||||||
|
@ -370,37 +382,44 @@ static void vbo_exec_fixup_vertex( struct gl_context *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
|
* This macro is used to implement all the glVertex, glColor, glTexCoord,
|
||||||
|
* glVertexAttrib, etc functions.
|
||||||
*/
|
*/
|
||||||
#define ATTR( A, N, V0, V1, V2, V3 ) \
|
#define ATTR( A, N, V0, V1, V2, V3 ) \
|
||||||
do { \
|
do { \
|
||||||
struct vbo_exec_context *exec = &vbo_context(ctx)->exec; \
|
struct vbo_exec_context *exec = &vbo_context(ctx)->exec; \
|
||||||
\
|
\
|
||||||
if (unlikely(!(ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT))) \
|
if (unlikely(!(ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT))) \
|
||||||
ctx->Driver.BeginVertices( ctx ); \
|
ctx->Driver.BeginVertices( ctx ); \
|
||||||
|
\
|
||||||
if (unlikely(exec->vtx.active_sz[A] != N)) \
|
if (unlikely(exec->vtx.active_sz[A] != N)) \
|
||||||
vbo_exec_fixup_vertex(ctx, A, N); \
|
vbo_exec_fixup_vertex(ctx, A, N); \
|
||||||
\
|
\
|
||||||
{ \
|
{ \
|
||||||
GLfloat *dest = exec->vtx.attrptr[A]; \
|
GLfloat *dest = exec->vtx.attrptr[A]; \
|
||||||
if (N>0) dest[0] = V0; \
|
if (N>0) dest[0] = V0; \
|
||||||
if (N>1) dest[1] = V1; \
|
if (N>1) dest[1] = V1; \
|
||||||
if (N>2) dest[2] = V2; \
|
if (N>2) dest[2] = V2; \
|
||||||
if (N>3) dest[3] = V3; \
|
if (N>3) dest[3] = V3; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if ((A) == 0) { \
|
if ((A) == 0) { \
|
||||||
GLuint i; \
|
/* This is a glVertex call */ \
|
||||||
\
|
GLuint i; \
|
||||||
for (i = 0; i < exec->vtx.vertex_size; i++) \
|
\
|
||||||
exec->vtx.buffer_ptr[i] = exec->vtx.vertex[i]; \
|
for (i = 0; i < exec->vtx.vertex_size; i++) \
|
||||||
\
|
exec->vtx.buffer_ptr[i] = exec->vtx.vertex[i]; \
|
||||||
exec->vtx.buffer_ptr += exec->vtx.vertex_size; \
|
\
|
||||||
ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; \
|
exec->vtx.buffer_ptr += exec->vtx.vertex_size; \
|
||||||
\
|
\
|
||||||
if (++exec->vtx.vert_count >= exec->vtx.max_vert) \
|
/* Set FLUSH_STORED_VERTICES to indicate that there's now */ \
|
||||||
vbo_exec_vtx_wrap( exec ); \
|
/* something to draw (not just updating a color or texcoord).*/ \
|
||||||
} \
|
ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; \
|
||||||
|
\
|
||||||
|
if (++exec->vtx.vert_count >= exec->vtx.max_vert) \
|
||||||
|
vbo_exec_vtx_wrap( exec ); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -646,11 +646,11 @@ static void _save_reset_vertex( struct gl_context *ctx )
|
||||||
do { \
|
do { \
|
||||||
struct vbo_save_context *save = &vbo_context(ctx)->save; \
|
struct vbo_save_context *save = &vbo_context(ctx)->save; \
|
||||||
\
|
\
|
||||||
if (save->active_sz[A] != N) \
|
if (save->active_sz[A] != N) \
|
||||||
save_fixup_vertex(ctx, A, N); \
|
save_fixup_vertex(ctx, A, N); \
|
||||||
\
|
\
|
||||||
{ \
|
{ \
|
||||||
GLfloat *dest = save->attrptr[A]; \
|
GLfloat *dest = save->attrptr[A]; \
|
||||||
if (N>0) dest[0] = V0; \
|
if (N>0) dest[0] = V0; \
|
||||||
if (N>1) dest[1] = V1; \
|
if (N>1) dest[1] = V1; \
|
||||||
if (N>2) dest[2] = V2; \
|
if (N>2) dest[2] = V2; \
|
||||||
|
@ -663,7 +663,7 @@ do { \
|
||||||
for (i = 0; i < save->vertex_size; i++) \
|
for (i = 0; i < save->vertex_size; i++) \
|
||||||
save->buffer_ptr[i] = save->vertex[i]; \
|
save->buffer_ptr[i] = save->vertex[i]; \
|
||||||
\
|
\
|
||||||
save->buffer_ptr += save->vertex_size; \
|
save->buffer_ptr += save->vertex_size; \
|
||||||
\
|
\
|
||||||
if (++save->vert_count >= save->max_vert) \
|
if (++save->vert_count >= save->max_vert) \
|
||||||
_save_wrap_filled_vertex( ctx ); \
|
_save_wrap_filled_vertex( ctx ); \
|
||||||
|
|
Loading…
Reference in New Issue