Mesa (7.9): mesa: Fix error checks in GetVertexAttrib functions

Ian Romanick idr at kemper.freedesktop.org
Mon Feb 21 23:07:13 UTC 2011


Module: Mesa
Branch: 7.9
Commit: 8159bef77fadab7f45fc4551296c2f072e1db3f9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8159bef77fadab7f45fc4551296c2f072e1db3f9

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Thu Feb  3 17:56:44 2011 -0800

mesa: Fix error checks in GetVertexAttrib functions

Querying index zero is not an error in OpenGL ES 2.0.

Querying an index larger than the value returned by
GL_MAX_VERTEX_ATTRIBS is an error in all APIs.

Fixes bugzilla #32375.
(cherry picked from commit 5c3f1cdbbeb4d787bad7729ccd3f10aa78d113ac)

---

 src/mesa/main/varray.c |   68 ++++++++++++++++++++++-------------------------
 1 files changed, 32 insertions(+), 36 deletions(-)

diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index d19de7f..fc7ee65 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -783,7 +783,7 @@ get_vertex_array_attrib(GLcontext *ctx, GLuint index, GLenum pname,
 {
    const struct gl_client_array *array;
 
-   if (index >= MAX_VERTEX_GENERIC_ATTRIBS) {
+   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
       _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
       return 0;
    }
@@ -812,6 +812,25 @@ get_vertex_array_attrib(GLcontext *ctx, GLuint index, GLenum pname,
 }
 
 
+static const GLfloat *
+get_current_attrib(GLcontext *ctx, GLuint index, const char *function)
+{
+   if (index == 0) {
+      if (ctx->API != API_OPENGLES2) {
+	 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function);
+	 return NULL;
+      }
+   }
+   else if (index >= ctx->Const.VertexProgram.MaxAttribs) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+		  "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function);
+      return NULL;
+   }
+
+   FLUSH_CURRENT(ctx, 0);
+   return ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
+}
+
 void GLAPIENTRY
 _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
 {
@@ -819,13 +838,8 @@ _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
-      if (index == 0) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetVertexAttribfv(index==0)");
-      }
-      else {
-         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
-         FLUSH_CURRENT(ctx, 0);
+      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv");
+      if (v != NULL) {
          COPY_4V(params, v);
       }
    }
@@ -843,13 +857,8 @@ _mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
-      if (index == 0) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetVertexAttribdv(index==0)");
-      }
-      else {
-         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
-         FLUSH_CURRENT(ctx, 0);
+      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv");
+      if (v != NULL) {
          params[0] = (GLdouble) v[0];
          params[1] = (GLdouble) v[1];
          params[2] = (GLdouble) v[2];
@@ -870,13 +879,8 @@ _mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
-      if (index == 0) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetVertexAttribiv(index==0)");
-      }
-      else {
-         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
-         FLUSH_CURRENT(ctx, 0);
+      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv");
+      if (v != NULL) {
          /* XXX should floats in[0,1] be scaled to full int range? */
          params[0] = (GLint) v[0];
          params[1] = (GLint) v[1];
@@ -899,13 +903,9 @@ _mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
-      if (index == 0) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetVertexAttribIiv(index==0)");
-      }
-      else {
-         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
-         FLUSH_CURRENT(ctx, 0);
+      const GLfloat *v =
+	 get_current_attrib(ctx, index, "glGetVertexAttribIiv");
+      if (v != NULL) {
          /* XXX we don't have true integer-valued vertex attribs yet */
          params[0] = (GLint) v[0];
          params[1] = (GLint) v[1];
@@ -928,13 +928,9 @@ _mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
-      if (index == 0) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetVertexAttribIuiv(index==0)");
-      }
-      else {
-         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
-         FLUSH_CURRENT(ctx, 0);
+      const GLfloat *v =
+	 get_current_attrib(ctx, index, "glGetVertexAttribIuiv");
+      if (v != NULL) {
          /* XXX we don't have true integer-valued vertex attribs yet */
          params[0] = (GLuint) v[0];
          params[1] = (GLuint) v[1];




More information about the mesa-commit mailing list