fragment program execution
[mesa.git] / src / mesa / tnl / t_imm_fixup.c
index d08c162efef61a9abe26cbb95d31b2ce1c58dd77..fbbac432a37f26d96627e3196b01d310377b1a2e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_imm_fixup.c,v 1.33 2002/01/22 14:35:16 brianp Exp $ */
+/* $Id: t_imm_fixup.c,v 1.39 2002/10/29 20:29:03 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -26,7 +26,7 @@
 
 /*
  * Authors:
- *    Keith Whitwell <keithw@valinux.com>
+ *    Keith Whitwell <keith@tungstengraphics.com>
  */
 
 
@@ -37,7 +37,7 @@
 #include "colormac.h"
 #include "light.h"
 #include "macros.h"
-#include "mem.h"
+#include "imports.h"
 #include "mmath.h"
 #include "state.h"
 #include "mtypes.h"
@@ -78,7 +78,7 @@ _tnl_fixup_3f( float data[][3], GLuint flag[], GLuint start, GLuint match )
 
    for (;;) {
       if ((flag[++i] & match) == 0) {
-/*      fprintf(stderr, "_tnl_fixup_3f copy to %p values %f %f %f\n", */
+/*      _mesa_debug(NULL, "_tnl_fixup_3f copy to %p values %f %f %f\n", */
 /*              data[i],  */
 /*              data[i-1][0], */
 /*              data[i-1][1], */
@@ -153,7 +153,7 @@ fixup_first_3f( GLfloat data[][3], GLuint flag[], GLuint match,
    GLuint i = start-1;
    match |= VERT_BIT_END_VB;
 
-/*     fprintf(stderr, "fixup_first_3f default: %f %f %f start: %d\n", */
+/*     _mesa_debug(NULL, "fixup_first_3f default: %f %f %f start: %d\n", */
 /*        dflt[0], dflt[1], dflt[2], start);  */
 
    while ((flag[++i]&match) == 0)
@@ -260,7 +260,7 @@ void _tnl_fixup_input( GLcontext *ctx, struct immediate *IM )
 
    IM->CopyTexSize = IM->TexSize;
 
-/*     fprintf(stderr, "Fixup input, Start: %u Count: %u LastData: %u\n", */
+/*     _mesa_debug(ctx, "Fixup input, Start: %u Count: %u LastData: %u\n", */
 /*        IM->Start, IM->Count, IM->LastData); */
 /*     _tnl_print_vert_flags("Orflag", orflag); */
 /*     _tnl_print_vert_flags("Andflag", andflag); */
@@ -386,6 +386,7 @@ void _tnl_fixup_input( GLcontext *ctx, struct immediate *IM )
                                    vulnerable );
 
 
+       ++i;
       } while (vulnerable);
    }
 }
@@ -396,6 +397,8 @@ copy_material( struct immediate *next,
                struct immediate *prev,
                GLuint dst, GLuint src )
 {
+/*     _mesa_debug(NULL, "%s\n", __FUNCTION__); */
+
    if (next->Material == 0) {
       next->Material = (struct gl_material (*)[2])
          MALLOC( sizeof(struct gl_material) * IMM_SIZE * 2 );
@@ -461,8 +464,9 @@ void _tnl_copy_immediate_vertices( GLcontext *ctx, struct immediate *next )
         GLuint dst = next->CopyStart+i;
         next->Elt[dst] = prev->Elt[src];
         next->Flag[dst] = VERT_BIT_ELT;
+        elts[i+offset] = dst;
       }
-/*        fprintf(stderr, "ADDING VERT_BIT_ELT!\n"); */
+/*        _mesa_debug(ctx, "ADDING VERT_BIT_ELT!\n"); */
       next->CopyOrFlag |= VERT_BIT_ELT;
       next->CopyAndFlag &= VERT_BIT_ELT;
    }
@@ -505,7 +509,7 @@ void _tnl_copy_immediate_vertices( GLcontext *ctx, struct immediate *next )
                    inputs->Obj.data[isrc] );
 
         if (copy & VERT_BIT_NORMAL) {
-/*         fprintf(stderr, "copy vert norm %d to %d (%p): %f %f %f\n", */
+/*         _mesa_debug(ctx, "copy vert norm %d to %d (%p): %f %f %f\n", */
 /*                 isrc, dst,  */
 /*                 next->Normal[dst], */
 /*                 inputs->Normal.data[isrc][0], */
@@ -551,14 +555,14 @@ void _tnl_copy_immediate_vertices( GLcontext *ctx, struct immediate *next )
         next->CopyOrFlag |= prev->Flag[src] & (VERT_BITS_FIXUP|
                                                VERT_BIT_MATERIAL|
                                                VERT_BIT_POS);
+        elts[i+offset] = dst;
       }
    }
 
-   if (--tnl->ExecCopySource->ref_count == 0)
-      _tnl_free_immediate( tnl->ExecCopySource );
-
-   tnl->ExecCopySource = 0;
-   tnl->ExecCopyCount = 0;
+   if (--tnl->ExecCopySource->ref_count == 0) 
+      _tnl_free_immediate( ctx, tnl->ExecCopySource );
+  
+   tnl->ExecCopySource = next; next->ref_count++;
 }
 
 
@@ -574,7 +578,7 @@ void _tnl_fixup_compiled_cassette( GLcontext *ctx, struct immediate *IM )
    GLuint fixup;
    GLuint start = IM->Start;
 
-/*     fprintf(stderr, "%s\n", __FUNCTION__); */
+/*     _mesa_debug(ctx, "%s\n", __FUNCTION__); */
 
    IM->Evaluated = 0;
    IM->CopyOrFlag = IM->OrFlag;          
@@ -677,6 +681,7 @@ void _tnl_fixup_compiled_cassette( GLcontext *ctx, struct immediate *IM )
                                    vulnerable );
 
 
+        ++i;
       } while (vulnerable);
    }
 }
@@ -763,20 +768,22 @@ _tnl_get_exec_copy_verts( GLcontext *ctx, struct immediate *IM )
    GLuint pintro = intro[prim];
    GLuint ovf = 0;
 
-/*     fprintf(stderr, "_tnl_get_exec_copy_verts %s\n",  */
+/*     _mesa_debug(ctx, "_tnl_get_exec_copy_verts %s\n",  */
 /*        _mesa_lookup_enum_by_nr(prim)); */
 
-   ASSERT(tnl->ExecCopySource == 0);
+   if (tnl->ExecCopySource)
+      if (--tnl->ExecCopySource->ref_count == 0) 
+        _tnl_free_immediate( ctx, tnl->ExecCopySource );
 
    if (prim == GL_POLYGON+1) {
+      tnl->ExecCopySource = 0;
       tnl->ExecCopyCount = 0;
       tnl->ExecCopyTexSize = 0;
       tnl->ExecParity = 0;
    } else {
       /* Remember this immediate as the one to copy from.
        */
-      IM->ref_count++;
-      tnl->ExecCopySource = IM;
+      tnl->ExecCopySource = IM; IM->ref_count++;
       tnl->ExecCopyCount = 0;
       tnl->ExecCopyTexSize = IM->CopyTexSize;