mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 23:40:10 +01:00
restore normal length optimization in dlists
This commit is contained in:
parent
206eda8b69
commit
47a28c0b4d
9 changed files with 101 additions and 21 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue