diff options
-rw-r--r-- | src/mesa/main/glformats.c | 42 | ||||
-rw-r--r-- | src/mesa/main/glformats.h | 3 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 3 |
3 files changed, 47 insertions, 1 deletions
diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c index fefa9c44105..f33a0503da2 100644 --- a/src/mesa/main/glformats.c +++ b/src/mesa/main/glformats.c @@ -308,6 +308,48 @@ _mesa_bytes_per_pixel(GLenum format, GLenum type) /** + * Get the number of bytes for a vertex attrib with the given number of + * components and type. + * + * \param comps number of components. + * \param type data type. + * + * \return bytes per attribute, or -1 if a bad comps/type combination was given. + */ +GLint +_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type) +{ + switch (type) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return comps * sizeof(GLubyte); + case GL_SHORT: + case GL_UNSIGNED_SHORT: + return comps * sizeof(GLshort); + case GL_INT: + case GL_UNSIGNED_INT: + return comps * sizeof(GLint); + case GL_FLOAT: + return comps * sizeof(GLfloat); + case GL_HALF_FLOAT_ARB: + return comps * sizeof(GLhalfARB); + case GL_DOUBLE: + return comps * sizeof(GLdouble); + case GL_FIXED: + return comps * sizeof(GLfixed); + case GL_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_2_10_10_10_REV: + if (comps == 4) + return sizeof(GLuint); + else + return -1; + default: + return -1; + } +} + + +/** * Test if the given format is an integer (non-normalized) format. */ GLboolean diff --git a/src/mesa/main/glformats.h b/src/mesa/main/glformats.h index 5d099514010..ccfb5e13ca4 100644 --- a/src/mesa/main/glformats.h +++ b/src/mesa/main/glformats.h @@ -49,6 +49,9 @@ _mesa_components_in_format( GLenum format ); extern GLint _mesa_bytes_per_pixel( GLenum format, GLenum type ); +extern GLint +_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type); + extern GLboolean _mesa_is_type_integer(GLenum type); diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index f770143972c..5e4d6c3e638 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -251,7 +251,8 @@ update_array(struct gl_context *ctx, return; } - elementSize = _mesa_sizeof_type(type) * size; + elementSize = _mesa_bytes_per_vertex_attrib(size, type); + assert(elementSize != -1); array = &ctx->Array.ArrayObj->VertexAttrib[attrib]; array->Size = size; |