vbo: simplify vertex array initializations in vbo_context.c
authorBrian Paul <brianp@vmware.com>
Mon, 12 Oct 2015 15:55:57 +0000 (09:55 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 13 Oct 2015 14:28:23 +0000 (08:28 -0600)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/vbo/vbo_context.c

index b5dc45c..5e1a760 100644 (file)
@@ -43,32 +43,47 @@ static GLuint check_size( const GLfloat *attr )
 }
 
 
+/**
+ * Helper for initializing a vertex array.
+ */
+static void
+init_array(struct gl_context *ctx, struct gl_client_array *cl,
+           unsigned size, const void *pointer)
+{
+   memset(cl, 0, sizeof(*cl));
+
+   cl->Size = size;
+   cl->Type = GL_FLOAT;
+   cl->Format = GL_RGBA;
+   cl->Stride = 0;
+   cl->StrideB = 0;
+   cl->_ElementSize = cl->Size * sizeof(GLfloat);
+   cl->Ptr = pointer;
+   cl->Enabled = 1;
+
+   _mesa_reference_buffer_object(ctx, &cl->BufferObj,
+                                 ctx->Shared->NullBufferObj);
+}
+
+
+/**
+ * Set up the vbo->currval arrays to point at the context's current
+ * vertex attributes (with strides = 0).
+ */
 static void init_legacy_currval(struct gl_context *ctx)
 {
    struct vbo_context *vbo = vbo_context(ctx);
-   struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_POS];
    GLuint i;
 
-   memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_FF_MAX);
-
    /* Set up a constant (StrideB == 0) array for each current
     * attribute:
     */
    for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) {
-      struct gl_client_array *cl = &arrays[i];
+      struct gl_client_array *cl = &vbo->currval[VERT_ATTRIB_FF(i)];
 
-      /* Size will have to be determined at runtime:
-       */
-      cl->Size = check_size(ctx->Current.Attrib[i]);
-      cl->Stride = 0;
-      cl->StrideB = 0;
-      cl->Enabled = 1;
-      cl->Type = GL_FLOAT;
-      cl->Format = GL_RGBA;
-      cl->Ptr = (const void *)ctx->Current.Attrib[i];
-      cl->_ElementSize = cl->Size * sizeof(GLfloat);
-      _mesa_reference_buffer_object(ctx, &cl->BufferObj,
-                                    ctx->Shared->NullBufferObj);
+      init_array(ctx, cl,
+                 check_size(ctx->Current.Attrib[i]),
+                 ctx->Current.Attrib[i]);
    }
 }
 
@@ -76,26 +91,12 @@ static void init_legacy_currval(struct gl_context *ctx)
 static void init_generic_currval(struct gl_context *ctx)
 {
    struct vbo_context *vbo = vbo_context(ctx);
-   struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_GENERIC0];
    GLuint i;
 
-   memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_GENERIC_MAX);
-
    for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) {
-      struct gl_client_array *cl = &arrays[i];
+      struct gl_client_array *cl = &vbo->currval[VBO_ATTRIB_GENERIC0 + i];
 
-      /* This will have to be determined at runtime:
-       */
-      cl->Size = 1;
-      cl->Type = GL_FLOAT;
-      cl->Format = GL_RGBA;
-      cl->Ptr = (const void *)ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i];
-      cl->Stride = 0;
-      cl->StrideB = 0;
-      cl->Enabled = 1;
-      cl->_ElementSize = cl->Size * sizeof(GLfloat);
-      _mesa_reference_buffer_object(ctx, &cl->BufferObj,
-                                    ctx->Shared->NullBufferObj);
+      init_array(ctx, cl, 1, ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i]);
    }
 }
 
@@ -103,17 +104,15 @@ static void init_generic_currval(struct gl_context *ctx)
 static void init_mat_currval(struct gl_context *ctx)
 {
    struct vbo_context *vbo = vbo_context(ctx);
-   struct gl_client_array *arrays =
-      &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT];
    GLuint i;
 
-   memset(arrays, 0, sizeof(*arrays) * MAT_ATTRIB_MAX);
-
    /* Set up a constant (StrideB == 0) array for each current
     * attribute:
     */
    for (i = 0; i < MAT_ATTRIB_MAX; i++) {
-      struct gl_client_array *cl = &arrays[i];
+      struct gl_client_array *cl =
+         &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT + i];
+      unsigned size;
 
       /* Size is fixed for the material attributes, for others will
        * be determined at runtime:
@@ -121,26 +120,18 @@ static void init_mat_currval(struct gl_context *ctx)
       switch (i) {
       case MAT_ATTRIB_FRONT_SHININESS:
       case MAT_ATTRIB_BACK_SHININESS:
-        cl->Size = 1;
-        break;
+         size = 1;
+         break;
       case MAT_ATTRIB_FRONT_INDEXES:
       case MAT_ATTRIB_BACK_INDEXES:
-        cl->Size = 3;
-        break;
+         size = 3;
+         break;
       default:
-        cl->Size = 4;
-        break;
+         size = 4;
+         break;
       }
 
-      cl->Ptr = (const void *)ctx->Light.Material.Attrib[i];
-      cl->Type = GL_FLOAT;
-      cl->Format = GL_RGBA;
-      cl->Stride = 0;
-      cl->StrideB = 0;
-      cl->Enabled = 1;
-      cl->_ElementSize = cl->Size * sizeof(GLfloat);
-      _mesa_reference_buffer_object(ctx, &cl->BufferObj,
-                                    ctx->Shared->NullBufferObj);
+      init_array(ctx, cl, size, ctx->Light.Material.Attrib[i]);
    }
 }