-/* $Id: t_context.h,v 1.44 2003/01/14 04:55:47 brianp Exp $ */
+/* $Id: t_context.h,v 1.45 2003/03/28 01:39:04 brianp Exp $ */
/*
* Mesa 3-D graphics library
/**
- * KW: Represents everything that can take place between a begin and
- * end, and can represent multiple begin/end pairs. Can be used to
- * losslessly encode this information in display lists.
+ * Stores everything that can take place between a glBegin and glEnd.
+ * Adjacent glBegin/glEnd pairs are stored back-to-back when there's no
+ * state changes between them.
+ * Used for immediate mode rendering and display lists.
*/
struct immediate
{
* of individual arrays as we did prior to Mesa 4.1.
*
* XXX may need to use 32-byte aligned allocation for this!!!
+ * XXX replace this with GLfloat *Attrib[VERT_ATTRIB_MAX] and allocate
+ * the attribute arrays as needed, so save memory. As is, we're using
+ * 256 bytes per vertex (16 attribs * 4 comps/attrib * 4 bytes/comp).
*/
GLfloat Attrib[VERT_ATTRIB_MAX][IMM_SIZE][4]; /* GL_NV_vertex_program */
GLvector4f TexCoord[MAX_TEXTURE_COORD_UNITS];
GLvector1ui Elt;
GLvector4f FogCoord;
+
+ /* These attributes don't alias with the conventional attributes.
+ * The GL_NV_vertex_program extension defines 16 extra sets of vertex
+ * arrays which have precedent over the conventional arrays when enabled.
+ */
GLvector4f Attribs[VERT_ATTRIB_MAX];
};
-/* $Id: t_imm_alloc.c,v 1.17 2002/10/29 20:29:01 brianp Exp $ */
+/* $Id: t_imm_alloc.c,v 1.18 2003/03/28 01:39:05 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 4.1
+ * Version: 5.1
*
- * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
+ * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
static int id = 0; /* give each struct immediate a unique ID number */
-static struct immediate *real_alloc_immediate( GLcontext *ctx )
+
+static struct immediate *
+real_alloc_immediate( GLcontext *ctx )
{
- struct immediate *IM = ALIGN_CALLOC_STRUCT( immediate, 32 );
+ struct immediate *immed = ALIGN_CALLOC_STRUCT( immediate, 32 );
- if (!IM)
- return 0;
+ printf("Sizeof(struct immed) = %d\n", sizeof(struct immediate));
-/* memset(IM, 0, sizeof(*IM)); */
+ if (!immed)
+ return NULL;
- IM->id = id++;
- IM->ref_count = 0;
- IM->FlushElt = 0;
- IM->LastPrimitive = IMM_MAX_COPIED_VERTS;
- IM->Count = IMM_MAX_COPIED_VERTS;
- IM->Start = IMM_MAX_COPIED_VERTS;
- IM->Material = 0;
- IM->MaterialMask = 0;
- IM->MaxTextureUnits = ctx->Const.MaxTextureUnits;
- IM->TexSize = 0;
- IM->NormalLengthPtr = 0;
+ immed->id = id++;
+ immed->ref_count = 0;
+ immed->FlushElt = 0;
+ immed->LastPrimitive = IMM_MAX_COPIED_VERTS;
+ immed->Count = IMM_MAX_COPIED_VERTS;
+ immed->Start = IMM_MAX_COPIED_VERTS;
+ immed->Material = 0;
+ immed->MaterialMask = 0;
+ immed->MaxTextureUnits = ctx->Const.MaxTextureCoordUnits;
+ immed->TexSize = 0;
+ immed->NormalLengthPtr = 0;
- IM->CopyTexSize = 0;
- IM->CopyStart = IM->Start;
+ immed->CopyTexSize = 0;
+ immed->CopyStart = immed->Start;
- return IM;
+ return immed;
}
-static void real_free_immediate( struct immediate *IM )
+static void
+real_free_immediate( struct immediate *immed )
{
static int freed = 0;
- if (IM->Material) {
- FREE( IM->Material );
- FREE( IM->MaterialMask );
- IM->Material = 0;
- IM->MaterialMask = 0;
+ if (immed->Material) {
+ FREE( immed->Material );
+ FREE( immed->MaterialMask );
+ immed->Material = 0;
+ immed->MaterialMask = 0;
}
- if (IM->NormalLengthPtr)
- ALIGN_FREE( IM->NormalLengthPtr );
+ if (immed->NormalLengthPtr)
+ ALIGN_FREE( immed->NormalLengthPtr );
- ALIGN_FREE( IM );
+ ALIGN_FREE( immed );
freed++;
/* printf("outstanding %d\n", id - freed); */
}
-/* Cache a single allocated immediate struct.
+/**
+ * Return a pointer to a new 'struct immediate' object.
+ * We actually keep a spare/cached one to reduce malloc calls.
*/
-struct immediate *_tnl_alloc_immediate( GLcontext *ctx )
+struct immediate *
+_tnl_alloc_immediate( GLcontext *ctx )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct immediate *tmp = tnl->freed_immediate;
return real_alloc_immediate( ctx );
}
-/* May be called after tnl is destroyed.
+/**
+ * Free a 'struct immediate' object.
+ * May be called after tnl is destroyed.
*/
-void _tnl_free_immediate( GLcontext *ctx, struct immediate *IM )
+void
+_tnl_free_immediate( GLcontext *ctx, struct immediate *immed )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
- ASSERT(IM->ref_count == 0);
+ ASSERT(immed->ref_count == 0);
- if (IM->NormalLengthPtr) {
- ALIGN_FREE(IM->NormalLengthPtr);
- IM->NormalLengthPtr = NULL;
+ if (immed->NormalLengthPtr) {
+ ALIGN_FREE(immed->NormalLengthPtr);
+ immed->NormalLengthPtr = NULL;
}
if (!tnl) {
- real_free_immediate( IM );
+ real_free_immediate( immed );
}
else {
if (tnl->freed_immediate)
real_free_immediate( tnl->freed_immediate );
- tnl->freed_immediate = IM;
+ tnl->freed_immediate = immed;
}
}
-/* $Id: t_imm_dlist.c,v 1.46 2003/03/01 01:50:26 brianp Exp $ */
+/* $Id: t_imm_dlist.c,v 1.47 2003/03/28 01:39:05 brianp Exp $ */
/*
* Mesa 3-D graphics library
static void loopback_compiled_cassette( GLcontext *ctx, struct immediate *IM );
-static void build_normal_lengths( struct immediate *IM )
+static void
+build_normal_lengths( struct immediate *IM )
{
GLuint i;
GLfloat len;
}
}
-static void fixup_normal_lengths( struct immediate *IM )
+
+static void
+fixup_normal_lengths( struct immediate *IM )
{
GLuint i;
GLfloat len = 1.0F; /* just to silence warnings */
_tnl_fixup_input( ctx, IM );
+ /* Allocate space for this structure in the display list currently
+ * being compiled.
+ */
node = (TNLvertexcassette *)
_mesa_alloc_instruction(ctx,
tnl->opcode_vertex_cassette,
}
-static void fixup_compiled_primitives( GLcontext *ctx, struct immediate *IM )
+static void
+fixup_compiled_primitives( GLcontext *ctx, struct immediate *IM )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
IM->LastPrimitive = IM->CopyStart;
}
}
- } else {
+ }
+ else {
GLuint i;
if (IM->BeginState & VERT_ERROR_0)
if (IM->CopyStart == IM->Start &&
IM->Flag[IM->Start] & (VERT_BIT_END | VERT_BIT_END_VB))
{
+ /* nothing */
}
else
{
ASSERT(IM->PrimitiveLength[IM->Start] > 0 ||
IM->Flag[IM->Start] & (VERT_BIT_END | VERT_BIT_END_VB));
- for (i = IM->Start ; i <= IM->Count ; i += IM->PrimitiveLength[i])
+ for (i = IM->Start ; i <= IM->Count ; i += IM->PrimitiveLength[i]) {
if (IM->Flag[i] & (VERT_BIT_END | VERT_BIT_END_VB)) {
IM->PrimitiveLength[IM->CopyStart] = i - IM->CopyStart;
if (IM->Flag[i] & VERT_BIT_END_VB) {
}
break;
}
+ }
}
}
}
+
/* Undo any changes potentially made to the immediate in the range
* IM->Start..IM->Count above.
*/
-static void restore_compiled_primitives( GLcontext *ctx, struct immediate *IM )
+static void
+restore_compiled_primitives( GLcontext *ctx, struct immediate *IM )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
IM->Primitive[IM->Start] = tnl->DlistPrimitive;
}
-
static void
execute_compiled_cassette( GLcontext *ctx, void *data )
{
tnl->ReplayHardBeginEnd = 0;
}
+
static void
destroy_compiled_cassette( GLcontext *ctx, void *data )
{
_tnl_print_cassette( node->IM );
}
+
void
_tnl_BeginCallList( GLcontext *ctx, GLuint list )
{
}
-static void emit_material( struct gl_material *src, GLuint bitmask )
+/**
+ * Call glMaterialfv for the attributes specified by bitmask, using the
+ * material colors in src.
+ */
+static void
+emit_material( const struct gl_material *src, GLuint bitmask )
{
if (bitmask & FRONT_EMISSION_BIT)
glMaterialfv( GL_FRONT, GL_EMISSION, src[0].Emission );
* begin/end), or (for tnl hardware) implement their own display list
* mechanism.
*/
-static void loopback_compiled_cassette( GLcontext *ctx, struct immediate *IM )
+static void
+loopback_compiled_cassette( GLcontext *ctx, struct immediate *IM )
{
- GLuint i;
- GLuint *flags = IM->Flag;
- GLuint orflag = IM->OrFlag;
- GLuint j;
+ const GLuint *flags = IM->Flag;
+ const GLuint orflag = IM->OrFlag;
void (GLAPIENTRY *vertex)( const GLfloat * );
void (GLAPIENTRY *texcoordfv[MAX_TEXTURE_COORD_UNITS])( GLenum, const GLfloat * );
- GLuint maxtex = 0;
- GLuint p, length, prim = 0;
+ GLuint i, j, p, length, prim = 0, maxtex = 0;
if (orflag & VERT_BITS_OBJ_234)
vertex = (void (GLAPIENTRY *)(const GLfloat *)) glVertex4fv;
-/* $Id: t_imm_fixup.c,v 1.40 2003/03/01 01:50:27 brianp Exp $ */
+/* $Id: t_imm_fixup.c,v 1.41 2003/03/28 01:39:05 brianp Exp $ */
/*
* Mesa 3-D graphics library
if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
_tnl_print_vert_flags("copy from current", copyMask);
-#if 0
- if (copyMask & VERT_BIT_NORMAL) {
- COPY_4V(IM->Attrib[VERT_ATTRIB_NORMAL][pos],
- ctx->Current.Attrib[VERT_ATTRIB_NORMAL]);
- }
-
- if (copyMask & VERT_BIT_COLOR0) {
- COPY_4FV( IM->Attrib[VERT_ATTRIB_COLOR0][pos],
- ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
- }
-
- if (copyMask & VERT_BIT_COLOR1)
- COPY_4FV( IM->Attrib[VERT_ATTRIB_COLOR1][pos],
- ctx->Current.Attrib[VERT_ATTRIB_COLOR1]);
-
- if (copyMask & VERT_BIT_FOG)
- IM->Attrib[VERT_ATTRIB_FOG][pos][0] = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
-
- if (copyMask & VERT_BITS_TEX_ANY) {
- GLuint i;
- for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) {
- if (copyMask & VERT_BIT_TEX(i))
- COPY_4FV(IM->Attrib[VERT_ATTRIB_TEX0 + i][pos],
- ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i]);
- }
- }
-#else
for (attrib = 0, attribBit = 1; attrib < 16; attrib++, attribBit <<= 1) {
if (copyMask & attribBit) {
COPY_4FV( IM->Attrib[attrib][pos], ctx->Current.Attrib[attrib]);
}
}
-#endif
if (copyMask & VERT_BIT_INDEX)
IM->Index[pos] = ctx->Current.Index;