Mesa (master): mesa: add missing error checks in _mesa_program_parameteri()

Brian Paul brianp at kemper.freedesktop.org
Fri Jul 2 15:09:27 UTC 2010


Module: Mesa
Branch: master
Commit: 291bcfd831895ebdaee098f67007e1db0c8facdc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=291bcfd831895ebdaee098f67007e1db0c8facdc

Author: Brian Paul <brianp at vmware.com>
Date:   Fri Jul  2 09:09:06 2010 -0600

mesa: add missing error checks in _mesa_program_parameteri()

---

 src/mesa/main/shaderapi.c |   53 ++++++++++++++++++++++++++++++++++++++------
 1 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 01b7244..11eb41b 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -39,6 +39,7 @@
 #include "main/glheader.h"
 #include "main/context.h"
 #include "main/dispatch.h"
+#include "main/enums.h"
 #include "main/hash.h"
 #include "main/shaderapi.h"
 #include "main/shaderobj.h"
@@ -1506,6 +1507,10 @@ _mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat,
 
 #if FEATURE_ARB_geometry_shader4
 
+/**
+ * Look up a geometry program given a shader ID.
+ * An error will be recorded if the ID is invalid, etc.
+ */
 static struct gl_geometry_program *
 _mesa_geometry_from_shader(GLuint program)
 {
@@ -1544,24 +1549,56 @@ _mesa_program_parameteri(GLcontext *ctx, GLuint program,
    struct gl_geometry_program *gprog;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
+   gprog = _mesa_geometry_from_shader(program);
+   if (!gprog) {
+      /* error will have been recorded */
+      return;
+   }
+
    switch (pname) {
    case GL_GEOMETRY_VERTICES_OUT_ARB:
-      gprog = _mesa_geometry_from_shader(program);
-      if (gprog)
-         gprog->VerticesOut = value;
+      if (value < 1 ||
+          value > ctx->Const.GeometryProgram.MaxGeometryOutputVertices) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
+                     value);
+         return;
+      }
+      gprog->VerticesOut = value;
       break;
    case GL_GEOMETRY_INPUT_TYPE_ARB:
-      gprog = _mesa_geometry_from_shader(program);
-      if (gprog)
+      switch (value) {
+      case GL_POINTS:
+      case GL_LINES:
+      case GL_LINES_ADJACENCY_ARB:
+      case GL_TRIANGLES:
+      case GL_TRIANGLES_ADJACENCY_ARB:
          gprog->InputType = value;
+         break;
+      default:
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glProgramParameteri(geometry input type = %s",
+                     _mesa_lookup_enum_by_nr(value));
+         return;
+      }
       break;
    case GL_GEOMETRY_OUTPUT_TYPE_ARB:
-      gprog = _mesa_geometry_from_shader(program);
-      if (gprog)
+      switch (value) {
+      case GL_POINTS:
+      case GL_LINE_STRIP:
+      case GL_TRIANGLE_STRIP:
          gprog->OutputType = value;
+         break;
+      default:
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glProgramParameteri(geometry output type = %s",
+                     _mesa_lookup_enum_by_nr(value));
+         return;
+      }
       break;
    default:
-      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameteriARB");
+      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameteriARB(pname=%s)",
+                  _mesa_lookup_enum_by_nr(pname));
       break;
    }
 }




More information about the mesa-commit mailing list