diff options
| author | Brian Paul <brianp@vmware.com> | 2009-05-21 09:56:41 -0600 | 
|---|---|---|
| committer | Brian Paul <brianp@vmware.com> | 2009-05-21 16:10:45 -0600 | 
| commit | de1cfc5e8a8e9d0b0b397671575ae448a554a002 (patch) | |
| tree | 9f3d94b32d940af2a75de684d9ca9ef27dcf5658 /src | |
| parent | dda82137d28aba846dda73da230871c115e30aaf (diff) | |
mesa: new _mesa_update_array_object_max_element() function
This will replace the code in state.c
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/main/arrayobj.c | 78 | ||||
| -rw-r--r-- | src/mesa/main/arrayobj.h | 7 | 
2 files changed, 83 insertions, 2 deletions
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index 8ec73b9526..eab6fac94e 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -1,9 +1,10 @@  /*   * Mesa 3-D graphics library - * Version:  7.2 + * Version:  7.6   *   * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   * (C) Copyright IBM Corporation 2006 + * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -46,6 +47,7 @@  #include "bufferobj.h"  #endif  #include "arrayobj.h" +#include "macros.h"  #include "glapi/dispatch.h" @@ -267,6 +269,80 @@ remove_array_object( GLcontext *ctx, struct gl_array_object *obj )  } + +/** + * Compute the index of the last array element that can be safely accessed + * in a vertex array.  We can really only do this when the array lives in + * a VBO. + * The array->_MaxElement field will be updated. + * Later in glDrawArrays/Elements/etc we can do some bounds checking. + */ +static void +compute_max_element(struct gl_client_array *array) +{ +   if (array->BufferObj->Name) { +      /* Compute the max element we can access in the VBO without going +       * out of bounds. +       */ +      array->_MaxElement = ((GLsizeiptrARB) array->BufferObj->Size +                            - (GLsizeiptrARB) array->Ptr + array->StrideB +                            - array->_ElementSize) / array->StrideB; +      if (0) +         _mesa_printf("%s Object %u  Size %u  MaxElement %u\n", +                      __FUNCTION__, +                      array->BufferObj->Name, +                      (GLuint) array->BufferObj->Size, +                      array->_MaxElement); +   } +   else { +      /* user-space array, no idea how big it is */ +      array->_MaxElement = 2 * 1000 * 1000 * 1000; /* just a big number */ +   } +} + + +/** + * Helper for update_arrays(). + * \return  min(current min, array->_MaxElement). + */ +static GLuint +update_min(GLuint min, struct gl_client_array *array) +{ +   compute_max_element(array); +   if (array->Enabled) +      return MIN2(min, array->_MaxElement); +   else +      return min; +} + + +/** + * Examine vertex arrays to update the gl_array_object::_MaxElement field. + */ +void +_mesa_update_array_object_max_element(GLcontext *ctx, +                                      struct gl_array_object *arrayObj) +{ +   GLuint i, min = ~0; + +   min = update_min(min, &arrayObj->Vertex); +   min = update_min(min, &arrayObj->Normal); +   min = update_min(min, &arrayObj->Color); +   min = update_min(min, &arrayObj->SecondaryColor); +   min = update_min(min, &arrayObj->FogCoord); +   min = update_min(min, &arrayObj->Index); +   min = update_min(min, &arrayObj->EdgeFlag); +   min = update_min(min, &arrayObj->PointSize); +   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) +      min = update_min(min, &arrayObj->TexCoord[i]); +   for (i = 0; i < VERT_ATTRIB_MAX; i++) +      min = update_min(min, &arrayObj->VertexAttrib[i]); + +   /* _MaxElement is one past the last legal array element */ +   arrayObj->_MaxElement = min; +} + +  /**********************************************************************/  /* API Functions                                                      */  /**********************************************************************/ diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h index 90c2aea155..abca5ab9b4 100644 --- a/src/mesa/main/arrayobj.h +++ b/src/mesa/main/arrayobj.h @@ -1,9 +1,10 @@  /*   * Mesa 3-D graphics library - * Version:  6.5 + * Version:  7.6   *   * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.   * (C) Copyright IBM Corporation 2006 + * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -57,6 +58,10 @@ _mesa_initialize_array_object( GLcontext *ctx,                                 struct gl_array_object *obj, GLuint name ); +extern void +_mesa_update_array_object_max_element(GLcontext *ctx, +                                      struct gl_array_object *arrayObj); +  /*   * API functions  | 
