-/* $Id: t_imm_dlist.c,v 1.28 2001/08/02 22:39:51 keithw Exp $ */
+/* $Id: t_imm_dlist.c,v 1.43 2002/10/24 23:57:25 brianp Exp $ */
/*
* Mesa 3-D graphics library
#include "dlist.h"
#include "debug.h"
#include "mmath.h"
-#include "mem.h"
+#include "imports.h"
#include "state.h"
#include "t_context.h"
{
GLuint i;
GLfloat len;
- GLfloat (*data)[3] = IM->Normal + IM->Start;
+ GLfloat (*data)[4] = IM->Attrib[VERT_ATTRIB_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 );
+ dest = IM->NormalLengthPtr = (GLfloat *) 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;
+ if (len > 0.0F) len = 1.0F / len;
for (i = 0 ; i < count ; ) {
dest[i] = len;
- if (flags[++i] & VERT_NORM) {
+ if (flags[++i] & VERT_BIT_NORMAL) {
len = (GLfloat) LEN_3FV( data[i] );
- if (len > 0.0) len = 1.0/len;
+ if (len > 0.0F) len = 1.0F / len;
}
}
}
static void fixup_normal_lengths( struct immediate *IM )
{
GLuint i;
- GLfloat len = 1.0; /* just to silence warnings */
- GLfloat (*data)[3] = IM->Normal;
+ GLfloat len = 1.0F; /* just to silence warnings */
+ GLfloat (*data)[4] = IM->Attrib[VERT_ATTRIB_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;
+ if (len > 0.0F) len = 1.0F / len;
dest[i] = len;
}
if (i < IM->Count) {
- while (!(flags[i] & (VERT_NORM|VERT_END_VB))) {
+ while (!(flags[i] & (VERT_BIT_NORMAL|VERT_BIT_END_VB))) {
dest[i] = len;
i++;
}
TNLvertexcassette *node;
GLuint new_beginstate;
+ if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST)
+ _mesa_debug(ctx, "_tnl_compiled_cassette IM: %d\n", IM->id);
+
if (IM->FlushElt) {
ASSERT (IM->FlushElt == FLUSH_ELT_LAZY);
_tnl_translate_array_elts( ctx, IM, IM->Start, IM->Count );
* array-elements have been translated away by now, so it's ok to
* remove it.)
*/
- IM->OrFlag &= ~VERT_ELT;
- IM->AndFlag &= ~VERT_ELT;
+ IM->OrFlag &= ~VERT_BIT_ELT;
+ IM->AndFlag &= ~VERT_BIT_ELT;
_tnl_fixup_input( ctx, IM );
_mesa_error( ctx, GL_INVALID_OPERATION, "glBegin/glEnd");
for (i = IM->Start ; i <= IM->Count ; i += IM->PrimitiveLength[i])
- if (IM->Flag[i] & (VERT_BEGIN|VERT_END_VB))
+ if (IM->Flag[i] & (VERT_BIT_BEGIN|VERT_BIT_END_VB))
break;
/* Would like to just ignore vertices upto this point. Can't
* set copystart because it might skip materials?
*/
ASSERT(IM->Start == IM->CopyStart);
- if (i > IM->CopyStart) {
+ if (i > IM->CopyStart || !(IM->Flag[IM->Start] & VERT_BIT_BEGIN)) {
IM->Primitive[IM->CopyStart] = GL_POLYGON+1;
IM->PrimitiveLength[IM->CopyStart] = i - IM->CopyStart;
- if (IM->Flag[i] & VERT_END_VB) {
+ if (IM->Flag[i] & VERT_BIT_END_VB) {
IM->Primitive[IM->CopyStart] |= PRIM_LAST;
IM->LastPrimitive = IM->CopyStart;
}
_mesa_error( ctx, GL_INVALID_OPERATION, "glBegin/glEnd");
if (IM->CopyStart == IM->Start &&
- IM->Flag[IM->Start] & (VERT_END|VERT_END_VB))
+ IM->Flag[IM->Start] & (VERT_BIT_END | VERT_BIT_END_VB))
{
}
else
/* one of these should be true, else we'll be in an infinite loop
*/
ASSERT(IM->PrimitiveLength[IM->Start] > 0 ||
- IM->Flag[IM->Start] & (VERT_END|VERT_END_VB));
+ IM->Flag[IM->Start] & (VERT_BIT_END | VERT_BIT_END_VB));
for (i = IM->Start ; i <= IM->Count ; i += IM->PrimitiveLength[i])
- if (IM->Flag[i] & (VERT_END|VERT_END_VB)) {
+ if (IM->Flag[i] & (VERT_BIT_END | VERT_BIT_END_VB)) {
IM->PrimitiveLength[IM->CopyStart] = i - IM->CopyStart;
- if (IM->Flag[i] & VERT_END_VB) {
+ if (IM->Flag[i] & VERT_BIT_END_VB) {
IM->Primitive[IM->CopyStart] |= PRIM_LAST;
IM->LastPrimitive = IM->CopyStart;
}
- if (IM->Flag[i] & VERT_END) {
+ if (IM->Flag[i] & VERT_BIT_END) {
IM->Primitive[IM->CopyStart] |= PRIM_END;
}
break;
TNLvertexcassette *node = (TNLvertexcassette *)data;
struct immediate *IM = node->IM;
-/* fprintf(stderr, "%s\n", __FUNCTION__); */
+/* _mesa_debug("%s\n", __FUNCTION__); */
IM->Start = node->Start;
IM->CopyStart = node->Start;
_tnl_print_cassette( IM );
if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST) {
- fprintf(stderr, "Run cassette %d, rows %d..%d, beginstate %x ",
- IM->id,
- IM->Start, IM->Count, IM->BeginState);
+ _mesa_debug(ctx, "Run cassette %d, rows %d..%d, beginstate %x ",
+ IM->id, IM->Start, IM->Count, IM->BeginState);
_tnl_print_vert_flags("orflag", IM->OrFlag);
}
}
if (tnl->LoopbackDListCassettes) {
+/* (tnl->IsolateMaterials && (IM->OrFlag & VERT_MATERIAL)) ) { */
fixup_compiled_primitives( ctx, IM );
loopback_compiled_cassette( ctx, IM );
restore_compiled_primitives( ctx, IM );
TNLvertexcassette *node = (TNLvertexcassette *)data;
if ( --node->IM->ref_count == 0 )
- _tnl_free_immediate( node->IM );
+ _tnl_free_immediate( ctx, node->IM );
}
TNLvertexcassette *node = (TNLvertexcassette *)data;
struct immediate *IM = node->IM;
- fprintf(stderr, "TNL-VERTEX-CASSETTE, id %u, rows %u..%u\n",
- node->IM->id, node->Start, node->Count);
+ _mesa_debug(ctx, "TNL-VERTEX-CASSETTE, id %u, rows %u..%u\n",
+ node->IM->id, node->Start, node->Count);
IM->Start = node->Start;
IM->CopyStart = node->Start;
}
-/* Called at the tail of a CallList. Nothing to do.
+/* Called at the tail of a CallList. Make current immediate aware of
+ * any new to-be-copied vertices.
*/
void
_tnl_EndCallList( GLcontext *ctx )
{
- (void) ctx;
+ GLuint beginstate = 0;
+
+ if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END)
+ beginstate = VERT_BEGIN_0|VERT_BEGIN_1;
+
+ _tnl_reset_exec_input( ctx, TNL_CURRENT_IM(ctx)->Start, beginstate, 0 );
}
GLuint maxtex = 0;
GLuint p, length, prim = 0;
- if (orflag & VERT_OBJ_234)
+ if (orflag & VERT_BITS_OBJ_234)
vertex = (void (GLAPIENTRY *)(const GLfloat *)) glVertex4fv;
else
vertex = (void (GLAPIENTRY *)(const GLfloat *)) glVertex3fv;
- if (orflag & VERT_TEX_ANY) {
+ if (orflag & VERT_BITS_TEX_ANY) {
for (j = 0 ; j < ctx->Const.MaxTextureUnits ; j++) {
- if (orflag & VERT_TEX(j)) {
+ if (orflag & VERT_BIT_TEX(j)) {
maxtex = j+1;
if ((IM->TexSize & TEX_SIZE_4(j)) == TEX_SIZE_4(j))
texcoordfv[j] = glMultiTexCoord4fvARB;
ASSERT((prim & PRIM_MODE_MASK) <= GL_POLYGON+1);
if (prim & PRIM_BEGIN) {
-/* fprintf(stderr, "begin %s\n", _mesa_prim_name[prim&PRIM_MODE_MASK]); */
glBegin(prim & PRIM_MODE_MASK);
}
for ( i = p ; i <= p+length ; i++) {
- if (flags[i] & VERT_TEX_ANY) {
+ if (flags[i] & VERT_BITS_TEX_ANY) {
GLuint k;
for (k = 0 ; k < maxtex ; k++) {
- if (flags[i] & VERT_TEX(k)) {
- texcoordfv[k]( GL_TEXTURE0_ARB + k, IM->TexCoord[k][i] );
+ if (flags[i] & VERT_BIT_TEX(k)) {
+ texcoordfv[k]( GL_TEXTURE0_ARB + k,
+ IM->Attrib[VERT_ATTRIB_TEX0 + k][i] );
}
}
}
- if (flags[i] & VERT_NORM) {
-/* fprintf(stderr, "normal %d: %f %f %f\n", i, */
-/* IM->Normal[i][0], IM->Normal[i][1], IM->Normal[i][2]); */
- glNormal3fv(IM->Normal[i]);
- }
+ if (flags[i] & VERT_BIT_NORMAL)
+ glNormal3fv(IM->Attrib[VERT_ATTRIB_NORMAL][i]);
- if (flags[i] & VERT_RGBA) {
-/* fprintf(stderr, "color %d: %f %f %f\n", i, */
-/* IM->Color[i][0], IM->Color[i][1], IM->Color[i][2]); */
- glColor4fv( IM->Color[i] );
- }
+ if (flags[i] & VERT_BIT_COLOR0)
+ glColor4fv( IM->Attrib[VERT_ATTRIB_COLOR0][i] );
- if (flags[i] & VERT_SPEC_RGB)
- glSecondaryColor3fvEXT( IM->SecondaryColor[i] );
+ if (flags[i] & VERT_BIT_COLOR1)
+ _glapi_Dispatch->SecondaryColor3fvEXT( IM->Attrib[VERT_ATTRIB_COLOR1][i] );
- if (flags[i] & VERT_FOG_COORD)
- glFogCoordfEXT( IM->FogCoord[i] );
+ if (flags[i] & VERT_BIT_FOG)
+ _glapi_Dispatch->FogCoordfEXT( IM->Attrib[VERT_ATTRIB_FOG][i][0] );
- if (flags[i] & VERT_INDEX)
+ if (flags[i] & VERT_BIT_INDEX)
glIndexi( IM->Index[i] );
- if (flags[i] & VERT_EDGE)
+ if (flags[i] & VERT_BIT_EDGEFLAG)
glEdgeFlag( IM->EdgeFlag[i] );
- if (flags[i] & VERT_MATERIAL)
+ if (flags[i] & VERT_BIT_MATERIAL)
emit_material( IM->Material[i], IM->MaterialMask[i] );
- if (flags[i]&VERT_OBJ_234) {
-/* fprintf(stderr, "vertex %d: %f %f %f\n", i, */
-/* IM->Obj[i][0], IM->Obj[i][1], IM->Obj[i][2]); */
- vertex( IM->Obj[i] );
- }
- else if (flags[i] & VERT_EVAL_C1)
- glEvalCoord1f(IM->Obj[i][0]);
- else if (flags[i] & VERT_EVAL_P1)
- glEvalPoint1(IM->Obj[i][0]);
- else if (flags[i] & VERT_EVAL_C2)
- glEvalCoord2f( IM->Obj[i][0], IM->Obj[i][1]);
- else if (flags[i] & VERT_EVAL_P2)
- glEvalPoint2( IM->Obj[i][0], IM->Obj[i][1]);
+ if (flags[i]&VERT_BITS_OBJ_234)
+ vertex( IM->Attrib[VERT_ATTRIB_POS][i] );
+ else if (flags[i] & VERT_BIT_EVAL_C1)
+ glEvalCoord1f( IM->Attrib[VERT_ATTRIB_POS][i][0] );
+ else if (flags[i] & VERT_BIT_EVAL_P1)
+ glEvalPoint1( (GLint) IM->Attrib[VERT_ATTRIB_POS][i][0] );
+ else if (flags[i] & VERT_BIT_EVAL_C2)
+ glEvalCoord2f( IM->Attrib[VERT_ATTRIB_POS][i][0],
+ IM->Attrib[VERT_ATTRIB_POS][i][1] );
+ else if (flags[i] & VERT_BIT_EVAL_P2)
+ glEvalPoint2( (GLint) IM->Attrib[VERT_ATTRIB_POS][i][0],
+ (GLint) IM->Attrib[VERT_ATTRIB_POS][i][1] );
}
if (prim & PRIM_END) {
-/* fprintf(stderr, "end\n"); */
glEnd();
}
}