Update Visual Studio Project file for src tree updates.
[mesa.git] / src / mesa / tnl / t_vtx_api.c
index 926b277dc9794e2eea7de6375d88c079e5872461..e75ac5b3397963456c3e87b0ada6f8a6a61d9ba1 100644 (file)
@@ -45,8 +45,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 static void reset_attrfv( TNLcontext *tnl );
 
-static attrfv_func choose[_TNL_MAX_ATTR_CODEGEN+1][4]; /* +1 for ERROR_ATTRIB */
-static attrfv_func generic_attr_func[_TNL_MAX_ATTR_CODEGEN][4];
+static tnl_attrfv_func choose[_TNL_MAX_ATTR_CODEGEN+1][4]; /* +1 for ERROR_ATTRIB */
+static tnl_attrfv_func generic_attr_func[_TNL_MAX_ATTR_CODEGEN][4];
 
 
 /* Close off the last primitive, execute the buffer, restart the
@@ -102,8 +102,10 @@ static void _tnl_wrap_buffers( GLcontext *ctx )
 
 /* Deal with buffer wrapping where provoked by the vertex buffer
  * filling up, as opposed to upgrade_vertex().
+ *
+ * Make it GLAPIENTRY, so we can tail from the codegen'ed Vertex*fv
  */
-void _tnl_wrap_filled_vertex( GLcontext *ctx )
+void GLAPIENTRY _tnl_wrap_filled_vertex( GLcontext *ctx )
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    GLfloat *data = tnl->vtx.copied.buffer;
@@ -273,10 +275,15 @@ static void _tnl_wrap_upgrade_vertex( GLcontext *ctx,
         for (j = 0 ; j < _TNL_ATTRIB_MAX ; j++) {
            if (tnl->vtx.attrsz[j]) {
               if (j == attr) {
-                 COPY_SZ_4V( dest, newsz, tnl->vtx.current[j] );
-                 COPY_SZ_4V( dest, oldsz, data );
-                 data += oldsz;
-                 dest += newsz;
+                 if (oldsz) {
+                    ASSIGN_4V( dest, 0, 0, 0, 1 );
+                    COPY_SZ_4V( dest, oldsz, data );
+                    data += oldsz;
+                    dest += newsz;
+                 } else {
+                    COPY_SZ_4V( dest, newsz, tnl->vtx.current[j] );
+                    dest += newsz;
+                 }
               }
               else {
                  GLuint sz = tnl->vtx.attrsz[j];
@@ -327,6 +334,15 @@ static void _tnl_fixup_vertex( GLcontext *ctx, GLuint attr, GLuint sz )
       for (i = sz ; i <= tnl->vtx.attrsz[attr] ; i++)
         tnl->vtx.attrptr[attr][i-1] = id[i-1];
    }
+
+   /* Does setting NeedFlush belong here?  Necessitates resetting
+    * vtxfmt on each flush (otherwise flags won't get reset
+    * afterwards).
+    */
+   if (attr == 0) 
+      ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
+   else 
+      ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
 }
 
 
@@ -343,7 +359,7 @@ static struct _tnl_dynfn *lookup( struct _tnl_dynfn *l, GLuint key )
 }
 
 
-static attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz )
+static tnl_attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz )
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx); 
    struct _tnl_dynfn *dfn = 0;
@@ -366,7 +382,7 @@ static attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz )
    }
 
    if (dfn) 
-      return (attrfv_func) dfn->code;
+      return (tnl_attrfv_func) dfn->code;
    else
       return 0;
 }
@@ -375,7 +391,7 @@ static attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz )
  * entrypoint is called for the first time.
  */
 
-static attrfv_func do_choose( GLuint attr, GLuint sz )
+static tnl_attrfv_func do_choose( GLuint attr, GLuint sz )
 { 
    GET_CURRENT_CONTEXT( ctx ); 
    TNLcontext *tnl = TNL_CONTEXT(ctx); 
@@ -391,19 +407,11 @@ static attrfv_func do_choose( GLuint attr, GLuint sz )
    
       _tnl_fixup_vertex( ctx, attr, sz );
  
-      /* Does setting NeedFlush belong here?  Necessitates resetting
-       * vtxfmt on each flush (otherwise flags won't get reset
-       * afterwards).
-       */
-      if (attr == 0) 
-        ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
-      else 
-        ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
    }
 
 
    /* Try to use codegen:
-    */   
+    */
 #ifdef USE_X86_ASM
    if (tnl->AllowCodegen)
       tnl->vtx.tabfv[attr][sz-1] = do_codegen( ctx, attr, sz );
@@ -424,7 +432,7 @@ static attrfv_func do_choose( GLuint attr, GLuint sz )
 #define CHOOSE( ATTR, N )                              \
 static void choose_##ATTR##_##N( const GLfloat *v )    \
 {                                                      \
-   attrfv_func f = do_choose(ATTR, N);                 \
+   tnl_attrfv_func f = do_choose(ATTR, N);                     \
    f( v );                                             \
 }
 
@@ -473,11 +481,15 @@ static void reset_attrfv( TNLcontext *tnl )
 
    for (i = 0 ; i < _TNL_ATTRIB_MAX ; i++) 
       if (tnl->vtx.attrsz[i]) {
-        GLuint j = tnl->vtx.attrsz[i] - 1;
+        GLint j = tnl->vtx.attrsz[i] - 1;
         tnl->vtx.attrsz[i] = 0;
 
-        if (i < _TNL_MAX_ATTR_CODEGEN)
-           tnl->vtx.tabfv[i][j] = choose[i][j];
+        if (i < _TNL_MAX_ATTR_CODEGEN) {
+            while (j >= 0) {
+              tnl->vtx.tabfv[i][j] = choose[i][j];
+               j--;
+            }
+         }
       }
 
    tnl->vtx.vertex_size = 0;
@@ -511,7 +523,6 @@ do {                                                        \
       if (N>1) dest[1] = (params)[1];                  \
       if (N>2) dest[2] = (params)[2];                  \
       if (N>3) dest[3] = (params)[3];                  \
-      ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;   \
    }                                                   \
 } while (0)
 
@@ -625,7 +636,7 @@ static void GLAPIENTRY _tnl_EvalCoord1f( GLfloat u )
 
       for (i = 0 ; i <= _TNL_ATTRIB_INDEX ; i++) {
         if (tnl->vtx.eval.map1[i].map) 
-           if (tnl->vtx.attrsz[i] < tnl->vtx.eval.map1[i].sz)
+           if (tnl->vtx.attrsz[i] != tnl->vtx.eval.map1[i].sz)
               _tnl_fixup_vertex( ctx, i, tnl->vtx.eval.map1[i].sz );
       }
    }
@@ -653,12 +664,12 @@ static void GLAPIENTRY _tnl_EvalCoord2f( GLfloat u, GLfloat v )
 
       for (i = 0 ; i <= _TNL_ATTRIB_INDEX ; i++) {
         if (tnl->vtx.eval.map2[i].map) 
-           if (tnl->vtx.attrsz[i] < tnl->vtx.eval.map2[i].sz)
+           if (tnl->vtx.attrsz[i] != tnl->vtx.eval.map2[i].sz)
               _tnl_fixup_vertex( ctx, i, tnl->vtx.eval.map2[i].sz );
       }
 
       if (ctx->Eval.AutoNormal) 
-        if (tnl->vtx.attrsz[_TNL_ATTRIB_NORMAL] < 3)
+        if (tnl->vtx.attrsz[_TNL_ATTRIB_NORMAL] != 3)
            _tnl_fixup_vertex( ctx, _TNL_ATTRIB_NORMAL, 3 );
    }
 
@@ -713,21 +724,20 @@ static void GLAPIENTRY _tnl_Begin( GLenum mode )
 {
    GET_CURRENT_CONTEXT( ctx ); 
 
-   if ((ctx->VertexProgram.Enabled
-        && !ctx->VertexProgram.Current->Instructions) ||
-       (ctx->FragmentProgram.Enabled
-        && !ctx->FragmentProgram.Current->Instructions)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glBegin (invalid vertex/fragment program)");
-      return;
-   }
-
    if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) {
       TNLcontext *tnl = TNL_CONTEXT(ctx); 
       int i;
 
       if (ctx->NewState) {
         _mesa_update_state( ctx );
+
+         if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) ||
+            (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glBegin (invalid vertex/fragment program)");
+            return;
+         }
+
         if (!(tnl->Driver.NotifyBegin && 
               tnl->Driver.NotifyBegin( ctx, mode )))
             ctx->Exec->Begin(mode);
@@ -904,7 +914,9 @@ void _tnl_vtx_init( GLcontext *ctx )
       tnl->vtx.gen.Attribute[i] = no_codegen;
    }
 
+#ifdef USE_X86_ASM
    _tnl_InitX86Codegen( &tnl->vtx.gen );
+#endif
 
    _tnl_current_init( ctx );
    _tnl_exec_vtxfmt_init( ctx );