st/mesa: simplify the signature of get_client_array
[mesa.git] / src / mesa / vbo / vbo_rebase.c
index f3fe5f75708d97b1c6da3e8acdaa788bfc954364..9f5dc4678f8d59187c82bb568aaed8591d1fcdbc 100644 (file)
@@ -46,6 +46,7 @@
  * of zero.
  */
 
+#include <stdio.h>
 #include "main/glheader.h"
 #include "main/imports.h"
 #include "main/mtypes.h"
@@ -58,9 +59,14 @@ static void *rebase_##TYPE( const void *ptr,                 \
                          GLuint count,                         \
                          TYPE min_index )                      \
 {                                                              \
-   const TYPE *in = (TYPE *)ptr;                               \
-   TYPE *tmp_indices = malloc(count * sizeof(TYPE));   \
    GLuint i;                                                   \
+   const TYPE *in = (TYPE *)ptr;                               \
+   TYPE *tmp_indices = malloc(count * sizeof(TYPE));           \
+                                                               \
+   if (tmp_indices == NULL) {                                   \
+      _mesa_error_no_memory(__func__);                          \
+      return NULL;                                              \
+   }                                                            \
                                                                \
    for (i = 0; i < count; i++)                                 \
       tmp_indices[i] = in[i] - min_index;                      \
@@ -73,7 +79,7 @@ REBASE(GLuint)
 REBASE(GLushort)
 REBASE(GLubyte)
 
-GLboolean vbo_all_varyings_in_vbos( const struct gl_client_array *arrays[] )
+GLboolean vbo_all_varyings_in_vbos( const struct gl_vertex_array *arrays[] )
 {
    GLuint i;
    
@@ -85,7 +91,7 @@ GLboolean vbo_all_varyings_in_vbos( const struct gl_client_array *arrays[] )
    return GL_TRUE;
 }
 
-GLboolean vbo_any_varyings_in_vbos( const struct gl_client_array *arrays[] )
+GLboolean vbo_any_varyings_in_vbos( const struct gl_vertex_array *arrays[] )
 {
    GLuint i;
 
@@ -116,7 +122,7 @@ GLboolean vbo_any_varyings_in_vbos( const struct gl_client_array *arrays[] )
  *      all or nothing.
  */
 void vbo_rebase_prims( struct gl_context *ctx,
-                      const struct gl_client_array *arrays[],
+                      const struct gl_vertex_array *arrays[],
                       const struct _mesa_prim *prim,
                       GLuint nr_prims,
                       const struct _mesa_index_buffer *ib,
@@ -124,19 +130,19 @@ void vbo_rebase_prims( struct gl_context *ctx,
                       GLuint max_index,
                       vbo_draw_func draw )
 {
-   struct gl_client_array tmp_arrays[VERT_ATTRIB_MAX];
-   const struct gl_client_array *tmp_array_pointers[VERT_ATTRIB_MAX];
+   struct gl_vertex_array tmp_arrays[VERT_ATTRIB_MAX];
+   const struct gl_vertex_array *tmp_array_pointers[VERT_ATTRIB_MAX];
 
    struct _mesa_index_buffer tmp_ib;
    struct _mesa_prim *tmp_prims = NULL;
-   const struct gl_client_array **saved_arrays = ctx->Array._DrawArrays;
+   const struct gl_vertex_array **saved_arrays = ctx->Array._DrawArrays;
    void *tmp_indices = NULL;
    GLuint i;
 
    assert(min_index != 0);
 
    if (0)
-      printf("%s %d..%d\n", __FUNCTION__, min_index, max_index);
+      printf("%s %d..%d\n", __func__, min_index, max_index);
 
 
    /* XXX this path is disabled for now.
@@ -148,6 +154,11 @@ void vbo_rebase_prims( struct gl_context *ctx,
        */
       tmp_prims = malloc(sizeof(*prim) * nr_prims);
 
+      if (tmp_prims == NULL) {
+         _mesa_error_no_memory(__func__);
+         return;
+      }
+
       for (i = 0; i < nr_prims; i++) {
         tmp_prims[i] = prim[i];
         tmp_prims[i].basevertex -= min_index;
@@ -171,14 +182,14 @@ void vbo_rebase_prims( struct gl_context *ctx,
       /* Some users might prefer it if we translated elements to
        * GLuints here.  Others wouldn't...
        */
-      switch (ib->type) {
-      case GL_UNSIGNED_INT: 
+      switch (ib->index_size) {
+      case 4:
         tmp_indices = rebase_GLuint( ptr, ib->count, min_index );
         break;
-      case GL_UNSIGNED_SHORT: 
+      case 2:
         tmp_indices = rebase_GLushort( ptr, ib->count, min_index );
         break;
-      case GL_UNSIGNED_BYTE: 
+      case 1:
         tmp_indices = rebase_GLubyte( ptr, ib->count, min_index );
         break;
       }      
@@ -186,10 +197,14 @@ void vbo_rebase_prims( struct gl_context *ctx,
       if (map_ib) 
         ctx->Driver.UnmapBuffer(ctx, ib->obj, MAP_INTERNAL);
 
+      if (tmp_indices == NULL) {
+         return;
+      }
+
       tmp_ib.obj = ctx->Shared->NullBufferObj;
       tmp_ib.ptr = tmp_indices;
       tmp_ib.count = ib->count;
-      tmp_ib.type = ib->type;
+      tmp_ib.index_size = ib->index_size;
 
       ib = &tmp_ib;
    }
@@ -198,6 +213,11 @@ void vbo_rebase_prims( struct gl_context *ctx,
        */
       tmp_prims = malloc(sizeof(*prim) * nr_prims);
 
+      if (tmp_prims == NULL) {
+         _mesa_error_no_memory(__func__);
+         return;
+      }
+
       for (i = 0; i < nr_prims; i++) {
         /* If this fails, it could indicate an application error:
          */
@@ -238,7 +258,7 @@ void vbo_rebase_prims( struct gl_context *ctx,
         GL_TRUE,
         0, 
         max_index - min_index,
-        NULL, NULL );
+        NULL, 0, NULL );
 
    ctx->Array._DrawArrays = saved_arrays;
    ctx->NewDriverState |= ctx->DriverFlags.NewArray;