[Mesa-dev] [PATCH 15/21] mesa: Enable vertex programs by default, remove checks

Ian Romanick idr at freedesktop.org
Sat Aug 27 00:57:05 PDT 2011


From: Ian Romanick <ian.d.romanick at intel.com>

Specifically, the following extensions are enabled:

    GL_ARB_vertex_program
    GL_EXT_gpu_program_paramaters
    GL_NV_vertex_program

GL_NV_vertex_program1_1 is *not* enabled because several drivers that
have vertex shader hardware do not support the RCC opcode.  This would
be easy enough to add to R200 (which does not support Inf), but it may
be more complex for others.

Note that this enables GL_NV_vertex_program on r200 where it was not
previously enabled.  No piglit regressions (or new failures) were
seen.

Cc: Alex Deucher <alexdeucher at gmail.com>
Cc: Dave Airlie <airlied at redhat.com>
---
 src/mesa/drivers/common/meta.c |   22 +++++++++-------------
 src/mesa/main/arbprogram.c     |   36 +++++++++---------------------------
 src/mesa/main/eval.c           |    9 ---------
 src/mesa/main/extensions.c     |    3 +++
 src/mesa/main/getstring.c      |    8 +-------
 src/mesa/main/matrix.c         |   30 +++++++++---------------------
 src/mesa/main/nvprogram.c      |   22 ++++++----------------
 7 files changed, 37 insertions(+), 93 deletions(-)

diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 291d912..b9c20ac 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -427,12 +427,10 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
    }
 
    if (state & MESA_META_SHADER) {
-      if (ctx->Extensions.ARB_vertex_program) {
-         save->VertexProgramEnabled = ctx->VertexProgram.Enabled;
-         _mesa_reference_vertprog(ctx, &save->VertexProgram,
-				  ctx->VertexProgram.Current);
-         _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);
-      }
+      save->VertexProgramEnabled = ctx->VertexProgram.Enabled;
+      _mesa_reference_vertprog(ctx, &save->VertexProgram,
+			       ctx->VertexProgram.Current);
+      _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);
 
       if (ctx->Extensions.ARB_fragment_program) {
          save->FragmentProgramEnabled = ctx->FragmentProgram.Enabled;
@@ -697,13 +695,11 @@ _mesa_meta_end(struct gl_context *ctx)
    }
 
    if (state & MESA_META_SHADER) {
-      if (ctx->Extensions.ARB_vertex_program) {
-         _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB,
-                          save->VertexProgramEnabled);
-         _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, 
-                                  save->VertexProgram);
-	 _mesa_reference_vertprog(ctx, &save->VertexProgram, NULL);
-      }
+      _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB,
+		       save->VertexProgramEnabled);
+      _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,
+			       save->VertexProgram);
+      _mesa_reference_vertprog(ctx, &save->VertexProgram, NULL);
 
       if (ctx->Extensions.ARB_fragment_program) {
          _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB,
diff --git a/src/mesa/main/arbprogram.c b/src/mesa/main/arbprogram.c
index b83369d..3d40356 100644
--- a/src/mesa/main/arbprogram.c
+++ b/src/mesa/main/arbprogram.c
@@ -77,9 +77,7 @@ _mesa_BindProgram(GLenum target, GLuint id)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    /* Error-check target and get curProg */
-   if ((target == GL_VERTEX_PROGRAM_ARB) && /* == GL_VERTEX_PROGRAM_NV */
-        (ctx->Extensions.NV_vertex_program ||
-         ctx->Extensions.ARB_vertex_program)) {
+   if (target == GL_VERTEX_PROGRAM_ARB) {
       curProg = &ctx->VertexProgram.Current->Base;
    }
    else if ((target == GL_FRAGMENT_PROGRAM_NV
@@ -276,8 +274,7 @@ get_local_param_pointer(struct gl_context *ctx, const char *func,
    struct gl_program *prog;
    GLuint maxParams;
 
-   if (target == GL_VERTEX_PROGRAM_ARB
-       && ctx->Extensions.ARB_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_ARB) {
       prog = &(ctx->VertexProgram.Current->Base);
       maxParams = ctx->Const.VertexProgram.MaxLocalParams;
    }
@@ -320,9 +317,7 @@ get_env_param_pointer(struct gl_context *ctx, const char *func,
       *param = ctx->FragmentProgram.Parameters[index];
       return GL_TRUE;
    }
-   else if (target == GL_VERTEX_PROGRAM_ARB &&
-	    (ctx->Extensions.ARB_vertex_program ||
-	     ctx->Extensions.NV_vertex_program)) {
+   else if (target == GL_VERTEX_PROGRAM_ARB) {
       if (index >= ctx->Const.VertexProgram.MaxEnvParams) {
          _mesa_error(ctx, GL_INVALID_VALUE, "%s(index)", func);
          return GL_FALSE;
@@ -345,12 +340,6 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
 
    FLUSH_VERTICES(ctx, _NEW_PROGRAM);
 
-   if (!ctx->Extensions.ARB_vertex_program
-       && !ctx->Extensions.ARB_fragment_program) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramStringARB()");
-      return;
-   }
-
    if (format != GL_PROGRAM_FORMAT_ASCII_ARB) {
       _mesa_error(ctx, GL_INVALID_ENUM, "glProgramStringARB(format)");
       return;
@@ -361,18 +350,14 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
     * using the ARB grammar if the string starts with "!!ARB" or if
     * NV_vertex_program is not supported.
     */
-   if (target == GL_VERTEX_PROGRAM_ARB
-       && ctx->Extensions.ARB_vertex_program
-       && ((strncmp(string, "!!ARB", 5) == 0)
-	   || !ctx->Extensions.NV_vertex_program)) {
+   if (target == GL_VERTEX_PROGRAM_ARB && (strncmp(string, "!!ARB", 5) == 0)) {
       struct gl_vertex_program *prog = ctx->VertexProgram.Current;
       _mesa_parse_arb_vertex_program(ctx, target, string, len, prog);
 
       base = & prog->Base;
    }
-   else if ((target == GL_VERTEX_PROGRAM_ARB
-	     || target == GL_VERTEX_STATE_PROGRAM_NV)
-	    && ctx->Extensions.NV_vertex_program) {
+   else if (target == GL_VERTEX_PROGRAM_ARB
+	    || target == GL_VERTEX_STATE_PROGRAM_NV) {
       struct gl_vertex_program *prog = ctx->VertexProgram.Current;
       _mesa_parse_nv_vertex_program(ctx, target, string, len, prog);
 
@@ -509,8 +494,7 @@ _mesa_ProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count,
       }
       dest = ctx->FragmentProgram.Parameters[index];
    }
-   else if (target == GL_VERTEX_PROGRAM_ARB
-       && ctx->Extensions.ARB_vertex_program) {
+   else if (target == GL_VERTEX_PROGRAM_ARB) {
       if ((index + count) > ctx->Const.VertexProgram.MaxEnvParams) {
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameters4fv(index + count)");
          return;
@@ -612,8 +596,7 @@ _mesa_ProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count,
       }
       dest = ctx->FragmentProgram.Current->Base.LocalParams[index];
    }
-   else if (target == GL_VERTEX_PROGRAM_ARB
-            && ctx->Extensions.ARB_vertex_program) {
+   else if (target == GL_VERTEX_PROGRAM_ARB) {
       if ((index + count) > ctx->Const.VertexProgram.MaxLocalParams) {
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramLocalParameters4fvEXT(index + count)");
          return;
@@ -700,8 +683,7 @@ _mesa_GetProgramivARB(GLenum target, GLenum pname, GLint *params)
 
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (target == GL_VERTEX_PROGRAM_ARB
-       && ctx->Extensions.ARB_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_ARB) {
       prog = &(ctx->VertexProgram.Current->Base);
       limits = &ctx->Const.VertexProgram;
    }
diff --git a/src/mesa/main/eval.c b/src/mesa/main/eval.c
index e651715..babd1f9 100644
--- a/src/mesa/main/eval.c
+++ b/src/mesa/main/eval.c
@@ -80,11 +80,6 @@ GLuint _mesa_evaluator_components( GLenum target )
       default:				break;
    }
 
-   /* XXX need to check for the vertex program extension
-   if (!ctx->Extensions.NV_vertex_program)
-      return 0;
-   */
-
    if (target >= GL_MAP1_VERTEX_ATTRIB0_4_NV &&
        target <= GL_MAP1_VERTEX_ATTRIB15_4_NV)
       return 4;
@@ -138,8 +133,6 @@ get_1d_map( struct gl_context *ctx, GLenum target )
       case GL_MAP1_VERTEX_ATTRIB13_4_NV:
       case GL_MAP1_VERTEX_ATTRIB14_4_NV:
       case GL_MAP1_VERTEX_ATTRIB15_4_NV:
-         if (!ctx->Extensions.NV_vertex_program)
-            return NULL;
          return &ctx->EvalMap.Map1Attrib[target - GL_MAP1_VERTEX_ATTRIB0_4_NV];
       default:
          return NULL;
@@ -188,8 +181,6 @@ get_2d_map( struct gl_context *ctx, GLenum target )
       case GL_MAP2_VERTEX_ATTRIB13_4_NV:
       case GL_MAP2_VERTEX_ATTRIB14_4_NV:
       case GL_MAP2_VERTEX_ATTRIB15_4_NV:
-         if (!ctx->Extensions.NV_vertex_program)
-            return NULL;
          return &ctx->EvalMap.Map2Attrib[target - GL_MAP2_VERTEX_ATTRIB0_4_NV];
       default:
          return NULL;
diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index 14b0cf9..01bcc62 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -351,6 +351,7 @@ static const size_t default_extensions[] = {
    o(ARB_texture_compression),
    o(ARB_transpose_matrix),
    o(ARB_vertex_buffer_object),
+   o(ARB_vertex_program),
    o(ARB_window_pos),
 
    o(EXT_abgr),
@@ -358,6 +359,7 @@ static const size_t default_extensions[] = {
    o(EXT_compiled_vertex_array),
    o(EXT_copy_texture),
    o(EXT_draw_range_elements),
+   o(EXT_gpu_program_parameters),
    o(EXT_multi_draw_arrays),
    o(EXT_packed_pixels),
    o(EXT_polygon_offset),
@@ -378,6 +380,7 @@ static const size_t default_extensions[] = {
    o(IBM_rasterpos_clip),
    o(NV_light_max_exponent),
    o(NV_texgen_reflection),
+   o(NV_vertex_program),
    o(SGIS_generate_mipmap),
    o(SGIS_texture_edge_clamp),
    o(SGIS_texture_lod),
diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c
index c381fb2..726218f 100644
--- a/src/mesa/main/getstring.c
+++ b/src/mesa/main/getstring.c
@@ -121,13 +121,7 @@ _mesa_GetString( GLenum name )
 #if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program || \
     FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program
       case GL_PROGRAM_ERROR_STRING_NV:
-         if (ctx->Extensions.NV_fragment_program ||
-             ctx->Extensions.ARB_fragment_program ||
-             ctx->Extensions.NV_vertex_program ||
-             ctx->Extensions.ARB_vertex_program) {
-            return (const GLubyte *) ctx->Program.ErrorString;
-         }
-         /* FALL-THROUGH */
+	 return (const GLubyte *) ctx->Program.ErrorString;
 #endif
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" );
diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c
index 5697366..87dabf1 100644
--- a/src/mesa/main/matrix.c
+++ b/src/mesa/main/matrix.c
@@ -187,13 +187,7 @@ _mesa_MatrixMode( GLenum mode )
    case GL_MATRIX5_NV:
    case GL_MATRIX6_NV:
    case GL_MATRIX7_NV:
-      if (ctx->Extensions.NV_vertex_program) {
-         ctx->CurrentStack = &ctx->ProgramMatrixStack[mode - GL_MATRIX0_NV];
-      }
-      else {
-         _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
-         return;
-      }
+      ctx->CurrentStack = &ctx->ProgramMatrixStack[mode - GL_MATRIX0_NV];
       break;
    case GL_MATRIX0_ARB:
    case GL_MATRIX1_ARB:
@@ -202,22 +196,16 @@ _mesa_MatrixMode( GLenum mode )
    case GL_MATRIX4_ARB:
    case GL_MATRIX5_ARB:
    case GL_MATRIX6_ARB:
-   case GL_MATRIX7_ARB:
-      if (ctx->Extensions.ARB_vertex_program ||
-          ctx->Extensions.ARB_fragment_program) {
-         const GLuint m = mode - GL_MATRIX0_ARB;
-         if (m > ctx->Const.MaxProgramMatrices) {
-            _mesa_error(ctx, GL_INVALID_ENUM,
-                        "glMatrixMode(GL_MATRIX%d_ARB)", m);
-            return;
-         }
-         ctx->CurrentStack = &ctx->ProgramMatrixStack[m];
-      }
-      else {
-         _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
-         return;
+   case GL_MATRIX7_ARB: {
+      const GLuint m = mode - GL_MATRIX0_ARB;
+      if (m > ctx->Const.MaxProgramMatrices) {
+	 _mesa_error(ctx, GL_INVALID_ENUM,
+		     "glMatrixMode(GL_MATRIX%d_ARB)", m);
+	 return;
       }
+      ctx->CurrentStack = &ctx->ProgramMatrixStack[m];
       break;
+   }
    default:
       _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
       return;
diff --git a/src/mesa/main/nvprogram.c b/src/mesa/main/nvprogram.c
index 7ff7645..8aff37a 100644
--- a/src/mesa/main/nvprogram.c
+++ b/src/mesa/main/nvprogram.c
@@ -318,8 +318,7 @@ _mesa_GetTrackMatrixivNV(GLenum target, GLuint address,
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (target == GL_VERTEX_PROGRAM_NV
-       && ctx->Extensions.NV_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_NV) {
       GLuint i;
 
       if ((address & 0x3) || address >= MAX_NV_VERTEX_PROGRAM_PARAMS) {
@@ -599,12 +598,6 @@ _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (!ctx->Extensions.NV_vertex_program
-       && !ctx->Extensions.NV_fragment_program) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV()");
-      return;
-   }
-
    if (id == 0) {
       _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)");
       return;
@@ -624,9 +617,7 @@ _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
       return;
    }
 
-   if ((target == GL_VERTEX_PROGRAM_NV ||
-        target == GL_VERTEX_STATE_PROGRAM_NV)
-       && ctx->Extensions.NV_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_NV || target == GL_VERTEX_STATE_PROGRAM_NV) {
       struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog;
       if (!vprog || prog == &_mesa_DummyProgram) {
          vprog = (struct gl_vertex_program *)
@@ -638,8 +629,7 @@ _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
          _mesa_HashInsert(ctx->Shared->Programs, id, vprog);
       }
 
-      if (ctx->Extensions.ARB_vertex_program
-	  && (strncmp((char *) program, "!!ARB", 5) == 0)) {
+      if (strncmp((char *) program, "!!ARB", 5) == 0) {
 	 _mesa_parse_arb_vertex_program(ctx, target, program, len, vprog);
       } else {
 	 _mesa_parse_nv_vertex_program(ctx, target, program, len, vprog);
@@ -691,7 +681,7 @@ _mesa_ProgramParameters4dvNV(GLenum target, GLuint index,
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_NV) {
       GLint i;
       if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) {
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4dvNV");
@@ -723,7 +713,7 @@ _mesa_ProgramParameters4fvNV(GLenum target, GLuint index,
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_NV) {
       GLint i;
       if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) {
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4fvNV");
@@ -755,7 +745,7 @@ _mesa_TrackMatrixNV(GLenum target, GLuint address,
 
    FLUSH_VERTICES(ctx, _NEW_PROGRAM);
 
-   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
+   if (target == GL_VERTEX_PROGRAM_NV) {
       if (address & 0x3) {
          /* addr must be multiple of four */
          _mesa_error(ctx, GL_INVALID_VALUE, "glTrackMatrixNV(address)");
-- 
1.7.4.4



More information about the mesa-dev mailing list