restore normal length optimization in dlists
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 28 Jun 2001 17:34:14 +0000 (17:34 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 28 Jun 2001 17:34:14 +0000 (17:34 +0000)
src/mesa/math/m_norm_tmp.h
src/mesa/tnl/t_context.c
src/mesa/tnl/t_context.h
src/mesa/tnl/t_imm_alloc.c
src/mesa/tnl/t_imm_dlist.c
src/mesa/tnl/t_imm_exec.c
src/mesa/tnl/t_imm_fixup.c
src/mesa/tnl/t_vb_normals.c
src/mesa/tnl/tnl.h

index bab84d24f572fdcf0440b74886c9b570c1df43a2..cc5ff00b3de9e2b11b69673aa945a5725327053f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: m_norm_tmp.h,v 1.7 2001/03/30 14:44:43 gareth Exp $ */
+/* $Id: m_norm_tmp.h,v 1.8 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -140,13 +140,9 @@ TAG(transform_normalize_normals_no_rot)( const GLmatrix *mat,
       }
    }
    else {
-      /* scale has been snapped to 1.0 if it is close.
-       */
-      if (scale != 1.0) {
-        m0 *= scale;
-        m5 *= scale;
-        m10 *= scale;
-      }
+      m0 *= scale;
+      m5 *= scale;
+      m10 *= scale;
 
       STRIDE_LOOP {
         GLfloat tx, ty, tz;
index e842bd14224d447c88618ab359fb16cb8adeaf4c..0acb9f9db20bac2dbc460b5ff3554651afe4c3a6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_context.c,v 1.19 2001/06/04 16:09:28 keithw Exp $ */
+/* $Id: t_context.c,v 1.20 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -104,6 +104,7 @@ _tnl_CreateContext( GLcontext *ctx )
 
    tnl->NeedProjCoords = GL_TRUE;
    tnl->LoopbackDListCassettes = GL_FALSE;
+   tnl->CalcDListNormalLengths = GL_TRUE;
 
    /* Hook our functions into exec and compile dispatch tables.
     */
@@ -222,3 +223,12 @@ _tnl_need_dlist_loopback( GLcontext *ctx, GLboolean mode )
       tnl->LoopbackDListCassettes = mode;
    }
 }
+
+void
+_tnl_need_dlist_norm_lengths( GLcontext *ctx, GLboolean mode )
+{
+   TNLcontext *tnl = TNL_CONTEXT(ctx);
+   if (tnl->CalcDListNormalLengths != mode) {
+      tnl->CalcDListNormalLengths = mode;
+   }
+}
index 226b877d8525d705b6edf6fd996ce05478ab2375..a7ecb346b708ba9b3c1383d65c3a9eac50c6b445 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_context.h,v 1.28 2001/06/04 16:09:28 keithw Exp $ */
+/* $Id: t_context.h,v 1.29 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -207,6 +207,7 @@ struct immediate
    GLfloat Color[IMM_SIZE][4];
    GLfloat Obj[IMM_SIZE][4];
    GLfloat Normal[IMM_SIZE][3];
+   GLfloat *NormalLengthPtr;
    GLfloat TexCoord0[IMM_SIZE][4];  /* just VERT_TEX0 */
    GLuint  Elt[IMM_SIZE];
    GLubyte EdgeFlag[IMM_SIZE];
@@ -256,6 +257,7 @@ typedef struct vertex_buffer
    GLubyte     ClipOrMask;                     /* VERT_CLIP (3) */
    GLubyte     *ClipMask;                      /* VERT_CLIP (4) */
    GLvector3f  *NormalPtr;                     /* VERT_NORM */
+   GLfloat     *NormalLengthPtr;               /* VERT_NORM */
    GLboolean   *EdgeFlag;                      /* VERT_EDGE */
    GLvector4f  *TexCoordPtr[MAX_TEXTURE_UNITS];        /* VERT_TEX_0..n */
    GLvector1ui *IndexPtr[2];                   /* VERT_INDEX */
