diff options
| -rw-r--r-- | src/mesa/main/api_arrayelt.c | 676 | 
1 files changed, 567 insertions, 109 deletions
| diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c index 93ba0b7bc3..93fade2418 100644 --- a/src/mesa/main/api_arrayelt.c +++ b/src/mesa/main/api_arrayelt.c @@ -1,8 +1,8 @@  /*   * Mesa 3-D graphics library - * Version:  5.1 + * Version:  6.1   * - * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -34,31 +34,37 @@  #include "macros.h"  #include "mtypes.h" - -typedef void (GLAPIENTRY *texarray_func)( GLenum, const void * ); - -typedef struct { -   GLint unit; -   struct gl_client_array *array; -   texarray_func func; -} AEtexarray; -  typedef void (GLAPIENTRY *array_func)( const void * );  typedef struct { -   struct gl_client_array *array; +   const struct gl_client_array *array;     array_func func;  } AEarray; +typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data ); + +typedef struct { +   const struct gl_client_array *array; +   attrib_func func; +   GLuint index; +} AEattrib; +  typedef struct { -   AEtexarray texarrays[MAX_TEXTURE_COORD_UNITS + 1];     AEarray arrays[32]; +   AEattrib attribs[VERT_ATTRIB_MAX + 1];     GLuint NewState;  } AEcontext;  #define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context) + +/* + * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer + * in the range [0, 7].  Luckily these type tokens are sequentially + * numbered in gl.h + */  #define TYPE_IDX(t) ((t) & 0xf) +  static void (GLAPIENTRY *colorfuncs[2][8])( const void * ) = {     { (array_func)glColor3bv,       (array_func)glColor3ubv, @@ -108,45 +114,6 @@ static void (GLAPIENTRY *vertexfuncs[3][8])( const void * ) = {       (array_func)glVertex4dv }  }; - -static void (GLAPIENTRY *multitexfuncs[4][8])( GLenum, const void * ) = { -   { 0, -     0, -     (texarray_func)glMultiTexCoord1svARB, -     0, -     (texarray_func)glMultiTexCoord1ivARB, -     0, -     (texarray_func)glMultiTexCoord1fvARB, -     (texarray_func)glMultiTexCoord1dvARB }, - -   { 0, -     0, -     (texarray_func)glMultiTexCoord2svARB, -     0, -     (texarray_func)glMultiTexCoord2ivARB, -     0, -     (texarray_func)glMultiTexCoord2fvARB, -     (texarray_func)glMultiTexCoord2dvARB }, - -   { 0, -     0, -     (texarray_func)glMultiTexCoord3svARB, -     0, -     (texarray_func)glMultiTexCoord3ivARB, -     0, -     (texarray_func)glMultiTexCoord3fvARB, -     (texarray_func)glMultiTexCoord3dvARB }, - -   { 0, -     0, -     (texarray_func)glMultiTexCoord4svARB, -     0, -     (texarray_func)glMultiTexCoord4ivARB, -     0, -     (texarray_func)glMultiTexCoord4fvARB, -     (texarray_func)glMultiTexCoord4dvARB } -}; -  static void (GLAPIENTRY *indexfuncs[8])( const void * ) = {     0,     (array_func)glIndexubv, @@ -158,7 +125,6 @@ static void (GLAPIENTRY *indexfuncs[8])( const void * ) = {     (array_func)glIndexdv  }; -  static void (GLAPIENTRY *normalfuncs[8])( const void * ) = {     (array_func)glNormal3bv,     0, @@ -247,6 +213,442 @@ static void (GLAPIENTRY *fogcoordfuncs[8])( const void * ) = {  }; +/**********************************************************************/ + +/* GL_BYTE attributes */ + +static void VertexAttrib1Nbv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, BYTE_TO_FLOAT(v[0])); +} + +static void VertexAttrib1bv(GLuint index, const GLbyte *v) +{ +      _glapi_Dispatch->VertexAttrib1fNV(index, v[0]); +} + +static void VertexAttrib2Nbv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, BYTE_TO_FLOAT(v[0]), +                                     BYTE_TO_FLOAT(v[1])); +} + +static void VertexAttrib2bv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]); +} + +static void VertexAttrib3Nbv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, BYTE_TO_FLOAT(v[0]), +                                     BYTE_TO_FLOAT(v[1]), +                                     BYTE_TO_FLOAT(v[2])); +} + +static void VertexAttrib3bv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]); +} + +static void VertexAttrib4Nbv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, BYTE_TO_FLOAT(v[0]), +                                     BYTE_TO_FLOAT(v[1]), +                                     BYTE_TO_FLOAT(v[2]), +                                     BYTE_TO_FLOAT(v[3])); +} + +static void VertexAttrib4bv(GLuint index, const GLbyte *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); +} + +/* GL_UNSIGNED_BYTE attributes */ + +static void VertexAttrib1Nubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, UBYTE_TO_FLOAT(v[0])); +} + +static void VertexAttrib1ubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]); +} + +static void VertexAttrib2Nubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, UBYTE_TO_FLOAT(v[0]), +                                     UBYTE_TO_FLOAT(v[1])); +} + +static void VertexAttrib2ubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]); +} + +static void VertexAttrib3Nubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, UBYTE_TO_FLOAT(v[0]), +                                     UBYTE_TO_FLOAT(v[1]), +                                     UBYTE_TO_FLOAT(v[2])); +} +static void VertexAttrib3ubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]); +} + +static void VertexAttrib4Nubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, UBYTE_TO_FLOAT(v[0]), +                                     UBYTE_TO_FLOAT(v[1]), +                                     UBYTE_TO_FLOAT(v[2]), +                                     UBYTE_TO_FLOAT(v[3])); +} + +static void VertexAttrib4ubv(GLuint index, const GLubyte *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); +} + +/* GL_SHORT attributes */ + +static void VertexAttrib1Nsv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, SHORT_TO_FLOAT(v[0])); +} + +static void VertexAttrib1sv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]); +} + +static void VertexAttrib2Nsv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, SHORT_TO_FLOAT(v[0]), +                                     SHORT_TO_FLOAT(v[1])); +} + +static void VertexAttrib2sv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]); +} + +static void VertexAttrib3Nsv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, SHORT_TO_FLOAT(v[0]), +                                     SHORT_TO_FLOAT(v[1]), +                                     SHORT_TO_FLOAT(v[2])); +} + +static void VertexAttrib3sv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]); +} + +static void VertexAttrib4Nsv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, SHORT_TO_FLOAT(v[0]), +                                     SHORT_TO_FLOAT(v[1]), +                                     SHORT_TO_FLOAT(v[2]), +                                     SHORT_TO_FLOAT(v[3])); +} + +static void VertexAttrib4sv(GLuint index, const GLshort *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); +} + +/* GL_UNSIGNED_SHORT attributes */ + +static void VertexAttrib1Nusv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, USHORT_TO_FLOAT(v[0])); +} + +static void VertexAttrib1usv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]); +} + +static void VertexAttrib2Nusv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, USHORT_TO_FLOAT(v[0]), +                                     USHORT_TO_FLOAT(v[1])); +} + +static void VertexAttrib2usv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]); +} + +static void VertexAttrib3Nusv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, USHORT_TO_FLOAT(v[0]), +                                     USHORT_TO_FLOAT(v[1]), +                                     USHORT_TO_FLOAT(v[2])); +} + +static void VertexAttrib3usv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]); +} + +static void VertexAttrib4Nusv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, USHORT_TO_FLOAT(v[0]), +                                     USHORT_TO_FLOAT(v[1]), +                                     USHORT_TO_FLOAT(v[2]), +                                     USHORT_TO_FLOAT(v[3])); +} + +static void VertexAttrib4usv(GLuint index, const GLushort *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); +} + +/* GL_INT attributes */ + +static void VertexAttrib1Niv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, INT_TO_FLOAT(v[0])); +} + +static void VertexAttrib1iv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]); +} + +static void VertexAttrib2Niv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, INT_TO_FLOAT(v[0]), +                                     INT_TO_FLOAT(v[1])); +} + +static void VertexAttrib2iv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]); +} + +static void VertexAttrib3Niv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, INT_TO_FLOAT(v[0]), +                                     INT_TO_FLOAT(v[1]), +                                     INT_TO_FLOAT(v[2])); +} + +static void VertexAttrib3iv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]); +} + +static void VertexAttrib4Niv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, INT_TO_FLOAT(v[0]), +                                     INT_TO_FLOAT(v[1]), +                                     INT_TO_FLOAT(v[2]), +                                     INT_TO_FLOAT(v[3])); +} + +static void VertexAttrib4iv(GLuint index, const GLint *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); +} + +/* GL_UNSIGNED_INT attributes */ + +static void VertexAttrib1Nuiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, UINT_TO_FLOAT(v[0])); +} + +static void VertexAttrib1uiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]); +} + +static void VertexAttrib2Nuiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, UINT_TO_FLOAT(v[0]), +                                     UINT_TO_FLOAT(v[1])); +} + +static void VertexAttrib2uiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]); +} + +static void VertexAttrib3Nuiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, UINT_TO_FLOAT(v[0]), +                                     UINT_TO_FLOAT(v[1]), +                                     UINT_TO_FLOAT(v[2])); +} + +static void VertexAttrib3uiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]); +} + +static void VertexAttrib4Nuiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, UINT_TO_FLOAT(v[0]), +                                     UINT_TO_FLOAT(v[1]), +                                     UINT_TO_FLOAT(v[2]), +                                     UINT_TO_FLOAT(v[3])); +} + +static void VertexAttrib4uiv(GLuint index, const GLuint *v) +{ +   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); +} + +/* GL_FLOAT attributes */ + +static void VertexAttrib1fv(GLuint index, const GLfloat *v) +{ +   _glapi_Dispatch->VertexAttrib1fvNV(index, v); +} + +static void VertexAttrib2fv(GLuint index, const GLfloat *v) +{ +   _glapi_Dispatch->VertexAttrib2fvNV(index, v); +} + +static void VertexAttrib3fv(GLuint index, const GLfloat *v) +{ +   _glapi_Dispatch->VertexAttrib3fvNV(index, v); +} + +static void VertexAttrib4fv(GLuint index, const GLfloat *v) +{ +   _glapi_Dispatch->VertexAttrib4fvNV(index, v); +} + +/* GL_DOUBLE attributes */ + +static void VertexAttrib1dv(GLuint index, const GLdouble *v) +{ +   _glapi_Dispatch->VertexAttrib1dvNV(index, v); +} + +static void VertexAttrib2dv(GLuint index, const GLdouble *v) +{ +   _glapi_Dispatch->VertexAttrib2dvNV(index, v); +} + +static void VertexAttrib3dv(GLuint index, const GLdouble *v) +{ +   _glapi_Dispatch->VertexAttrib3dvNV(index, v); +} + +static void VertexAttrib4dv(GLuint index, const GLdouble *v) +{ +   _glapi_Dispatch->VertexAttrib4dvNV(index, v); +} + + +/* + * Array [size][type] of VertexAttrib functions + */ +static void (GLAPIENTRY *attribfuncs[2][4][8])( GLuint, const void * ) = { +   { +      /* non-normalized */ +      { +         /* size 1 */ +         (attrib_func) VertexAttrib1bv, +         (attrib_func) VertexAttrib1ubv, +         (attrib_func) VertexAttrib1sv, +         (attrib_func) VertexAttrib1usv, +         (attrib_func) VertexAttrib1iv, +         (attrib_func) VertexAttrib1uiv, +         (attrib_func) VertexAttrib1fv, +         (attrib_func) VertexAttrib1dv +      }, +      { +         /* size 2 */ +         (attrib_func) VertexAttrib2bv, +         (attrib_func) VertexAttrib2ubv, +         (attrib_func) VertexAttrib2sv, +         (attrib_func) VertexAttrib2usv, +         (attrib_func) VertexAttrib2iv, +         (attrib_func) VertexAttrib2uiv, +         (attrib_func) VertexAttrib2fv, +         (attrib_func) VertexAttrib2dv +      }, +      { +         /* size 3 */ +         (attrib_func) VertexAttrib3bv, +         (attrib_func) VertexAttrib3ubv, +         (attrib_func) VertexAttrib3sv, +         (attrib_func) VertexAttrib3usv, +         (attrib_func) VertexAttrib3iv, +         (attrib_func) VertexAttrib3uiv, +         (attrib_func) VertexAttrib3fv, +         (attrib_func) VertexAttrib3dv +      }, +      { +         /* size 4 */ +         (attrib_func) VertexAttrib4bv, +         (attrib_func) VertexAttrib4ubv, +         (attrib_func) VertexAttrib4sv, +         (attrib_func) VertexAttrib4usv, +         (attrib_func) VertexAttrib4iv, +         (attrib_func) VertexAttrib4uiv, +         (attrib_func) VertexAttrib4fv, +         (attrib_func) VertexAttrib4dv +      } +   }, +   { +      /* normalized (except for float/double) */ +      { +         /* size 1 */ +         (attrib_func) VertexAttrib1Nbv, +         (attrib_func) VertexAttrib1Nubv, +         (attrib_func) VertexAttrib1Nsv, +         (attrib_func) VertexAttrib1Nusv, +         (attrib_func) VertexAttrib1Niv, +         (attrib_func) VertexAttrib1Nuiv, +         (attrib_func) VertexAttrib1fv, +         (attrib_func) VertexAttrib1dv +      }, +      { +         /* size 2 */ +         (attrib_func) VertexAttrib2Nbv, +         (attrib_func) VertexAttrib2Nubv, +         (attrib_func) VertexAttrib2Nsv, +         (attrib_func) VertexAttrib2Nusv, +         (attrib_func) VertexAttrib2Niv, +         (attrib_func) VertexAttrib2Nuiv, +         (attrib_func) VertexAttrib2fv, +         (attrib_func) VertexAttrib2dv +      }, +      { +         /* size 3 */ +         (attrib_func) VertexAttrib3Nbv, +         (attrib_func) VertexAttrib3Nubv, +         (attrib_func) VertexAttrib3Nsv, +         (attrib_func) VertexAttrib3Nusv, +         (attrib_func) VertexAttrib3Niv, +         (attrib_func) VertexAttrib3Nuiv, +         (attrib_func) VertexAttrib3fv, +         (attrib_func) VertexAttrib3dv +      }, +      { +         /* size 4 */ +         (attrib_func) VertexAttrib4Nbv, +         (attrib_func) VertexAttrib4Nubv, +         (attrib_func) VertexAttrib4Nsv, +         (attrib_func) VertexAttrib4Nusv, +         (attrib_func) VertexAttrib4Niv, +         (attrib_func) VertexAttrib4Nuiv, +         (attrib_func) VertexAttrib4fv, +         (attrib_func) VertexAttrib4dv +      } +   } +}; + +/**********************************************************************/ +  GLboolean _ae_create_context( GLcontext *ctx )  { @@ -271,68 +673,124 @@ void _ae_destroy_context( GLcontext *ctx )  } +/** + * Make a list of per-vertex functions to call for each glArrayElement call. + * These functions access the array data (i.e. glVertex, glColor, glNormal, etc); + */  static void _ae_update_state( GLcontext *ctx )  {     AEcontext *actx = AE_CONTEXT(ctx); -   AEtexarray *ta = actx->texarrays;     AEarray *aa = actx->arrays; +   AEattrib *at = actx->attribs;     GLuint i; -   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) -      if (ctx->Array.TexCoord[i].Enabled) { -	 ta->unit = i; -	 ta->array = &ctx->Array.TexCoord[i]; -	 ta->func = multitexfuncs[ta->array->Size-1][TYPE_IDX(ta->array->Type)]; -	 ta++; -      } - -   ta->func = 0; - -   if (ctx->Array.Color.Enabled) { -      aa->array = &ctx->Array.Color; -      aa->func = colorfuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; -      aa++; -   } - -   if (ctx->Array.Normal.Enabled) { -      aa->array = &ctx->Array.Normal; -      aa->func = normalfuncs[TYPE_IDX(aa->array->Type)]; -      aa++; -   } - +   /* yuck, no generic array to correspond to color index or edge flag */     if (ctx->Array.Index.Enabled) {        aa->array = &ctx->Array.Index;        aa->func = indexfuncs[TYPE_IDX(aa->array->Type)];        aa++;     } -     if (ctx->Array.EdgeFlag.Enabled) {        aa->array = &ctx->Array.EdgeFlag; -      aa->func = (array_func)glEdgeFlagv; +      aa->func = (array_func) glEdgeFlagv;        aa++;     } -   if (ctx->Array.FogCoord.Enabled) { -      aa->array = &ctx->Array.FogCoord; -      aa->func = fogcoordfuncs[TYPE_IDX(aa->array->Type)]; -      aa++; -   } +   /* all other arrays handled here */ +   for (i = 0; i < VERT_ATTRIB_MAX; i++) { +      /* Note: we count down to zero so glVertex (attrib 0) is last!!! */ +      const GLuint index = VERT_ATTRIB_MAX - i - 1; +      struct gl_client_array *attribArray = NULL; -   if (ctx->Array.SecondaryColor.Enabled) { -      aa->array = &ctx->Array.SecondaryColor; -      aa->func = secondarycolorfuncs[TYPE_IDX(aa->array->Type)]; -      aa++; -   } +      /* Generic arrays take priority over conventional arrays if vertex program +       * mode is enabled. +       */ +      if (ctx->VertexProgram.Enabled +          && ctx->Array.VertexAttrib[index].Enabled) { +         if (index == 0) { +            /* Special case: use glVertex() for vertex position so +             * that it's always executed last. +             */ +            aa->array = &ctx->Array.VertexAttrib[0]; +            aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; +            aa++; +         } +         else { +            attribArray = &ctx->Array.VertexAttrib[index]; +         } +      } +      else { +         switch (index) { +         case VERT_ATTRIB_POS: +            if (ctx->Array.Vertex.Enabled) { +               aa->array = &ctx->Array.Vertex; +               aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; +               aa++; +            } +            break; +         case VERT_ATTRIB_NORMAL: +            if (ctx->Array.Normal.Enabled) { +               aa->array = &ctx->Array.Normal; +               aa->func = normalfuncs[TYPE_IDX(aa->array->Type)]; +               aa++; +            } +            break; +         case VERT_ATTRIB_COLOR0: +            if (ctx->Array.Color.Enabled) { +               aa->array = &ctx->Array.Color; +               aa->func = colorfuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; +               aa++; +            } +            break; +         case VERT_ATTRIB_COLOR1: +            if (ctx->Array.SecondaryColor.Enabled) { +               aa->array = &ctx->Array.SecondaryColor; +               aa->func = secondarycolorfuncs[TYPE_IDX(aa->array->Type)]; +               aa++; +            } +            break; +         case VERT_ATTRIB_FOG: +            if (ctx->Array.FogCoord.Enabled) { +               aa->array = &ctx->Array.FogCoord; +               aa->func = fogcoordfuncs[TYPE_IDX(aa->array->Type)]; +               aa++; +            } +            break; +         case VERT_ATTRIB_TEX0: +         case VERT_ATTRIB_TEX1: +         case VERT_ATTRIB_TEX2: +         case VERT_ATTRIB_TEX3: +         case VERT_ATTRIB_TEX4: +         case VERT_ATTRIB_TEX5: +         case VERT_ATTRIB_TEX6: +         case VERT_ATTRIB_TEX7: +            /* use generic vertex attribs for texcoords */ +            if (ctx->Array.TexCoord[index - VERT_ATTRIB_TEX0].Enabled) { +               attribArray = &ctx->Array.TexCoord[index - VERT_ATTRIB_TEX0]; +            } +         default: +            /* nothing */; +         } +      } -   /* Must be last -    */ -   if (ctx->Array.Vertex.Enabled) { -      aa->array = &ctx->Array.Vertex; -      aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; -      aa++; +      /* Save glVertexAttrib call (may be for glMultiTexCoord) */ +      if (attribArray) { +         at->array = attribArray; +         /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV +          * function pointer here (for float arrays) since the pointer may +          * change from one execution of _ae_loopback_array_elt() to +          * the next.  Doing so caused UT to break. +          */ +         at->func = attribfuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)]; +         at->index = index; +         at++; +      }     } +   ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX); +   ASSERT(aa - actx->arrays < 32); +   at->func = NULL;  /* terminate the list */ +   aa->func = NULL;  /* terminate the list */ -   aa->func = 0;     actx->NewState = 0;  } @@ -340,26 +798,26 @@ static void _ae_update_state( GLcontext *ctx )  void GLAPIENTRY _ae_loopback_array_elt( GLint elt )  {     GET_CURRENT_CONTEXT(ctx); -   AEcontext *actx = AE_CONTEXT(ctx); -   AEtexarray *ta; -   AEarray *aa; +   const AEcontext *actx = AE_CONTEXT(ctx); +   const AEarray *aa; +   const AEattrib *at;     if (actx->NewState)        _ae_update_state( ctx ); -   for (ta = actx->texarrays ; ta->func ; ta++) { -      GLubyte *src = ta->array->BufferObj->Data -                   + (GLuint) ta->array->Ptr -                   + elt * ta->array->StrideB; -      ta->func( ta->unit + GL_TEXTURE0_ARB, src); +   /* generic attributes */ +   for (at = actx->attribs; at->func; at++) { +      const GLubyte *src = at->array->BufferObj->Data +                         + (GLuint) at->array->Ptr +                         + elt * at->array->StrideB; +      at->func( at->index, src );     } -   /* Must be last -    */ -   for (aa = actx->arrays ; aa->func ; aa++) { -      GLubyte *src = aa->array->BufferObj->Data -                   + (GLuint) aa->array->Ptr -                   + elt * aa->array->StrideB; +   /* conventional arrays */ +   for (aa = actx->arrays; aa->func ; aa++) { +      const GLubyte *src = aa->array->BufferObj->Data +                         + (GLuint) aa->array->Ptr +                         + elt * aa->array->StrideB;        aa->func( src );     }  } | 
