mesa: new _mesa_update_array_object_max_element() function

This will replace the code in state.c
This commit is contained in:
Brian Paul
2009-05-21 09:56:41 -06:00
parent dda82137d2
commit de1cfc5e8a
2 changed files with 83 additions and 2 deletions

View File

@@ -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 */
/**********************************************************************/