@@ -525,6 +527,7 @@ typedef struct {
     */
    GLboolean NeedProjCoords;
    GLboolean LoopbackDListCassettes;
+   GLboolean CalcDListNormalLengths;
 
    /* Derived state and storage for _tnl_eval_vb:
     */
index 22bdb7a7bb343e08688f6b49fa7bd6e29c1277b4..5cf0d1ea14221a816ee48afde828ac59a1d4264e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_imm_alloc.c,v 1.8 2001/05/09 13:53:36 keithw Exp $ */
+/* $Id: t_imm_alloc.c,v 1.9 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -57,6 +57,7 @@ static struct immediate *real_alloc_immediate( GLcontext *ctx )
    IM->MaterialMask = 0;
    IM->MaxTextureUnits = ctx->Const.MaxTextureUnits;
    IM->TexSize = 0;
+   IM->NormalLengthPtr = 0;
 
    IM->CopyTexSize = 0;
    IM->CopyStart = IM->Start;
@@ -96,6 +97,8 @@ static void real_free_immediate( struct immediate *IM )
    for (j = 1; j < IM->MaxTextureUnits; j++)
       ALIGN_FREE( IM->TexCoord[j] );
 
+   if (IM->NormalLengthPtr)
+      ALIGN_FREE( IM->NormalLengthPtr );
 
    ALIGN_FREE( IM );
    freed++;
index 722d67b143562f502bd0649b0c0a7cc00b424c73..9c22ed3e7b7399799062ebc298e1a796d5810a3b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_imm_dlist.c,v 1.20 2001/06/04 16:09:28 keithw Exp $ */
+/* $Id: t_imm_dlist.c,v 1.21 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -66,6 +66,55 @@ static void execute_compiled_cassette( GLcontext *ctx, void *data );
 static void loopback_compiled_cassette( GLcontext *ctx, struct immediate *IM );
 
 
+static void build_normal_lengths( struct immediate *IM )
+{
+   GLuint i;
+   GLfloat len;
+   GLfloat (*data)[3] = IM->Normal + IM->Start;
+   GLfloat *dest = IM->NormalLengthPtr;
+   GLuint *flags = IM->Flag + IM->Start;
+   GLuint count = IM->Count - IM->Start;
+
+   if (!dest) {
+      dest = IM->NormalLengthPtr = ALIGN_MALLOC( IMM_SIZE*sizeof(GLfloat), 32 );
+      if (!dest) return;
+   }
+   dest += IM->Start;
+
+   len = (GLfloat) LEN_3FV( data[0] );
+   if (len > 0.0) len = 1.0/len;
+   
+   for (i = 0 ; i < count ; ) {
+      dest[i] = len;
+      if (flags[++i] & VERT_NORM) {
+        len = (GLfloat) LEN_3FV( data[i] );
+        if (len > 0.0) len = 1.0/len;
+      }
+   } 
+}
+
+static void fixup_normal_lengths( struct immediate *IM ) 
+{
+   GLuint i;
+   GLfloat len;
+   GLfloat (*data)[3] = IM->Normal;
+   GLfloat *dest = IM->NormalLengthPtr;
+   GLuint *flags = IM->Flag;
+
+   for (i = IM->CopyStart ; i <= IM->Start ; i++) {
+      len = (GLfloat) LEN_3FV( data[i] );
+      if (len > 0.0) len = 1.0/len;
+      dest[i] = len;
+   } 
+
+   while (!(flags[i] & (VERT_NORM|VERT_END_VB))) {
+      dest[i] = len;
+      i++;
+   }
+}
+
+
+
 /* Insert the active immediate struct onto the display list currently
  * being built.
  */
@@ -84,14 +133,14 @@ _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM )
 
    _tnl_compute_orflag( IM, IM->Start );
 
-   /* Need to clear this flag, or fixup gets confused.  (The elements
-    * have been translated away by now.)  
+   /* Need to clear this flag, or fixup gets confused.  (The
+    * array-elements have been translated away by now, so it's ok to
+    * remove it.)
     */
    IM->OrFlag &= ~VERT_ELT;    
    IM->AndFlag &= ~VERT_ELT;   
 
    _tnl_fixup_input( ctx, IM );
-/*     _tnl_print_cassette( IM ); */
 
    node = (TNLvertexcassette *)
       _mesa_alloc_instruction(ctx,
@@ -113,6 +162,10 @@ _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM )
    node->LastMaterial = im->LastMaterial;
    node->MaterialOrMask = im->MaterialOrMask;
    node->MaterialAndMask = im->MaterialAndMask;
