The NV_vertex_program generic attributes should alias the legacy attributes. Simplify aliasing by using the same gl_client_arrays for legacy and NV_vertex_program attributes. The same is already done for the current state values. --- src/mesa/main/enable.c | 10 ++-- src/mesa/main/get.c | 32 ++++++------ src/mesa/main/nvprogram.c | 8 ++-- src/mesa/main/state.c | 102 ++++------------------------------------- src/mesa/vbo/vbo_exec_array.c | 7 +-- 5 files changed, 37 insertions(+), 122 deletions(-)
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 6461ac1..7c6a714 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -118,9 +118,9 @@ client_state(struct gl_context *ctx, GLenum cap, GLboolean state) CHECK_EXTENSION(NV_vertex_program, cap); { GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV; - ASSERT(VERT_ATTRIB_GENERIC(n) < Elements(ctx->Array.ArrayObj- >VertexAttrib)); - var = &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(n)].Enabled; - flag = VERT_BIT_GENERIC(n); + ASSERT(VERT_ATTRIB_GENERIC_NV(n) < Elements(ctx->Array.ArrayObj- >VertexAttrib)); + var = &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC_NV(n)].Enabled; + flag = VERT_BIT_GENERIC_NV(n); } break; #endif /* FEATURE_NV_vertex_program */ @@ -1312,8 +1312,8 @@ _mesa_IsEnabled( GLenum cap ) CHECK_EXTENSION(NV_vertex_program); { GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV; - ASSERT(VERT_ATTRIB_GENERIC(n) < Elements(ctx->Array.ArrayObj- >VertexAttrib)); - return (ctx->Array.ArrayObj- >VertexAttrib[VERT_ATTRIB_GENERIC(n)].Enabled != 0); + ASSERT(VERT_ATTRIB_GENERIC_NV(n) < Elements(ctx->Array.ArrayObj- >VertexAttrib)); + return (ctx->Array.ArrayObj- >VertexAttrib[VERT_ATTRIB_GENERIC_NV(n)].Enabled != 0); } case GL_MAP1_VERTEX_ATTRIB0_4_NV: case GL_MAP1_VERTEX_ATTRIB1_4_NV: diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 551955c..d8851b5 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -998,37 +998,37 @@ static const struct value_desc values[] = { /* GL_NV_vertex_program */ { GL_VERTEX_PROGRAM_BINDING_NV, LOC_CUSTOM, TYPE_INT, 0, extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY0_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(0)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY0_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(0)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY1_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(1)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY1_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(1)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY2_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(2)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY2_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(2)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY3_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(3)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY3_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(3)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY4_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(4)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY4_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(4)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY5_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(5)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY5_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(5)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY6_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(6)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY6_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(6)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY7_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(7)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY7_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(7)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY8_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(8)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY8_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(8)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY9_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(9)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY9_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(9)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY10_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(10)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY10_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(10)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY11_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(11)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY11_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(11)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY12_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(12)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY12_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(12)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY13_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(13)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY13_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(13)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY14_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(14)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY14_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(14)].Enabled), extra_NV_vertex_program }, - { GL_VERTEX_ATTRIB_ARRAY15_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC(15)].Enabled), + { GL_VERTEX_ATTRIB_ARRAY15_NV, ARRAY_BOOL(VertexAttrib[VERT_ATTRIB_GENERIC_NV(15)].Enabled), extra_NV_vertex_program }, { GL_MAP1_VERTEX_ATTRIB0_4_NV, CONTEXT_BOOL(Eval.Map1Attrib[0]), extra_NV_vertex_program }, diff --git a/src/mesa/main/nvprogram.c b/src/mesa/main/nvprogram.c index dae1156..23172fb 100644 --- a/src/mesa/main/nvprogram.c +++ b/src/mesa/main/nvprogram.c @@ -365,7 +365,7 @@ _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params) return; } - array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; + array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC_NV(index)]; switch (pname) { case GL_ATTRIB_ARRAY_SIZE_NV: @@ -409,7 +409,7 @@ _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params) return; } - array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; + array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC_NV(index)]; switch (pname) { case GL_ATTRIB_ARRAY_SIZE_NV: @@ -453,7 +453,7 @@ _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params) return; } - array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; + array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC_NV(index)]; switch (pname) { case GL_ATTRIB_ARRAY_SIZE_NV: @@ -508,7 +508,7 @@ _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer) return; } - *pointer = (GLvoid *) ctx->Array.ArrayObj- >VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; + *pointer = (GLvoid *) ctx->Array.ArrayObj- >VertexAttrib[VERT_ATTRIB_GENERIC_NV(index)].Ptr; } void diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index a2b1eca..f4bc697 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -68,6 +68,7 @@ update_separate_specular(struct gl_context *ctx) static GLuint update_min(GLuint min, struct gl_client_array *array) { + assert(array->Enabled); _mesa_update_array_max_element(array); return MIN2(min, array->_MaxElement); } @@ -81,100 +82,17 @@ static void update_arrays( struct gl_context *ctx ) { struct gl_array_object *arrayObj = ctx->Array.ArrayObj; - GLuint i, min = ~0; + GLbitfield64 enabled = arrayObj->_Enabled; + GLuint min = ~0u; /* find min of _MaxElement values for all enabled arrays */ - - /* 0 */ - if (ctx->VertexProgram._Current - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0]); - } - else if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]); - } - - /* 1 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC1].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC1]); - } - /* no conventional vertex weight array */ - - /* 2 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC2].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC2]); - } - else if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]); - } - - /* 3 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC3].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC3]); - } - else if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]); - } - - /* 4 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC4].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC4]); - } - else if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR1]); - } - - /* 5 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC5].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC5]); - } - else if (arrayObj->VertexAttrib[VERT_ATTRIB_FOG].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_FOG]); - } - - /* 6 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC6].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC6]); - } - else if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) { - min = update_min(min, &arrayObj- >VertexAttrib[VERT_ATTRIB_COLOR_INDEX]); - } - - /* 7 */ - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC7].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC7]); - } - - /* 8..15 */ - for (i = 0; i < VERT_ATTRIB_TEX_MAX; i++) { - if (ctx->VertexProgram._Enabled - && arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC8 + i].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC8 + i]); - } - else if (i < ctx->Const.MaxTextureCoordUnits - && arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]); - } - } - - /* 16..31 */ - if (ctx->VertexProgram._Current) { - for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) { - if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled) { - min = update_min(min, &arrayObj- >VertexAttrib[VERT_ATTRIB_GENERIC(i)]); - } - } - } - - if (arrayObj->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled) { - min = update_min(min, &arrayObj->VertexAttrib[VERT_ATTRIB_EDGEFLAG]); + while (enabled) { + GLint attrib = _mesa_ffsll(enabled) - 1; + enabled &= ~BITFIELD64_BIT(attrib); + if (!ctx->VertexProgram._Current && + VERT_ATTRIB_GENERIC0 <= attrib && attrib <= VERT_ATTRIB_GENERIC15) + continue; + min = update_min(min, &arrayObj->VertexAttrib[attrib]); } /* _MaxElement is one past the last legal array element */ diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 3d8a832..aa7bc3f 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -450,15 +450,12 @@ recalculate_input_bindings(struct gl_context *ctx) break; case VP_NV: - /* NV_vertex_program - attribute arrays alias and override + /* NV_vertex_program - attribute arrays alias * conventional, legacy arrays. No materials, and the generic * slots are vacant. */ for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) { - if (i < VERT_ATTRIB_GENERIC_MAX - && exec->array.generic_array[i]->Enabled) - inputs[i] = exec->array.generic_array[i]; - else if (exec->array.legacy_array[i]->Enabled) + if (exec->array.legacy_array[i]->Enabled) inputs[i] = exec->array.legacy_array[i]; else { inputs[i] = &vbo->legacy_currval[i]; -- 1.7.4.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev