-----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 <i...@freedesktop.org> wrote: >> From: Ian Romanick <ian.d.roman...@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 <alexdeuc...@gmail.com> >> Cc: Dave Airlie <airl...@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----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev