vbo: rename some vars, add new comments, fix formatting, etc.
authorBrian Paul <brianp@vmware.com>
Mon, 21 Feb 2011 22:11:44 +0000 (15:11 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 21 Feb 2011 22:15:52 +0000 (15:15 -0700)
src/mesa/vbo/vbo_exec_api.c
src/mesa/vbo/vbo_save_api.c

index 39415247d9b4976bdb9e2706fe84a3c4de41535e..7ad8e298134c28dd54554eacff42f9c6e6f53838 100644 (file)
@@ -159,8 +159,7 @@ static void vbo_exec_copy_to_current( struct vbo_exec_context *exec )
                        exec->vtx.attrsz[i], 
                        exec->vtx.attrptr[i]);
          
-         if (memcmp(current, tmp, sizeof(tmp)) != 0)
-         { 
+         if (memcmp(current, tmp, sizeof(tmp)) != 0) { 
             memcpy(current, tmp, sizeof(tmp));
         
             /* 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 vbo_context *vbo = vbo_context(ctx);
    GLint i;
 
-   for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
-      const GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
+   for (i = VBO_ATTRIB_POS + 1; i < VBO_ATTRIB_MAX; i++) {
+      const GLfloat *current = (GLfloat *) vbo->currval[i].Ptr;
       switch (exec->vtx.attrsz[i]) {
       case 4: exec->vtx.attrptr[i][3] = current[3];
       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.
+ * 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,
-                                         GLuint attr,
-                                         GLuint newsz )
+static void
+vbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,
+                             GLuint attr, GLuint newSize )
 {
    struct gl_context *ctx = exec->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];
-   GLuint old_vtx_size = exec->vtx.vertex_size;
-   GLuint oldsz = exec->vtx.attrsz[attr];
+   const GLuint old_vtx_size = exec->vtx.vertex_size; /* floats per vertex */
+   const GLuint oldSize = exec->vtx.attrsz[attr];
    GLuint i;
 
    /* 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));
    }
 
-   if (unlikely(oldsz)) {
+   if (unlikely(oldSize)) {
       /* Do a COPY_TO_CURRENT to ensure back-copying works for the
        * case when the attribute already exists in the vertex and is
        * 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.
     */
    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 );
       reset_attrfv( exec );
    }
 
    /* Fix up sizes:
     */
-   exec->vtx.attrsz[attr] = newsz;
-   exec->vtx.vertex_size += newsz - oldsz;
+   exec->vtx.attrsz[attr] = newSize;
+   exec->vtx.vertex_size += newSize - oldSize;
    exec->vtx.max_vert = ((VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) / 
                          (exec->vtx.vertex_size * sizeof(GLfloat)));
    exec->vtx.vert_count = 0;
    exec->vtx.buffer_ptr = exec->vtx.buffer_map;
 
-   if (unlikely(oldsz)) {
+   if (unlikely(oldSize)) {
       /* Size changed, recalculate all the attrptr[] values
        */
       GLfloat *tmp = exec->vtx.vertex;
@@ -283,11 +290,11 @@ static void vbo_exec_wrap_upgrade_vertex( struct vbo_exec_context *exec,
        * values.
        */
       vbo_exec_copy_from_current( exec );
-
-   else {
+   }
+   else {
       /* Just have to append the new attribute at the end */
       exec->vtx.attrptr[attr] = exec->vtx.vertex +
-        exec->vtx.vertex_size - newsz;
+        exec->vtx.vertex_size - newSize;
    }
 
    /* 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;
 
               if (j == attr) {
-                 if (oldsz) {
+                 if (oldSize) {
                     GLfloat tmp[4];
-                    COPY_CLEAN_4V(tmp, oldsz, data + old_offset);
-                    COPY_SZ_4V(dest + new_offset, newsz, tmp);
+                    COPY_CLEAN_4V(tmp, oldSize, data + old_offset);
+                    COPY_SZ_4V(dest + new_offset, newSize, tmp);
                  } else {
                     GLfloat *current = (GLfloat *)vbo->currval[j].Ptr;
                     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;
-   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
        * 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 };
+      GLuint i;
 
       /* New size is smaller - just need to fill in some
        * 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.active_sz[attr] = sz;
+   exec->vtx.active_sz[attr] = newSize;
 
    /* Does setting NeedFlush belong here?  Necessitates resetting
     * 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 )                           \
-do {                                                           \
-   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;    \
+#define ATTR( A, N, V0, V1, V2, V3 )                                   \
+do {                                                                   \
+   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;            \
                                                                        \
    if (unlikely(!(ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)))      \
-      ctx->Driver.BeginVertices( ctx );                                 \
+      ctx->Driver.BeginVertices( ctx );                                        \
+                                                                       \
    if (unlikely(exec->vtx.active_sz[A] != N))                          \
       vbo_exec_fixup_vertex(ctx, A, N);                                        \
                                                                        \
-   {                                                           \
-      GLfloat *dest = exec->vtx.attrptr[A];                    \
-      if (N>0) dest[0] = V0;                                   \
-      if (N>1) dest[1] = V1;                                   \
-      if (N>2) dest[2] = V2;                                   \
-      if (N>3) dest[3] = V3;                                   \
-   }                                                           \
-                                                               \
-   if ((A) == 0) {                                             \
-      GLuint 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;          \
-                                                               \
-      if (++exec->vtx.vert_count >= exec->vtx.max_vert)                \
-        vbo_exec_vtx_wrap( exec );                             \
-   }                                                           \
+   {                                                                   \
+      GLfloat *dest = exec->vtx.attrptr[A];                            \
+      if (N>0) dest[0] = V0;                                           \
+      if (N>1) dest[1] = V1;                                           \
+      if (N>2) dest[2] = V2;                                           \
+      if (N>3) dest[3] = V3;                                           \
+   }                                                                   \
+                                                                       \
+   if ((A) == 0) {                                                     \
+      /* 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];                 \
+                                                                       \
+      exec->vtx.buffer_ptr += exec->vtx.vertex_size;                   \
+                                                                       \
+      /* Set FLUSH_STORED_VERTICES to indicate that there's now */     \
+      /* 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)
 
 
index 4ee78e9e1037f9eef67b5fc5d9de198d03f496cc..c8199544526d7264aac2b482f04ccd70738237e1 100644 (file)
@@ -646,11 +646,11 @@ static void _save_reset_vertex( struct gl_context *ctx )
 do {                                                           \
    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);                            \
                                                                \
    {                                                           \
-      GLfloat *dest = save->attrptr[A];                        \
+      GLfloat *dest = save->attrptr[A];                                \
       if (N>0) dest[0] = V0;                                   \
       if (N>1) dest[1] = V1;                                   \
       if (N>2) dest[2] = V2;                                   \
@@ -663,7 +663,7 @@ do {                                                                \
       for (i = 0; i < save->vertex_size; 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)                        \
         _save_wrap_filled_vertex( ctx );                       \