+   
+   if (tnl->CalcDListNormalLengths) {
+      build_normal_lengths( im );
+   }
 
    if (ctx->ExecuteFlag) {
       execute_compiled_cassette( ctx, (void *)node );
@@ -308,6 +361,10 @@ execute_compiled_cassette( GLcontext *ctx, void *data )
            IM->Primitive[IM->LastPrimitive] & PRIM_MODE_MASK;
 
       _tnl_get_exec_copy_verts( ctx, IM );
+
+      if (IM->NormalLengthPtr) 
+        fixup_normal_lengths( IM );
+      
       _tnl_run_cassette( ctx, IM );
 
       restore_compiled_primitives( ctx, IM );
@@ -365,6 +422,7 @@ _tnl_BeginCallList( GLcontext *ctx, GLuint list )
 void
 _tnl_EndCallList( GLcontext *ctx )
 {
+   (void) ctx;
 }
 
 
index 37dd1597a54de57dd1cfce582c75b453ba9a7214..547af43a3970461b501d8f7caa84108419ed8cfc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_imm_exec.c,v 1.26 2001/05/16 09:28:32 keithw Exp $ */
+/* $Id: t_imm_exec.c,v 1.27 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -244,6 +244,7 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM )
    /* TexCoordPtr's are zeroed in loop below.
     */
    VB->NormalPtr = 0;
+   VB->NormalLengthPtr = 0;
    VB->FogCoordPtr = 0;
    VB->EdgeFlag = 0;
    VB->IndexPtr[0] = 0;
@@ -280,6 +281,8 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM )
       tmp->Normal.start = (GLfloat *)(IM->Normal + start);
       tmp->Normal.count = count;
       VB->NormalPtr = &tmp->Normal;
+      if (IM->NormalLengthPtr)
+        VB->NormalLengthPtr = IM->NormalLengthPtr + start;
    }
 
    if (inputs & VERT_INDEX) {
index 7f6ae40304161ad43c7d9048395ce84ab8b4d02f..0336a9779e88d10da59e37d8c4612a949d761612 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_imm_fixup.c,v 1.21 2001/06/13 14:57:55 brianp Exp $ */
+/* $Id: t_imm_fixup.c,v 1.22 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -505,7 +505,8 @@ void _tnl_copy_immediate_vertices( GLcontext *ctx, struct immediate *next )
 
 /* Revive a compiled immediate struct - propogate new 'Current'
  * values.  Often this is redundant because the current values were
- * known and fixed up at compile time.
+ * known and fixed up at compile time (or in the first execution of
+ * the cassette).
  */
 void _tnl_fixup_compiled_cassette( GLcontext *ctx, struct immediate *IM )
 {
index ce3f0b7b2680c92047582e8f982cbb2bb47bbbda..1a71b13be3291e87b56f53ea0c21f2a1253fb0b1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_vb_normals.c,v 1.8 2001/03/30 14:44:44 gareth Exp $ */
+/* $Id: t_vb_normals.c,v 1.9 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -65,10 +65,11 @@ static GLboolean run_normal_stage( GLcontext *ctx,
       store->NormalTransform( &ctx->ModelView,
                              ctx->_ModelViewInvScale,
                              VB->NormalPtr,
-                             0,
+                             VB->NormalLengthPtr,
                              &store->normal );
 
    VB->NormalPtr = &store->normal;
+   VB->NormalLengthPtr = 0;    /* no longer valid */
    return GL_TRUE;
 }
 
index 413864aba1f78a0970cde14ea631e2273a091db7..16470295f483095d862ba12aead6bb988b2e42b1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: tnl.h,v 1.7 2001/06/04 16:09:28 keithw Exp $ */
+/* $Id: tnl.h,v 1.8 2001/06/28 17:34:14 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -61,10 +61,15 @@ _tnl_wakeup_exec( GLcontext *ctx );
 extern void
 _tnl_wakeup_save_exec( GLcontext *ctx );
 
+/* Driver configuration options:
+ */
 extern void
 _tnl_need_projected_coords( GLcontext *ctx, GLboolean flag );
 
 extern void
 _tnl_need_dlist_loopback( GLcontext *ctx, GLboolean flag );
 
+extern void
+_tnl_need_dlist_norm_lengths( GLcontext *ctx, GLboolean flag );
+
 #endif