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

Ian Romanick idr at freedesktop.org
Mon Aug 29 10:59:07 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 08/27/2011 05:39 AM, Marek Olšák wrote:
> Hi Ian,
> 
> I was trying to enable NV_vertex_program without regressions in
> st/mesa before, but these piglit tests were always failing and are still
> failing with your patch:
> 
> nv-add
> nv-arl
> nv-init-zero-addr
> nv-init-zero-reg
> nv-mov

After digging around some more, I think everything except nouveau needs:

    ctx->ShaderCompilerOptions[].EmitNVTempInitialization = true;

I did that for r200 in patch 16/21.  If that fixes softpipe, we should
just make that setting be the default.

> r600g just fails or assertion-fails, but softpipe sometimes crashes
> (e.g. in nv-init-zero-addr). That's the reason st/mesa doesn't support
> NV_vertex_program currently.

That's weird.  What's the assertion failure?  Is it some invalid
instruction or something else?

> Marek
> 
> On Sat, Aug 27, 2011 at 9:57 AM, Ian Romanick <idr at freedesktop.org> wrote:
>> 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

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk5b02sACgkQX1gOwKyEAw8v1wCfRwmceyq2alkMYSDAZiIv0zmq
s4IAnjtTkDAl+TTaKGlZYFNL54VWTjg5
=jQzD
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list