Compare commits
	
		
			52 Commits
		
	
	
		
			mesa-17.1.
			...
			vtx-0-2-21
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f2f09abce4 | ||
| 
						 | 
					93320957f2 | ||
| 
						 | 
					374a09c4f7 | ||
| 
						 | 
					1302fd3b25 | ||
| 
						 | 
					5198950cde | ||
| 
						 | 
					88d66b7208 | ||
| 
						 | 
					701208d259 | ||
| 
						 | 
					dfd3c9c40f | ||
| 
						 | 
					cef9471ab2 | ||
| 
						 | 
					8d8bb0679c | ||
| 
						 | 
					5affcd3cbb | ||
| 
						 | 
					86ac3e3c2d | ||
| 
						 | 
					5c2d467e6d | ||
| 
						 | 
					c00a1c4622 | ||
| 
						 | 
					dad38213e7 | ||
| 
						 | 
					9cbad64314 | ||
| 
						 | 
					f0bf8c0ed1 | ||
| 
						 | 
					6b692dc06c | ||
| 
						 | 
					be3c25458b | ||
| 
						 | 
					a384b0c5eb | ||
| 
						 | 
					acfa4d46a4 | ||
| 
						 | 
					df3b1eb5bc | ||
| 
						 | 
					34a9e4adaf | ||
| 
						 | 
					34f6df8b6d | ||
| 
						 | 
					5fc6940aca | ||
| 
						 | 
					c9c27a6efd | ||
| 
						 | 
					79a49e30a1 | ||
| 
						 | 
					f1582dbe52 | ||
| 
						 | 
					4fc77f884c | ||
| 
						 | 
					398f8d10a2 | ||
| 
						 | 
					5b9ad341a0 | ||
| 
						 | 
					fcd68a2b30 | ||
| 
						 | 
					f1bbe8d0a5 | ||
| 
						 | 
					3c0cfda46b | ||
| 
						 | 
					5d80efc35e | ||
| 
						 | 
					e01f56b3a8 | ||
| 
						 | 
					30cd200068 | ||
| 
						 | 
					e55c545d4a | ||
| 
						 | 
					b101554d16 | ||
| 
						 | 
					1b8c209523 | ||
| 
						 | 
					d46adad5cd | ||
| 
						 | 
					bfc37379cc | ||
| 
						 | 
					0c390fec04 | ||
| 
						 | 
					d5c9fd383b | ||
| 
						 | 
					8ae69294ad | ||
| 
						 | 
					46330d3aa7 | ||
| 
						 | 
					c91f7ad52b | ||
| 
						 | 
					5b40d6924c | ||
| 
						 | 
					27b4c2d675 | ||
| 
						 | 
					051a8141d1 | ||
| 
						 | 
					9b6d6988c4 | ||
| 
						 | 
					967fa00a7f | 
@@ -135,16 +135,10 @@ TNL_SOURCES = \
 | 
			
		||||
	tnl/t_array_api.c \
 | 
			
		||||
	tnl/t_array_import.c \
 | 
			
		||||
	tnl/t_context.c \
 | 
			
		||||
	tnl/t_eval_api.c \
 | 
			
		||||
	tnl/t_imm_alloc.c \
 | 
			
		||||
	tnl/t_imm_api.c \
 | 
			
		||||
	tnl/t_imm_debug.c \
 | 
			
		||||
	tnl/t_imm_dlist.c \
 | 
			
		||||
	tnl/t_imm_elt.c \
 | 
			
		||||
	tnl/t_imm_eval.c \
 | 
			
		||||
	tnl/t_imm_exec.c \
 | 
			
		||||
	tnl/t_imm_fixup.c \
 | 
			
		||||
	tnl/t_pipeline.c \
 | 
			
		||||
	tnl/t_save_api.c \
 | 
			
		||||
	tnl/t_save_loopback.c \
 | 
			
		||||
	tnl/t_save_playback.c \
 | 
			
		||||
	tnl/t_vb_fog.c \
 | 
			
		||||
	tnl/t_vb_light.c \
 | 
			
		||||
	tnl/t_vb_normals.c \
 | 
			
		||||
@@ -153,7 +147,11 @@ TNL_SOURCES = \
 | 
			
		||||
	tnl/t_vb_render.c \
 | 
			
		||||
	tnl/t_vb_texgen.c \
 | 
			
		||||
	tnl/t_vb_texmat.c \
 | 
			
		||||
	tnl/t_vb_vertex.c
 | 
			
		||||
	tnl/t_vb_vertex.c \
 | 
			
		||||
	tnl/t_vtx_api.c \
 | 
			
		||||
	tnl/t_vtx_eval.c \
 | 
			
		||||
	tnl/t_vtx_exec.c 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ASM_C_SOURCES =	\
 | 
			
		||||
	x86/common_x86.c \
 | 
			
		||||
@@ -228,9 +226,9 @@ CORE_SOURCES = \
 | 
			
		||||
	$(GLAPI_SOURCES)	\
 | 
			
		||||
	$(MATH_SOURCES)		\
 | 
			
		||||
	$(ARRAY_CACHE_SOURCES)	\
 | 
			
		||||
	$(TNL_SOURCES)		\
 | 
			
		||||
	$(SWRAST_SOURCES)	\
 | 
			
		||||
	$(SWRAST_SETUP_SOURCES)	\
 | 
			
		||||
	$(TNL_SOURCES)		\
 | 
			
		||||
	$(ASM_C_SOURCES)
 | 
			
		||||
 | 
			
		||||
# This will probably get set to $(X86_SOURCES) in Make-config:
 | 
			
		||||
@@ -348,9 +346,9 @@ tags:
 | 
			
		||||
 | 
			
		||||
# Remove .o and backup files
 | 
			
		||||
clean:
 | 
			
		||||
	-rm -f *.a
 | 
			
		||||
	-rm *.a
 | 
			
		||||
	-rm -f */*.o */*~ */*.o */*~
 | 
			
		||||
	-rm -f drivers/*/*.o drivers/*/*/*.o
 | 
			
		||||
	-rm -f drivers/*/*.o
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
include $(TOP)/Make-config
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,7 @@ static void _ac_fallbacks_init( GLcontext *ctx )
 | 
			
		||||
 | 
			
		||||
   cl = &ac->Fallback.Index;
 | 
			
		||||
   cl->Size = 1;
 | 
			
		||||
   cl->Type = GL_UNSIGNED_INT;
 | 
			
		||||
   cl->Type = GL_FLOAT;
 | 
			
		||||
   cl->Stride = 0;
 | 
			
		||||
   cl->StrideB = 0;
 | 
			
		||||
   cl->Ptr = (GLubyte *) &ctx->Current.Index;
 | 
			
		||||
@@ -217,9 +217,9 @@ static void _ac_cache_init( GLcontext *ctx )
 | 
			
		||||
 | 
			
		||||
   cl = &ac->Cache.Index;
 | 
			
		||||
   cl->Size = 1;
 | 
			
		||||
   cl->Type = GL_UNSIGNED_INT;
 | 
			
		||||
   cl->Type = GL_FLOAT;
 | 
			
		||||
   cl->Stride = 0;
 | 
			
		||||
   cl->StrideB = sizeof(GLuint);
 | 
			
		||||
   cl->StrideB = sizeof(GLfloat);
 | 
			
		||||
   cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size );
 | 
			
		||||
   cl->Enabled = 1;
 | 
			
		||||
   cl->Flags = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -48,9 +48,9 @@
 | 
			
		||||
#include "gamma_vb.h"
 | 
			
		||||
#include "gamma_tris.h"
 | 
			
		||||
 | 
			
		||||
extern const struct gl_pipeline_stage _gamma_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _gamma_render_stage;
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *gamma_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *gamma_pipeline[] = {
 | 
			
		||||
   &_tnl_vertex_transform_stage,
 | 
			
		||||
   &_tnl_normal_transform_stage,
 | 
			
		||||
   &_tnl_lighting_stage,
 | 
			
		||||
 
 | 
			
		||||
@@ -178,7 +178,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
 | 
			
		||||
   GAMMA_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   GAMMA_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const GLuint hw_prim[GL_POLYGON+1] = {
 | 
			
		||||
@@ -236,7 +236,7 @@ static __inline void gammaEndPrimitive( gammaContextPtr gmesa )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean gamma_run_render( GLcontext *ctx,
 | 
			
		||||
				  struct gl_pipeline_stage *stage )
 | 
			
		||||
				  struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -271,9 +271,9 @@ static GLboolean gamma_run_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void gamma_check_render( GLcontext *ctx,
 | 
			
		||||
				 struct gl_pipeline_stage *stage )
 | 
			
		||||
				 struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->RenderMode == GL_RENDER) {
 | 
			
		||||
      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
 | 
			
		||||
@@ -293,13 +293,13 @@ static void gamma_check_render( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _gamma_render_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _gamma_render_stage =
 | 
			
		||||
{
 | 
			
		||||
   "gamma render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
 
 | 
			
		||||
@@ -278,7 +278,7 @@ void gammaBuildVertices( GLcontext *ctx,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[gmesa->SetupIndex].emit( ctx, start, count, v, stride );
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -107,9 +107,9 @@ static const char * const card_extensions[] =
 | 
			
		||||
   NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const struct gl_pipeline_stage _i810_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _i810_render_stage;
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *i810_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *i810_pipeline[] = {
 | 
			
		||||
   &_tnl_vertex_transform_stage,
 | 
			
		||||
   &_tnl_normal_transform_stage,
 | 
			
		||||
   &_tnl_lighting_stage,
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, 
 | 
			
		||||
							  count, flags );
 | 
			
		||||
   I810_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   I810_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -137,12 +137,12 @@ static void VERT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean i810_run_render( GLcontext *ctx,
 | 
			
		||||
				  struct gl_pipeline_stage *stage )
 | 
			
		||||
				  struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   i810ContextPtr imesa = I810_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   GLuint i, length, flags = 0;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   /* Don't handle clipping or indexed vertices.
 | 
			
		||||
    */
 | 
			
		||||
@@ -150,17 +150,21 @@ static GLboolean i810_run_render( GLcontext *ctx,
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   imesa->SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   imesa->SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Start( ctx );
 | 
			
		||||
 | 
			
		||||
   for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length= VB->PrimitiveLength[i];
 | 
			
		||||
      if (length)
 | 
			
		||||
	 i810_render_tab_verts[flags & PRIM_MODE_MASK]( ctx, i, i + length,
 | 
			
		||||
							flags );
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      i810_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length,
 | 
			
		||||
						    prim );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Finish( ctx );
 | 
			
		||||
@@ -169,9 +173,9 @@ static GLboolean i810_run_render( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void i810_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void i810_check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->RenderMode == GL_RENDER) {
 | 
			
		||||
      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
 | 
			
		||||
@@ -191,13 +195,13 @@ static void i810_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _i810_render_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _i810_render_stage =
 | 
			
		||||
{
 | 
			
		||||
   "i810 render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
 
 | 
			
		||||
@@ -68,10 +68,10 @@ static drmBufMapPtr i810_create_empty_buffers(void)
 | 
			
		||||
{
 | 
			
		||||
   drmBufMapPtr retval;
 | 
			
		||||
 | 
			
		||||
   retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap));
 | 
			
		||||
   retval = (drmBufMapPtr)MALLOC(sizeof(drmBufMap));
 | 
			
		||||
   if(retval == NULL) return NULL;
 | 
			
		||||
   memset(retval, 0, sizeof(drmBufMap));
 | 
			
		||||
   retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I810_DMA_BUF_NR);
 | 
			
		||||
   retval->list = (drmBufPtr)MALLOC(sizeof(drmBuf) * I810_DMA_BUF_NR);
 | 
			
		||||
   if(retval->list == NULL) {
 | 
			
		||||
      Xfree(retval);
 | 
			
		||||
      return NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -383,7 +383,7 @@ void i810BuildVertices( GLcontext *ctx,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[imesa->SetupIndex].emit( ctx, start, count, v, stride );
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -167,9 +167,9 @@ static const char * const card_extensions[] =
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern const struct gl_pipeline_stage _i830_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _i830_render_stage;
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *i830_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *i830_pipeline[] = {
 | 
			
		||||
   &_tnl_vertex_transform_stage,
 | 
			
		||||
   &_tnl_normal_transform_stage,
 | 
			
		||||
   &_tnl_lighting_stage,
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, 
 | 
			
		||||
							  count, flags );
 | 
			
		||||
   I830_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   I830_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -159,24 +159,27 @@ static GLboolean choose_render( struct vertex_buffer *VB, int bufsz )
 | 
			
		||||
   int nr_rprims = 0;
 | 
			
		||||
   int nr_rverts = 0;
 | 
			
		||||
   int rprim = 0;
 | 
			
		||||
   int i = 0, length, flags = 0;
 | 
			
		||||
   int i;
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
   for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length) {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length = VB->PrimitiveLength[i];
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      if (!hw_prim[flags & PRIM_MODE_MASK])
 | 
			
		||||
      if (!hw_prim[prim & PRIM_MODE_MASK])
 | 
			
		||||
	 return GL_FALSE;
 | 
			
		||||
 | 
			
		||||
      nr_prims++;
 | 
			
		||||
      nr_rverts += length * scale_prim[flags & PRIM_MODE_MASK];
 | 
			
		||||
      nr_rverts += length * scale_prim[prim & PRIM_MODE_MASK];
 | 
			
		||||
 | 
			
		||||
      if (reduced_prim[flags&PRIM_MODE_MASK] != rprim) {
 | 
			
		||||
      if (reduced_prim[prim&PRIM_MODE_MASK] != rprim) {
 | 
			
		||||
	 nr_rprims++;
 | 
			
		||||
	 rprim = reduced_prim[flags&PRIM_MODE_MASK];
 | 
			
		||||
	 rprim = reduced_prim[prim&PRIM_MODE_MASK];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -192,7 +195,7 @@ static GLboolean choose_render( struct vertex_buffer *VB, int bufsz )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean i830_run_render( GLcontext *ctx, 
 | 
			
		||||
				 struct gl_pipeline_stage *stage )
 | 
			
		||||
				 struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   i830ContextPtr imesa = I830_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -205,16 +208,21 @@ static GLboolean i830_run_render( GLcontext *ctx,
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   imesa->SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   imesa->SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Start( ctx );
 | 
			
		||||
   
 | 
			
		||||
   for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length) {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length= VB->PrimitiveLength[i];
 | 
			
		||||
      if (length)
 | 
			
		||||
	 i830_render_tab_verts[flags & PRIM_MODE_MASK]( ctx, i, i + length,
 | 
			
		||||
						        flags );
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      i830_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length,
 | 
			
		||||
						    prim );
 | 
			
		||||
   }
 | 
			
		||||
      
 | 
			
		||||
   tnl->Driver.Render.Finish( ctx );
 | 
			
		||||
@@ -224,9 +232,9 @@ static GLboolean i830_run_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void i830_check_render( GLcontext *ctx, 
 | 
			
		||||
			       struct gl_pipeline_stage *stage )
 | 
			
		||||
			       struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
 | 
			
		||||
   if (ctx->RenderMode == GL_RENDER) {
 | 
			
		||||
      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
 | 
			
		||||
	 inputs |= VERT_BIT_COLOR1;
 | 
			
		||||
@@ -244,13 +252,13 @@ static void i830_check_render( GLcontext *ctx,
 | 
			
		||||
   stage->inputs = inputs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _i830_render_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _i830_render_stage =
 | 
			
		||||
{
 | 
			
		||||
   "i830 render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ static int i830_malloc_proxy_buf(drmBufMapPtr buffers)
 | 
			
		||||
   drmBufPtr buf;
 | 
			
		||||
   int i;
 | 
			
		||||
 | 
			
		||||
   buffer = ALIGN_MALLOC(I830_DMA_BUF_SZ);
 | 
			
		||||
   buffer = MALLOC(I830_DMA_BUF_SZ);
 | 
			
		||||
   if(buffer == NULL) return -1;
 | 
			
		||||
   for(i = 0; i < I830_DMA_BUF_NR; i++) {
 | 
			
		||||
      buf = &(buffers->list[i]);
 | 
			
		||||
@@ -71,10 +71,10 @@ static drmBufMapPtr i830_create_empty_buffers(void)
 | 
			
		||||
{
 | 
			
		||||
   drmBufMapPtr retval;
 | 
			
		||||
 | 
			
		||||
   retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap));
 | 
			
		||||
   retval = (drmBufMapPtr)MALLOC(sizeof(drmBufMap));
 | 
			
		||||
   if(retval == NULL) return NULL;
 | 
			
		||||
   memset(retval, 0, sizeof(drmBufMap));
 | 
			
		||||
   retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR);
 | 
			
		||||
   retval->list = (drmBufPtr)MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR);
 | 
			
		||||
   if(retval->list == NULL) {
 | 
			
		||||
      Xfree(retval);
 | 
			
		||||
      return NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -445,7 +445,7 @@ void i830BuildVertices( GLcontext *ctx,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[imesa->SetupIndex].emit( ctx, start, count, v, stride );
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -239,9 +239,9 @@ mgaDestroyScreen(__DRIscreenPrivate *sPriv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern const struct gl_pipeline_stage _mga_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _mga_render_stage;
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *mga_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *mga_pipeline[] = {
 | 
			
		||||
   &_tnl_vertex_transform_stage, 
 | 
			
		||||
   &_tnl_normal_transform_stage, 
 | 
			
		||||
   &_tnl_lighting_stage,	
 | 
			
		||||
@@ -647,7 +647,7 @@ void mgaGetLock( mgaContextPtr mmesa, GLuint flags )
 | 
			
		||||
 | 
			
		||||
   if (*(dPriv->pStamp) != mmesa->lastStamp) {
 | 
			
		||||
      mmesa->lastStamp = *(dPriv->pStamp);
 | 
			
		||||
      mmesa->SetupNewInputs |= VERT_BIT_CLIP;
 | 
			
		||||
      mmesa->SetupNewInputs |= VERT_BIT_POS;
 | 
			
		||||
      mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK);
 | 
			
		||||
      mgaUpdateRects( mmesa, (MGA_FRONT|MGA_BACK) );
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -101,7 +101,7 @@ static void VERT_FALLBACK( GLcontext *ctx, GLuint start, GLuint count,
 | 
			
		||||
   tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
 | 
			
		||||
   MGA_CONTEXT(ctx)->SetupNewInputs |= VERT_BIT_CLIP;
 | 
			
		||||
   MGA_CONTEXT(ctx)->SetupNewInputs |= VERT_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define LOCAL_VARS mgaContextPtr mmesa = MGA_CONTEXT(ctx) 
 | 
			
		||||
@@ -131,12 +131,12 @@ static void VERT_FALLBACK( GLcontext *ctx, GLuint start, GLuint count,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean mga_run_render( GLcontext *ctx,
 | 
			
		||||
				  struct gl_pipeline_stage *stage )
 | 
			
		||||
				  struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb; 
 | 
			
		||||
   GLuint i, length, flags = 0;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   /* Don't handle clipping or indexed vertices or vertex manipulations.
 | 
			
		||||
    */
 | 
			
		||||
@@ -147,13 +147,17 @@ static GLboolean mga_run_render( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.Start( ctx );
 | 
			
		||||
   mmesa->SetupNewInputs = ~0;      
 | 
			
		||||
 | 
			
		||||
   for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length= VB->PrimitiveLength[i];	
 | 
			
		||||
      if (length)
 | 
			
		||||
	 mga_render_tab_verts[flags & PRIM_MODE_MASK]( ctx, i, i + length,
 | 
			
		||||
						       flags );
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      mga_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length, 
 | 
			
		||||
						   prim);
 | 
			
		||||
   } 
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Finish( ctx );
 | 
			
		||||
@@ -162,9 +166,9 @@ static GLboolean mga_run_render( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void mga_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void mga_check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->RenderMode == GL_RENDER) {
 | 
			
		||||
      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) 
 | 
			
		||||
@@ -184,13 +188,13 @@ static void mga_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _mga_render_stage = 
 | 
			
		||||
const struct tnl_pipeline_stage _mga_render_stage = 
 | 
			
		||||
{ 
 | 
			
		||||
   "mga render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
 
 | 
			
		||||
@@ -359,7 +359,7 @@ void mgaBuildVertices( GLcontext *ctx,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[mmesa->SetupIndex].emit( ctx, start, count, v, stride );   
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -379,7 +379,7 @@ void r128BuildVertices( GLcontext *ctx,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[rmesa->SetupIndex].emit( ctx, start, count, v, stride );
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -151,10 +151,10 @@ static const char * const card_extensions[] =
 | 
			
		||||
    NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const struct gl_pipeline_stage _r200_render_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _r200_tcl_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _r200_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _r200_tcl_stage;
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *r200_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *r200_pipeline[] = {
 | 
			
		||||
 | 
			
		||||
   /* Try and go straight to t&l
 | 
			
		||||
    */
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#include "math/m_translate.h"
 | 
			
		||||
#include "tnl/tnl.h"
 | 
			
		||||
#include "tnl/t_context.h"
 | 
			
		||||
#include "tnl/t_imm_debug.h"
 | 
			
		||||
 | 
			
		||||
#include "r200_context.h"
 | 
			
		||||
#include "r200_ioctl.h"
 | 
			
		||||
@@ -316,9 +315,6 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
 | 
			
		||||
   GLuint vfmt0 = 0, vfmt1 = 0;
 | 
			
		||||
   GLuint count = VB->Count;
 | 
			
		||||
   
 | 
			
		||||
   if (R200_DEBUG & DEBUG_VERTS) 
 | 
			
		||||
      _tnl_print_vert_flags( __FUNCTION__, inputs );
 | 
			
		||||
 | 
			
		||||
   if (1) {
 | 
			
		||||
      if (!rmesa->tcl.obj.buf) 
 | 
			
		||||
	 emit_vector( ctx, 
 | 
			
		||||
@@ -333,7 +329,7 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
 | 
			
		||||
      case 3: vfmt0 |= R200_VTX_Z0;
 | 
			
		||||
      case 2: 
 | 
			
		||||
      default:
 | 
			
		||||
	break;
 | 
			
		||||
	 break;
 | 
			
		||||
      }
 | 
			
		||||
      component[nr++] = &rmesa->tcl.obj;
 | 
			
		||||
   }
 | 
			
		||||
@@ -353,60 +349,44 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_COLOR0) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type == GL_UNSIGNED_BYTE) {
 | 
			
		||||
	 if (!rmesa->tcl.rgba.buf)
 | 
			
		||||
	    emit_ubyte_rgba( ctx, 
 | 
			
		||||
			     &rmesa->tcl.rgba, 
 | 
			
		||||
			     (char *)VB->ColorPtr[0]->Ptr,
 | 
			
		||||
			     VB->ColorPtr[0]->Size,
 | 
			
		||||
			     VB->ColorPtr[0]->StrideB,
 | 
			
		||||
			     count);
 | 
			
		||||
      int emitsize;
 | 
			
		||||
 | 
			
		||||
	 vfmt0 |= R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT; 
 | 
			
		||||
      if (VB->ColorPtr[0]->size == 4 &&
 | 
			
		||||
	  (VB->ColorPtr[0]->stride != 0 ||
 | 
			
		||||
	   VB->ColorPtr[0]->data[0][3] != 1.0)) { 
 | 
			
		||||
	 vfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT; 
 | 
			
		||||
	 emitsize = 4;
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
	 int emitsize;
 | 
			
		||||
 | 
			
		||||
	 if (VB->ColorPtr[0]->Size == 4 &&
 | 
			
		||||
	     (VB->ColorPtr[0]->StrideB != 0 ||
 | 
			
		||||
	      ((GLfloat *)VB->ColorPtr[0]->Ptr)[3] != 1.0)) { 
 | 
			
		||||
	    vfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT; 
 | 
			
		||||
	    emitsize = 4;
 | 
			
		||||
	 }
 | 
			
		||||
	 else { 
 | 
			
		||||
	    vfmt0 |= R200_VTX_FP_RGB << R200_VTX_COLOR_0_SHIFT; 
 | 
			
		||||
	    emitsize = 3;
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 if (!rmesa->tcl.rgba.buf)
 | 
			
		||||
	    emit_vector( ctx, 
 | 
			
		||||
			 &(rmesa->tcl.rgba), 
 | 
			
		||||
			 (char *)VB->ColorPtr[0]->Ptr,
 | 
			
		||||
			 emitsize,
 | 
			
		||||
			 VB->ColorPtr[0]->StrideB,
 | 
			
		||||
			 count);
 | 
			
		||||
      else { 
 | 
			
		||||
	 vfmt0 |= R200_VTX_FP_RGB << R200_VTX_COLOR_0_SHIFT; 
 | 
			
		||||
	 emitsize = 3;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!rmesa->tcl.rgba.buf)
 | 
			
		||||
	 emit_vector( ctx, 
 | 
			
		||||
		      &(rmesa->tcl.rgba), 
 | 
			
		||||
		      (char *)VB->ColorPtr[0]->data,
 | 
			
		||||
		      emitsize,
 | 
			
		||||
		      VB->ColorPtr[0]->stride,
 | 
			
		||||
		      count);
 | 
			
		||||
 | 
			
		||||
      component[nr++] = &rmesa->tcl.rgba;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_COLOR1) {
 | 
			
		||||
      if (!rmesa->tcl.spec.buf) {
 | 
			
		||||
	 if (VB->SecondaryColorPtr[0]->Type != GL_UNSIGNED_BYTE)
 | 
			
		||||
	    r200_import_float_spec_colors( ctx );
 | 
			
		||||
 | 
			
		||||
	 emit_ubyte_rgba( ctx, 
 | 
			
		||||
			  &rmesa->tcl.spec, 
 | 
			
		||||
			  (char *)VB->SecondaryColorPtr[0]->Ptr,
 | 
			
		||||
			  3,
 | 
			
		||||
			  VB->SecondaryColorPtr[0]->StrideB,
 | 
			
		||||
			  count);
 | 
			
		||||
	 emit_vector( ctx, 
 | 
			
		||||
		      &rmesa->tcl.spec, 
 | 
			
		||||
		      (char *)VB->SecondaryColorPtr[0]->data,
 | 
			
		||||
		      3,
 | 
			
		||||
		      VB->SecondaryColorPtr[0]->stride,
 | 
			
		||||
		      count);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* How does this work?
 | 
			
		||||
       */
 | 
			
		||||
      vfmt0 |= R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT; 
 | 
			
		||||
      vfmt0 |= R200_VTX_FP_RGB << R200_VTX_COLOR_1_SHIFT; 
 | 
			
		||||
      component[nr++] = &rmesa->tcl.spec;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -455,8 +435,8 @@ void r200ReleaseArrays( GLcontext *ctx, GLuint newinputs )
 | 
			
		||||
{
 | 
			
		||||
   r200ContextPtr rmesa = R200_CONTEXT( ctx );
 | 
			
		||||
 | 
			
		||||
   if (R200_DEBUG & DEBUG_VERTS) 
 | 
			
		||||
      _tnl_print_vert_flags( __FUNCTION__, newinputs );
 | 
			
		||||
/*    if (R200_DEBUG & DEBUG_VERTS)  */
 | 
			
		||||
/*       _tnl_print_vert_flags( __FUNCTION__, newinputs ); */
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) 
 | 
			
		||||
     r200ReleaseDmaRegion( rmesa, &rmesa->tcl.obj, __FUNCTION__ );
 | 
			
		||||
 
 | 
			
		||||
@@ -2089,10 +2089,30 @@ static void r200InvalidateState( GLcontext *ctx, GLuint new_state )
 | 
			
		||||
   r200VtxfmtInvalidate( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* A hack.  The r200 can actually cope just fine with materials
 | 
			
		||||
 * between begin/ends, so fix this.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean check_material( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLint i;
 | 
			
		||||
 | 
			
		||||
   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 
 | 
			
		||||
	i < _TNL_ATTRIB_MAT_BACK_INDEXES; 
 | 
			
		||||
	i++)
 | 
			
		||||
      if (tnl->vb.AttribPtr[i] &&
 | 
			
		||||
	  tnl->vb.AttribPtr[i]->stride)
 | 
			
		||||
	 return GL_TRUE;
 | 
			
		||||
 | 
			
		||||
   return GL_FALSE;
 | 
			
		||||
}
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
static void r200WrapRunPipeline( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   r200ContextPtr rmesa = R200_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLboolean has_material;
 | 
			
		||||
 | 
			
		||||
   if (0)
 | 
			
		||||
      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState);
 | 
			
		||||
@@ -2102,7 +2122,9 @@ static void r200WrapRunPipeline( GLcontext *ctx )
 | 
			
		||||
   if (rmesa->NewGLState)
 | 
			
		||||
      r200ValidateState( ctx );
 | 
			
		||||
 | 
			
		||||
   if (tnl->vb.Material) {
 | 
			
		||||
   has_material = (ctx->Light.Enabled && check_material( ctx ));
 | 
			
		||||
 | 
			
		||||
   if (has_material) {
 | 
			
		||||
      TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_TRUE );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -2110,7 +2132,7 @@ static void r200WrapRunPipeline( GLcontext *ctx )
 | 
			
		||||
    */ 
 | 
			
		||||
   _tnl_run_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
   if (tnl->vb.Material) {
 | 
			
		||||
   if (has_material) {
 | 
			
		||||
      TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_FALSE );
 | 
			
		||||
      r200UpdateMaterial( ctx ); /* not needed any more? */
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#include "math/m_translate.h"
 | 
			
		||||
#include "tnl/tnl.h"
 | 
			
		||||
#include "tnl/t_context.h"
 | 
			
		||||
#include "tnl/t_imm_exec.h"
 | 
			
		||||
#include "tnl/t_pipeline.h"
 | 
			
		||||
 | 
			
		||||
#include "r200_context.h"
 | 
			
		||||
@@ -538,7 +537,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
 | 
			
		||||
   R200_CONTEXT(ctx)->swtcl.SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   R200_CONTEXT(ctx)->swtcl.SetupNewInputs = _TNL_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ELT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
@@ -550,7 +549,7 @@ static void ELT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabElts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
 | 
			
		||||
   R200_CONTEXT(ctx)->swtcl.SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   R200_CONTEXT(ctx)->swtcl.SetupNewInputs = _TNL_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -632,7 +631,7 @@ do {									\
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean r200_run_render( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   r200ContextPtr rmesa = R200_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -660,18 +659,21 @@ static GLboolean r200_run_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Start( ctx );
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length = VB->PrimitiveLength[i];
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      if (R200_DEBUG & DEBUG_PRIMS)
 | 
			
		||||
	 fprintf(stderr, "r200_render.c: prim %s %d..%d\n", 
 | 
			
		||||
		 _mesa_lookup_enum_by_nr(flags & PRIM_MODE_MASK), 
 | 
			
		||||
		 i, i+length);
 | 
			
		||||
		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK), 
 | 
			
		||||
		 start, start+length);
 | 
			
		||||
 | 
			
		||||
      if (length)
 | 
			
		||||
	 tab[flags & PRIM_MODE_MASK]( ctx, i, i + length, flags );
 | 
			
		||||
      tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, flags );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Finish( ctx );
 | 
			
		||||
@@ -682,35 +684,35 @@ static GLboolean r200_run_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void r200_check_render( GLcontext *ctx,
 | 
			
		||||
				 struct gl_pipeline_stage *stage )
 | 
			
		||||
				 struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_CLIP | VERT_BIT_COLOR0;
 | 
			
		||||
   GLuint inputs = _TNL_BIT_POS | _TNL_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->RenderMode == GL_RENDER) {
 | 
			
		||||
      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
 | 
			
		||||
	 inputs |= VERT_BIT_COLOR1;
 | 
			
		||||
	 inputs |= _TNL_BIT_COLOR1;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Texture.Unit[0]._ReallyEnabled)
 | 
			
		||||
	 inputs |= VERT_BIT_TEX0;
 | 
			
		||||
	 inputs |= _TNL_BIT_TEX0;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Texture.Unit[1]._ReallyEnabled)
 | 
			
		||||
	 inputs |= VERT_BIT_TEX1;
 | 
			
		||||
	 inputs |= _TNL_BIT_TEX1;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Fog.Enabled)
 | 
			
		||||
	 inputs |= VERT_BIT_FOG;
 | 
			
		||||
	 inputs |= _TNL_BIT_FOG;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   stage->inputs = inputs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _r200_render_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _r200_render_stage =
 | 
			
		||||
{
 | 
			
		||||
   "r200 render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
@@ -1231,7 +1233,7 @@ r200PointsBitmap( GLcontext *ctx, GLint px, GLint py,
 | 
			
		||||
 | 
			
		||||
void r200FlushVertices( GLcontext *ctx, GLuint flags )
 | 
			
		||||
{
 | 
			
		||||
   _tnl_flush_vertices( ctx, flags );
 | 
			
		||||
   _tnl_FlushVertices( ctx, flags );
 | 
			
		||||
 | 
			
		||||
   if (flags & FLUSH_STORED_VERTICES)
 | 
			
		||||
      R200_NEWPRIM( R200_CONTEXT( ctx ) );
 | 
			
		||||
 
 | 
			
		||||
@@ -255,7 +255,7 @@ void r200TclPrimitive( GLcontext *ctx,
 | 
			
		||||
/* TCL render.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean r200_run_tcl_render( GLcontext *ctx,
 | 
			
		||||
					struct gl_pipeline_stage *stage )
 | 
			
		||||
				      struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   r200ContextPtr rmesa = R200_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -278,24 +278,19 @@ static GLboolean r200_run_tcl_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
   rmesa->tcl.Elts = VB->Elts;
 | 
			
		||||
 | 
			
		||||
   for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length = VB->PrimitiveLength[i];
 | 
			
		||||
 | 
			
		||||
      if (R200_DEBUG & DEBUG_PRIMS)
 | 
			
		||||
	 fprintf(stderr, "%s: prim %s %d..%d\n", 
 | 
			
		||||
		 __FUNCTION__,
 | 
			
		||||
		 _mesa_lookup_enum_by_nr(flags & PRIM_MODE_MASK), 
 | 
			
		||||
		 i, i+length);
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      if (rmesa->tcl.Elts)
 | 
			
		||||
	 r200EmitEltPrimitive( ctx, i, i+length, flags );
 | 
			
		||||
	 r200EmitEltPrimitive( ctx, start, start+length, prim );
 | 
			
		||||
      else
 | 
			
		||||
	 r200EmitPrimitive( ctx, i, i+length, flags );
 | 
			
		||||
	 r200EmitPrimitive( ctx, start, start+length, prim );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return GL_FALSE;		/* finished the pipe */
 | 
			
		||||
@@ -304,7 +299,7 @@ static GLboolean r200_run_tcl_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void r200_check_tcl_render( GLcontext *ctx,
 | 
			
		||||
				     struct gl_pipeline_stage *stage )
 | 
			
		||||
				   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   r200ContextPtr rmesa = R200_CONTEXT(ctx);
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS;
 | 
			
		||||
@@ -360,13 +355,13 @@ static void r200_check_tcl_render( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void r200_init_tcl_render( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->check = r200_check_tcl_render;
 | 
			
		||||
   stage->check( ctx, stage );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
@@ -374,7 +369,7 @@ static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
/* Initial state for tcl stage.  
 | 
			
		||||
 */
 | 
			
		||||
const struct gl_pipeline_stage _r200_tcl_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _r200_tcl_stage =
 | 
			
		||||
{
 | 
			
		||||
   "r200 render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
 
 | 
			
		||||
@@ -75,10 +75,10 @@ static void count_funcs( r200ContextPtr rmesa )
 | 
			
		||||
   count_func( "Vertex2fv", &rmesa->vb.dfn_cache.Vertex2fv );
 | 
			
		||||
   count_func( "Vertex3f", &rmesa->vb.dfn_cache.Vertex3f );
 | 
			
		||||
   count_func( "Vertex3fv", &rmesa->vb.dfn_cache.Vertex3fv );
 | 
			
		||||
   count_func( "Color4ub", &rmesa->vb.dfn_cache.Color4ub );
 | 
			
		||||
   count_func( "Color4ubv", &rmesa->vb.dfn_cache.Color4ubv );
 | 
			
		||||
   count_func( "Color3ub", &rmesa->vb.dfn_cache.Color3ub );
 | 
			
		||||
   count_func( "Color3ubv", &rmesa->vb.dfn_cache.Color3ubv );
 | 
			
		||||
   count_func( "Color4ub", &rmesa->vb.dfn_cache.Color4ub ); 
 | 
			
		||||
   count_func( "Color4ubv", &rmesa->vb.dfn_cache.Color4ubv ); 
 | 
			
		||||
   count_func( "Color3ub", &rmesa->vb.dfn_cache.Color3ub ); 
 | 
			
		||||
   count_func( "Color3ubv", &rmesa->vb.dfn_cache.Color3ubv ); 
 | 
			
		||||
   count_func( "Color4f", &rmesa->vb.dfn_cache.Color4f );
 | 
			
		||||
   count_func( "Color4fv", &rmesa->vb.dfn_cache.Color4fv );
 | 
			
		||||
   count_func( "Color3f", &rmesa->vb.dfn_cache.Color3f );
 | 
			
		||||
@@ -468,7 +468,10 @@ static void VFMT_FALLBACK( const char *caller )
 | 
			
		||||
      glNormal3fv( rmesa->vb.normalptr );
 | 
			
		||||
 | 
			
		||||
   if (VTX_COLOR(ind0, 0) == R200_VTX_PK_RGBA) 
 | 
			
		||||
         glColor4ub( rmesa->vb.colorptr->red, rmesa->vb.colorptr->green, rmesa->vb.colorptr->blue, rmesa->vb.colorptr->alpha );
 | 
			
		||||
         glColor4ub( rmesa->vb.colorptr->red,
 | 
			
		||||
		     rmesa->vb.colorptr->green,
 | 
			
		||||
		     rmesa->vb.colorptr->blue,
 | 
			
		||||
		     rmesa->vb.colorptr->alpha );
 | 
			
		||||
   else if (VTX_COLOR(ind0, 0) == R200_VTX_FP_RGBA) 
 | 
			
		||||
      glColor4fv( rmesa->vb.floatcolorptr );
 | 
			
		||||
   else if (VTX_COLOR(ind0, 0) == R200_VTX_FP_RGB) {
 | 
			
		||||
@@ -482,7 +485,9 @@ static void VFMT_FALLBACK( const char *caller )
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (VTX_COLOR(ind0, 1) == R200_VTX_PK_RGBA) 
 | 
			
		||||
      _glapi_Dispatch->SecondaryColor3ubEXT( rmesa->vb.specptr->red, rmesa->vb.specptr->green, rmesa->vb.specptr->blue ); 
 | 
			
		||||
      _glapi_Dispatch->SecondaryColor3ubEXT( rmesa->vb.specptr->red, 
 | 
			
		||||
					     rmesa->vb.specptr->green,
 | 
			
		||||
					     rmesa->vb.specptr->blue ); 
 | 
			
		||||
 | 
			
		||||
   if (ind1 & (7 << R200_VTX_TEX0_COMP_CNT_SHIFT)) 
 | 
			
		||||
      glTexCoord2fv( rmesa->vb.texcoordptr[0] );
 | 
			
		||||
@@ -1006,13 +1011,14 @@ void r200VtxfmtInit( GLcontext *ctx )
 | 
			
		||||
   vfmt->FogCoordfEXT = _mesa_noop_FogCoordfEXT;
 | 
			
		||||
   vfmt->EdgeFlag = _mesa_noop_EdgeFlag;
 | 
			
		||||
   vfmt->EdgeFlagv = _mesa_noop_EdgeFlagv;
 | 
			
		||||
   vfmt->Indexi = _mesa_noop_Indexi;
 | 
			
		||||
   vfmt->Indexiv = _mesa_noop_Indexiv;
 | 
			
		||||
   vfmt->Indexf = _mesa_noop_Indexf;
 | 
			
		||||
   vfmt->Indexfv = _mesa_noop_Indexfv;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Active but unsupported -- fallback if we receive these:
 | 
			
		||||
    */
 | 
			
		||||
   vfmt->CallList = r200_fallback_CallList;
 | 
			
		||||
   vfmt->CallLists = r200_fallback_CallLists;
 | 
			
		||||
   vfmt->EvalCoord1f = r200_fallback_EvalCoord1f;
 | 
			
		||||
   vfmt->EvalCoord1fv = r200_fallback_EvalCoord1fv;
 | 
			
		||||
   vfmt->EvalCoord2f = r200_fallback_EvalCoord2f;
 | 
			
		||||
 
 | 
			
		||||
@@ -827,16 +827,10 @@ void r200VtxfmtInitChoosers( GLvertexformat *vfmt )
 | 
			
		||||
{
 | 
			
		||||
   vfmt->Color3f = choose_Color3f;
 | 
			
		||||
   vfmt->Color3fv = choose_Color3fv;
 | 
			
		||||
   vfmt->Color3ub = choose_Color3ub;
 | 
			
		||||
   vfmt->Color3ubv = choose_Color3ubv;
 | 
			
		||||
   vfmt->Color4f = choose_Color4f;
 | 
			
		||||
   vfmt->Color4fv = choose_Color4fv;
 | 
			
		||||
   vfmt->Color4ub = choose_Color4ub;
 | 
			
		||||
   vfmt->Color4ubv = choose_Color4ubv;
 | 
			
		||||
   vfmt->SecondaryColor3fEXT = choose_SecondaryColor3fEXT;
 | 
			
		||||
   vfmt->SecondaryColor3fvEXT = choose_SecondaryColor3fvEXT;
 | 
			
		||||
   vfmt->SecondaryColor3ubEXT = choose_SecondaryColor3ubEXT;
 | 
			
		||||
   vfmt->SecondaryColor3ubvEXT = choose_SecondaryColor3ubvEXT;
 | 
			
		||||
   vfmt->MultiTexCoord1fARB = choose_MultiTexCoord1fARB;
 | 
			
		||||
   vfmt->MultiTexCoord1fvARB = choose_MultiTexCoord1fvARB;
 | 
			
		||||
   vfmt->MultiTexCoord2fARB = choose_MultiTexCoord2fARB;
 | 
			
		||||
@@ -851,6 +845,17 @@ void r200VtxfmtInitChoosers( GLvertexformat *vfmt )
 | 
			
		||||
   vfmt->Vertex2fv = choose_Vertex2fv;
 | 
			
		||||
   vfmt->Vertex3f = choose_Vertex3f;
 | 
			
		||||
   vfmt->Vertex3fv = choose_Vertex3fv;
 | 
			
		||||
 | 
			
		||||
   /* TODO: restore ubyte colors to vtxfmt.
 | 
			
		||||
    */
 | 
			
		||||
#if 0
 | 
			
		||||
   vfmt->Color3ub = choose_Color3ub;
 | 
			
		||||
   vfmt->Color3ubv = choose_Color3ubv;
 | 
			
		||||
   vfmt->Color4ub = choose_Color4ub;
 | 
			
		||||
   vfmt->Color4ubv = choose_Color4ubv;
 | 
			
		||||
   vfmt->SecondaryColor3ubEXT = choose_SecondaryColor3ubEXT;
 | 
			
		||||
   vfmt->SecondaryColor3ubvEXT = choose_SecondaryColor3ubvEXT;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -147,11 +147,11 @@ static const char * const card_extensions[] =
 | 
			
		||||
    NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const struct gl_pipeline_stage _radeon_texrect_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _radeon_render_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _radeon_tcl_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _radeon_texrect_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _radeon_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _radeon_tcl_stage;
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *radeon_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *radeon_pipeline[] = {
 | 
			
		||||
 | 
			
		||||
   /* Try and go straight to t&l
 | 
			
		||||
    */
 | 
			
		||||
@@ -392,6 +392,9 @@ radeonCreateContext( const __GLcontextModes *glVisual,
 | 
			
		||||
   radeonInitState( rmesa );
 | 
			
		||||
   radeonInitSwtcl( ctx );
 | 
			
		||||
 | 
			
		||||
   _mesa_vector4f_alloc( &rmesa->tcl.ObjClean, 0, 
 | 
			
		||||
			 ctx->Const.MaxArrayLockSize, 32 );
 | 
			
		||||
 | 
			
		||||
   rmesa->iw.irq_seq = -1;
 | 
			
		||||
   rmesa->irqsEmitted = 0;
 | 
			
		||||
   rmesa->do_irqs = (rmesa->radeonScreen->irq && !getenv("RADEON_NO_IRQS"));
 | 
			
		||||
@@ -486,6 +489,8 @@ void radeonDestroyContext( __DRIcontextPrivate *driContextPriv )
 | 
			
		||||
      rmesa->glCtx->DriverCtx = NULL;
 | 
			
		||||
      _mesa_destroy_context( rmesa->glCtx );
 | 
			
		||||
 | 
			
		||||
      _mesa_vector4f_free( &rmesa->tcl.ObjClean );
 | 
			
		||||
 | 
			
		||||
      if (rmesa->state.scissor.pClipRects) {
 | 
			
		||||
	 FREE(rmesa->state.scissor.pClipRects);
 | 
			
		||||
	 rmesa->state.scissor.pClipRects = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -57,6 +57,8 @@ typedef struct radeon_context *radeonContextPtr;
 | 
			
		||||
#include "radeon_screen.h"
 | 
			
		||||
#include "mm.h"
 | 
			
		||||
 | 
			
		||||
#include "math/m_vector.h"
 | 
			
		||||
 | 
			
		||||
/* Flags for software fallback cases */
 | 
			
		||||
/* See correponding strings in radeon_swtcl.c */
 | 
			
		||||
#define RADEON_FALLBACK_TEXTURE		0x0001
 | 
			
		||||
@@ -503,6 +505,11 @@ struct radeon_tcl_info {
 | 
			
		||||
   GLint last_offset;
 | 
			
		||||
   GLuint hw_primitive;
 | 
			
		||||
 | 
			
		||||
   /* Temporary for cases where incoming vertex data is incompatible
 | 
			
		||||
    * with maos code.
 | 
			
		||||
    */
 | 
			
		||||
   GLvector4f ObjClean;
 | 
			
		||||
 | 
			
		||||
   struct radeon_dma_region *aos_components[8];
 | 
			
		||||
   GLuint nr_aos_components;
 | 
			
		||||
 | 
			
		||||
@@ -698,12 +705,6 @@ struct radeon_context {
 | 
			
		||||
   GLuint Fallback;
 | 
			
		||||
   GLuint NewGLState;
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
   /* Temporaries for translating away float colors:
 | 
			
		||||
    */
 | 
			
		||||
   struct gl_client_array UbyteColor;
 | 
			
		||||
   struct gl_client_array UbyteSecondaryColor;
 | 
			
		||||
 | 
			
		||||
   /* Vertex buffers
 | 
			
		||||
    */
 | 
			
		||||
   struct radeon_ioctl ioctl;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,13 +39,14 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
		       void *dest )
 | 
			
		||||
{
 | 
			
		||||
   LOCALVARS
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
      struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   GLuint (*tc0)[4], (*tc1)[4], (*tc2)[4];
 | 
			
		||||
   GLfloat (*col)[4], (*spec)[4];
 | 
			
		||||
   GLfloat (*fog)[4];
 | 
			
		||||
   GLuint (*norm)[4];
 | 
			
		||||
   GLubyte (*col)[4], (*spec)[4];
 | 
			
		||||
   GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride;
 | 
			
		||||
   GLuint tc2_stride, norm_stride;
 | 
			
		||||
   GLuint fill_tex = 0;
 | 
			
		||||
   GLuint (*coord)[4];
 | 
			
		||||
   GLuint coord_stride; /* object coordinates */
 | 
			
		||||
   GLubyte dummy[4];
 | 
			
		||||
@@ -56,36 +57,20 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
   if (RADEON_DEBUG & DEBUG_VERTS)
 | 
			
		||||
      fprintf(stderr, "%s\n", __FUNCTION__); 
 | 
			
		||||
 | 
			
		||||
   /* The vertex code expects Obj to be clean to element 3.  To fix
 | 
			
		||||
    * this, add more vertex code (for obj-2, obj-3) or preferably move
 | 
			
		||||
    * to maos.  
 | 
			
		||||
    */
 | 
			
		||||
   if (VB->ObjPtr->size < 3) {
 | 
			
		||||
      if (VB->ObjPtr->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	 VB->import_data( ctx, VERT_BIT_POS, VEC_NOT_WRITEABLE );
 | 
			
		||||
      }
 | 
			
		||||
      _mesa_vector4f_clean_elem( VB->ObjPtr, VB->Count, 2 );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (DO_W && VB->ObjPtr->size < 4) {
 | 
			
		||||
      if (VB->ObjPtr->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	 VB->import_data( ctx, VERT_BIT_POS, VEC_NOT_WRITEABLE );
 | 
			
		||||
      }
 | 
			
		||||
      _mesa_vector4f_clean_elem( VB->ObjPtr, VB->Count, 3 );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   coord = (GLuint (*)[4])VB->ObjPtr->data;
 | 
			
		||||
   coord_stride = VB->ObjPtr->stride;
 | 
			
		||||
 | 
			
		||||
   if (DO_TEX2) {
 | 
			
		||||
      const GLuint t2 = GET_TEXSOURCE(2);
 | 
			
		||||
      tc2 = (GLuint (*)[4])VB->TexCoordPtr[t2]->data;
 | 
			
		||||
      tc2_stride = VB->TexCoordPtr[t2]->stride;
 | 
			
		||||
      if (DO_PTEX && VB->TexCoordPtr[t2]->size < 4) {
 | 
			
		||||
	 if (VB->TexCoordPtr[t2]->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	    VB->import_data( ctx, VERT_BIT_TEX2, VEC_NOT_WRITEABLE );
 | 
			
		||||
      if (VB->TexCoordPtr[2]) {
 | 
			
		||||
	 const GLuint t2 = GET_TEXSOURCE(2);
 | 
			
		||||
	 tc2 = (GLuint (*)[4])VB->TexCoordPtr[t2]->data;
 | 
			
		||||
	 tc2_stride = VB->TexCoordPtr[t2]->stride;
 | 
			
		||||
	 if (DO_PTEX && VB->TexCoordPtr[t2]->size < 4) {
 | 
			
		||||
	    fill_tex |= (1<<2);
 | 
			
		||||
	 }
 | 
			
		||||
	 _mesa_vector4f_clean_elem( VB->TexCoordPtr[t2], VB->Count, 3 );
 | 
			
		||||
      } else {
 | 
			
		||||
	 tc2 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX2];
 | 
			
		||||
	 tc2_stride = 0;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -95,13 +80,10 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	 tc1 = (GLuint (*)[4])VB->TexCoordPtr[t1]->data;
 | 
			
		||||
	 tc1_stride = VB->TexCoordPtr[t1]->stride;
 | 
			
		||||
	 if (DO_PTEX && VB->TexCoordPtr[t1]->size < 4) {
 | 
			
		||||
	    if (VB->TexCoordPtr[t1]->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	       VB->import_data( ctx, VERT_BIT_TEX1, VEC_NOT_WRITEABLE );
 | 
			
		||||
	    }
 | 
			
		||||
	    _mesa_vector4f_clean_elem( VB->TexCoordPtr[t1], VB->Count, 3 );
 | 
			
		||||
	    fill_tex |= (1<<1);
 | 
			
		||||
	 }
 | 
			
		||||
      } else {
 | 
			
		||||
	 tc1 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX1]; /* could be anything, really */
 | 
			
		||||
	 tc1 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX1];
 | 
			
		||||
	 tc1_stride = 0;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@@ -112,13 +94,10 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	 tc0_stride = VB->TexCoordPtr[t0]->stride;
 | 
			
		||||
	 tc0 = (GLuint (*)[4])VB->TexCoordPtr[t0]->data;
 | 
			
		||||
	 if (DO_PTEX && VB->TexCoordPtr[t0]->size < 4) {
 | 
			
		||||
	    if (VB->TexCoordPtr[t0]->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	       VB->import_data( ctx, VERT_BIT_TEX0, VEC_NOT_WRITEABLE );
 | 
			
		||||
	    }
 | 
			
		||||
	    _mesa_vector4f_clean_elem( VB->TexCoordPtr[t0], VB->Count, 3 );
 | 
			
		||||
	    fill_tex |= (1<<0);
 | 
			
		||||
	 }
 | 
			
		||||
      } else {
 | 
			
		||||
	 tc0 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX0]; /* could be anything, really */
 | 
			
		||||
	 tc0 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
	 tc0_stride = 0;
 | 
			
		||||
      }
 | 
			
		||||
	 
 | 
			
		||||
@@ -136,28 +115,20 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
   if (DO_RGBA) {
 | 
			
		||||
      if (VB->ColorPtr[0]) {
 | 
			
		||||
	 /* This is incorrect when colormaterial is enabled:
 | 
			
		||||
	  */
 | 
			
		||||
	 if (VB->ColorPtr[0]->Type != GL_UNSIGNED_BYTE) {
 | 
			
		||||
	    if (0) fprintf(stderr, "IMPORTING FLOAT COLORS\n");
 | 
			
		||||
	    IMPORT_FLOAT_COLORS( ctx );
 | 
			
		||||
	 }
 | 
			
		||||
	 col = (GLubyte (*)[4])VB->ColorPtr[0]->Ptr;
 | 
			
		||||
	 col_stride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
	 col = VB->ColorPtr[0]->data;
 | 
			
		||||
	 col_stride = VB->ColorPtr[0]->stride;
 | 
			
		||||
      } else {
 | 
			
		||||
	 col = &dummy; /* any old memory is fine */
 | 
			
		||||
	 col = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
 | 
			
		||||
	 col_stride = 0;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (DO_SPEC) {
 | 
			
		||||
      if (VB->SecondaryColorPtr[0]) {
 | 
			
		||||
	 if (VB->SecondaryColorPtr[0]->Type != GL_UNSIGNED_BYTE)
 | 
			
		||||
	    IMPORT_FLOAT_SPEC_COLORS( ctx );
 | 
			
		||||
	 spec = (GLubyte (*)[4])VB->SecondaryColorPtr[0]->Ptr;
 | 
			
		||||
	 spec_stride = VB->SecondaryColorPtr[0]->StrideB;
 | 
			
		||||
	 spec = VB->SecondaryColorPtr[0]->data;
 | 
			
		||||
	 spec_stride = VB->SecondaryColorPtr[0]->stride;
 | 
			
		||||
      } else {
 | 
			
		||||
	 spec = &dummy;
 | 
			
		||||
	 spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
 | 
			
		||||
	 spec_stride = 0;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@@ -173,33 +144,33 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
   
 | 
			
		||||
   if (VB->importable_data) {
 | 
			
		||||
      if (start) {
 | 
			
		||||
	 coord =  (GLuint (*)[4])((GLubyte *)coord + start * coord_stride);
 | 
			
		||||
	 if (DO_TEX0)
 | 
			
		||||
	    tc0 =  (GLuint (*)[4])((GLubyte *)tc0 + start * tc0_stride);
 | 
			
		||||
	 if (DO_TEX1) 
 | 
			
		||||
	    tc1 =  (GLuint (*)[4])((GLubyte *)tc1 + start * tc1_stride);
 | 
			
		||||
	 if (DO_TEX2) 
 | 
			
		||||
	    tc2 =  (GLuint (*)[4])((GLubyte *)tc2 + start * tc2_stride);
 | 
			
		||||
	 if (DO_NORM) 
 | 
			
		||||
	    norm =  (GLuint (*)[4])((GLubyte *)norm + start * norm_stride);
 | 
			
		||||
	 if (DO_RGBA) 
 | 
			
		||||
	    STRIDE_4UB(col, start * col_stride);
 | 
			
		||||
	 if (DO_SPEC)
 | 
			
		||||
	    STRIDE_4UB(spec, start * spec_stride);
 | 
			
		||||
	 if (DO_FOG)
 | 
			
		||||
	    fog =  (GLfloat (*)[4])((GLubyte *)fog + start * fog_stride);
 | 
			
		||||
      }
 | 
			
		||||
   if (start) {
 | 
			
		||||
      coord =  (GLuint (*)[4])((GLubyte *)coord + start * coord_stride);
 | 
			
		||||
      if (DO_TEX0)
 | 
			
		||||
	 tc0 =  (GLuint (*)[4])((GLubyte *)tc0 + start * tc0_stride);
 | 
			
		||||
      if (DO_TEX1) 
 | 
			
		||||
	 tc1 =  (GLuint (*)[4])((GLubyte *)tc1 + start * tc1_stride);
 | 
			
		||||
      if (DO_TEX2) 
 | 
			
		||||
	 tc2 =  (GLuint (*)[4])((GLubyte *)tc2 + start * tc2_stride);
 | 
			
		||||
      if (DO_NORM) 
 | 
			
		||||
	 norm =  (GLuint (*)[4])((GLubyte *)norm + start * norm_stride);
 | 
			
		||||
      if (DO_RGBA) 
 | 
			
		||||
	 STRIDE_4F(col, start * col_stride);
 | 
			
		||||
      if (DO_SPEC)
 | 
			
		||||
	 STRIDE_4F(spec, start * spec_stride);
 | 
			
		||||
      if (DO_FOG)
 | 
			
		||||
	 STRIDE_4F(fog, start * fog_stride);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   {
 | 
			
		||||
      for (i=start; i < end; i++) {
 | 
			
		||||
	 
 | 
			
		||||
	 v[0].ui = coord[0][0];
 | 
			
		||||
	 v[1].ui = coord[0][1];
 | 
			
		||||
	 v[2].ui = coord[0][2];
 | 
			
		||||
	 if (TCL_DEBUG) fprintf(stderr, "%d: %.2f %.2f %.2f ", i, v[0].f, v[1].f, v[2].f);
 | 
			
		||||
	 if (DO_W) {
 | 
			
		||||
	    v[3].ui = coord[0][3];
 | 
			
		||||
	    if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[3].f);
 | 
			
		||||
	    v += 4;
 | 
			
		||||
	 } 
 | 
			
		||||
	 else
 | 
			
		||||
@@ -210,26 +181,27 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	    v[0].ui = norm[0][0];
 | 
			
		||||
	    v[1].ui = norm[0][1];
 | 
			
		||||
	    v[2].ui = norm[0][2];
 | 
			
		||||
	    if (TCL_DEBUG) fprintf(stderr, "norm: %.2f %.2f %.2f ", v[0].f, v[1].f, v[2].f);
 | 
			
		||||
	    v += 3;
 | 
			
		||||
	    norm =  (GLuint (*)[4])((GLubyte *)norm +  norm_stride);
 | 
			
		||||
	 }
 | 
			
		||||
	 if (DO_RGBA) {
 | 
			
		||||
	    v[0].ui = LE32_TO_CPU(*(GLuint *)&col[0]);
 | 
			
		||||
	    STRIDE_4UB(col, col_stride);
 | 
			
		||||
	    if (TCL_DEBUG) fprintf(stderr, "%x ", v[0].ui);
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, col[0][0]);
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, col[0][1]);
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, col[0][2]);
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, col[0][3]);
 | 
			
		||||
	    STRIDE_4F(col, col_stride);
 | 
			
		||||
	    v++;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (DO_SPEC || DO_FOG) {
 | 
			
		||||
	    if (DO_SPEC) {
 | 
			
		||||
	       v[0].specular.red   = spec[0][0];
 | 
			
		||||
	       v[0].specular.green = spec[0][1];
 | 
			
		||||
	       v[0].specular.blue  = spec[0][2];
 | 
			
		||||
	       STRIDE_4UB(spec, spec_stride);
 | 
			
		||||
	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, spec[0][0]);
 | 
			
		||||
	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, spec[0][1]);
 | 
			
		||||
	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, spec[0][2]);
 | 
			
		||||
	       STRIDE_4F(spec, spec_stride);
 | 
			
		||||
	    }
 | 
			
		||||
	    if (DO_FOG) {
 | 
			
		||||
	       v[0].specular.alpha = fog[0][0] * 255.0;
 | 
			
		||||
               fog = (GLfloat (*)[4])((GLubyte *)fog + fog_stride);
 | 
			
		||||
	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, fog[0][0]);
 | 
			
		||||
	       fog = (GLfloat (*)[4])((GLubyte *)fog + fog_stride);
 | 
			
		||||
	    }
 | 
			
		||||
	    if (TCL_DEBUG) fprintf(stderr, "%x ", v[0].ui);
 | 
			
		||||
	    v++;
 | 
			
		||||
@@ -239,7 +211,10 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	    v[1].ui = tc0[0][1];
 | 
			
		||||
	    if (TCL_DEBUG) fprintf(stderr, "t0: %.2f %.2f ", v[0].f, v[1].f);
 | 
			
		||||
	    if (DO_PTEX) {
 | 
			
		||||
	       v[2].ui = tc0[0][3];
 | 
			
		||||
	       if (fill_tex & (1<<0))
 | 
			
		||||
		  v[2].f = 1.0;
 | 
			
		||||
	       else
 | 
			
		||||
		  v[2].ui = tc0[0][3];
 | 
			
		||||
	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
 | 
			
		||||
	       v += 3;
 | 
			
		||||
	    } 
 | 
			
		||||
@@ -252,7 +227,10 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	    v[1].ui = tc1[0][1];
 | 
			
		||||
	    if (TCL_DEBUG) fprintf(stderr, "t1: %.2f %.2f ", v[0].f, v[1].f);
 | 
			
		||||
	    if (DO_PTEX) {
 | 
			
		||||
	       v[2].ui = tc1[0][3];
 | 
			
		||||
	       if (fill_tex & (1<<1))
 | 
			
		||||
		  v[2].f = 1.0;
 | 
			
		||||
	       else
 | 
			
		||||
		  v[2].ui = tc1[0][3];
 | 
			
		||||
	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
 | 
			
		||||
	       v += 3;
 | 
			
		||||
	    } 
 | 
			
		||||
@@ -264,7 +242,10 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	    v[0].ui = tc2[0][0];
 | 
			
		||||
	    v[1].ui = tc2[0][1];
 | 
			
		||||
	    if (DO_PTEX) {
 | 
			
		||||
	       v[2].ui = tc2[0][3];
 | 
			
		||||
	       if (fill_tex & (1<<2))
 | 
			
		||||
		  v[2].f = 1.0;
 | 
			
		||||
	       else
 | 
			
		||||
		  v[2].ui = tc2[0][3];
 | 
			
		||||
	       v += 3;
 | 
			
		||||
	    } 
 | 
			
		||||
	    else
 | 
			
		||||
@@ -273,71 +254,6 @@ static void TAG(emit)( GLcontext *ctx,
 | 
			
		||||
	 } 
 | 
			
		||||
	 if (TCL_DEBUG) fprintf(stderr, "\n");
 | 
			
		||||
      }
 | 
			
		||||
   } else {
 | 
			
		||||
      for (i=start; i < end; i++) {
 | 
			
		||||
	 v[0].ui = coord[i][0];
 | 
			
		||||
	 v[1].ui = coord[i][1];
 | 
			
		||||
	 v[2].ui = coord[i][2];
 | 
			
		||||
	 if (DO_W) {
 | 
			
		||||
	    v[3].ui = coord[i][3];
 | 
			
		||||
	    v += 4;
 | 
			
		||||
	 } 
 | 
			
		||||
	 else
 | 
			
		||||
	    v += 3;
 | 
			
		||||
 | 
			
		||||
	 if (DO_NORM) {
 | 
			
		||||
	    v[0].ui = norm[i][0];
 | 
			
		||||
	    v[1].ui = norm[i][1];
 | 
			
		||||
	    v[2].ui = norm[i][2];
 | 
			
		||||
	    v += 3;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (DO_RGBA) {
 | 
			
		||||
	    v[0].ui = LE32_TO_CPU(*(GLuint *)&col[i]);
 | 
			
		||||
	    v++;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (DO_SPEC || DO_FOG) {
 | 
			
		||||
	    if (DO_SPEC) {
 | 
			
		||||
	       v[0].specular.red   = spec[i][0];
 | 
			
		||||
	       v[0].specular.green = spec[i][1];
 | 
			
		||||
	       v[0].specular.blue  = spec[i][2];
 | 
			
		||||
	    }
 | 
			
		||||
	    if (DO_FOG) {
 | 
			
		||||
               GLfloat *f = (GLfloat *) ((GLubyte *)fog + fog_stride);
 | 
			
		||||
               v[0].specular.alpha = *f * 255.0;
 | 
			
		||||
	    }
 | 
			
		||||
	    v++;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (DO_TEX0) {
 | 
			
		||||
	    v[0].ui = tc0[i][0];
 | 
			
		||||
	    v[1].ui = tc0[i][1];
 | 
			
		||||
	    if (DO_PTEX) {
 | 
			
		||||
	       v[2].ui = tc0[i][3];
 | 
			
		||||
	       v += 3;
 | 
			
		||||
	    } 
 | 
			
		||||
	    else
 | 
			
		||||
	       v += 2;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (DO_TEX1) {
 | 
			
		||||
	    v[0].ui = tc1[i][0];
 | 
			
		||||
	    v[1].ui = tc1[i][1];
 | 
			
		||||
	    if (DO_PTEX) {
 | 
			
		||||
	       v[2].ui = tc1[i][3];
 | 
			
		||||
	       v += 3;
 | 
			
		||||
	    } 
 | 
			
		||||
	    else
 | 
			
		||||
	       v += 2;
 | 
			
		||||
	 } 
 | 
			
		||||
	 if (DO_TEX2) {
 | 
			
		||||
	    v[0].ui = tc2[i][0];
 | 
			
		||||
	    v[1].ui = tc2[i][1];
 | 
			
		||||
	    if (DO_PTEX) {
 | 
			
		||||
	       v[2].ui = tc2[i][3];
 | 
			
		||||
	       v += 3;
 | 
			
		||||
	    } 
 | 
			
		||||
	    else
 | 
			
		||||
	       v += 2;
 | 
			
		||||
	 } 
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#include "array_cache/acache.h"
 | 
			
		||||
#include "tnl/tnl.h"
 | 
			
		||||
#include "tnl/t_pipeline.h"
 | 
			
		||||
#include "tnl/t_imm_debug.h"
 | 
			
		||||
 | 
			
		||||
#include "radeon_context.h"
 | 
			
		||||
#include "radeon_state.h"
 | 
			
		||||
@@ -53,7 +52,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
#define RADEON_TCL_MAX_SETUP 13
 | 
			
		||||
 | 
			
		||||
union emit_union { float f; GLuint ui; radeon_color_t specular; };
 | 
			
		||||
union emit_union { float f; GLuint ui; radeon_color_t rgba; };
 | 
			
		||||
 | 
			
		||||
static struct {
 | 
			
		||||
   void   (*emit)( GLcontext *, GLuint, GLuint, void * );
 | 
			
		||||
@@ -308,6 +307,41 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs )
 | 
			
		||||
			      setup_tab[i].vertex_size * 4, 
 | 
			
		||||
			      4);
 | 
			
		||||
 | 
			
		||||
   /* The vertex code expects Obj to be clean to element 3.  To fix
 | 
			
		||||
    * this, add more vertex code (for obj-2, obj-3) or preferably move
 | 
			
		||||
    * to maos.  
 | 
			
		||||
    */
 | 
			
		||||
   if (VB->ObjPtr->size < 3 || 
 | 
			
		||||
       (VB->ObjPtr->size == 3 && 
 | 
			
		||||
	(setup_tab[i].vertex_format & RADEON_CP_VC_FRMT_W0))) {
 | 
			
		||||
 | 
			
		||||
      _math_trans_4f( rmesa->tcl.ObjClean.data,
 | 
			
		||||
		      VB->ObjPtr->data,
 | 
			
		||||
		      VB->ObjPtr->stride,
 | 
			
		||||
		      GL_FLOAT,
 | 
			
		||||
		      VB->ObjPtr->size,
 | 
			
		||||
		      0,
 | 
			
		||||
		      VB->Count );
 | 
			
		||||
 | 
			
		||||
      switch (VB->ObjPtr->size) {
 | 
			
		||||
      case 1:
 | 
			
		||||
	    _mesa_vector4f_clean_elem(&rmesa->tcl.ObjClean, VB->Count, 1);
 | 
			
		||||
      case 2:
 | 
			
		||||
	    _mesa_vector4f_clean_elem(&rmesa->tcl.ObjClean, VB->Count, 2);
 | 
			
		||||
      case 3:
 | 
			
		||||
	 if (setup_tab[i].vertex_format & RADEON_CP_VC_FRMT_W0) {
 | 
			
		||||
	    _mesa_vector4f_clean_elem(&rmesa->tcl.ObjClean, VB->Count, 3);
 | 
			
		||||
	 }
 | 
			
		||||
      case 4:
 | 
			
		||||
      default:
 | 
			
		||||
	 break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      VB->ObjPtr = &rmesa->tcl.ObjClean;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   setup_tab[i].emit( ctx, 0, VB->Count, 
 | 
			
		||||
		      rmesa->tcl.indexed_verts.address + 
 | 
			
		||||
		      rmesa->tcl.indexed_verts.start );
 | 
			
		||||
 
 | 
			
		||||
@@ -2115,10 +2115,30 @@ static void radeonInvalidateState( GLcontext *ctx, GLuint new_state )
 | 
			
		||||
   radeonVtxfmtInvalidate( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* A hack.  Need a faster way to find this out.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean check_material( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLint i;
 | 
			
		||||
 | 
			
		||||
   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; 
 | 
			
		||||
	i < _TNL_ATTRIB_MAT_BACK_INDEXES; 
 | 
			
		||||
	i++)
 | 
			
		||||
      if (tnl->vb.AttribPtr[i] &&
 | 
			
		||||
	  tnl->vb.AttribPtr[i]->stride)
 | 
			
		||||
	 return GL_TRUE;
 | 
			
		||||
 | 
			
		||||
   return GL_FALSE;
 | 
			
		||||
}
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
static void radeonWrapRunPipeline( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLboolean has_material;
 | 
			
		||||
 | 
			
		||||
   if (0)
 | 
			
		||||
      fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState);
 | 
			
		||||
@@ -2128,7 +2148,9 @@ static void radeonWrapRunPipeline( GLcontext *ctx )
 | 
			
		||||
   if (rmesa->NewGLState)
 | 
			
		||||
      radeonValidateState( ctx );
 | 
			
		||||
 | 
			
		||||
   if (tnl->vb.Material) {
 | 
			
		||||
   has_material = (ctx->Light.Enabled && check_material( ctx ));
 | 
			
		||||
 | 
			
		||||
   if (has_material) {
 | 
			
		||||
      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_TRUE );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -2136,7 +2158,7 @@ static void radeonWrapRunPipeline( GLcontext *ctx )
 | 
			
		||||
    */ 
 | 
			
		||||
   _tnl_run_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
   if (tnl->vb.Material) {
 | 
			
		||||
   if (has_material) {
 | 
			
		||||
      TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_MATERIAL, GL_FALSE );
 | 
			
		||||
      radeonUpdateMaterial( ctx ); /* not needed any more? */
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -44,8 +44,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#include "math/m_translate.h"
 | 
			
		||||
#include "tnl/tnl.h"
 | 
			
		||||
#include "tnl/t_context.h"
 | 
			
		||||
#include "tnl/t_imm_exec.h"
 | 
			
		||||
#include "tnl/t_pipeline.h"
 | 
			
		||||
#include "tnl/t_vtx_api.h"	/* for _tnl_FlushVertices */
 | 
			
		||||
 | 
			
		||||
#include "radeon_context.h"
 | 
			
		||||
#include "radeon_ioctl.h"
 | 
			
		||||
@@ -567,7 +567,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
 | 
			
		||||
   RADEON_CONTEXT(ctx)->swtcl.SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   RADEON_CONTEXT(ctx)->swtcl.SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ELT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
@@ -579,7 +579,7 @@ static void ELT_FALLBACK( GLcontext *ctx,
 | 
			
		||||
   tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
 | 
			
		||||
   tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
 | 
			
		||||
   tnl->Driver.Render.PrimTabElts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
 | 
			
		||||
   RADEON_CONTEXT(ctx)->swtcl.SetupNewInputs = VERT_BIT_CLIP;
 | 
			
		||||
   RADEON_CONTEXT(ctx)->swtcl.SetupNewInputs = VERT_BIT_POS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -667,7 +667,7 @@ do {									\
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean radeon_run_render( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -701,18 +701,22 @@ static GLboolean radeon_run_render( GLcontext *ctx,
 | 
			
		||||
	    return GL_TRUE;	/* too many vertices */
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length = VB->PrimitiveLength[i];
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      if (RADEON_DEBUG & DEBUG_PRIMS)
 | 
			
		||||
	 fprintf(stderr, "radeon_render.c: prim %s %d..%d\n", 
 | 
			
		||||
		 _mesa_lookup_enum_by_nr(flags & PRIM_MODE_MASK), 
 | 
			
		||||
		 i, i+length);
 | 
			
		||||
	 fprintf(stderr, "r200_render.c: prim %s %d..%d\n", 
 | 
			
		||||
		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK), 
 | 
			
		||||
		 start, start+length);
 | 
			
		||||
 | 
			
		||||
      if (length)
 | 
			
		||||
	 tab[flags & PRIM_MODE_MASK]( ctx, i, i + length, flags );
 | 
			
		||||
	 tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, flags );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Finish( ctx );
 | 
			
		||||
@@ -723,9 +727,9 @@ static GLboolean radeon_run_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void radeon_check_render( GLcontext *ctx,
 | 
			
		||||
				 struct gl_pipeline_stage *stage )
 | 
			
		||||
				 struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_CLIP | VERT_BIT_COLOR0;
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->RenderMode == GL_RENDER) {
 | 
			
		||||
      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
 | 
			
		||||
@@ -745,13 +749,13 @@ static void radeon_check_render( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _radeon_render_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _radeon_render_stage =
 | 
			
		||||
{
 | 
			
		||||
   "radeon render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
@@ -784,7 +788,7 @@ struct texrect_stage_data {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_texrect_stage( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct texrect_stage_data *store = TEXRECT_STAGE_DATA(stage);
 | 
			
		||||
   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
 | 
			
		||||
@@ -826,7 +830,7 @@ static GLboolean run_texrect_stage( GLcontext *ctx,
 | 
			
		||||
/* Called the first time stage->run() is invoked.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean alloc_texrect_data( GLcontext *ctx,
 | 
			
		||||
				     struct gl_pipeline_stage *stage )
 | 
			
		||||
				     struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct texrect_stage_data *store;
 | 
			
		||||
@@ -848,7 +852,7 @@ static GLboolean alloc_texrect_data( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void check_texrect( GLcontext *ctx,
 | 
			
		||||
			   struct gl_pipeline_stage *stage )
 | 
			
		||||
			   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint flags = 0;
 | 
			
		||||
 | 
			
		||||
@@ -864,7 +868,7 @@ static void check_texrect( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void free_texrect_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void free_texrect_data( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct texrect_stage_data *store = TEXRECT_STAGE_DATA(stage);
 | 
			
		||||
   GLuint i;
 | 
			
		||||
@@ -879,7 +883,7 @@ static void free_texrect_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _radeon_texrect_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _radeon_texrect_stage =
 | 
			
		||||
{
 | 
			
		||||
   "radeon texrect stage",			/* name */
 | 
			
		||||
   _NEW_TEXTURE,	/* check_state */
 | 
			
		||||
@@ -1271,7 +1275,7 @@ void radeonFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
 | 
			
		||||
 | 
			
		||||
void radeonFlushVertices( GLcontext *ctx, GLuint flags )
 | 
			
		||||
{
 | 
			
		||||
   _tnl_flush_vertices( ctx, flags );
 | 
			
		||||
   _tnl_FlushVertices( ctx, flags );
 | 
			
		||||
 | 
			
		||||
   if (flags & FLUSH_STORED_VERTICES)
 | 
			
		||||
      RADEON_NEWPRIM( RADEON_CONTEXT( ctx ) );
 | 
			
		||||
@@ -1320,13 +1324,4 @@ void radeonDestroySwtcl( GLcontext *ctx )
 | 
			
		||||
      rmesa->swtcl.verts = 0;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (rmesa->UbyteSecondaryColor.Ptr) {
 | 
			
		||||
      ALIGN_FREE(rmesa->UbyteSecondaryColor.Ptr);
 | 
			
		||||
      rmesa->UbyteSecondaryColor.Ptr = 0;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (rmesa->UbyteColor.Ptr) {
 | 
			
		||||
      ALIGN_FREE(rmesa->UbyteColor.Ptr);
 | 
			
		||||
      rmesa->UbyteColor.Ptr = 0;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -277,7 +277,7 @@ void radeonTclPrimitive( GLcontext *ctx,
 | 
			
		||||
/* TCL render.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean radeon_run_tcl_render( GLcontext *ctx,
 | 
			
		||||
					struct gl_pipeline_stage *stage )
 | 
			
		||||
					struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -297,24 +297,19 @@ static GLboolean radeon_run_tcl_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
   rmesa->tcl.Elts = VB->Elts;
 | 
			
		||||
 | 
			
		||||
   for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
   for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
   {
 | 
			
		||||
      flags = VB->Primitive[i];
 | 
			
		||||
      length = VB->PrimitiveLength[i];
 | 
			
		||||
 | 
			
		||||
      if (RADEON_DEBUG & DEBUG_PRIMS)
 | 
			
		||||
	 fprintf(stderr, "%s: prim %s %d..%d\n", 
 | 
			
		||||
		 __FUNCTION__,
 | 
			
		||||
		 _mesa_lookup_enum_by_nr(flags & PRIM_MODE_MASK), 
 | 
			
		||||
		 i, i+length);
 | 
			
		||||
      GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
      GLuint start = VB->Primitive[i].start;
 | 
			
		||||
      GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
      if (!length)
 | 
			
		||||
	 continue;
 | 
			
		||||
 | 
			
		||||
      if (rmesa->tcl.Elts)
 | 
			
		||||
	 radeonEmitEltPrimitive( ctx, i, i+length, flags );
 | 
			
		||||
	 radeonEmitEltPrimitive( ctx, start, start+length, prim );
 | 
			
		||||
      else
 | 
			
		||||
	 radeonEmitPrimitive( ctx, i, i+length, flags );
 | 
			
		||||
	 radeonEmitPrimitive( ctx, start, start+length, prim );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return GL_FALSE;		/* finished the pipe */
 | 
			
		||||
@@ -323,7 +318,7 @@ static GLboolean radeon_run_tcl_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void radeon_check_tcl_render( GLcontext *ctx,
 | 
			
		||||
				     struct gl_pipeline_stage *stage )
 | 
			
		||||
				     struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
 | 
			
		||||
   GLuint inputs = VERT_BIT_POS;
 | 
			
		||||
@@ -374,13 +369,13 @@ static void radeon_check_tcl_render( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void radeon_init_tcl_render( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->check = radeon_check_tcl_render;
 | 
			
		||||
   stage->check( ctx, stage );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   (void)stage;
 | 
			
		||||
}
 | 
			
		||||
@@ -388,7 +383,7 @@ static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
/* Initial state for tcl stage.  
 | 
			
		||||
 */
 | 
			
		||||
const struct gl_pipeline_stage _radeon_tcl_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _radeon_tcl_stage =
 | 
			
		||||
{
 | 
			
		||||
   "radeon render",
 | 
			
		||||
   (_DD_NEW_SEPARATE_SPECULAR |
 | 
			
		||||
 
 | 
			
		||||
@@ -973,8 +973,8 @@ void radeonVtxfmtInit( GLcontext *ctx )
 | 
			
		||||
   vfmt->FogCoordfEXT = _mesa_noop_FogCoordfEXT;
 | 
			
		||||
   vfmt->EdgeFlag = _mesa_noop_EdgeFlag;
 | 
			
		||||
   vfmt->EdgeFlagv = _mesa_noop_EdgeFlagv;
 | 
			
		||||
   vfmt->Indexi = _mesa_noop_Indexi;
 | 
			
		||||
   vfmt->Indexiv = _mesa_noop_Indexiv;
 | 
			
		||||
   vfmt->Indexf = _mesa_noop_Indexf;
 | 
			
		||||
   vfmt->Indexfv = _mesa_noop_Indexfv;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Active but unsupported -- fallback if we receive these:
 | 
			
		||||
 
 | 
			
		||||
@@ -831,16 +831,10 @@ void radeonVtxfmtInitChoosers( GLvertexformat *vfmt )
 | 
			
		||||
{
 | 
			
		||||
   vfmt->Color3f = choose_Color3f;
 | 
			
		||||
   vfmt->Color3fv = choose_Color3fv;
 | 
			
		||||
   vfmt->Color3ub = choose_Color3ub;
 | 
			
		||||
   vfmt->Color3ubv = choose_Color3ubv;
 | 
			
		||||
   vfmt->Color4f = choose_Color4f;
 | 
			
		||||
   vfmt->Color4fv = choose_Color4fv;
 | 
			
		||||
   vfmt->Color4ub = choose_Color4ub;
 | 
			
		||||
   vfmt->Color4ubv = choose_Color4ubv;
 | 
			
		||||
   vfmt->SecondaryColor3fEXT = choose_SecondaryColor3fEXT;
 | 
			
		||||
   vfmt->SecondaryColor3fvEXT = choose_SecondaryColor3fvEXT;
 | 
			
		||||
   vfmt->SecondaryColor3ubEXT = choose_SecondaryColor3ubEXT;
 | 
			
		||||
   vfmt->SecondaryColor3ubvEXT = choose_SecondaryColor3ubvEXT;
 | 
			
		||||
   vfmt->MultiTexCoord1fARB = choose_MultiTexCoord1fARB;
 | 
			
		||||
   vfmt->MultiTexCoord1fvARB = choose_MultiTexCoord1fvARB;
 | 
			
		||||
   vfmt->MultiTexCoord2fARB = choose_MultiTexCoord2fARB;
 | 
			
		||||
@@ -855,6 +849,15 @@ void radeonVtxfmtInitChoosers( GLvertexformat *vfmt )
 | 
			
		||||
   vfmt->Vertex2fv = choose_Vertex2fv;
 | 
			
		||||
   vfmt->Vertex3f = choose_Vertex3f;
 | 
			
		||||
   vfmt->Vertex3fv = choose_Vertex3fv;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   vfmt->Color3ub = choose_Color3ub;
 | 
			
		||||
   vfmt->Color3ubv = choose_Color3ubv;
 | 
			
		||||
   vfmt->Color4ub = choose_Color4ub;
 | 
			
		||||
   vfmt->Color4ubv = choose_Color4ubv;
 | 
			
		||||
   vfmt->SecondaryColor3ubEXT = choose_SecondaryColor3ubEXT;
 | 
			
		||||
   vfmt->SecondaryColor3ubvEXT = choose_SecondaryColor3ubvEXT;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -361,7 +361,7 @@ void sisBuildVertices( GLcontext *ctx,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[smesa->SetupIndex].emit( ctx, start, count, v, stride );
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * fxDDReadPixels888 does not convert 8A8R8G8B into 5R5G5B
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* $Id: fxdd.c,v 1.100 2003/10/02 17:36:44 brianp Exp $ */
 | 
			
		||||
/* $Id: fxdd.c,v 1.100.2.1 2003/11/21 13:40:21 keithw Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
@@ -960,7 +960,7 @@ fxDDGetString(GLcontext * ctx, GLenum name)
 | 
			
		||||
 }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct gl_pipeline_stage *fx_pipeline[] = {
 | 
			
		||||
static const struct tnl_pipeline_stage *fx_pipeline[] = {
 | 
			
		||||
   &_tnl_vertex_transform_stage,	/* TODO: Add the fastpath here */
 | 
			
		||||
   &_tnl_normal_transform_stage,
 | 
			
		||||
   &_tnl_lighting_stage,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: fxvb.c,v 1.19 2003/10/02 17:36:45 brianp Exp $ */
 | 
			
		||||
/* $Id: fxvb.c,v 1.19.2.1 2003/11/21 13:40:21 keithw Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
@@ -301,7 +301,7 @@ void fxBuildVertices( GLcontext *ctx, GLuint start, GLuint count,
 | 
			
		||||
   if (!newinputs)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   if (newinputs & VERT_BIT_CLIP) {
 | 
			
		||||
   if (newinputs & VERT_BIT_POS) {
 | 
			
		||||
      setup_tab[fxMesa->SetupIndex].emit( ctx, start, count, v );   
 | 
			
		||||
   } else {
 | 
			
		||||
      GLuint ind = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -250,6 +250,9 @@ static void (*fogcoordfuncs[8])( const void * ) = {
 | 
			
		||||
 | 
			
		||||
GLboolean _ae_create_context( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   if (ctx->aelt_context)
 | 
			
		||||
      return GL_TRUE;
 | 
			
		||||
 | 
			
		||||
   ctx->aelt_context = MALLOC( sizeof(AEcontext) );
 | 
			
		||||
   if (!ctx->aelt_context)
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,324 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "api_eval.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "math/m_eval.h"
 | 
			
		||||
 | 
			
		||||
static void do_EvalCoord1f(GLcontext* ctx, GLfloat u)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
   /** Color Index **/
 | 
			
		||||
   if (ctx->Eval.Map1Index) 
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat findex;
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Index;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, &findex, uu, 1, map->Order);
 | 
			
		||||
      glIndexi( (GLint) findex );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Color **/
 | 
			
		||||
   if (ctx->Eval.Map1Color4) {
 | 
			
		||||
      GLfloat fcolor[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Color4;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, fcolor, uu, 4, map->Order);
 | 
			
		||||
      glColor4fv( fcolor );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Normal Vector **/
 | 
			
		||||
   if (ctx->Eval.Map1Normal) {
 | 
			
		||||
      GLfloat normal[3];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Normal;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, normal, uu, 3, map->Order);
 | 
			
		||||
      glNormal3fv( normal );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Texture Coordinates **/
 | 
			
		||||
   if (ctx->Eval.Map1TextureCoord4) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Texture4;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, texcoord, uu, 4, map->Order);
 | 
			
		||||
      glTexCoord4fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map1TextureCoord3) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Texture3;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, texcoord, uu, 3, map->Order);
 | 
			
		||||
      glTexCoord3fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map1TextureCoord2) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Texture2;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, texcoord, uu, 2, map->Order);
 | 
			
		||||
      glTexCoord2fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map1TextureCoord1) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Texture1;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, texcoord, uu, 1, map->Order);
 | 
			
		||||
      glTexCoord1fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
  
 | 
			
		||||
   /** Vertex **/
 | 
			
		||||
   if (ctx->Eval.Map1Vertex4) 
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat vertex[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Vertex4;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, vertex, uu, 4, map->Order);
 | 
			
		||||
      glVertex4fv( vertex );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map1Vertex3) 
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat vertex[4];
 | 
			
		||||
      struct gl_1d_map *map = &ctx->EvalMap.Map1Vertex3;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      _math_horner_bezier_curve(map->Points, vertex, uu, 3, map->Order);
 | 
			
		||||
      glVertex3fv( vertex );
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define CROSS_PROD(n, u, v) \
 | 
			
		||||
  (n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \
 | 
			
		||||
  (n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \
 | 
			
		||||
  (n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void do_EvalCoord2f( GLcontext* ctx, GLfloat u, GLfloat v )
 | 
			
		||||
{   
 | 
			
		||||
   /** Color Index **/
 | 
			
		||||
   if (ctx->Eval.Map2Index) {
 | 
			
		||||
      GLfloat findex;
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Index;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, &findex, uu, vv, 1,
 | 
			
		||||
                         map->Uorder, map->Vorder);
 | 
			
		||||
      glIndexi( (GLuint) (GLint) findex );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Color **/
 | 
			
		||||
   if (ctx->Eval.Map2Color4) {
 | 
			
		||||
      GLfloat fcolor[4];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Color4;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, fcolor, uu, vv, 4,
 | 
			
		||||
                         map->Uorder, map->Vorder);
 | 
			
		||||
      glColor4fv( fcolor );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Normal **/
 | 
			
		||||
   if (ctx->Eval.Map2Normal &&
 | 
			
		||||
       (!ctx->Eval.AutoNormal || (!ctx->Eval.Map2Vertex3 && 
 | 
			
		||||
				  !ctx->Eval.Map2Vertex4))) {
 | 
			
		||||
      GLfloat normal[3];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Normal;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, normal, uu, vv, 3,
 | 
			
		||||
			 map->Uorder, map->Vorder);
 | 
			
		||||
      glNormal3fv( normal );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Texture Coordinates **/
 | 
			
		||||
   if (ctx->Eval.Map2TextureCoord4) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Texture4;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 4,
 | 
			
		||||
                         map->Uorder, map->Vorder);
 | 
			
		||||
      glTexCoord4fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map2TextureCoord3) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Texture3;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 3,
 | 
			
		||||
                         map->Uorder, map->Vorder);
 | 
			
		||||
      glTexCoord3fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map2TextureCoord2) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Texture2;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 2,
 | 
			
		||||
                         map->Uorder, map->Vorder);
 | 
			
		||||
      glTexCoord2fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map2TextureCoord1) {
 | 
			
		||||
      GLfloat texcoord[4];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Texture1;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 1,
 | 
			
		||||
                         map->Uorder, map->Vorder);
 | 
			
		||||
      glTexCoord1fv( texcoord );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /** Vertex **/
 | 
			
		||||
   if(ctx->Eval.Map2Vertex4) {
 | 
			
		||||
      GLfloat vertex[4];
 | 
			
		||||
      GLfloat normal[3];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Vertex4;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Eval.AutoNormal) {
 | 
			
		||||
         GLfloat du[4], dv[4];
 | 
			
		||||
 | 
			
		||||
         _math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv, 4,
 | 
			
		||||
				 map->Uorder, map->Vorder);
 | 
			
		||||
 | 
			
		||||
         CROSS_PROD(normal, du, dv);
 | 
			
		||||
         NORMALIZE_3FV(normal);
 | 
			
		||||
	 glNormal3fv( normal );
 | 
			
		||||
	 glVertex4fv( vertex );
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
         _math_horner_bezier_surf(map->Points, vertex, uu, vv, 4,
 | 
			
		||||
                            map->Uorder, map->Vorder);
 | 
			
		||||
	 glVertex4fv( vertex );
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map2Vertex3) {
 | 
			
		||||
      GLfloat vertex[4];
 | 
			
		||||
      struct gl_2d_map *map = &ctx->EvalMap.Map2Vertex3;
 | 
			
		||||
      GLfloat uu = (u - map->u1) * map->du;
 | 
			
		||||
      GLfloat vv = (v - map->v1) * map->dv;
 | 
			
		||||
      if (ctx->Eval.AutoNormal) {
 | 
			
		||||
         GLfloat du[3], dv[3];
 | 
			
		||||
	 GLfloat normal[3];
 | 
			
		||||
         _math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv, 3,
 | 
			
		||||
				 map->Uorder, map->Vorder);
 | 
			
		||||
         CROSS_PROD(normal, du, dv);
 | 
			
		||||
         NORMALIZE_3FV(normal);
 | 
			
		||||
	 glNormal3fv( normal );
 | 
			
		||||
	 glVertex3fv( vertex );
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
         _math_horner_bezier_surf(map->Points, vertex, uu, vv, 3,
 | 
			
		||||
                            map->Uorder, map->Vorder);
 | 
			
		||||
	 glVertex3fv( vertex );
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _mesa_EvalPoint1( GLint i )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT( ctx );
 | 
			
		||||
   GLfloat du = ((ctx->Eval.MapGrid1u2 - ctx->Eval.MapGrid1u1) /
 | 
			
		||||
		 (GLfloat) ctx->Eval.MapGrid1un);
 | 
			
		||||
   GLfloat u = i * du + ctx->Eval.MapGrid1u1;
 | 
			
		||||
 | 
			
		||||
   glEvalCoord1f( u );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _mesa_EvalPoint2( GLint i, GLint j )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT( ctx );
 | 
			
		||||
   GLfloat du = ((ctx->Eval.MapGrid2u2 - ctx->Eval.MapGrid2u1) / 
 | 
			
		||||
		 (GLfloat) ctx->Eval.MapGrid2un);
 | 
			
		||||
   GLfloat dv = ((ctx->Eval.MapGrid2v2 - ctx->Eval.MapGrid2v1) / 
 | 
			
		||||
		 (GLfloat) ctx->Eval.MapGrid2vn);
 | 
			
		||||
   GLfloat u = i * du + ctx->Eval.MapGrid2u1;
 | 
			
		||||
   GLfloat v = j * dv + ctx->Eval.MapGrid2v1;
 | 
			
		||||
 | 
			
		||||
   glEvalCoord2f( u, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Wierd thing about eval is that it doesn't affect 'current' values.
 | 
			
		||||
 * This technique of saving and resetting current values requires
 | 
			
		||||
 * that: 
 | 
			
		||||
 *
 | 
			
		||||
 *   1) Current values are updated immediately in the glColor,
 | 
			
		||||
 *   etc. functions.
 | 
			
		||||
 *
 | 
			
		||||
 *   2) Hardware color values are stored seperately from ctx->Current, 
 | 
			
		||||
 *      for example in dma buffers, or direct emit to registers.
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_EvalCoord1f( GLfloat u )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT( ctx );
 | 
			
		||||
   GLfloat normal[3], texcoord[4], color[4];
 | 
			
		||||
   GLuint index;
 | 
			
		||||
 | 
			
		||||
   COPY_3FV( normal, ctx->Current.Attrib[VERT_ATTRIB_NORMAL] );
 | 
			
		||||
   COPY_4FV( texcoord, ctx->Current.Attrib[VERT_ATTRIB_TEX0] );
 | 
			
		||||
   COPY_4FV( color, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
   index = ctx->Current.Index;
 | 
			
		||||
 | 
			
		||||
   do_EvalCoord1f( ctx, u );
 | 
			
		||||
 | 
			
		||||
   COPY_3FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], normal );
 | 
			
		||||
   COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0], texcoord );
 | 
			
		||||
   COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color );
 | 
			
		||||
   ctx->Current.Index = index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_EvalCoord2f( GLfloat u, GLfloat v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT( ctx );
 | 
			
		||||
   GLfloat normal[3], texcoord[4], color[4];
 | 
			
		||||
   GLuint index;
 | 
			
		||||
 | 
			
		||||
   COPY_3FV( normal, ctx->Current.Attrib[VERT_ATTRIB_NORMAL] );
 | 
			
		||||
   COPY_4FV( texcoord, ctx->Current.Attrib[VERT_ATTRIB_TEX0] );
 | 
			
		||||
   COPY_4FV( color, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
   index = ctx->Current.Index;
 | 
			
		||||
 | 
			
		||||
   do_EvalCoord2f( ctx, u, v );
 | 
			
		||||
 | 
			
		||||
   COPY_3FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], normal );
 | 
			
		||||
   COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0], texcoord );
 | 
			
		||||
   COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color );
 | 
			
		||||
   ctx->Current.Index = index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_EvalCoord1fv( const GLfloat *u )
 | 
			
		||||
{
 | 
			
		||||
   glEvalCoord1f( u[0] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_EvalCoord2fv( const GLfloat *u )
 | 
			
		||||
{
 | 
			
		||||
   glEvalCoord2f( u[0], u[1] );
 | 
			
		||||
}
 | 
			
		||||
@@ -45,7 +45,6 @@
 | 
			
		||||
 * listed in dd.h.  The easiest way for a driver to do this is to
 | 
			
		||||
 * install the supplied software t&l module.
 | 
			
		||||
 */
 | 
			
		||||
#define COLORUBV(v)                 glColor4ubv(v)
 | 
			
		||||
#define COLORF(r,g,b,a)             glColor4f(r,g,b,a)
 | 
			
		||||
#define VERTEX2(x,y)	            glVertex2f(x,y)
 | 
			
		||||
#define VERTEX3(x,y,z)	            glVertex3f(x,y,z)
 | 
			
		||||
@@ -55,7 +54,7 @@
 | 
			
		||||
#define TEXCOORD2(s,t)              glTexCoord2f(s,t)
 | 
			
		||||
#define TEXCOORD3(s,t,u)            glTexCoord3f(s,t,u)
 | 
			
		||||
#define TEXCOORD4(s,t,u,v)          glTexCoord4f(s,t,u,v)
 | 
			
		||||
#define INDEX(c)		    glIndexi(c)
 | 
			
		||||
#define INDEX(c)		    glIndexf(c)
 | 
			
		||||
#define MULTI_TEXCOORD1(z,s)	    glMultiTexCoord1fARB(z,s)
 | 
			
		||||
#define MULTI_TEXCOORD2(z,s,t)	    glMultiTexCoord2fARB(z,s,t)
 | 
			
		||||
#define MULTI_TEXCOORD3(z,s,t,u)    glMultiTexCoord3fARB(z,s,t,u)
 | 
			
		||||
@@ -65,295 +64,17 @@
 | 
			
		||||
#define MATERIALFV(a,b,c)           glMaterialfv(a,b,c)
 | 
			
		||||
#define RECTF(a,b,c,d)              glRectf(a,b,c,d)
 | 
			
		||||
 | 
			
		||||
#define ATTRIB(index, x, y, z, w)   _glapi_Dispatch->VertexAttrib4fNV(index, x, y, z, w)
 | 
			
		||||
/* Extension functions must be dereferenced through _glapi_Dispatch as
 | 
			
		||||
 * not all libGL.so's will have all the uptodate entrypoints.
 | 
			
		||||
 */
 | 
			
		||||
#define ATTRIB1(index,x)        _glapi_Dispatch->VertexAttrib1fNV(index,x)
 | 
			
		||||
#define ATTRIB2(index,x,y)      _glapi_Dispatch->VertexAttrib2fNV(index,x,y)
 | 
			
		||||
#define ATTRIB3(index,x,y,z)    _glapi_Dispatch->VertexAttrib3fNV(index,x,y,z)
 | 
			
		||||
#define ATTRIB4(index,x,y,z,w)  _glapi_Dispatch->VertexAttrib4fNV(index,x,y,z,w)
 | 
			
		||||
#define FOGCOORDF(x)            _glapi_Dispatch->FogCoordfEXT(x)
 | 
			
		||||
#define SECONDARYCOLORF(a,b,c)  _glapi_Dispatch->SecondaryColor3fEXT(a,b,c)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define FOGCOORDF(x)                _glapi_Dispatch->FogCoordfEXT(x)
 | 
			
		||||
#define SECONDARYCOLORUB(a,b,c)     _glapi_Dispatch->SecondaryColor3ubEXT(a,b,c)
 | 
			
		||||
#define SECONDARYCOLORF(a,b,c)      _glapi_Dispatch->SecondaryColor3fEXT(a,b,c)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3b( GLbyte red, GLbyte green, GLbyte blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = BYTE_TO_UBYTE(red);
 | 
			
		||||
   col[1] = BYTE_TO_UBYTE(green);
 | 
			
		||||
   col[2] = BYTE_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3d( GLdouble red, GLdouble green, GLdouble blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   GLfloat r = (GLfloat) red;
 | 
			
		||||
   GLfloat g = (GLfloat) green;
 | 
			
		||||
   GLfloat b = (GLfloat) blue;
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV( col );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3i( GLint red, GLint green, GLint blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = INT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = INT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = INT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3s( GLshort red, GLshort green, GLshort blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = SHORT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = SHORT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = SHORT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3ui( GLuint red, GLuint green, GLuint blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = UINT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = UINT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = UINT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3us( GLushort red, GLushort green, GLushort blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = USHORT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = USHORT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = USHORT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = BYTE_TO_UBYTE(red);
 | 
			
		||||
   col[1] = BYTE_TO_UBYTE(green);
 | 
			
		||||
   col[2] = BYTE_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   GLfloat r = (GLfloat) red;
 | 
			
		||||
   GLfloat g = (GLfloat) green;
 | 
			
		||||
   GLfloat b = (GLfloat) blue;
 | 
			
		||||
   GLfloat a = (GLfloat) alpha;
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[3], a);
 | 
			
		||||
   COLORUBV( col );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4i( GLint red, GLint green, GLint blue, GLint alpha )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = INT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = INT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = INT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = INT_TO_UBYTE(alpha);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4s( GLshort red, GLshort green, GLshort blue,
 | 
			
		||||
			GLshort alpha )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = SHORT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = SHORT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = SHORT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = SHORT_TO_UBYTE(alpha);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = UINT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = UINT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = UINT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = UINT_TO_UBYTE(alpha);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4us( GLushort red, GLushort green, GLushort blue,
 | 
			
		||||
			 GLushort alpha )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = USHORT_TO_UBYTE(red);
 | 
			
		||||
   col[1] = USHORT_TO_UBYTE(green);
 | 
			
		||||
   col[2] = USHORT_TO_UBYTE(blue);
 | 
			
		||||
   col[3] = USHORT_TO_UBYTE(alpha);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3bv( const GLbyte *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = BYTE_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = BYTE_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = BYTE_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3dv( const GLdouble *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   GLfloat r = (GLfloat) v[0];
 | 
			
		||||
   GLfloat g = (GLfloat) v[1];
 | 
			
		||||
   GLfloat b = (GLfloat) v[2];
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV( col );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3iv( const GLint *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = INT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = INT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = INT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3sv( const GLshort *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = SHORT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = SHORT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = SHORT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3uiv( const GLuint *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = UINT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = UINT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = UINT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3usv( const GLushort *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = USHORT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = USHORT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = USHORT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = 255;
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4bv( const GLbyte *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = BYTE_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = BYTE_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = BYTE_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = BYTE_TO_UBYTE(v[3]);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4dv( const GLdouble *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   GLfloat r = (GLfloat) v[0];
 | 
			
		||||
   GLfloat g = (GLfloat) v[1];
 | 
			
		||||
   GLfloat b = (GLfloat) v[2];
 | 
			
		||||
   GLfloat a = (GLfloat) v[3];
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[3], a);
 | 
			
		||||
   COLORUBV( col );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4iv( const GLint *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = INT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = INT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = INT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = INT_TO_UBYTE(v[3]);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4sv( const GLshort *v)
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = SHORT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = SHORT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = SHORT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = SHORT_TO_UBYTE(v[3]);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4uiv( const GLuint *v)
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = UINT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = UINT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = UINT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = UINT_TO_UBYTE(v[3]);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4usv( const GLushort *v)
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[4];
 | 
			
		||||
   col[0] = USHORT_TO_UBYTE(v[0]);
 | 
			
		||||
   col[1] = USHORT_TO_UBYTE(v[1]);
 | 
			
		||||
   col[2] = USHORT_TO_UBYTE(v[2]);
 | 
			
		||||
   col[3] = USHORT_TO_UBYTE(v[3]);
 | 
			
		||||
   COLORUBV(col);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3b_f( GLbyte red, GLbyte green, GLbyte blue )
 | 
			
		||||
{
 | 
			
		||||
@@ -397,6 +118,13 @@ loopback_Color3us_f( GLushort red, GLushort green, GLushort blue )
 | 
			
		||||
	   USHORT_TO_FLOAT(blue), 1.0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3ub_f( GLubyte red, GLubyte green, GLubyte blue )
 | 
			
		||||
{
 | 
			
		||||
   COLORF( UBYTE_TO_FLOAT(red), UBYTE_TO_FLOAT(green),
 | 
			
		||||
	   UBYTE_TO_FLOAT(blue), 1.0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3bv_f( const GLbyte *v )
 | 
			
		||||
@@ -439,6 +167,13 @@ loopback_Color3usv_f( const GLushort *v )
 | 
			
		||||
	   USHORT_TO_FLOAT(v[2]), 1.0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color3ubv_f( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   COLORF( UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
 | 
			
		||||
	   UBYTE_TO_FLOAT(v[2]), 1.0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4b_f( GLbyte red, GLbyte green, GLbyte blue,
 | 
			
		||||
@@ -484,6 +219,13 @@ loopback_Color4us_f( GLushort red, GLushort green, GLushort blue, GLushort alpha
 | 
			
		||||
	   USHORT_TO_FLOAT(blue), USHORT_TO_FLOAT(alpha) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4ub_f( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha )
 | 
			
		||||
{
 | 
			
		||||
   COLORF( UBYTE_TO_FLOAT(red), UBYTE_TO_FLOAT(green),
 | 
			
		||||
	   UBYTE_TO_FLOAT(blue), UBYTE_TO_FLOAT(alpha) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4iv_f( const GLint *v )
 | 
			
		||||
@@ -529,6 +271,13 @@ loopback_Color4usv_f( const GLushort *v)
 | 
			
		||||
	   USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Color4ubv_f( const GLubyte *v)
 | 
			
		||||
{
 | 
			
		||||
   COLORF( UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
 | 
			
		||||
	   UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_FogCoorddEXT( GLdouble d )
 | 
			
		||||
{
 | 
			
		||||
@@ -545,55 +294,49 @@ loopback_FogCoorddvEXT( const GLdouble *v )
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexd( GLdouble c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) c );
 | 
			
		||||
   INDEX( (GLfloat) c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexf( GLfloat c )
 | 
			
		||||
loopback_Indexi( GLint c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLuint) (GLint) c );
 | 
			
		||||
   INDEX( (GLfloat) c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexs( GLshort c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) c );
 | 
			
		||||
   INDEX( (GLfloat) c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexub( GLubyte c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) c );
 | 
			
		||||
   INDEX( (GLfloat) c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexdv( const GLdouble *c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) (GLint) *c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexfv( const GLfloat *c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) (GLint) *c );
 | 
			
		||||
   INDEX( (GLfloat) *c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexiv( const GLint *c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( *c );
 | 
			
		||||
   INDEX( (GLfloat) *c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexsv( const GLshort *c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) *c );
 | 
			
		||||
   INDEX( (GLfloat) *c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_Indexubv( const GLubyte *c )
 | 
			
		||||
{
 | 
			
		||||
   INDEX( (GLint) *c );
 | 
			
		||||
   INDEX( (GLfloat) *c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -1172,114 +915,6 @@ loopback_Rectsv(const GLshort *v1, const GLshort *v2)
 | 
			
		||||
   RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3bEXT( GLbyte red, GLbyte green, GLbyte blue )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB( BYTE_TO_UBYTE(red),
 | 
			
		||||
		     BYTE_TO_UBYTE(green),
 | 
			
		||||
		     BYTE_TO_UBYTE(blue) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3dEXT( GLdouble red, GLdouble green, GLdouble blue )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[3];
 | 
			
		||||
   GLfloat r = (GLfloat) red;
 | 
			
		||||
   GLfloat g = (GLfloat) green;
 | 
			
		||||
   GLfloat b = (GLfloat) blue;
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
 | 
			
		||||
   SECONDARYCOLORUB( col[0], col[1], col[2] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3iEXT( GLint red, GLint green, GLint blue )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB( INT_TO_UBYTE(red),
 | 
			
		||||
		     INT_TO_UBYTE(green),
 | 
			
		||||
		     INT_TO_UBYTE(blue));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3sEXT( GLshort red, GLshort green, GLshort blue )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(SHORT_TO_UBYTE(red),
 | 
			
		||||
		    SHORT_TO_UBYTE(green),
 | 
			
		||||
		    SHORT_TO_UBYTE(blue));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3uiEXT( GLuint red, GLuint green, GLuint blue )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(UINT_TO_UBYTE(red),
 | 
			
		||||
		    UINT_TO_UBYTE(green),
 | 
			
		||||
		    UINT_TO_UBYTE(blue));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3usEXT( GLushort red, GLushort green, GLushort blue )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(USHORT_TO_UBYTE(red),
 | 
			
		||||
		    USHORT_TO_UBYTE(green),
 | 
			
		||||
		    USHORT_TO_UBYTE(blue));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3bvEXT( const GLbyte *v )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat a = BYTE_TO_FLOAT(v[0]);
 | 
			
		||||
   const GLfloat b = BYTE_TO_FLOAT(v[1]);
 | 
			
		||||
   const GLfloat c = BYTE_TO_FLOAT(v[2]);
 | 
			
		||||
   SECONDARYCOLORF(a,b,c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3dvEXT( const GLdouble *v )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte col[3];
 | 
			
		||||
   GLfloat r = (GLfloat) v[0];
 | 
			
		||||
   GLfloat g = (GLfloat) v[1];
 | 
			
		||||
   GLfloat b = (GLfloat) v[2];
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
 | 
			
		||||
   SECONDARYCOLORUB( col[0], col[1], col[2] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3ivEXT( const GLint *v )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(INT_TO_UBYTE(v[0]),
 | 
			
		||||
		    INT_TO_UBYTE(v[1]),
 | 
			
		||||
		    INT_TO_UBYTE(v[2]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3svEXT( const GLshort *v )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(SHORT_TO_UBYTE(v[0]),
 | 
			
		||||
		    SHORT_TO_UBYTE(v[1]),
 | 
			
		||||
		    SHORT_TO_UBYTE(v[2]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3uivEXT( const GLuint *v )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(UINT_TO_UBYTE(v[0]),
 | 
			
		||||
		    UINT_TO_UBYTE(v[1]),
 | 
			
		||||
		    UINT_TO_UBYTE(v[2]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3usvEXT( const GLushort *v )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORUB(USHORT_TO_UBYTE(v[0]),
 | 
			
		||||
		    USHORT_TO_UBYTE(v[1]),
 | 
			
		||||
		    USHORT_TO_UBYTE(v[2]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3bEXT_f( GLbyte red, GLbyte green, GLbyte blue )
 | 
			
		||||
{
 | 
			
		||||
@@ -1326,6 +961,14 @@ loopback_SecondaryColor3usEXT_f( GLushort red, GLushort green, GLushort blue )
 | 
			
		||||
                   USHORT_TO_FLOAT(blue));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3ubEXT_f( GLubyte red, GLubyte green, GLubyte blue )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORF(UBYTE_TO_FLOAT(red),
 | 
			
		||||
                   UBYTE_TO_FLOAT(green),
 | 
			
		||||
                   UBYTE_TO_FLOAT(blue));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3bvEXT_f( const GLbyte *v )
 | 
			
		||||
{
 | 
			
		||||
@@ -1371,6 +1014,14 @@ loopback_SecondaryColor3usvEXT_f( const GLushort *v )
 | 
			
		||||
                   USHORT_TO_FLOAT(v[2]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_SecondaryColor3ubvEXT_f( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   SECONDARYCOLORF(UBYTE_TO_FLOAT(v[0]),
 | 
			
		||||
                   UBYTE_TO_FLOAT(v[1]),
 | 
			
		||||
                   UBYTE_TO_FLOAT(v[2]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * GL_NV_vertex_program
 | 
			
		||||
@@ -1379,153 +1030,153 @@ loopback_SecondaryColor3usvEXT_f( const GLushort *v )
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib1sNV(GLuint index, GLshort x)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, 0.0F, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB1(index, (GLfloat) x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib1fNV(GLuint index, GLfloat x)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, x, 0.0F, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB1(index, x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib1dNV(GLuint index, GLdouble x)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, 0.0F, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB1(index, (GLfloat) x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib2sNV(GLuint index, GLshort x, GLshort y)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, y, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB2(index, (GLfloat) x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, y, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB2(index, (GLfloat) x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB2(index, (GLfloat) x, (GLfloat) y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, y, z, 1.0F);
 | 
			
		||||
   ATTRIB3(index, (GLfloat) x, y, z);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, x, y, z, 1.0F);
 | 
			
		||||
   ATTRIB3(index, x, y, z);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y),
 | 
			
		||||
   ATTRIB4(index, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y),
 | 
			
		||||
	UBYTE_TO_FLOAT(z), UBYTE_TO_FLOAT(w));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib1svNV(GLuint index, const GLshort *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], 0.0F, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB1(index, (GLfloat) v[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib1fvNV(GLuint index, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, v[0], 0.0F, 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB1(index, v[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib1dvNV(GLuint index, const GLdouble *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB1(index, (GLfloat) v[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib2svNV(GLuint index, const GLshort *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB2(index, (GLfloat) v[0], (GLfloat) v[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib2fvNV(GLuint index, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, v[0], v[1], 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB2(index, v[0], v[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib2dvNV(GLuint index, const GLdouble *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
 | 
			
		||||
   ATTRIB2(index, (GLfloat) v[0], (GLfloat) v[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib3svNV(GLuint index, const GLshort *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
 | 
			
		||||
   ATTRIB2(index, (GLfloat) v[0], (GLfloat) v[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib3fvNV(GLuint index, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, v[0], v[1], v[2], 1.0F);
 | 
			
		||||
   ATTRIB3(index, v[0], v[1], v[2]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib3dvNV(GLuint index, const GLdouble *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
 | 
			
		||||
   ATTRIB3(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4svNV(GLuint index, const GLshort *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 
 | 
			
		||||
	  (GLfloat)v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4fvNV(GLuint index, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, v[0], v[1], v[2], v[3]);
 | 
			
		||||
   ATTRIB4(index, v[0], v[1], v[2], v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4dvNV(GLuint index, const GLdouble *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4ubvNV(GLuint index, const GLubyte *v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
 | 
			
		||||
   ATTRIB4(index, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
 | 
			
		||||
          UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1642,171 +1293,127 @@ loopback_VertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v)
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4bvARB(GLuint index, const GLbyte * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4ivARB(GLuint index, const GLint * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4ubvARB(GLuint index, const GLubyte * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4usvARB(GLuint index, const GLushort * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4uivARB(GLuint index, const GLuint * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
   ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4NbvARB(GLuint index, const GLbyte * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
 | 
			
		||||
   ATTRIB4(index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
 | 
			
		||||
          BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4NsvARB(GLuint index, const GLshort * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
 | 
			
		||||
   ATTRIB4(index, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
 | 
			
		||||
          SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4NivARB(GLuint index, const GLint * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
 | 
			
		||||
   ATTRIB4(index, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
 | 
			
		||||
          INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4NusvARB(GLuint index, const GLushort * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
 | 
			
		||||
   ATTRIB4(index, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
 | 
			
		||||
          USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
loopback_VertexAttrib4NuivARB(GLuint index, const GLuint * v)
 | 
			
		||||
{
 | 
			
		||||
   ATTRIB(index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
 | 
			
		||||
   ATTRIB4(index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
 | 
			
		||||
          UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_mesa_loopback_prefer_float( struct _glapi_table *dest,
 | 
			
		||||
			     GLboolean prefer_float_colors )
 | 
			
		||||
{
 | 
			
		||||
   if (!prefer_float_colors) {
 | 
			
		||||
      dest->Color3b = loopback_Color3b;
 | 
			
		||||
      dest->Color3d = loopback_Color3d;
 | 
			
		||||
      dest->Color3i = loopback_Color3i;
 | 
			
		||||
      dest->Color3s = loopback_Color3s;
 | 
			
		||||
      dest->Color3ui = loopback_Color3ui;
 | 
			
		||||
      dest->Color3us = loopback_Color3us;
 | 
			
		||||
      dest->Color4b = loopback_Color4b;
 | 
			
		||||
      dest->Color4d = loopback_Color4d;
 | 
			
		||||
      dest->Color4i = loopback_Color4i;
 | 
			
		||||
      dest->Color4s = loopback_Color4s;
 | 
			
		||||
      dest->Color4ui = loopback_Color4ui;
 | 
			
		||||
      dest->Color4us = loopback_Color4us;
 | 
			
		||||
      dest->Color3bv = loopback_Color3bv;
 | 
			
		||||
      dest->Color3dv = loopback_Color3dv;
 | 
			
		||||
      dest->Color3iv = loopback_Color3iv;
 | 
			
		||||
      dest->Color3sv = loopback_Color3sv;
 | 
			
		||||
      dest->Color3uiv = loopback_Color3uiv;
 | 
			
		||||
      dest->Color3usv = loopback_Color3usv;
 | 
			
		||||
      dest->Color4bv = loopback_Color4bv;
 | 
			
		||||
      dest->Color4dv = loopback_Color4dv;
 | 
			
		||||
      dest->Color4iv = loopback_Color4iv;
 | 
			
		||||
      dest->Color4sv = loopback_Color4sv;
 | 
			
		||||
      dest->Color4uiv = loopback_Color4uiv;
 | 
			
		||||
      dest->Color4usv = loopback_Color4usv;
 | 
			
		||||
      dest->SecondaryColor3bEXT = loopback_SecondaryColor3bEXT;
 | 
			
		||||
      dest->SecondaryColor3dEXT = loopback_SecondaryColor3dEXT;
 | 
			
		||||
      dest->SecondaryColor3iEXT = loopback_SecondaryColor3iEXT;
 | 
			
		||||
      dest->SecondaryColor3sEXT = loopback_SecondaryColor3sEXT;
 | 
			
		||||
      dest->SecondaryColor3uiEXT = loopback_SecondaryColor3uiEXT;
 | 
			
		||||
      dest->SecondaryColor3usEXT = loopback_SecondaryColor3usEXT;
 | 
			
		||||
      dest->SecondaryColor3bvEXT = loopback_SecondaryColor3bvEXT;
 | 
			
		||||
      dest->SecondaryColor3dvEXT = loopback_SecondaryColor3dvEXT;
 | 
			
		||||
      dest->SecondaryColor3ivEXT = loopback_SecondaryColor3ivEXT;
 | 
			
		||||
      dest->SecondaryColor3svEXT = loopback_SecondaryColor3svEXT;
 | 
			
		||||
      dest->SecondaryColor3uivEXT = loopback_SecondaryColor3uivEXT;
 | 
			
		||||
      dest->SecondaryColor3usvEXT = loopback_SecondaryColor3usvEXT;
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      dest->Color3b = loopback_Color3b_f;
 | 
			
		||||
      dest->Color3d = loopback_Color3d_f;
 | 
			
		||||
      dest->Color3i = loopback_Color3i_f;
 | 
			
		||||
      dest->Color3s = loopback_Color3s_f;
 | 
			
		||||
      dest->Color3ui = loopback_Color3ui_f;
 | 
			
		||||
      dest->Color3us = loopback_Color3us_f;
 | 
			
		||||
      dest->Color4b = loopback_Color4b_f;
 | 
			
		||||
      dest->Color4d = loopback_Color4d_f;
 | 
			
		||||
      dest->Color4i = loopback_Color4i_f;
 | 
			
		||||
      dest->Color4s = loopback_Color4s_f;
 | 
			
		||||
      dest->Color4ui = loopback_Color4ui_f;
 | 
			
		||||
      dest->Color4us = loopback_Color4us_f;
 | 
			
		||||
      dest->Color3bv = loopback_Color3bv_f;
 | 
			
		||||
      dest->Color3dv = loopback_Color3dv_f;
 | 
			
		||||
      dest->Color3iv = loopback_Color3iv_f;
 | 
			
		||||
      dest->Color3sv = loopback_Color3sv_f;
 | 
			
		||||
      dest->Color3uiv = loopback_Color3uiv_f;
 | 
			
		||||
      dest->Color3usv = loopback_Color3usv_f;
 | 
			
		||||
      dest->Color4bv = loopback_Color4bv_f;
 | 
			
		||||
      dest->Color4dv = loopback_Color4dv_f;
 | 
			
		||||
      dest->Color4iv = loopback_Color4iv_f;
 | 
			
		||||
      dest->Color4sv = loopback_Color4sv_f;
 | 
			
		||||
      dest->Color4uiv = loopback_Color4uiv_f;
 | 
			
		||||
      dest->Color4usv = loopback_Color4usv_f;
 | 
			
		||||
      dest->SecondaryColor3bEXT = loopback_SecondaryColor3bEXT_f;
 | 
			
		||||
      dest->SecondaryColor3dEXT = loopback_SecondaryColor3dEXT_f;
 | 
			
		||||
      dest->SecondaryColor3iEXT = loopback_SecondaryColor3iEXT_f;
 | 
			
		||||
      dest->SecondaryColor3sEXT = loopback_SecondaryColor3sEXT_f;
 | 
			
		||||
      dest->SecondaryColor3uiEXT = loopback_SecondaryColor3uiEXT_f;
 | 
			
		||||
      dest->SecondaryColor3usEXT = loopback_SecondaryColor3usEXT_f;
 | 
			
		||||
      dest->SecondaryColor3bvEXT = loopback_SecondaryColor3bvEXT_f;
 | 
			
		||||
      dest->SecondaryColor3dvEXT = loopback_SecondaryColor3dvEXT_f;
 | 
			
		||||
      dest->SecondaryColor3ivEXT = loopback_SecondaryColor3ivEXT_f;
 | 
			
		||||
      dest->SecondaryColor3svEXT = loopback_SecondaryColor3svEXT_f;
 | 
			
		||||
      dest->SecondaryColor3uivEXT = loopback_SecondaryColor3uivEXT_f;
 | 
			
		||||
      dest->SecondaryColor3usvEXT = loopback_SecondaryColor3usvEXT_f;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Passing prefer_float_colors as true will mean that all colors
 | 
			
		||||
 * *except* Color{34}ub{v} are passed as floats.  Setting it false will
 | 
			
		||||
 * mean all colors *except* Color{34}f{v} are passed as ubytes.
 | 
			
		||||
 *
 | 
			
		||||
/*
 | 
			
		||||
 * This code never registers handlers for any of the entry points
 | 
			
		||||
 * listed in vtxfmt.h.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_mesa_loopback_init_api_table( struct _glapi_table *dest,
 | 
			
		||||
			       GLboolean prefer_float_colors )
 | 
			
		||||
_mesa_loopback_init_api_table( struct _glapi_table *dest )
 | 
			
		||||
{
 | 
			
		||||
   _mesa_loopback_prefer_float( dest, prefer_float_colors );
 | 
			
		||||
   dest->Color3b = loopback_Color3b_f;
 | 
			
		||||
   dest->Color3d = loopback_Color3d_f;
 | 
			
		||||
   dest->Color3i = loopback_Color3i_f;
 | 
			
		||||
   dest->Color3s = loopback_Color3s_f;
 | 
			
		||||
   dest->Color3ui = loopback_Color3ui_f;
 | 
			
		||||
   dest->Color3us = loopback_Color3us_f;
 | 
			
		||||
   dest->Color3ub = loopback_Color3ub_f;
 | 
			
		||||
   dest->Color4b = loopback_Color4b_f;
 | 
			
		||||
   dest->Color4d = loopback_Color4d_f;
 | 
			
		||||
   dest->Color4i = loopback_Color4i_f;
 | 
			
		||||
   dest->Color4s = loopback_Color4s_f;
 | 
			
		||||
   dest->Color4ui = loopback_Color4ui_f;
 | 
			
		||||
   dest->Color4us = loopback_Color4us_f;
 | 
			
		||||
   dest->Color4ub = loopback_Color4ub_f;
 | 
			
		||||
   dest->Color3bv = loopback_Color3bv_f;
 | 
			
		||||
   dest->Color3dv = loopback_Color3dv_f;
 | 
			
		||||
   dest->Color3iv = loopback_Color3iv_f;
 | 
			
		||||
   dest->Color3sv = loopback_Color3sv_f;
 | 
			
		||||
   dest->Color3uiv = loopback_Color3uiv_f;
 | 
			
		||||
   dest->Color3usv = loopback_Color3usv_f;
 | 
			
		||||
   dest->Color3ubv = loopback_Color3ubv_f;
 | 
			
		||||
   dest->Color4bv = loopback_Color4bv_f;
 | 
			
		||||
   dest->Color4dv = loopback_Color4dv_f;
 | 
			
		||||
   dest->Color4iv = loopback_Color4iv_f;
 | 
			
		||||
   dest->Color4sv = loopback_Color4sv_f;
 | 
			
		||||
   dest->Color4uiv = loopback_Color4uiv_f;
 | 
			
		||||
   dest->Color4usv = loopback_Color4usv_f;
 | 
			
		||||
   dest->Color4ubv = loopback_Color4ubv_f;
 | 
			
		||||
 | 
			
		||||
   dest->SecondaryColor3bEXT = loopback_SecondaryColor3bEXT_f;
 | 
			
		||||
   dest->SecondaryColor3dEXT = loopback_SecondaryColor3dEXT_f;
 | 
			
		||||
   dest->SecondaryColor3iEXT = loopback_SecondaryColor3iEXT_f;
 | 
			
		||||
   dest->SecondaryColor3sEXT = loopback_SecondaryColor3sEXT_f;
 | 
			
		||||
   dest->SecondaryColor3uiEXT = loopback_SecondaryColor3uiEXT_f;
 | 
			
		||||
   dest->SecondaryColor3usEXT = loopback_SecondaryColor3usEXT_f;
 | 
			
		||||
   dest->SecondaryColor3ubEXT = loopback_SecondaryColor3ubEXT_f;
 | 
			
		||||
   dest->SecondaryColor3bvEXT = loopback_SecondaryColor3bvEXT_f;
 | 
			
		||||
   dest->SecondaryColor3dvEXT = loopback_SecondaryColor3dvEXT_f;
 | 
			
		||||
   dest->SecondaryColor3ivEXT = loopback_SecondaryColor3ivEXT_f;
 | 
			
		||||
   dest->SecondaryColor3svEXT = loopback_SecondaryColor3svEXT_f;
 | 
			
		||||
   dest->SecondaryColor3uivEXT = loopback_SecondaryColor3uivEXT_f;
 | 
			
		||||
   dest->SecondaryColor3usvEXT = loopback_SecondaryColor3usvEXT_f;
 | 
			
		||||
   dest->SecondaryColor3ubvEXT = loopback_SecondaryColor3ubvEXT_f;
 | 
			
		||||
      
 | 
			
		||||
   dest->Indexd = loopback_Indexd;
 | 
			
		||||
   dest->Indexf = loopback_Indexf;
 | 
			
		||||
   dest->Indexi = loopback_Indexi;
 | 
			
		||||
   dest->Indexs = loopback_Indexs;
 | 
			
		||||
   dest->Indexub = loopback_Indexub;
 | 
			
		||||
   dest->Indexdv = loopback_Indexdv;
 | 
			
		||||
   dest->Indexfv = loopback_Indexfv;
 | 
			
		||||
   dest->Indexiv = loopback_Indexiv;
 | 
			
		||||
   dest->Indexsv = loopback_Indexsv;
 | 
			
		||||
   dest->Indexubv = loopback_Indexubv;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,10 +32,6 @@
 | 
			
		||||
 | 
			
		||||
struct _glapi_table;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_loopback_prefer_float( struct _glapi_table *dest,
 | 
			
		||||
					 GLboolean prefer_float_colors );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_loopback_init_api_table( struct _glapi_table *dest,
 | 
			
		||||
					   GLboolean prefer_float_colors );
 | 
			
		||||
extern void _mesa_loopback_init_api_table( struct _glapi_table *dest );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -27,11 +27,13 @@
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "api_noop.h"
 | 
			
		||||
#include "api_validate.h"
 | 
			
		||||
#include "api_arrayelt.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "colormac.h"
 | 
			
		||||
#include "light.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "dlist.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* In states where certain vertex components are required for t&l or
 | 
			
		||||
@@ -53,93 +55,56 @@ void _mesa_noop_EdgeFlagv( const GLboolean *b )
 | 
			
		||||
   ctx->Current.EdgeFlag = *b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Indexf( GLfloat f )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ctx->Current.Index = f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Indexfv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ctx->Current.Index = *v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_FogCoordfEXT( GLfloat a )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = a;
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_FOG];
 | 
			
		||||
   dest[0] = a;
 | 
			
		||||
   dest[1] = 0.0;
 | 
			
		||||
   dest[2] = 0.0;
 | 
			
		||||
   dest[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_FogCoordfvEXT( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = *v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Indexi( GLint i )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ctx->Current.Index = i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Indexiv( const GLint *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   ctx->Current.Index = *v;
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
 | 
			
		||||
   dest[0] = v[0];
 | 
			
		||||
   dest[1] = 0.0;
 | 
			
		||||
   dest[2] = 0.0;
 | 
			
		||||
   dest[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Normal3f( GLfloat a, GLfloat b, GLfloat c )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
 | 
			
		||||
   COPY_FLOAT(dest[0], a);
 | 
			
		||||
   COPY_FLOAT(dest[1], b);
 | 
			
		||||
   COPY_FLOAT(dest[2], c);
 | 
			
		||||
   dest[0] = a;
 | 
			
		||||
   dest[1] = b;
 | 
			
		||||
   dest[2] = c;
 | 
			
		||||
   dest[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Normal3fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
 | 
			
		||||
   COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
   COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
   COPY_FLOAT(dest[2], v[2]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Materialfv( GLenum face, GLenum pname, const GLfloat *params )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLint i, nr;
 | 
			
		||||
   struct gl_material *mat = &ctx->Light.Material;
 | 
			
		||||
   GLuint bitmask = _mesa_material_bitmask( ctx, face, pname, ~0,
 | 
			
		||||
                                            "_mesa_noop_Materialfv" );
 | 
			
		||||
 | 
			
		||||
   if (ctx->Light.ColorMaterialEnabled)
 | 
			
		||||
      bitmask &= ~ctx->Light.ColorMaterialBitmask;
 | 
			
		||||
 | 
			
		||||
   if (bitmask == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   switch (face) {
 | 
			
		||||
   case GL_SHININESS: nr = 1; break;
 | 
			
		||||
   case GL_COLOR_INDEXES: nr = 3; break;
 | 
			
		||||
   default: nr = 4 ; break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i < MAT_ATTRIB_MAX ; i++) 
 | 
			
		||||
      if (bitmask & (1<<i))
 | 
			
		||||
	 COPY_SZ_4V( mat->Attrib[i], nr, params ); 
 | 
			
		||||
 | 
			
		||||
   _mesa_update_material( ctx, bitmask );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Color4ub( GLubyte a, GLubyte b, GLubyte c, GLubyte d )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
 | 
			
		||||
   color[0] = UBYTE_TO_FLOAT(a);
 | 
			
		||||
   color[1] = UBYTE_TO_FLOAT(b);
 | 
			
		||||
   color[2] = UBYTE_TO_FLOAT(c);
 | 
			
		||||
   color[3] = UBYTE_TO_FLOAT(d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Color4ubv( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
 | 
			
		||||
   color[0] = UBYTE_TO_FLOAT(v[0]);
 | 
			
		||||
   color[1] = UBYTE_TO_FLOAT(v[1]);
 | 
			
		||||
   color[2] = UBYTE_TO_FLOAT(v[2]);
 | 
			
		||||
   color[3] = UBYTE_TO_FLOAT(v[3]);
 | 
			
		||||
   dest[0] = v[0];
 | 
			
		||||
   dest[1] = v[1];
 | 
			
		||||
   dest[2] = v[2];
 | 
			
		||||
   dest[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Color4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d )
 | 
			
		||||
@@ -162,26 +127,6 @@ void _mesa_noop_Color4fv( const GLfloat *v )
 | 
			
		||||
   color[3] = v[3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Color3ub( GLubyte a, GLubyte b, GLubyte c )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
 | 
			
		||||
   color[0] = UBYTE_TO_FLOAT(a);
 | 
			
		||||
   color[1] = UBYTE_TO_FLOAT(b);
 | 
			
		||||
   color[2] = UBYTE_TO_FLOAT(c);
 | 
			
		||||
   color[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Color3ubv( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
 | 
			
		||||
   color[0] = UBYTE_TO_FLOAT(v[0]);
 | 
			
		||||
   color[1] = UBYTE_TO_FLOAT(v[1]);
 | 
			
		||||
   color[2] = UBYTE_TO_FLOAT(v[2]);
 | 
			
		||||
   color[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_Color3f( GLfloat a, GLfloat b, GLfloat c )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
@@ -212,7 +157,7 @@ void _mesa_noop_MultiTexCoord1fARB( GLenum target, GLfloat a )
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], a);
 | 
			
		||||
      dest[0] = a;
 | 
			
		||||
      dest[1] = 0;
 | 
			
		||||
      dest[2] = 0;
 | 
			
		||||
      dest[3] = 1;
 | 
			
		||||
@@ -229,7 +174,7 @@ void _mesa_noop_MultiTexCoord1fvARB( GLenum target, const GLfloat *v )
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
      dest[0] = v[0];
 | 
			
		||||
      dest[1] = 0;
 | 
			
		||||
      dest[2] = 0;
 | 
			
		||||
      dest[3] = 1;
 | 
			
		||||
@@ -246,8 +191,8 @@ void _mesa_noop_MultiTexCoord2fARB( GLenum target, GLfloat a, GLfloat b )
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], a);
 | 
			
		||||
      COPY_FLOAT(dest[1], b);
 | 
			
		||||
      dest[0] = a;
 | 
			
		||||
      dest[1] = b;
 | 
			
		||||
      dest[2] = 0;
 | 
			
		||||
      dest[3] = 1;
 | 
			
		||||
   }
 | 
			
		||||
@@ -263,8 +208,8 @@ void _mesa_noop_MultiTexCoord2fvARB( GLenum target, const GLfloat *v )
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
      COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
      dest[0] = v[0];
 | 
			
		||||
      dest[1] = v[1];
 | 
			
		||||
      dest[2] = 0;
 | 
			
		||||
      dest[3] = 1;
 | 
			
		||||
   }
 | 
			
		||||
@@ -280,9 +225,9 @@ void _mesa_noop_MultiTexCoord3fARB( GLenum target, GLfloat a, GLfloat b, GLfloat
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], a);
 | 
			
		||||
      COPY_FLOAT(dest[1], b);
 | 
			
		||||
      COPY_FLOAT(dest[2], c);
 | 
			
		||||
      dest[0] = a;
 | 
			
		||||
      dest[1] = b;
 | 
			
		||||
      dest[2] = c;
 | 
			
		||||
      dest[3] = 1;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -297,9 +242,9 @@ void _mesa_noop_MultiTexCoord3fvARB( GLenum target, const GLfloat *v )
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
      COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
      COPY_FLOAT(dest[2], v[2]);
 | 
			
		||||
      dest[0] = v[0];
 | 
			
		||||
      dest[1] = v[1];
 | 
			
		||||
      dest[2] = v[2];
 | 
			
		||||
      dest[3] = 1;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -315,9 +260,9 @@ void _mesa_noop_MultiTexCoord4fARB( GLenum target, GLfloat a, GLfloat b,
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], a);
 | 
			
		||||
      COPY_FLOAT(dest[1], b);
 | 
			
		||||
      COPY_FLOAT(dest[2], c);
 | 
			
		||||
      dest[0] = a;
 | 
			
		||||
      dest[1] = b;
 | 
			
		||||
      dest[2] = c;
 | 
			
		||||
      dest[3] = d;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -332,33 +277,13 @@ void _mesa_noop_MultiTexCoord4fvARB( GLenum target, const GLfloat *v )
 | 
			
		||||
   if (unit < MAX_TEXTURE_COORD_UNITS)
 | 
			
		||||
   {
 | 
			
		||||
      GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
 | 
			
		||||
      COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
      COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
      COPY_FLOAT(dest[2], v[2]);
 | 
			
		||||
      COPY_FLOAT(dest[3], v[3]);
 | 
			
		||||
      dest[0] = v[0];
 | 
			
		||||
      dest[1] = v[1];
 | 
			
		||||
      dest[2] = v[2];
 | 
			
		||||
      dest[3] = v[3];
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_SecondaryColor3ubEXT( GLubyte a, GLubyte b, GLubyte c )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
 | 
			
		||||
   color[0] = UBYTE_TO_FLOAT(a);
 | 
			
		||||
   color[1] = UBYTE_TO_FLOAT(b);
 | 
			
		||||
   color[2] = UBYTE_TO_FLOAT(c);
 | 
			
		||||
   color[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_SecondaryColor3ubvEXT( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
 | 
			
		||||
   color[0] = UBYTE_TO_FLOAT(v[0]);
 | 
			
		||||
   color[1] = UBYTE_TO_FLOAT(v[1]);
 | 
			
		||||
   color[2] = UBYTE_TO_FLOAT(v[2]);
 | 
			
		||||
   color[3] = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_SecondaryColor3fEXT( GLfloat a, GLfloat b, GLfloat c )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
@@ -383,7 +308,7 @@ void _mesa_noop_TexCoord1f( GLfloat a )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], a);
 | 
			
		||||
   dest[0] = a;
 | 
			
		||||
   dest[1] = 0;
 | 
			
		||||
   dest[2] = 0;
 | 
			
		||||
   dest[3] = 1;
 | 
			
		||||
@@ -393,7 +318,7 @@ void _mesa_noop_TexCoord1fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
   dest[0] = v[0];
 | 
			
		||||
   dest[1] = 0;
 | 
			
		||||
   dest[2] = 0;
 | 
			
		||||
   dest[3] = 1;
 | 
			
		||||
@@ -403,8 +328,8 @@ void _mesa_noop_TexCoord2f( GLfloat a, GLfloat b )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], a);
 | 
			
		||||
   COPY_FLOAT(dest[1], b);
 | 
			
		||||
   dest[0] = a;
 | 
			
		||||
   dest[1] = b;
 | 
			
		||||
   dest[2] = 0;
 | 
			
		||||
   dest[3] = 1;
 | 
			
		||||
}
 | 
			
		||||
@@ -413,8 +338,8 @@ void _mesa_noop_TexCoord2fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
   COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
   dest[0] = v[0];
 | 
			
		||||
   dest[1] = v[1];
 | 
			
		||||
   dest[2] = 0;
 | 
			
		||||
   dest[3] = 1;
 | 
			
		||||
}
 | 
			
		||||
@@ -423,9 +348,9 @@ void _mesa_noop_TexCoord3f( GLfloat a, GLfloat b, GLfloat c )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], a);
 | 
			
		||||
   COPY_FLOAT(dest[1], b);
 | 
			
		||||
   COPY_FLOAT(dest[2], c);
 | 
			
		||||
   dest[0] = a;
 | 
			
		||||
   dest[1] = b;
 | 
			
		||||
   dest[2] = c;
 | 
			
		||||
   dest[3] = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -433,9 +358,9 @@ void _mesa_noop_TexCoord3fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
   COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
   COPY_FLOAT(dest[2], v[2]);
 | 
			
		||||
   dest[0] = v[0];
 | 
			
		||||
   dest[1] = v[1];
 | 
			
		||||
   dest[2] = v[2];
 | 
			
		||||
   dest[3] = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -443,23 +368,136 @@ void _mesa_noop_TexCoord4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], a);
 | 
			
		||||
   COPY_FLOAT(dest[1], b);
 | 
			
		||||
   COPY_FLOAT(dest[2], c);
 | 
			
		||||
   COPY_FLOAT(dest[3], d);
 | 
			
		||||
   dest[0] = a;
 | 
			
		||||
   dest[1] = b;
 | 
			
		||||
   dest[2] = c;
 | 
			
		||||
   dest[3] = d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_TexCoord4fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
 | 
			
		||||
   COPY_FLOAT(dest[0], v[0]);
 | 
			
		||||
   COPY_FLOAT(dest[1], v[1]);
 | 
			
		||||
   COPY_FLOAT(dest[2], v[2]);
 | 
			
		||||
   COPY_FLOAT(dest[3], v[3]);
 | 
			
		||||
   dest[0] = v[0];
 | 
			
		||||
   dest[1] = v[1];
 | 
			
		||||
   dest[2] = v[2];
 | 
			
		||||
   dest[3] = v[3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Useful outside begin/end?
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib1fNV( GLuint index, GLfloat x )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], x, 0, 0, 1);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib1fvNV( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], v[0], 0, 0, 1);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib2fNV( GLuint index, GLfloat x, GLfloat y )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], x, y, 0, 1);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib2fvNV( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], v[0], v[1], 0, 1);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib3fNV( GLuint index, GLfloat x,
 | 
			
		||||
                                  GLfloat y, GLfloat z )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], x, y, z, 1);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib3fvNV( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], v[0], v[1], v[2], 1);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib4fNV( GLuint index, GLfloat x,
 | 
			
		||||
                                  GLfloat y, GLfloat z, GLfloat w )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], x, y, z, w);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib4fvNV( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], v[0], v[1], v[2], v[3]);
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Material
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_Materialfv( GLenum face, GLenum pname, const GLfloat *params )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLint i, nr;
 | 
			
		||||
   struct gl_material *mat = &ctx->Light.Material;
 | 
			
		||||
   GLuint bitmask = _mesa_material_bitmask( ctx, face, pname, ~0,
 | 
			
		||||
                                            "_mesa_noop_Materialfv" );
 | 
			
		||||
 | 
			
		||||
   if (ctx->Light.ColorMaterialEnabled)
 | 
			
		||||
      bitmask &= ~ctx->Light.ColorMaterialBitmask;
 | 
			
		||||
 | 
			
		||||
   if (bitmask == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   switch (face) {
 | 
			
		||||
   case GL_SHININESS: nr = 1; break;
 | 
			
		||||
   case GL_COLOR_INDEXES: nr = 3; break;
 | 
			
		||||
   default: nr = 4 ; break;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i < MAT_ATTRIB_MAX ; i++) 
 | 
			
		||||
      if (bitmask & (1<<i))
 | 
			
		||||
	 COPY_SZ_4V( mat->Attrib[i], nr, params ); 
 | 
			
		||||
 | 
			
		||||
   _mesa_update_material( ctx, bitmask );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These really are noops outside begin/end:
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_Vertex2fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
@@ -491,25 +529,54 @@ void _mesa_noop_Vertex4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d )
 | 
			
		||||
   (void) a; (void) b; (void) c; (void) d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib4fNV( GLuint index, GLfloat x,
 | 
			
		||||
                                  GLfloat y, GLfloat z, GLfloat w )
 | 
			
		||||
/* Similarly, these have no effect outside begin/end:
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_EvalCoord1f( GLfloat a )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], x, y, z, w);
 | 
			
		||||
   }
 | 
			
		||||
   (void) a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_VertexAttrib4fvNV( GLuint index, const GLfloat *v )
 | 
			
		||||
void _mesa_noop_EvalCoord1fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   if (index < 16) {
 | 
			
		||||
      ASSIGN_4V(ctx->Current.Attrib[index], v[0], v[1], v[2], v[3]);
 | 
			
		||||
   }
 | 
			
		||||
   (void) v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_EvalCoord2f( GLfloat a, GLfloat b )
 | 
			
		||||
{
 | 
			
		||||
   (void) a; (void) b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_EvalCoord2fv( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   (void) v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_EvalPoint1( GLint a )
 | 
			
		||||
{
 | 
			
		||||
   (void) a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_EvalPoint2( GLint a, GLint b )
 | 
			
		||||
{
 | 
			
		||||
   (void) a; (void) b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Begin -- call into driver, should result in the vtxfmt being
 | 
			
		||||
 * swapped out:
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_Begin( GLenum mode )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* End -- just raise an error
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_End( void )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   _mesa_error( ctx, GL_INVALID_OPERATION, __FUNCTION__ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Execute a glRectf() function.  This is not suitable for GL_COMPILE
 | 
			
		||||
@@ -549,7 +616,7 @@ void _mesa_noop_DrawArrays(GLenum mode, GLint start, GLsizei count)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   glBegin(mode);
 | 
			
		||||
   for (i = start ; i <= count ; i++)
 | 
			
		||||
   for (i = start ; i < count ; i++)
 | 
			
		||||
      glArrayElement( i );
 | 
			
		||||
   glEnd();
 | 
			
		||||
}
 | 
			
		||||
@@ -599,3 +666,199 @@ void _mesa_noop_DrawRangeElements(GLenum mode,
 | 
			
		||||
					 count, type, indices ))
 | 
			
		||||
      glDrawElements( mode, count, type, indices );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Eval Mesh
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* KW: If are compiling, we don't know whether eval will produce a
 | 
			
		||||
 *     vertex when it is run in the future.  If this is pure immediate
 | 
			
		||||
 *     mode, eval is a noop if neither vertex map is enabled.
 | 
			
		||||
 *
 | 
			
		||||
 *     Thus we need to have a check in the display list code or
 | 
			
		||||
 *     elsewhere for eval(1,2) vertices in the case where
 | 
			
		||||
 *     map(1,2)_vertex is disabled, and to purge those vertices from
 | 
			
		||||
 *     the vb.
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_EvalMesh1( GLenum mode, GLint i1, GLint i2 )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLint i;
 | 
			
		||||
   GLfloat u, du;
 | 
			
		||||
   GLenum prim;
 | 
			
		||||
 | 
			
		||||
   switch (mode) {
 | 
			
		||||
   case GL_POINT:
 | 
			
		||||
      prim = GL_POINTS;
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_LINE:
 | 
			
		||||
      prim = GL_LINE_STRIP;
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh1(mode)" );
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* No effect if vertex maps disabled.
 | 
			
		||||
    */
 | 
			
		||||
   if (!ctx->Eval.Map1Vertex4 && 
 | 
			
		||||
       !ctx->Eval.Map1Vertex3 &&
 | 
			
		||||
       !(ctx->VertexProgram.Enabled && ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]))
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   du = ctx->Eval.MapGrid1du;
 | 
			
		||||
   u = ctx->Eval.MapGrid1u1 + i1 * du;
 | 
			
		||||
 | 
			
		||||
   glBegin( prim );
 | 
			
		||||
   for (i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
      glEvalCoord1f( u );
 | 
			
		||||
   }
 | 
			
		||||
   glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _mesa_noop_EvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLfloat u, du, v, dv, v1, u1;
 | 
			
		||||
   GLint i, j;
 | 
			
		||||
 | 
			
		||||
   switch (mode) {
 | 
			
		||||
   case GL_POINT:
 | 
			
		||||
   case GL_LINE:
 | 
			
		||||
   case GL_FILL:
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh2(mode)" );
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* No effect if vertex maps disabled.
 | 
			
		||||
    */
 | 
			
		||||
   if (!ctx->Eval.Map2Vertex4 && 
 | 
			
		||||
       !ctx->Eval.Map2Vertex3 &&
 | 
			
		||||
       !(ctx->VertexProgram.Enabled && ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]))
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   du = ctx->Eval.MapGrid2du;
 | 
			
		||||
   dv = ctx->Eval.MapGrid2dv;
 | 
			
		||||
   v1 = ctx->Eval.MapGrid2v1 + j1 * dv;
 | 
			
		||||
   u1 = ctx->Eval.MapGrid2u1 + i1 * du;
 | 
			
		||||
 | 
			
		||||
   switch (mode) {
 | 
			
		||||
   case GL_POINT:
 | 
			
		||||
      glBegin( GL_POINTS );
 | 
			
		||||
      for (v=v1,j=j1;j<=j2;j++,v+=dv) {
 | 
			
		||||
	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	    glEvalCoord2f(u, v );
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
      glEnd();
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_LINE:
 | 
			
		||||
      for (v=v1,j=j1;j<=j2;j++,v+=dv) {
 | 
			
		||||
	 glBegin( GL_LINE_STRIP );
 | 
			
		||||
	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	    glEvalCoord2f(u, v );
 | 
			
		||||
	 }
 | 
			
		||||
	 glEnd();
 | 
			
		||||
      }
 | 
			
		||||
      for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	 glBegin( GL_LINE_STRIP );
 | 
			
		||||
	 for (v=v1,j=j1;j<=j2;j++,v+=dv) {
 | 
			
		||||
	    glEvalCoord2f(u, v );
 | 
			
		||||
	 }
 | 
			
		||||
	 glEnd();
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
   case GL_FILL:
 | 
			
		||||
      for (v=v1,j=j1;j<j2;j++,v+=dv) {
 | 
			
		||||
	 glBegin( GL_TRIANGLE_STRIP );
 | 
			
		||||
	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	    glEvalCoord2f(u, v );
 | 
			
		||||
	    glEvalCoord2f(u, v+dv );
 | 
			
		||||
	 }
 | 
			
		||||
	 glEnd();
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
   default:
 | 
			
		||||
      _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh2(mode)" );
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Build a vertexformat full of things to use outside begin/end pairs.
 | 
			
		||||
 * 
 | 
			
		||||
 * TODO -- build a whole dispatch table for this purpose, and likewise
 | 
			
		||||
 * for inside begin/end.
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_noop_vtxfmt_init( GLvertexformat *vfmt )
 | 
			
		||||
{
 | 
			
		||||
   vfmt->ArrayElement = _ae_loopback_array_elt;	        /* generic helper */
 | 
			
		||||
   vfmt->Begin = _mesa_noop_Begin;
 | 
			
		||||
   vfmt->CallList = _mesa_CallList;
 | 
			
		||||
   vfmt->CallLists = _mesa_CallLists;
 | 
			
		||||
   vfmt->Color3f = _mesa_noop_Color3f;
 | 
			
		||||
   vfmt->Color3fv = _mesa_noop_Color3fv;
 | 
			
		||||
   vfmt->Color4f = _mesa_noop_Color4f;
 | 
			
		||||
   vfmt->Color4fv = _mesa_noop_Color4fv;
 | 
			
		||||
   vfmt->EdgeFlag = _mesa_noop_EdgeFlag;
 | 
			
		||||
   vfmt->EdgeFlagv = _mesa_noop_EdgeFlagv;
 | 
			
		||||
   vfmt->End = _mesa_noop_End;
 | 
			
		||||
   vfmt->EvalCoord1f = _mesa_noop_EvalCoord1f;
 | 
			
		||||
   vfmt->EvalCoord1fv = _mesa_noop_EvalCoord1fv;
 | 
			
		||||
   vfmt->EvalCoord2f = _mesa_noop_EvalCoord2f;
 | 
			
		||||
   vfmt->EvalCoord2fv = _mesa_noop_EvalCoord2fv;
 | 
			
		||||
   vfmt->EvalPoint1 = _mesa_noop_EvalPoint1;
 | 
			
		||||
   vfmt->EvalPoint2 = _mesa_noop_EvalPoint2;
 | 
			
		||||
   vfmt->FogCoordfEXT = _mesa_noop_FogCoordfEXT;
 | 
			
		||||
   vfmt->FogCoordfvEXT = _mesa_noop_FogCoordfvEXT;
 | 
			
		||||
   vfmt->Indexf = _mesa_noop_Indexf;
 | 
			
		||||
   vfmt->Indexfv = _mesa_noop_Indexfv;
 | 
			
		||||
   vfmt->Materialfv = _mesa_noop_Materialfv;
 | 
			
		||||
   vfmt->MultiTexCoord1fARB = _mesa_noop_MultiTexCoord1fARB;
 | 
			
		||||
   vfmt->MultiTexCoord1fvARB = _mesa_noop_MultiTexCoord1fvARB;
 | 
			
		||||
   vfmt->MultiTexCoord2fARB = _mesa_noop_MultiTexCoord2fARB;
 | 
			
		||||
   vfmt->MultiTexCoord2fvARB = _mesa_noop_MultiTexCoord2fvARB;
 | 
			
		||||
   vfmt->MultiTexCoord3fARB = _mesa_noop_MultiTexCoord3fARB;
 | 
			
		||||
   vfmt->MultiTexCoord3fvARB = _mesa_noop_MultiTexCoord3fvARB;
 | 
			
		||||
   vfmt->MultiTexCoord4fARB = _mesa_noop_MultiTexCoord4fARB;
 | 
			
		||||
   vfmt->MultiTexCoord4fvARB = _mesa_noop_MultiTexCoord4fvARB;
 | 
			
		||||
   vfmt->Normal3f = _mesa_noop_Normal3f;
 | 
			
		||||
   vfmt->Normal3fv = _mesa_noop_Normal3fv;
 | 
			
		||||
   vfmt->SecondaryColor3fEXT = _mesa_noop_SecondaryColor3fEXT;
 | 
			
		||||
   vfmt->SecondaryColor3fvEXT = _mesa_noop_SecondaryColor3fvEXT;
 | 
			
		||||
   vfmt->TexCoord1f = _mesa_noop_TexCoord1f;
 | 
			
		||||
   vfmt->TexCoord1fv = _mesa_noop_TexCoord1fv;
 | 
			
		||||
   vfmt->TexCoord2f = _mesa_noop_TexCoord2f;
 | 
			
		||||
   vfmt->TexCoord2fv = _mesa_noop_TexCoord2fv;
 | 
			
		||||
   vfmt->TexCoord3f = _mesa_noop_TexCoord3f;
 | 
			
		||||
   vfmt->TexCoord3fv = _mesa_noop_TexCoord3fv;
 | 
			
		||||
   vfmt->TexCoord4f = _mesa_noop_TexCoord4f;
 | 
			
		||||
   vfmt->TexCoord4fv = _mesa_noop_TexCoord4fv;
 | 
			
		||||
   vfmt->Vertex2f = _mesa_noop_Vertex2f;
 | 
			
		||||
   vfmt->Vertex2fv = _mesa_noop_Vertex2fv;
 | 
			
		||||
   vfmt->Vertex3f = _mesa_noop_Vertex3f;
 | 
			
		||||
   vfmt->Vertex3fv = _mesa_noop_Vertex3fv;
 | 
			
		||||
   vfmt->Vertex4f = _mesa_noop_Vertex4f;
 | 
			
		||||
   vfmt->Vertex4fv = _mesa_noop_Vertex4fv;
 | 
			
		||||
   vfmt->VertexAttrib1fNV = _mesa_noop_VertexAttrib1fNV;
 | 
			
		||||
   vfmt->VertexAttrib1fvNV = _mesa_noop_VertexAttrib1fvNV;
 | 
			
		||||
   vfmt->VertexAttrib2fNV = _mesa_noop_VertexAttrib2fNV;
 | 
			
		||||
   vfmt->VertexAttrib2fvNV = _mesa_noop_VertexAttrib2fvNV;
 | 
			
		||||
   vfmt->VertexAttrib3fNV = _mesa_noop_VertexAttrib3fNV;
 | 
			
		||||
   vfmt->VertexAttrib3fvNV = _mesa_noop_VertexAttrib3fvNV;
 | 
			
		||||
   vfmt->VertexAttrib4fNV = _mesa_noop_VertexAttrib4fNV;
 | 
			
		||||
   vfmt->VertexAttrib4fvNV = _mesa_noop_VertexAttrib4fvNV;
 | 
			
		||||
 | 
			
		||||
   vfmt->Rectf = _mesa_noop_Rectf;
 | 
			
		||||
 | 
			
		||||
   vfmt->DrawArrays = _mesa_noop_DrawArrays;
 | 
			
		||||
   vfmt->DrawElements = _mesa_noop_DrawElements;
 | 
			
		||||
   vfmt->DrawRangeElements = _mesa_noop_DrawRangeElements;
 | 
			
		||||
   vfmt->EvalMesh1 = _mesa_noop_EvalMesh1;
 | 
			
		||||
   vfmt->EvalMesh2 = _mesa_noop_EvalMesh2;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,9 +46,9 @@ extern void _mesa_noop_FogCoordfEXT( GLfloat a );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_FogCoordfvEXT( const GLfloat *v );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_Indexi( GLint i );
 | 
			
		||||
extern void _mesa_noop_Indexf( GLfloat i );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_Indexiv( const GLint *v );
 | 
			
		||||
extern void _mesa_noop_Indexfv( const GLfloat *v );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_Normal3f( GLfloat a, GLfloat b, GLfloat c );
 | 
			
		||||
 | 
			
		||||
@@ -127,11 +127,37 @@ extern void _mesa_noop_Vertex3f( GLfloat a, GLfloat b, GLfloat c );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_Vertex4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_VertexAttrib1fNV( GLuint index, GLfloat x );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_VertexAttrib1fvNV( GLuint index, const GLfloat *v );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_VertexAttrib2fNV( GLuint index, GLfloat x, GLfloat y );
 | 
			
		||||
extern void _mesa_noop_VertexAttrib2fvNV( GLuint index, const GLfloat *v );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_VertexAttrib3fNV( GLuint index, GLfloat x,
 | 
			
		||||
					 GLfloat y, GLfloat z );
 | 
			
		||||
extern void _mesa_noop_VertexAttrib3fvNV( GLuint index, const GLfloat *v );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_VertexAttrib4fNV( GLuint index, GLfloat x,
 | 
			
		||||
                                         GLfloat y, GLfloat z, GLfloat w );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_VertexAttrib4fvNV( GLuint index, const GLfloat *v );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_End( void );
 | 
			
		||||
extern void _mesa_noop_Begin( GLenum mode );
 | 
			
		||||
extern void _mesa_noop_EvalPoint2( GLint a, GLint b );
 | 
			
		||||
extern void _mesa_noop_EvalPoint1( GLint a );
 | 
			
		||||
extern void _mesa_noop_EvalCoord2fv( const GLfloat *v );
 | 
			
		||||
extern void _mesa_noop_EvalCoord2f( GLfloat a, GLfloat b );
 | 
			
		||||
extern void _mesa_noop_EvalCoord1fv( const GLfloat *v );
 | 
			
		||||
extern void _mesa_noop_EvalCoord1f( GLfloat a );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_vtxfmt_init( GLvertexformat *vfmt );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_EvalMesh2( GLenum mode, GLint i1, GLint i2, 
 | 
			
		||||
				  GLint j1, GLint j2 );
 | 
			
		||||
 | 
			
		||||
extern void _mesa_noop_EvalMesh1( GLenum mode, GLint i1, GLint i2 );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Not strictly a noop -- translate Rectf down to Begin/End and
 | 
			
		||||
 
 | 
			
		||||
@@ -1422,15 +1422,13 @@ _mesa_initialize_context( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
#if _HAVE_FULL_GL
 | 
			
		||||
   _mesa_init_dlist_table(ctx->Save, dispatchSize);
 | 
			
		||||
   _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
 | 
			
		||||
 | 
			
		||||
   ctx->ExecPrefersFloat = GL_FALSE;
 | 
			
		||||
   ctx->SavePrefersFloat = GL_FALSE;
 | 
			
		||||
 | 
			
		||||
   /* Neutral tnl module stuff */
 | 
			
		||||
   _mesa_init_exec_vtxfmt( ctx ); 
 | 
			
		||||
   ctx->TnlModule.Current = NULL;
 | 
			
		||||
   ctx->TnlModule.SwapCount = 0;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   return GL_TRUE;
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,7 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "glapi.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -263,6 +264,7 @@ _mesa_Flush( void );
 | 
			
		||||
/** \name Macros for contexts/flushing. */
 | 
			
		||||
/*@{*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Flush vertices.
 | 
			
		||||
 *
 | 
			
		||||
@@ -272,8 +274,6 @@ _mesa_Flush( void );
 | 
			
		||||
 * Checks if dd_function_table::NeedFlush is marked to flush stored vertices,
 | 
			
		||||
 * and calls dd_function_table::FlushVertices if so. Marks
 | 
			
		||||
 * __GLcontextRec::NewState with \p newstate.
 | 
			
		||||
 * 
 | 
			
		||||
 * \todo Eventually let the driver specify what state changes require a flush:
 | 
			
		||||
 */
 | 
			
		||||
#define FLUSH_VERTICES(ctx, newstate)				\
 | 
			
		||||
do {								\
 | 
			
		||||
 
 | 
			
		||||
@@ -808,6 +808,7 @@ struct dd_function_table {
 | 
			
		||||
    * these conditions.
 | 
			
		||||
    */
 | 
			
		||||
   GLuint NeedFlush;
 | 
			
		||||
   GLuint SaveNeedFlush;
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * If inside glBegin()/glEnd(), it should ASSERT(0).  Otherwise, if
 | 
			
		||||
@@ -819,6 +820,14 @@ struct dd_function_table {
 | 
			
		||||
    * FLUSH_UPDATE_CURRENT bit, even after performing the update.
 | 
			
		||||
    */
 | 
			
		||||
   void (*FlushVertices)( GLcontext *ctx, GLuint flags );
 | 
			
		||||
   void (*SaveFlushVertices)( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * Give the driver the opportunity to hook in its own vtxfmt for
 | 
			
		||||
    * compiling optimized display lists.  This is called on each valid
 | 
			
		||||
    * glBegin() during list compilation.
 | 
			
		||||
    */
 | 
			
		||||
   GLboolean (*NotifySaveBegin)( GLcontext *ctx, GLenum mode );
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * Notify driver that the special derived value _NeedEyeCoords has
 | 
			
		||||
@@ -899,12 +908,8 @@ typedef struct {
 | 
			
		||||
   void (*ArrayElement)( GLint ); /* NOTE */
 | 
			
		||||
   void (*Color3f)( GLfloat, GLfloat, GLfloat );
 | 
			
		||||
   void (*Color3fv)( const GLfloat * );
 | 
			
		||||
   void (*Color3ub)( GLubyte, GLubyte, GLubyte );
 | 
			
		||||
   void (*Color3ubv)( const GLubyte * );
 | 
			
		||||
   void (*Color4f)( GLfloat, GLfloat, GLfloat, GLfloat );
 | 
			
		||||
   void (*Color4fv)( const GLfloat * );
 | 
			
		||||
   void (*Color4ub)( GLubyte, GLubyte, GLubyte, GLubyte );
 | 
			
		||||
   void (*Color4ubv)( const GLubyte * );
 | 
			
		||||
   void (*EdgeFlag)( GLboolean );
 | 
			
		||||
   void (*EdgeFlagv)( const GLboolean * );
 | 
			
		||||
   void (*EvalCoord1f)( GLfloat );          /* NOTE */
 | 
			
		||||
@@ -915,8 +920,8 @@ typedef struct {
 | 
			
		||||
   void (*EvalPoint2)( GLint, GLint );      /* NOTE */
 | 
			
		||||
   void (*FogCoordfEXT)( GLfloat );
 | 
			
		||||
   void (*FogCoordfvEXT)( const GLfloat * );
 | 
			
		||||
   void (*Indexi)( GLint );
 | 
			
		||||
   void (*Indexiv)( const GLint * );
 | 
			
		||||
   void (*Indexf)( GLfloat );
 | 
			
		||||
   void (*Indexfv)( const GLfloat * );
 | 
			
		||||
   void (*Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */
 | 
			
		||||
   void (*MultiTexCoord1fARB)( GLenum, GLfloat );
 | 
			
		||||
   void (*MultiTexCoord1fvARB)( GLenum, const GLfloat * );
 | 
			
		||||
@@ -930,8 +935,6 @@ typedef struct {
 | 
			
		||||
   void (*Normal3fv)( const GLfloat * );
 | 
			
		||||
   void (*SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat );
 | 
			
		||||
   void (*SecondaryColor3fvEXT)( const GLfloat * );
 | 
			
		||||
   void (*SecondaryColor3ubEXT)( GLubyte, GLubyte, GLubyte );
 | 
			
		||||
   void (*SecondaryColor3ubvEXT)( const GLubyte * );
 | 
			
		||||
   void (*TexCoord1f)( GLfloat );
 | 
			
		||||
   void (*TexCoord1fv)( const GLfloat * );
 | 
			
		||||
   void (*TexCoord2f)( GLfloat, GLfloat );
 | 
			
		||||
@@ -947,8 +950,15 @@ typedef struct {
 | 
			
		||||
   void (*Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat );
 | 
			
		||||
   void (*Vertex4fv)( const GLfloat * );
 | 
			
		||||
   void (*CallList)( GLuint );	/* NOTE */
 | 
			
		||||
   void (*CallLists)( GLsizei, GLenum, const GLvoid * );	/* NOTE */
 | 
			
		||||
   void (*Begin)( GLenum );
 | 
			
		||||
   void (*End)( void );
 | 
			
		||||
   void (*VertexAttrib1fNV)( GLuint index, GLfloat x );
 | 
			
		||||
   void (*VertexAttrib1fvNV)( GLuint index, const GLfloat *v );
 | 
			
		||||
   void (*VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y );
 | 
			
		||||
   void (*VertexAttrib2fvNV)( GLuint index, const GLfloat *v );
 | 
			
		||||
   void (*VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z );
 | 
			
		||||
   void (*VertexAttrib3fvNV)( GLuint index, const GLfloat *v );
 | 
			
		||||
   void (*VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w );
 | 
			
		||||
   void (*VertexAttrib4fvNV)( GLuint index, const GLfloat *v );
 | 
			
		||||
   /*@}*/
 | 
			
		||||
@@ -959,10 +969,6 @@ typedef struct {
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * \name Array
 | 
			
		||||
    *
 | 
			
		||||
    * These may or may not belong here.  Heuristic: if an array is
 | 
			
		||||
    * enabled, the installed vertex format should support that array and
 | 
			
		||||
    * its current size natively.
 | 
			
		||||
    */
 | 
			
		||||
   /*@{*/
 | 
			
		||||
   void (*DrawArrays)( GLenum mode, GLint start, GLsizei count );
 | 
			
		||||
@@ -988,11 +994,6 @@ typedef struct {
 | 
			
		||||
   void (*EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );
 | 
			
		||||
   /*@}*/
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * Should core try to send colors to glColor4f or glColor4chan,
 | 
			
		||||
    * where it has a choice?
 | 
			
		||||
    */
 | 
			
		||||
   GLboolean prefer_float_colors;
 | 
			
		||||
} GLvertexformat;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -79,6 +79,8 @@ extern void _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 );
 | 
			
		||||
extern void _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists );
 | 
			
		||||
extern void _mesa_save_CallList( GLuint list );
 | 
			
		||||
extern void _mesa_init_display_list( GLcontext * ctx );
 | 
			
		||||
extern void _mesa_save_vtxfmt_init( GLvertexformat *vfmt );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
@@ -94,6 +96,9 @@ extern void _mesa_init_display_list( GLcontext * ctx );
 | 
			
		||||
/** No-op */
 | 
			
		||||
#define _mesa_init_display_list(c) ((void)0)
 | 
			
		||||
 | 
			
		||||
/** No-op */
 | 
			
		||||
#define _mesa_save_vtxfmt_init(v) ((void)0)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -295,7 +295,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
 | 
			
		||||
         break;
 | 
			
		||||
      case GL_CURRENT_INDEX:
 | 
			
		||||
	 FLUSH_CURRENT(ctx, 0);
 | 
			
		||||
         *params = INT_TO_BOOL(ctx->Current.Index);
 | 
			
		||||
         *params = FLOAT_TO_BOOL(ctx->Current.Index);
 | 
			
		||||
         break;
 | 
			
		||||
      case GL_CURRENT_NORMAL:
 | 
			
		||||
	 FLUSH_CURRENT(ctx, 0);
 | 
			
		||||
@@ -499,7 +499,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
 | 
			
		||||
	 *params = INT_TO_BOOL(ctx->List.ListBase);
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_INDEX:
 | 
			
		||||
	 *params = INT_TO_BOOL( ctx->CurrentListNum );
 | 
			
		||||
	 *params = INT_TO_BOOL( ctx->ListState.CurrentListNum );
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_MODE:
 | 
			
		||||
         if (!ctx->CompileFlag)
 | 
			
		||||
@@ -2041,7 +2041,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
 | 
			
		||||
	 *params = (GLdouble) ctx->List.ListBase;
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_INDEX:
 | 
			
		||||
	 *params = (GLdouble) ctx->CurrentListNum;
 | 
			
		||||
	 *params = (GLdouble) ctx->ListState.CurrentListNum;
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_MODE:
 | 
			
		||||
         if (!ctx->CompileFlag)
 | 
			
		||||
@@ -3578,7 +3578,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
 | 
			
		||||
	 *params = (GLfloat) ctx->List.ListBase;
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_INDEX:
 | 
			
		||||
	 *params = (GLfloat) ctx->CurrentListNum;
 | 
			
		||||
	 *params = (GLfloat) ctx->ListState.CurrentListNum;
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_MODE:
 | 
			
		||||
         if (!ctx->CompileFlag)
 | 
			
		||||
@@ -5092,7 +5092,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
 | 
			
		||||
	 *params = (GLint) ctx->List.ListBase;
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_INDEX:
 | 
			
		||||
	 *params = (GLint) ctx->CurrentListNum;
 | 
			
		||||
	 *params = (GLint) ctx->ListState.CurrentListNum;
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LIST_MODE:
 | 
			
		||||
         if (!ctx->CompileFlag)
 | 
			
		||||
 
 | 
			
		||||
@@ -109,6 +109,8 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256];
 | 
			
		||||
#define STRIDE_UI(p, i)  (p = (GLuint *)((GLubyte *)p + i))
 | 
			
		||||
/** Stepping a GLubyte[4] pointer by a byte stride */
 | 
			
		||||
#define STRIDE_4UB(p, i)  (p = (GLubyte (*)[4])((GLubyte *)p + i))
 | 
			
		||||
/** Stepping a GLfloat[4] pointer by a byte stride */
 | 
			
		||||
#define STRIDE_4F(p, i)  (p = (GLfloat (*)[4])((GLubyte *)p + i))
 | 
			
		||||
/** Stepping a GLchan[4] pointer by a byte stride */
 | 
			
		||||
#define STRIDE_4CHAN(p, i)  (p = (GLchan (*)[4])((GLubyte *)p + i))
 | 
			
		||||
/** Stepping a GLchan pointer by a byte stride */
 | 
			
		||||
 
 | 
			
		||||
@@ -446,7 +446,7 @@ struct gl_current_attrib {
 | 
			
		||||
   /*@{*/
 | 
			
		||||
   GLfloat Attrib[VERT_ATTRIB_MAX][4];		/**< Current vertex attributes
 | 
			
		||||
						  *  indexed by VERT_ATTRIB_* */
 | 
			
		||||
   GLuint Index;				/**< Current color index */
 | 
			
		||||
   GLfloat Index;				/**< Current color index */
 | 
			
		||||
   GLboolean EdgeFlag;				/**< Current edge flag */
 | 
			
		||||
   /*@}*/
 | 
			
		||||
 | 
			
		||||
@@ -2018,6 +2018,27 @@ struct gl_tnl_module {
 | 
			
		||||
   /*@}*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mesa_list_state {
 | 
			
		||||
   GLuint CallDepth;		/**< Current recursion calling depth */
 | 
			
		||||
   Node *CurrentListPtr;	/**< Head of list being compiled */
 | 
			
		||||
   GLuint CurrentListNum;	/**< Number of the list being compiled */
 | 
			
		||||
   Node *CurrentBlock;		/**< Pointer to current block of nodes */
 | 
			
		||||
   GLuint CurrentPos;		/**< Index into current block of nodes */
 | 
			
		||||
   GLvertexformat ListVtxfmt;
 | 
			
		||||
 | 
			
		||||
   GLubyte ActiveAttribSize[VERT_ATTRIB_MAX];
 | 
			
		||||
   GLfloat CurrentAttrib[VERT_ATTRIB_MAX][4];
 | 
			
		||||
   
 | 
			
		||||
   GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX];
 | 
			
		||||
   GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4];
 | 
			
		||||
 | 
			
		||||
   GLubyte ActiveIndex;
 | 
			
		||||
   GLfloat CurrentIndex;
 | 
			
		||||
   
 | 
			
		||||
   GLubyte ActiveEdgeFlag;
 | 
			
		||||
   GLboolean CurrentEdgeFlag;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Mesa context
 | 
			
		||||
@@ -2049,9 +2070,6 @@ struct __GLcontextRec {
 | 
			
		||||
   struct _glapi_table *CurrentDispatch;  /**< == Save or Exec !! */
 | 
			
		||||
   /*@}*/
 | 
			
		||||
 | 
			
		||||
   GLboolean ExecPrefersFloat;	/**< What preference for color conversion? */
 | 
			
		||||
   GLboolean SavePrefersFloat;
 | 
			
		||||
 | 
			
		||||
   GLvisual Visual;
 | 
			
		||||
   GLframebuffer *DrawBuffer;	/**< buffer for writing */
 | 
			
		||||
   GLframebuffer *ReadBuffer;	/**< buffer for reading */
 | 
			
		||||
@@ -2081,15 +2099,10 @@ struct __GLcontextRec {
 | 
			
		||||
   GLmatrix _ModelProjectMatrix;
 | 
			
		||||
 | 
			
		||||
   /** \name Display lists */
 | 
			
		||||
   /*@{*/
 | 
			
		||||
   GLuint CallDepth;		/**< Current recursion calling depth */
 | 
			
		||||
   struct mesa_list_state ListState;
 | 
			
		||||
 | 
			
		||||
   GLboolean ExecuteFlag;	/**< Execute GL commands? */
 | 
			
		||||
   GLboolean CompileFlag;	/**< Compile GL commands into display list? */
 | 
			
		||||
   Node *CurrentListPtr;	/**< Head of list being compiled */
 | 
			
		||||
   GLuint CurrentListNum;	/**< Number of the list being compiled */
 | 
			
		||||
   Node *CurrentBlock;		/**< Pointer to current block of nodes */
 | 
			
		||||
   GLuint CurrentPos;		/**< Index into current block of nodes */
 | 
			
		||||
   /*@}*/
 | 
			
		||||
 | 
			
		||||
   /** Extensions */
 | 
			
		||||
   struct gl_extensions Extensions;
 | 
			
		||||
 
 | 
			
		||||
@@ -726,6 +726,8 @@ _mesa_fetch_state(GLcontext *ctx, const enum state_index state[],
 | 
			
		||||
            case STATE_LOCAL:
 | 
			
		||||
               COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]);
 | 
			
		||||
               break;				
 | 
			
		||||
	 default:
 | 
			
		||||
	    break;
 | 
			
		||||
         }				  
 | 
			
		||||
      }			
 | 
			
		||||
      return;
 | 
			
		||||
@@ -744,6 +746,8 @@ _mesa_fetch_state(GLcontext *ctx, const enum state_index state[],
 | 
			
		||||
            case STATE_LOCAL:
 | 
			
		||||
               COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]);
 | 
			
		||||
               break;				
 | 
			
		||||
	 default:
 | 
			
		||||
	    break;
 | 
			
		||||
         }				  
 | 
			
		||||
      }			
 | 
			
		||||
      return;
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,7 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize)
 | 
			
		||||
   _mesa_init_no_op_table(exec, tableSize);
 | 
			
		||||
 | 
			
		||||
#if _HAVE_FULL_GL
 | 
			
		||||
   _mesa_loopback_init_api_table( exec, GL_TRUE );
 | 
			
		||||
   _mesa_loopback_init_api_table( exec );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   /* load the dispatch slots we understand */
 | 
			
		||||
 
 | 
			
		||||
@@ -77,12 +77,8 @@ static void install_vtxfmt( struct _glapi_table *tab, GLvertexformat *vfmt )
 | 
			
		||||
   tab->ArrayElement = vfmt->ArrayElement;
 | 
			
		||||
   tab->Color3f = vfmt->Color3f;
 | 
			
		||||
   tab->Color3fv = vfmt->Color3fv;
 | 
			
		||||
   tab->Color3ub = vfmt->Color3ub;
 | 
			
		||||
   tab->Color3ubv = vfmt->Color3ubv;
 | 
			
		||||
   tab->Color4f = vfmt->Color4f;
 | 
			
		||||
   tab->Color4fv = vfmt->Color4fv;
 | 
			
		||||
   tab->Color4ub = vfmt->Color4ub;
 | 
			
		||||
   tab->Color4ubv = vfmt->Color4ubv;
 | 
			
		||||
   tab->EdgeFlag = vfmt->EdgeFlag;
 | 
			
		||||
   tab->EdgeFlagv = vfmt->EdgeFlagv;
 | 
			
		||||
   tab->EvalCoord1f = vfmt->EvalCoord1f;
 | 
			
		||||
@@ -93,8 +89,8 @@ static void install_vtxfmt( struct _glapi_table *tab, GLvertexformat *vfmt )
 | 
			
		||||
   tab->EvalPoint2 = vfmt->EvalPoint2;
 | 
			
		||||
   tab->FogCoordfEXT = vfmt->FogCoordfEXT;
 | 
			
		||||
   tab->FogCoordfvEXT = vfmt->FogCoordfvEXT;
 | 
			
		||||
   tab->Indexi = vfmt->Indexi;
 | 
			
		||||
   tab->Indexiv = vfmt->Indexiv;
 | 
			
		||||
   tab->Indexf = vfmt->Indexf;
 | 
			
		||||
   tab->Indexfv = vfmt->Indexfv;
 | 
			
		||||
   tab->Materialfv = vfmt->Materialfv;
 | 
			
		||||
   tab->MultiTexCoord1fARB = vfmt->MultiTexCoord1fARB;
 | 
			
		||||
   tab->MultiTexCoord1fvARB = vfmt->MultiTexCoord1fvARB;
 | 
			
		||||
@@ -108,8 +104,6 @@ static void install_vtxfmt( struct _glapi_table *tab, GLvertexformat *vfmt )
 | 
			
		||||
   tab->Normal3fv = vfmt->Normal3fv;
 | 
			
		||||
   tab->SecondaryColor3fEXT = vfmt->SecondaryColor3fEXT;
 | 
			
		||||
   tab->SecondaryColor3fvEXT = vfmt->SecondaryColor3fvEXT;
 | 
			
		||||
   tab->SecondaryColor3ubEXT = vfmt->SecondaryColor3ubEXT;
 | 
			
		||||
   tab->SecondaryColor3ubvEXT = vfmt->SecondaryColor3ubvEXT;
 | 
			
		||||
   tab->TexCoord1f = vfmt->TexCoord1f;
 | 
			
		||||
   tab->TexCoord1fv = vfmt->TexCoord1fv;
 | 
			
		||||
   tab->TexCoord2f = vfmt->TexCoord2f;
 | 
			
		||||
@@ -125,8 +119,15 @@ static void install_vtxfmt( struct _glapi_table *tab, GLvertexformat *vfmt )
 | 
			
		||||
   tab->Vertex4f = vfmt->Vertex4f;
 | 
			
		||||
   tab->Vertex4fv = vfmt->Vertex4fv;
 | 
			
		||||
   tab->CallList = vfmt->CallList;
 | 
			
		||||
   tab->CallLists = vfmt->CallLists;
 | 
			
		||||
   tab->Begin = vfmt->Begin;
 | 
			
		||||
   tab->End = vfmt->End;
 | 
			
		||||
   tab->VertexAttrib1fNV = vfmt->VertexAttrib1fNV;
 | 
			
		||||
   tab->VertexAttrib1fvNV = vfmt->VertexAttrib1fvNV;
 | 
			
		||||
   tab->VertexAttrib2fNV = vfmt->VertexAttrib2fNV;
 | 
			
		||||
   tab->VertexAttrib2fvNV = vfmt->VertexAttrib2fvNV;
 | 
			
		||||
   tab->VertexAttrib3fNV = vfmt->VertexAttrib3fNV;
 | 
			
		||||
   tab->VertexAttrib3fvNV = vfmt->VertexAttrib3fvNV;
 | 
			
		||||
   tab->VertexAttrib4fNV = vfmt->VertexAttrib4fNV;
 | 
			
		||||
   tab->VertexAttrib4fvNV = vfmt->VertexAttrib4fvNV;
 | 
			
		||||
   tab->Rectf = vfmt->Rectf;
 | 
			
		||||
@@ -150,15 +151,11 @@ void _mesa_install_exec_vtxfmt( GLcontext *ctx, GLvertexformat *vfmt )
 | 
			
		||||
{
 | 
			
		||||
   ctx->TnlModule.Current = vfmt;
 | 
			
		||||
   _mesa_restore_exec_vtxfmt( ctx );
 | 
			
		||||
   if ( ctx->ExecPrefersFloat != vfmt->prefer_float_colors )
 | 
			
		||||
      _mesa_loopback_prefer_float( ctx->Exec, vfmt->prefer_float_colors );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_install_save_vtxfmt( GLcontext *ctx, GLvertexformat *vfmt )
 | 
			
		||||
{
 | 
			
		||||
   install_vtxfmt( ctx->Save, vfmt );
 | 
			
		||||
   if ( ctx->SavePrefersFloat != vfmt->prefer_float_colors )
 | 
			
		||||
      _mesa_loopback_prefer_float( ctx->Save, vfmt->prefer_float_colors );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -48,18 +48,6 @@ static void TAG(Color3fv)( const GLfloat *v )
 | 
			
		||||
   _glapi_Dispatch->Color3fv( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Color3ub)( GLubyte r, GLubyte g, GLubyte b )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Color3ub );
 | 
			
		||||
   _glapi_Dispatch->Color3ub( r, g, b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Color3ubv)( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Color3ubv );
 | 
			
		||||
   _glapi_Dispatch->Color3ubv( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Color4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Color4f );
 | 
			
		||||
@@ -72,18 +60,6 @@ static void TAG(Color4fv)( const GLfloat *v )
 | 
			
		||||
   _glapi_Dispatch->Color4fv( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Color4ub)( GLubyte r, GLubyte g, GLubyte b, GLubyte a )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Color4ub );
 | 
			
		||||
   _glapi_Dispatch->Color4ub( r, g, b, a );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Color4ubv)( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Color4ubv );
 | 
			
		||||
   _glapi_Dispatch->Color4ubv( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(EdgeFlag)( GLboolean e )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( EdgeFlag );
 | 
			
		||||
@@ -144,16 +120,16 @@ static void TAG(FogCoordfvEXT)( const GLfloat *v )
 | 
			
		||||
   _glapi_Dispatch->FogCoordfvEXT( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Indexi)( GLint i )
 | 
			
		||||
static void TAG(Indexf)( GLfloat f )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Indexi );
 | 
			
		||||
   _glapi_Dispatch->Indexi( i );
 | 
			
		||||
   PRE_LOOPBACK( Indexf );
 | 
			
		||||
   _glapi_Dispatch->Indexi( f );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Indexiv)( const GLint *v )
 | 
			
		||||
static void TAG(Indexfv)( const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Indexiv );
 | 
			
		||||
   _glapi_Dispatch->Indexiv( v );
 | 
			
		||||
   PRE_LOOPBACK( Indexfv );
 | 
			
		||||
   _glapi_Dispatch->Indexfv( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Materialfv)( GLenum face, GLenum pname, const GLfloat *v )
 | 
			
		||||
@@ -236,18 +212,6 @@ static void TAG(SecondaryColor3fvEXT)( const GLfloat *v )
 | 
			
		||||
   _glapi_Dispatch->SecondaryColor3fvEXT( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(SecondaryColor3ubEXT)( GLubyte r, GLubyte g, GLubyte b )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( SecondaryColor3ubEXT );
 | 
			
		||||
   _glapi_Dispatch->SecondaryColor3ubEXT( r, g, b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(SecondaryColor3ubvEXT)( const GLubyte *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( SecondaryColor3ubvEXT );
 | 
			
		||||
   _glapi_Dispatch->SecondaryColor3ubvEXT( v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(TexCoord1f)( GLfloat s )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( TexCoord1f );
 | 
			
		||||
@@ -338,6 +302,12 @@ static void TAG(CallList)( GLuint i )
 | 
			
		||||
   _glapi_Dispatch->CallList( i );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(CallLists)( GLsizei sz, GLenum type, const GLvoid *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( CallLists );
 | 
			
		||||
   _glapi_Dispatch->CallLists( sz, type, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(Begin)( GLenum mode )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( Begin );
 | 
			
		||||
@@ -390,6 +360,42 @@ static void TAG(EvalMesh2)( GLenum mode, GLint i1, GLint i2,
 | 
			
		||||
   _glapi_Dispatch->EvalMesh2( mode, i1, i2, j1, j2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib1fNV)( GLuint index, GLfloat x )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib1fNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib1fNV( index, x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib1fvNV)( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib1fvNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib1fvNV( index, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib2fNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib2fNV( index, x, y );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib2fvNV)( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib2fvNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib2fvNV( index, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib3fNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib3fNV( index, x, y, z );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib3fvNV)( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib3fvNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib3fvNV( index, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib4fNV );
 | 
			
		||||
@@ -398,7 +404,7 @@ static void TAG(VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z
 | 
			
		||||
 | 
			
		||||
static void TAG(VertexAttrib4fvNV)( GLuint index, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib4fvNV );
 | 
			
		||||
   PRE_LOOPBACK( VertexAttrib4fNV );
 | 
			
		||||
   _glapi_Dispatch->VertexAttrib4fvNV( index, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -407,12 +413,8 @@ static GLvertexformat TAG(vtxfmt) = {
 | 
			
		||||
   TAG(ArrayElement),
 | 
			
		||||
   TAG(Color3f),
 | 
			
		||||
   TAG(Color3fv),
 | 
			
		||||
   TAG(Color3ub),
 | 
			
		||||
   TAG(Color3ubv),
 | 
			
		||||
   TAG(Color4f),
 | 
			
		||||
   TAG(Color4fv),
 | 
			
		||||
   TAG(Color4ub),
 | 
			
		||||
   TAG(Color4ubv),
 | 
			
		||||
   TAG(EdgeFlag),
 | 
			
		||||
   TAG(EdgeFlagv),
 | 
			
		||||
   TAG(EvalCoord1f),
 | 
			
		||||
@@ -423,8 +425,8 @@ static GLvertexformat TAG(vtxfmt) = {
 | 
			
		||||
   TAG(EvalPoint2),
 | 
			
		||||
   TAG(FogCoordfEXT),
 | 
			
		||||
   TAG(FogCoordfvEXT),
 | 
			
		||||
   TAG(Indexi),
 | 
			
		||||
   TAG(Indexiv),
 | 
			
		||||
   TAG(Indexf),
 | 
			
		||||
   TAG(Indexfv),
 | 
			
		||||
   TAG(Materialfv),
 | 
			
		||||
   TAG(MultiTexCoord1fARB),
 | 
			
		||||
   TAG(MultiTexCoord1fvARB),
 | 
			
		||||
@@ -438,8 +440,6 @@ static GLvertexformat TAG(vtxfmt) = {
 | 
			
		||||
   TAG(Normal3fv),
 | 
			
		||||
   TAG(SecondaryColor3fEXT),
 | 
			
		||||
   TAG(SecondaryColor3fvEXT),
 | 
			
		||||
   TAG(SecondaryColor3ubEXT),
 | 
			
		||||
   TAG(SecondaryColor3ubvEXT),
 | 
			
		||||
   TAG(TexCoord1f),
 | 
			
		||||
   TAG(TexCoord1fv),
 | 
			
		||||
   TAG(TexCoord2f),
 | 
			
		||||
@@ -455,8 +455,15 @@ static GLvertexformat TAG(vtxfmt) = {
 | 
			
		||||
   TAG(Vertex4f),
 | 
			
		||||
   TAG(Vertex4fv),
 | 
			
		||||
   TAG(CallList),
 | 
			
		||||
   TAG(CallLists),
 | 
			
		||||
   TAG(Begin),
 | 
			
		||||
   TAG(End),
 | 
			
		||||
   TAG(VertexAttrib1fNV),
 | 
			
		||||
   TAG(VertexAttrib1fvNV),
 | 
			
		||||
   TAG(VertexAttrib2fNV),
 | 
			
		||||
   TAG(VertexAttrib2fvNV),
 | 
			
		||||
   TAG(VertexAttrib3fNV),
 | 
			
		||||
   TAG(VertexAttrib3fvNV),
 | 
			
		||||
   TAG(VertexAttrib4fNV),
 | 
			
		||||
   TAG(VertexAttrib4fvNV),
 | 
			
		||||
   TAG(Rectf),
 | 
			
		||||
 
 | 
			
		||||
@@ -88,68 +88,7 @@ void _mesa_vector4f_init( GLvector4f *v, GLuint flags, GLfloat (*storage)[4] )
 | 
			
		||||
   v->flags = size_bits[4] | flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector3f_init( GLvector3f *v, GLuint flags, GLfloat (*storage)[3] )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 3 * sizeof(GLfloat);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLfloat *) storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1f_init( GLvector1f *v, GLuint flags, GLfloat *storage )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 1*sizeof(GLfloat);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLfloat *)storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4ub_init( GLvector4ub *v, GLuint flags, GLubyte (*storage)[4] )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 4 * sizeof(GLubyte);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLubyte *) storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4chan_init( GLvector4chan *v, GLuint flags, GLchan (*storage)[4] )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 4 * sizeof(GLchan);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLchan *) storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4us_init( GLvector4us *v, GLuint flags, GLushort (*storage)[4] )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 4 * sizeof(GLushort);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLushort *) storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1ub_init( GLvector1ub *v, GLuint flags, GLubyte *storage )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 1 * sizeof(GLubyte);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLubyte *) storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1ui_init( GLvector1ui *v, GLuint flags, GLuint *storage )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 1 * sizeof(GLuint);
 | 
			
		||||
   v->data = storage;
 | 
			
		||||
   v->start = (GLuint *) storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -174,82 +113,6 @@ void _mesa_vector4f_alloc( GLvector4f *v, GLuint flags, GLuint count,
 | 
			
		||||
   v->flags = size_bits[4] | flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector3f_alloc( GLvector3f *v, GLuint flags, GLuint count,
 | 
			
		||||
			GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 3 * sizeof(GLfloat);
 | 
			
		||||
   v->storage = ALIGN_MALLOC( count * 3 * sizeof(GLfloat), alignment );
 | 
			
		||||
   v->start = (GLfloat *) v->storage;
 | 
			
		||||
   v->data = (GLfloat (*)[3]) v->storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1f_alloc( GLvector1f *v, GLuint flags, GLuint count,
 | 
			
		||||
			GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = sizeof(GLfloat);
 | 
			
		||||
   v->storage = v->start = (GLfloat *)
 | 
			
		||||
      ALIGN_MALLOC( count * sizeof(GLfloat), alignment );
 | 
			
		||||
   v->data = v->start;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4ub_alloc( GLvector4ub *v, GLuint flags, GLuint count,
 | 
			
		||||
			 GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 4 * sizeof(GLubyte);
 | 
			
		||||
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLubyte), alignment );
 | 
			
		||||
   v->start = (GLubyte *) v->storage;
 | 
			
		||||
   v->data = (GLubyte (*)[4]) v->storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4chan_alloc( GLvector4chan *v, GLuint flags, GLuint count,
 | 
			
		||||
			   GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 4 * sizeof(GLchan);
 | 
			
		||||
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLchan), alignment );
 | 
			
		||||
   v->start = (GLchan *) v->storage;
 | 
			
		||||
   v->data = (GLchan (*)[4]) v->storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4us_alloc( GLvector4us *v, GLuint flags, GLuint count,
 | 
			
		||||
                         GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 4 * sizeof(GLushort);
 | 
			
		||||
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLushort), alignment );
 | 
			
		||||
   v->start = (GLushort *) v->storage;
 | 
			
		||||
   v->data = (GLushort (*)[4]) v->storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1ub_alloc( GLvector1ub *v, GLuint flags, GLuint count,
 | 
			
		||||
			 GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 1 * sizeof(GLubyte);
 | 
			
		||||
   v->storage = ALIGN_MALLOC( count * sizeof(GLubyte), alignment );
 | 
			
		||||
   v->start = (GLubyte *) v->storage;
 | 
			
		||||
   v->data = (GLubyte *) v->storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1ui_alloc( GLvector1ui *v, GLuint flags, GLuint count,
 | 
			
		||||
			 GLuint alignment )
 | 
			
		||||
{
 | 
			
		||||
   v->stride = 1 * sizeof(GLuint);
 | 
			
		||||
   v->storage = ALIGN_MALLOC( count * sizeof(GLuint), alignment );
 | 
			
		||||
   v->start = (GLuint *) v->storage;
 | 
			
		||||
   v->data = (GLuint *) v->storage;
 | 
			
		||||
   v->count = 0;
 | 
			
		||||
   v->flags = flags | VEC_MALLOC ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -271,83 +134,6 @@ void _mesa_vector4f_free( GLvector4f *v )
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector3f_free( GLvector3f *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = 0;
 | 
			
		||||
      v->start = 0;
 | 
			
		||||
      v->storage = 0;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1f_free( GLvector1f *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = NULL;
 | 
			
		||||
      v->start = NULL;
 | 
			
		||||
      v->storage = NULL;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4ub_free( GLvector4ub *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = NULL;
 | 
			
		||||
      v->start = NULL;
 | 
			
		||||
      v->storage = NULL;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4chan_free( GLvector4chan *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = NULL;
 | 
			
		||||
      v->start = NULL;
 | 
			
		||||
      v->storage = NULL;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector4us_free( GLvector4us *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = NULL;
 | 
			
		||||
      v->start = NULL;
 | 
			
		||||
      v->storage = NULL;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1ub_free( GLvector1ub *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = NULL;
 | 
			
		||||
      v->start = NULL;
 | 
			
		||||
      v->storage = NULL;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _mesa_vector1ui_free( GLvector1ui *v )
 | 
			
		||||
{
 | 
			
		||||
   if (v->flags & VEC_MALLOC) {
 | 
			
		||||
      ALIGN_FREE( v->storage );
 | 
			
		||||
      v->data = NULL;
 | 
			
		||||
      v->start = NULL;
 | 
			
		||||
      v->storage = NULL;
 | 
			
		||||
      v->flags &= ~VEC_MALLOC;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * For debugging
 | 
			
		||||
@@ -402,28 +188,3 @@ void _mesa_vector4f_print( GLvector4f *v, GLubyte *cullmask, GLboolean culling )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * For debugging
 | 
			
		||||
 */
 | 
			
		||||
void _mesa_vector3f_print( GLvector3f *v, GLubyte *cullmask, GLboolean culling )
 | 
			
		||||
{
 | 
			
		||||
   GLfloat *d = (GLfloat *)v->data;
 | 
			
		||||
   GLuint i = 0, count;
 | 
			
		||||
 | 
			
		||||
   _mesa_printf("data-start\n");
 | 
			
		||||
   for ( ; d != v->start ; STRIDE_F(d,v->stride), i++)
 | 
			
		||||
      _mesa_printf( "%u:\t%f, %f, %f\n", i, d[0], d[1], d[2]);
 | 
			
		||||
 | 
			
		||||
   _mesa_printf("start-count(%u)\n", v->count);
 | 
			
		||||
   count = i + v->count;
 | 
			
		||||
 | 
			
		||||
   if (culling) {
 | 
			
		||||
      for ( ; i < count ; STRIDE_F(d,v->stride), i++)
 | 
			
		||||
	 if (cullmask[i])
 | 
			
		||||
	    _mesa_printf("%u:\t%f, %f, %f\n", i, d[0], d[1], d[2]);
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      for ( ; i < count ; STRIDE_F(d,v->stride), i++)
 | 
			
		||||
	 _mesa_printf("%u:\t%f, %f, %f\n", i, d[0], d[1], d[2]);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -80,132 +80,6 @@ extern void _mesa_vector4f_print( GLvector4f *v, GLubyte *, GLboolean );
 | 
			
		||||
extern void _mesa_vector4f_clean_elem( GLvector4f *vec, GLuint nr, GLuint elt );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Could use a single vector type for normals and vertices, but
 | 
			
		||||
 * this way avoids some casts.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLfloat (*data)[3];
 | 
			
		||||
   GLfloat *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector3f;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector3f_init( GLvector3f *v, GLuint flags, GLfloat (*)[3] );
 | 
			
		||||
extern void _mesa_vector3f_alloc( GLvector3f *v, GLuint flags, GLuint count,
 | 
			
		||||
			       GLuint alignment );
 | 
			
		||||
extern void _mesa_vector3f_free( GLvector3f *v );
 | 
			
		||||
extern void _mesa_vector3f_print( GLvector3f *v, GLubyte *, GLboolean );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLfloat *data;
 | 
			
		||||
   GLfloat *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector1f;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector1f_free( GLvector1f *v );
 | 
			
		||||
extern void _mesa_vector1f_init( GLvector1f *v, GLuint flags, GLfloat * );
 | 
			
		||||
extern void _mesa_vector1f_alloc( GLvector1f *v, GLuint flags, GLuint count,
 | 
			
		||||
			       GLuint alignment );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* For 4ub rgba values.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLubyte (*data)[4];
 | 
			
		||||
   GLubyte *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector4ub;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector4ub_init( GLvector4ub *v, GLuint flags,
 | 
			
		||||
			       GLubyte (*storage)[4] );
 | 
			
		||||
extern void _mesa_vector4ub_alloc( GLvector4ub *v, GLuint flags, GLuint count,
 | 
			
		||||
				GLuint alignment );
 | 
			
		||||
extern void _mesa_vector4ub_free( GLvector4ub * );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* For 4 * GLchan values.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLchan (*data)[4];
 | 
			
		||||
   GLchan *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector4chan;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector4chan_init( GLvector4chan *v, GLuint flags,
 | 
			
		||||
				 GLchan (*storage)[4] );
 | 
			
		||||
extern void _mesa_vector4chan_alloc( GLvector4chan *v, GLuint flags, GLuint count,
 | 
			
		||||
				  GLuint alignment );
 | 
			
		||||
extern void _mesa_vector4chan_free( GLvector4chan * );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* For 4 * GLushort rgba values.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLushort (*data)[4];
 | 
			
		||||
   GLushort *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector4us;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector4us_init( GLvector4us *v, GLuint flags,
 | 
			
		||||
                               GLushort (*storage)[4] );
 | 
			
		||||
extern void _mesa_vector4us_alloc( GLvector4us *v, GLuint flags, GLuint count,
 | 
			
		||||
                                GLuint alignment );
 | 
			
		||||
extern void _mesa_vector4us_free( GLvector4us * );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* For 1ub values, eg edgeflag.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
   GLubyte *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector1ub;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector1ub_init( GLvector1ub *v, GLuint flags, GLubyte *storage);
 | 
			
		||||
extern void _mesa_vector1ub_alloc( GLvector1ub *v, GLuint flags, GLuint count,
 | 
			
		||||
				GLuint alignment );
 | 
			
		||||
extern void _mesa_vector1ub_free( GLvector1ub * );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* For, eg Index, Array element.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
   GLuint *data;
 | 
			
		||||
   GLuint *start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLuint flags;
 | 
			
		||||
   void *storage;
 | 
			
		||||
} GLvector1ui;
 | 
			
		||||
 | 
			
		||||
extern void _mesa_vector1ui_init( GLvector1ui *v, GLuint flags, GLuint *storage );
 | 
			
		||||
extern void _mesa_vector1ui_alloc( GLvector1ui *v, GLuint flags, GLuint count,
 | 
			
		||||
				GLuint alignment );
 | 
			
		||||
extern void _mesa_vector1ui_free( GLvector1ui * );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -162,8 +162,8 @@ static void _swsetup_render_point_tri( GLcontext *ctx,
 | 
			
		||||
   _swrast_flush(ctx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define SS_COLOR(a,b) COPY_CHAN4(a,b)
 | 
			
		||||
#define SS_SPEC(a,b) COPY_3V(a,b)
 | 
			
		||||
#define SS_COLOR(a,b) UNCLAMPED_FLOAT_TO_RGBA_CHAN(a,b)
 | 
			
		||||
#define SS_SPEC(a,b) UNCLAMPED_FLOAT_TO_RGB_CHAN(a,b)
 | 
			
		||||
#define SS_IND(a,b) (a = b)
 | 
			
		||||
 | 
			
		||||
#define IND (0)
 | 
			
		||||
 
 | 
			
		||||
@@ -62,18 +62,18 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
 | 
			
		||||
	 if (facing == 1) {
 | 
			
		||||
	    if (IND & SS_TWOSIDE_BIT) {
 | 
			
		||||
	       if (IND & SS_RGBA_BIT) {
 | 
			
		||||
		  GLchan (*vbcolor)[4] = (GLchan (*)[4])VB->ColorPtr[1]->Ptr;
 | 
			
		||||
		  GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data;
 | 
			
		||||
		  SS_COLOR(v[0]->color, vbcolor[e0]);
 | 
			
		||||
		  SS_COLOR(v[1]->color, vbcolor[e1]);
 | 
			
		||||
		  SS_COLOR(v[2]->color, vbcolor[e2]);
 | 
			
		||||
		  if (VB->SecondaryColorPtr[1]) {
 | 
			
		||||
		     GLchan (*vbspec)[4] = (GLchan (*)[4])VB->SecondaryColorPtr[1]->Ptr;
 | 
			
		||||
		     GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data;
 | 
			
		||||
		     SS_SPEC(v[0]->specular, vbspec[e0]);
 | 
			
		||||
		     SS_SPEC(v[1]->specular, vbspec[e1]);
 | 
			
		||||
		     SS_SPEC(v[2]->specular, vbspec[e2]);
 | 
			
		||||
		  }
 | 
			
		||||
	       } else {
 | 
			
		||||
		  GLuint *vbindex = VB->IndexPtr[1]->data;
 | 
			
		||||
		  GLfloat *vbindex = (GLfloat *)VB->IndexPtr[1]->data;
 | 
			
		||||
		  SS_IND(v[0]->index, vbindex[e0]);
 | 
			
		||||
		  SS_IND(v[1]->index, vbindex[e1]);
 | 
			
		||||
		  SS_IND(v[2]->index, vbindex[e2]);
 | 
			
		||||
@@ -137,18 +137,18 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
 | 
			
		||||
   if (IND & SS_TWOSIDE_BIT) {
 | 
			
		||||
      if (facing == 1) {
 | 
			
		||||
	 if (IND & SS_RGBA_BIT) {
 | 
			
		||||
	    GLchan (*vbcolor)[4] = (GLchan (*)[4])VB->ColorPtr[0]->Ptr;
 | 
			
		||||
	    GLfloat (*vbcolor)[4] = VB->ColorPtr[0]->data;
 | 
			
		||||
	    SS_COLOR(v[0]->color, vbcolor[e0]);
 | 
			
		||||
	    SS_COLOR(v[1]->color, vbcolor[e1]);
 | 
			
		||||
	    SS_COLOR(v[2]->color, vbcolor[e2]);
 | 
			
		||||
	    if (VB->SecondaryColorPtr[0]) {
 | 
			
		||||
	       GLchan (*vbspec)[4] = (GLchan (*)[4])VB->SecondaryColorPtr[0]->Ptr;
 | 
			
		||||
	       GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[0]->data;
 | 
			
		||||
	       SS_SPEC(v[0]->specular, vbspec[e0]);
 | 
			
		||||
	       SS_SPEC(v[1]->specular, vbspec[e1]);
 | 
			
		||||
	       SS_SPEC(v[2]->specular, vbspec[e2]);
 | 
			
		||||
	    }
 | 
			
		||||
	 } else {
 | 
			
		||||
	    GLuint *vbindex = VB->IndexPtr[0]->data;
 | 
			
		||||
	    GLfloat *vbindex = (GLfloat *)VB->IndexPtr[0]->data;
 | 
			
		||||
	    SS_IND(v[0]->index, vbindex[e0]);
 | 
			
		||||
	    SS_IND(v[1]->index, vbindex[e1]);
 | 
			
		||||
	    SS_IND(v[2]->index, vbindex[e2]);
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,8 @@
 | 
			
		||||
#include "ss_context.h"
 | 
			
		||||
#include "ss_vb.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
static void do_import( struct vertex_buffer *VB,
 | 
			
		||||
		       struct gl_client_array *to,
 | 
			
		||||
		       struct gl_client_array *from )
 | 
			
		||||
@@ -83,7 +85,7 @@ static void import_float_spec_colors( GLcontext *ctx )
 | 
			
		||||
   do_import( VB, to, VB->SecondaryColorPtr[0] );
 | 
			
		||||
   VB->SecondaryColorPtr[0] = to;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Provides a RasterSetup function which prebuilds vertices for the
 | 
			
		||||
 * software rasterizer.  This is required for the triangle functions
 | 
			
		||||
@@ -226,7 +228,7 @@ static copy_pv_func copy_pv_tab[MAX_SETUPFUNC];
 | 
			
		||||
 *      Additional setup and interp for back color and edgeflag. 
 | 
			
		||||
 ***********************************************************************/
 | 
			
		||||
 | 
			
		||||
#define GET_COLOR(ptr, idx) (((GLchan (*)[4])((ptr)->Ptr))[idx])
 | 
			
		||||
#define GET_COLOR(ptr, idx) (((GLfloat (*)[4])((ptr)->data))[idx])
 | 
			
		||||
 | 
			
		||||
static void interp_extras( GLcontext *ctx,
 | 
			
		||||
			   GLfloat t,
 | 
			
		||||
@@ -236,23 +238,22 @@ static void interp_extras( GLcontext *ctx,
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
 | 
			
		||||
   if (VB->ColorPtr[1]) {
 | 
			
		||||
      INTERP_4CHAN( t,
 | 
			
		||||
      INTERP_4F( t,
 | 
			
		||||
		 GET_COLOR(VB->ColorPtr[1], dst),
 | 
			
		||||
		 GET_COLOR(VB->ColorPtr[1], out),
 | 
			
		||||
		 GET_COLOR(VB->ColorPtr[1], in) );
 | 
			
		||||
 | 
			
		||||
      if (VB->SecondaryColorPtr[1]) {
 | 
			
		||||
	 INTERP_3CHAN( t,
 | 
			
		||||
	 INTERP_3F( t,
 | 
			
		||||
		    GET_COLOR(VB->SecondaryColorPtr[1], dst),
 | 
			
		||||
		    GET_COLOR(VB->SecondaryColorPtr[1], out),
 | 
			
		||||
		    GET_COLOR(VB->SecondaryColorPtr[1], in) );
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else if (VB->IndexPtr[1]) {
 | 
			
		||||
      VB->IndexPtr[1]->data[dst] = (GLuint) (GLint)
 | 
			
		||||
	 LINTERP( t,
 | 
			
		||||
		  (GLfloat) VB->IndexPtr[1]->data[out],
 | 
			
		||||
		  (GLfloat) VB->IndexPtr[1]->data[in] );
 | 
			
		||||
      VB->IndexPtr[1]->data[dst][0] = LINTERP( t,
 | 
			
		||||
					       VB->IndexPtr[1]->data[out][0],
 | 
			
		||||
					       VB->IndexPtr[1]->data[in][0] );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (VB->EdgeFlag) {
 | 
			
		||||
@@ -268,8 +269,8 @@ static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src )
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
 | 
			
		||||
   if (VB->ColorPtr[1]) {
 | 
			
		||||
	 COPY_CHAN4( GET_COLOR(VB->ColorPtr[1], dst), 
 | 
			
		||||
		     GET_COLOR(VB->ColorPtr[1], src) );
 | 
			
		||||
	 COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), 
 | 
			
		||||
		   GET_COLOR(VB->ColorPtr[1], src) );
 | 
			
		||||
	 
 | 
			
		||||
	 if (VB->SecondaryColorPtr[1]) {
 | 
			
		||||
	    COPY_3V( GET_COLOR(VB->SecondaryColorPtr[1], dst), 
 | 
			
		||||
@@ -277,7 +278,7 @@ static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src )
 | 
			
		||||
	 }
 | 
			
		||||
   }
 | 
			
		||||
   else if (VB->IndexPtr[1]) {
 | 
			
		||||
      VB->IndexPtr[1]->data[dst] = VB->IndexPtr[1]->data[src];
 | 
			
		||||
      VB->IndexPtr[1]->data[dst][0] = VB->IndexPtr[1]->data[src][0];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   copy_pv_tab[SWSETUP_CONTEXT(ctx)->SetupIndex](ctx, dst, src);
 | 
			
		||||
 
 | 
			
		||||
@@ -35,9 +35,9 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
 | 
			
		||||
   SWvertex *v;
 | 
			
		||||
   const GLfloat *ndc;		/* NDC (i.e. projected clip coordinates) */
 | 
			
		||||
   const GLfloat *tc[MAX_TEXTURE_COORD_UNITS];
 | 
			
		||||
   const GLchan *color;
 | 
			
		||||
   const GLchan *spec;
 | 
			
		||||
   const GLuint *index;
 | 
			
		||||
   const GLfloat *color;
 | 
			
		||||
   const GLfloat *spec;
 | 
			
		||||
   const GLfloat *index;
 | 
			
		||||
   const GLfloat *fog;
 | 
			
		||||
   const GLfloat *pointSize;
 | 
			
		||||
   GLuint tsz[MAX_TEXTURE_COORD_UNITS];
 | 
			
		||||
@@ -80,21 +80,15 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
 | 
			
		||||
      fog_stride = VB->FogCoordPtr->stride;
 | 
			
		||||
   }
 | 
			
		||||
   if (IND & COLOR) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type != CHAN_TYPE)
 | 
			
		||||
	 import_float_colors( ctx );
 | 
			
		||||
 | 
			
		||||
      color = (GLchan *) VB->ColorPtr[0]->Ptr;
 | 
			
		||||
      color_stride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
      color = (GLfloat *) VB->ColorPtr[0]->data;
 | 
			
		||||
      color_stride = VB->ColorPtr[0]->stride;
 | 
			
		||||
   }
 | 
			
		||||
   if (IND & SPEC) {
 | 
			
		||||
      if (VB->SecondaryColorPtr[0]->Type != CHAN_TYPE)
 | 
			
		||||
	 import_float_spec_colors( ctx );
 | 
			
		||||
 | 
			
		||||
      spec = (GLchan *) VB->SecondaryColorPtr[0]->Ptr;
 | 
			
		||||
      spec_stride = VB->SecondaryColorPtr[0]->StrideB;
 | 
			
		||||
      spec = (GLfloat *) VB->SecondaryColorPtr[0]->data;
 | 
			
		||||
      spec_stride = VB->SecondaryColorPtr[0]->stride;
 | 
			
		||||
   }
 | 
			
		||||
   if (IND & INDEX) {
 | 
			
		||||
      index = VB->IndexPtr[0]->data;
 | 
			
		||||
      index = (GLfloat *) VB->IndexPtr[0]->data;
 | 
			
		||||
      index_stride = VB->IndexPtr[0]->stride;
 | 
			
		||||
   }
 | 
			
		||||
   if (IND & POINT) {
 | 
			
		||||
@@ -128,13 +122,13 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (IND & COLOR) {
 | 
			
		||||
	 COPY_CHAN4(v->color, color);
 | 
			
		||||
	 STRIDE_CHAN(color, color_stride);
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGBA_CHAN(v->color, color);
 | 
			
		||||
	 STRIDE_F(color, color_stride);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (IND & SPEC) {
 | 
			
		||||
	 COPY_CHAN4(v->specular, spec);
 | 
			
		||||
	 STRIDE_CHAN(spec, spec_stride);
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGBA_CHAN(v->specular, spec);
 | 
			
		||||
	 STRIDE_F(spec, spec_stride);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (IND & FOG) {
 | 
			
		||||
@@ -144,7 +138,7 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
 | 
			
		||||
 | 
			
		||||
      if (IND & INDEX) {
 | 
			
		||||
	 v->index = index[0];
 | 
			
		||||
	 STRIDE_UI(index, index_stride);
 | 
			
		||||
	 STRIDE_F(index, index_stride);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (IND & POINT) {
 | 
			
		||||
 
 | 
			
		||||
@@ -40,38 +40,40 @@
 | 
			
		||||
 | 
			
		||||
#include "t_array_api.h"
 | 
			
		||||
#include "t_array_import.h"
 | 
			
		||||
#include "t_imm_api.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
#include "t_save_api.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
 | 
			
		||||
static void fallback_drawarrays( GLcontext *ctx, GLenum mode, GLint start,
 | 
			
		||||
				 GLsizei count )
 | 
			
		||||
{
 | 
			
		||||
   if (_tnl_hard_begin( ctx, mode )) {
 | 
			
		||||
      GLint i;
 | 
			
		||||
      for (i = start; i < count; i++) 
 | 
			
		||||
	 glArrayElement( i );
 | 
			
		||||
      glEnd();
 | 
			
		||||
   }
 | 
			
		||||
   GLint i;
 | 
			
		||||
 | 
			
		||||
   assert(!ctx->CompileFlag);
 | 
			
		||||
   assert(ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1);
 | 
			
		||||
 | 
			
		||||
   glBegin(mode);
 | 
			
		||||
   for (i = start; i < count; i++) 
 | 
			
		||||
      glArrayElement( i );
 | 
			
		||||
   glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void fallback_drawelements( GLcontext *ctx, GLenum mode, GLsizei count,
 | 
			
		||||
				   const GLuint *indices)
 | 
			
		||||
{
 | 
			
		||||
   if (_tnl_hard_begin(ctx, mode)) {
 | 
			
		||||
      GLint i;
 | 
			
		||||
      if (ctx->Array.ElementArrayBufferObj->Name) {
 | 
			
		||||
         /* use indices in the buffer object */
 | 
			
		||||
         ASSERT(ctx->Array.ElementArrayBufferObj->Data);
 | 
			
		||||
         indices = (const GLuint *) ctx->Array.ElementArrayBufferObj->Data;
 | 
			
		||||
      }
 | 
			
		||||
      for (i = 0 ; i < count ; i++) {
 | 
			
		||||
         glArrayElement( indices[i] );
 | 
			
		||||
      }
 | 
			
		||||
      glEnd();
 | 
			
		||||
   GLint i;
 | 
			
		||||
 | 
			
		||||
   assert(!ctx->CompileFlag);
 | 
			
		||||
   assert(ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1);
 | 
			
		||||
 | 
			
		||||
   /* Here, indices will already reflect the buffer object if active */
 | 
			
		||||
 | 
			
		||||
   glBegin(mode);
 | 
			
		||||
   for (i = 0 ; i < count ; i++) {
 | 
			
		||||
      glArrayElement( indices[i] );
 | 
			
		||||
   }
 | 
			
		||||
   glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -81,22 +83,26 @@ static void _tnl_draw_range_elements( GLcontext *ctx, GLenum mode,
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct tnl_prim prim;
 | 
			
		||||
   int i;
 | 
			
		||||
   FLUSH_CURRENT( ctx, 0 );
 | 
			
		||||
   
 | 
			
		||||
   /*  _mesa_debug(ctx, "%s\n", __FUNCTION__); */
 | 
			
		||||
   if (tnl->pipeline.build_state_changes)
 | 
			
		||||
      _tnl_validate_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
   _tnl_vb_bind_arrays( ctx, start, end );
 | 
			
		||||
 | 
			
		||||
   tnl->vb.FirstPrimitive = 0;
 | 
			
		||||
   tnl->vb.Primitive[0] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST;
 | 
			
		||||
   tnl->vb.PrimitiveLength[0] = count;
 | 
			
		||||
   tnl->vb.Primitive = &prim;
 | 
			
		||||
   tnl->vb.Primitive[0].mode = mode | PRIM_BEGIN | PRIM_END;
 | 
			
		||||
   tnl->vb.Primitive[0].start = 0;
 | 
			
		||||
   tnl->vb.Primitive[0].count = count;
 | 
			
		||||
   tnl->vb.PrimitiveCount = 1;
 | 
			
		||||
 | 
			
		||||
   tnl->vb.Elts = (GLuint *)indices;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i < count ; i++)
 | 
			
		||||
      indices[i] -= start;
 | 
			
		||||
   if (start)
 | 
			
		||||
      for (i = 0 ; i < count ; i++)
 | 
			
		||||
	 indices[i] -= start;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Array.LockCount)
 | 
			
		||||
      tnl->Driver.RunPipeline( ctx );
 | 
			
		||||
@@ -108,8 +114,9 @@ static void _tnl_draw_range_elements( GLcontext *ctx, GLenum mode,
 | 
			
		||||
      tnl->pipeline.run_input_changes |= ctx->Array._Enabled;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i < count ; i++)
 | 
			
		||||
      indices[i] += start;
 | 
			
		||||
   if (start)
 | 
			
		||||
      for (i = 0 ; i < count ; i++)
 | 
			
		||||
	 indices[i] += start;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -122,7 +129,6 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   GLuint thresh = (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES) ? 30 : 10;
 | 
			
		||||
   
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_API)
 | 
			
		||||
@@ -136,10 +142,9 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
 | 
			
		||||
   if (tnl->pipeline.build_state_changes)
 | 
			
		||||
      _tnl_validate_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
   if (ctx->CompileFlag) {
 | 
			
		||||
      fallback_drawarrays( ctx, mode, start, start + count );
 | 
			
		||||
   }    
 | 
			
		||||
   else if (!ctx->Array.LockCount && (GLuint) count < thresh) {
 | 
			
		||||
   assert(!ctx->CompileFlag);
 | 
			
		||||
 | 
			
		||||
   if (!ctx->Array.LockCount && (GLuint) count < thresh) {
 | 
			
		||||
      /* Small primitives: attempt to share a vb (at the expense of
 | 
			
		||||
       * using the immediate interface).
 | 
			
		||||
      */
 | 
			
		||||
@@ -148,6 +153,8 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
 | 
			
		||||
   else if (ctx->Array.LockCount && 
 | 
			
		||||
	    count < (GLint) ctx->Const.MaxArrayLockSize) {
 | 
			
		||||
      
 | 
			
		||||
      struct tnl_prim prim;
 | 
			
		||||
 | 
			
		||||
      /* Locked primitives which can fit in a single vertex buffer:
 | 
			
		||||
       */
 | 
			
		||||
      FLUSH_CURRENT( ctx, 0 );
 | 
			
		||||
@@ -160,9 +167,13 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
 | 
			
		||||
      /* Locked drawarrays.  Reuse any previously transformed data.
 | 
			
		||||
       */
 | 
			
		||||
      _tnl_vb_bind_arrays( ctx, ctx->Array.LockFirst, ctx->Array.LockCount );
 | 
			
		||||
      VB->FirstPrimitive = start;
 | 
			
		||||
      VB->Primitive[start] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST;
 | 
			
		||||
      VB->PrimitiveLength[start] = count;
 | 
			
		||||
 | 
			
		||||
      tnl->vb.Primitive = &prim;
 | 
			
		||||
      tnl->vb.Primitive[0].mode = mode | PRIM_BEGIN | PRIM_END;
 | 
			
		||||
      tnl->vb.Primitive[0].start = start;
 | 
			
		||||
      tnl->vb.Primitive[0].count = count;
 | 
			
		||||
      tnl->vb.PrimitiveCount = 1;
 | 
			
		||||
 | 
			
		||||
      tnl->Driver.RunPipeline( ctx );
 | 
			
		||||
   } 
 | 
			
		||||
   else {
 | 
			
		||||
@@ -237,13 +248,25 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
 | 
			
		||||
 | 
			
		||||
      for (j = start + minimum ; j < count ; j += nr + skip ) {
 | 
			
		||||
 | 
			
		||||
	 struct tnl_prim prim;
 | 
			
		||||
 | 
			
		||||
	 nr = MIN2( bufsz, count - j );
 | 
			
		||||
 | 
			
		||||
	 _tnl_vb_bind_arrays( ctx, j - minimum, j + nr );
 | 
			
		||||
 | 
			
		||||
	 VB->FirstPrimitive = 0;
 | 
			
		||||
	 VB->Primitive[0] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST;
 | 
			
		||||
	 VB->PrimitiveLength[0] = nr + minimum;
 | 
			
		||||
	 tnl->vb.Primitive = &prim;
 | 
			
		||||
	 tnl->vb.Primitive[0].mode = mode;
 | 
			
		||||
 | 
			
		||||
	 if (j == start + minimum)
 | 
			
		||||
	    tnl->vb.Primitive[0].mode |= PRIM_BEGIN;
 | 
			
		||||
 | 
			
		||||
	 if (j + nr + skip >= count)
 | 
			
		||||
	    tnl->vb.Primitive[0].mode |= PRIM_END;
 | 
			
		||||
 | 
			
		||||
	 tnl->vb.Primitive[0].start = 0;
 | 
			
		||||
	 tnl->vb.Primitive[0].count = nr + minimum;
 | 
			
		||||
	 tnl->vb.PrimitiveCount = 1;
 | 
			
		||||
 | 
			
		||||
	 tnl->pipeline.run_input_changes |= ctx->Array._Enabled;
 | 
			
		||||
	 tnl->Driver.RunPipeline( ctx );
 | 
			
		||||
	 tnl->pipeline.run_input_changes |= ctx->Array._Enabled;
 | 
			
		||||
@@ -282,12 +305,9 @@ _tnl_DrawRangeElements(GLenum mode,
 | 
			
		||||
					       count, type, indices );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   if (ctx->CompileFlag) {
 | 
			
		||||
      /* Can't do anything when compiling:
 | 
			
		||||
       */
 | 
			
		||||
      fallback_drawelements( ctx, mode, count, ui_indices );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Array.LockCount) {
 | 
			
		||||
   assert(!ctx->CompileFlag);
 | 
			
		||||
 | 
			
		||||
   if (ctx->Array.LockCount) {
 | 
			
		||||
      /* Are the arrays already locked?  If so we currently have to look
 | 
			
		||||
       * at the whole locked range.
 | 
			
		||||
       */
 | 
			
		||||
@@ -353,12 +373,9 @@ _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type,
 | 
			
		||||
   ui_indices = (GLuint *)_ac_import_elements( ctx, GL_UNSIGNED_INT,
 | 
			
		||||
					       count, type, indices );
 | 
			
		||||
 | 
			
		||||
   if (ctx->CompileFlag) {
 | 
			
		||||
      /* Can't do anything when compiling:
 | 
			
		||||
       */
 | 
			
		||||
      fallback_drawelements( ctx, mode, count, ui_indices );
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Array.LockCount) {
 | 
			
		||||
   assert(!ctx->CompileFlag);
 | 
			
		||||
 | 
			
		||||
   if (ctx->Array.LockCount) {
 | 
			
		||||
      _tnl_draw_range_elements( ctx, mode,
 | 
			
		||||
				ctx->Array.LockFirst,
 | 
			
		||||
				ctx->Array.LockCount,
 | 
			
		||||
@@ -390,8 +407,8 @@ _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type,
 | 
			
		||||
void _tnl_array_init( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_arrays *tmp = &tnl->array_inputs;
 | 
			
		||||
   GLvertexformat *vfmt = &(TNL_CONTEXT(ctx)->vtxfmt);
 | 
			
		||||
   struct tnl_vertex_arrays *tmp = &tnl->array_inputs;
 | 
			
		||||
   GLvertexformat *vfmt = &(TNL_CONTEXT(ctx)->exec_vtxfmt);
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   vfmt->DrawArrays = _tnl_DrawArrays;
 | 
			
		||||
@@ -403,14 +420,10 @@ void _tnl_array_init( GLcontext *ctx )
 | 
			
		||||
   _mesa_vector4f_init( &tmp->Obj, 0, 0 );
 | 
			
		||||
   _mesa_vector4f_init( &tmp->Normal, 0, 0 );   
 | 
			
		||||
   _mesa_vector4f_init( &tmp->FogCoord, 0, 0 );
 | 
			
		||||
   _mesa_vector1ui_init( &tmp->Index, 0, 0 );
 | 
			
		||||
   _mesa_vector1ub_init( &tmp->EdgeFlag, 0, 0 );
 | 
			
		||||
   _mesa_vector4f_init( &tmp->Index, 0, 0 );
 | 
			
		||||
 | 
			
		||||
   for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
 | 
			
		||||
      _mesa_vector4f_init( &tmp->TexCoord[i], 0, 0);
 | 
			
		||||
 | 
			
		||||
   tnl->tmp_primitive = (GLuint *)MALLOC(sizeof(GLuint)*tnl->vb.Size);
 | 
			
		||||
   tnl->tmp_primitive_length = (GLuint *)MALLOC(sizeof(GLuint)*tnl->vb.Size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -420,7 +433,4 @@ void _tnl_array_init( GLcontext *ctx )
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_array_destroy( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   if (tnl->tmp_primitive_length) FREE(tnl->tmp_primitive_length);
 | 
			
		||||
   if (tnl->tmp_primitive) FREE(tnl->tmp_primitive);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@
 | 
			
		||||
 | 
			
		||||
#include "t_array_import.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_imm_debug.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void _tnl_import_vertex( GLcontext *ctx,
 | 
			
		||||
@@ -46,7 +45,7 @@ static void _tnl_import_vertex( GLcontext *ctx,
 | 
			
		||||
{
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
 | 
			
		||||
   tmp = _ac_import_vertex(ctx,
 | 
			
		||||
@@ -56,21 +55,11 @@ static void _tnl_import_vertex( GLcontext *ctx,
 | 
			
		||||
			   writeable,
 | 
			
		||||
			   &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   /* guess we really don't need to add pointers here - BP */
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->Obj.data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->Obj.start = (GLfloat *) data;
 | 
			
		||||
   inputs->Obj.stride = tmp->StrideB;
 | 
			
		||||
   inputs->Obj.size = tmp->Size;
 | 
			
		||||
   inputs->Obj.flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->Obj.stride != 4*sizeof(GLfloat))
 | 
			
		||||
      inputs->Obj.flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->Obj.flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tnl_import_normal( GLcontext *ctx,
 | 
			
		||||
@@ -79,73 +68,72 @@ static void _tnl_import_normal( GLcontext *ctx,
 | 
			
		||||
{
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
 | 
			
		||||
   tmp = _ac_import_normal(ctx, GL_FLOAT,
 | 
			
		||||
			   stride ? 3*sizeof(GLfloat) : 0, writeable,
 | 
			
		||||
			   &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->Normal.data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->Normal.start = (GLfloat *) data;
 | 
			
		||||
   inputs->Normal.stride = tmp->StrideB;
 | 
			
		||||
   inputs->Normal.flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->Normal.stride != 3*sizeof(GLfloat))
 | 
			
		||||
      inputs->Normal.flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->Normal.flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void _tnl_import_color( GLcontext *ctx,
 | 
			
		||||
			       GLenum type,
 | 
			
		||||
			       GLboolean writeable,
 | 
			
		||||
			       GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
 | 
			
		||||
   tmp = _ac_import_color(ctx,
 | 
			
		||||
			  type,
 | 
			
		||||
			  GL_FLOAT,
 | 
			
		||||
			  stride ? 4*sizeof(GLfloat) : 0,
 | 
			
		||||
			  4,
 | 
			
		||||
			  writeable,
 | 
			
		||||
			  &is_writeable);
 | 
			
		||||
 | 
			
		||||
   inputs->Color = *tmp;
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
   inputs->Color.data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->Color.start = (GLfloat *) data;
 | 
			
		||||
   inputs->Color.stride = tmp->StrideB;
 | 
			
		||||
   inputs->Color.size = tmp->Size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void _tnl_import_secondarycolor( GLcontext *ctx,
 | 
			
		||||
					GLenum type,
 | 
			
		||||
					GLboolean writeable,
 | 
			
		||||
					GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
 | 
			
		||||
   tmp = _ac_import_secondarycolor(ctx, 
 | 
			
		||||
				   type,
 | 
			
		||||
				   GL_FLOAT,
 | 
			
		||||
				   stride ? 4*sizeof(GLfloat) : 0,
 | 
			
		||||
				   4,
 | 
			
		||||
				   writeable,
 | 
			
		||||
				   &is_writeable);
 | 
			
		||||
 | 
			
		||||
   inputs->SecondaryColor = *tmp;
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
   inputs->SecondaryColor.data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->SecondaryColor.start = (GLfloat *) data;
 | 
			
		||||
   inputs->SecondaryColor.stride = tmp->StrideB;
 | 
			
		||||
   inputs->SecondaryColor.size = tmp->Size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tnl_import_fogcoord( GLcontext *ctx,
 | 
			
		||||
				  GLboolean writeable,
 | 
			
		||||
				  GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
@@ -154,47 +142,29 @@ static void _tnl_import_fogcoord( GLcontext *ctx,
 | 
			
		||||
			     stride ? sizeof(GLfloat) : 0, writeable,
 | 
			
		||||
			     &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->FogCoord.data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->FogCoord.start = (GLfloat *) data;
 | 
			
		||||
   inputs->FogCoord.stride = tmp->StrideB;
 | 
			
		||||
   inputs->FogCoord.flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->FogCoord.stride != sizeof(GLfloat))
 | 
			
		||||
      inputs->FogCoord.flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->FogCoord.flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tnl_import_index( GLcontext *ctx,
 | 
			
		||||
			       GLboolean writeable,
 | 
			
		||||
			       GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
 | 
			
		||||
   tmp = _ac_import_index(ctx, GL_UNSIGNED_INT,
 | 
			
		||||
			  stride ? sizeof(GLuint) : 0, writeable,
 | 
			
		||||
   tmp = _ac_import_index(ctx, GL_FLOAT,
 | 
			
		||||
			  stride ? sizeof(GLfloat) : 0, writeable,
 | 
			
		||||
			  &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->Index.data = (GLuint *) data;
 | 
			
		||||
   inputs->Index.start = (GLuint *) data;
 | 
			
		||||
   inputs->Index.data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->Index.start = (GLfloat *) data;
 | 
			
		||||
   inputs->Index.stride = tmp->StrideB;
 | 
			
		||||
   inputs->Index.flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->Index.stride != sizeof(GLuint))
 | 
			
		||||
      inputs->Index.flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->Index.flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -203,7 +173,7 @@ static void _tnl_import_texcoord( GLcontext *ctx,
 | 
			
		||||
				  GLboolean writeable,
 | 
			
		||||
				  GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
@@ -214,20 +184,11 @@ static void _tnl_import_texcoord( GLcontext *ctx,
 | 
			
		||||
			     writeable,
 | 
			
		||||
			     &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->TexCoord[unit].data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->TexCoord[unit].start = (GLfloat *) data;
 | 
			
		||||
   inputs->TexCoord[unit].stride = tmp->StrideB;
 | 
			
		||||
   inputs->TexCoord[unit].size = tmp->Size;
 | 
			
		||||
   inputs->TexCoord[unit].flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->TexCoord[unit].stride != 4*sizeof(GLfloat))
 | 
			
		||||
      inputs->TexCoord[unit].flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->TexCoord[unit].flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -235,29 +196,18 @@ static void _tnl_import_edgeflag( GLcontext *ctx,
 | 
			
		||||
				  GLboolean writeable,
 | 
			
		||||
				  GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
 | 
			
		||||
   tmp = _ac_import_edgeflag(ctx, GL_UNSIGNED_BYTE,
 | 
			
		||||
			     stride ? sizeof(GLubyte) : 0,
 | 
			
		||||
			     sizeof(GLubyte),
 | 
			
		||||
			     0,
 | 
			
		||||
			     &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->EdgeFlag.data = (GLubyte *) data;
 | 
			
		||||
   inputs->EdgeFlag.start = (GLubyte *) data;
 | 
			
		||||
   inputs->EdgeFlag.stride = tmp->StrideB;
 | 
			
		||||
   inputs->EdgeFlag.flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->EdgeFlag.stride != sizeof(GLubyte))
 | 
			
		||||
      inputs->EdgeFlag.flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->EdgeFlag.flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
   inputs->EdgeFlag = (GLubyte *) data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -267,7 +217,7 @@ static void _tnl_import_attrib( GLcontext *ctx,
 | 
			
		||||
                                GLboolean writeable,
 | 
			
		||||
                                GLboolean stride )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   struct gl_client_array *tmp;
 | 
			
		||||
   GLboolean is_writeable = 0;
 | 
			
		||||
   GLubyte *data;
 | 
			
		||||
@@ -278,98 +228,15 @@ static void _tnl_import_attrib( GLcontext *ctx,
 | 
			
		||||
                           writeable,
 | 
			
		||||
                           &is_writeable);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
   data = ADD_POINTERS(tmp->Ptr, tmp->BufferObj->Data);
 | 
			
		||||
#else
 | 
			
		||||
   data = tmp->Ptr;
 | 
			
		||||
#endif
 | 
			
		||||
   inputs->Attribs[index].data = (GLfloat (*)[4]) data;
 | 
			
		||||
   inputs->Attribs[index].start = (GLfloat *) data;
 | 
			
		||||
   inputs->Attribs[index].stride = tmp->StrideB;
 | 
			
		||||
   inputs->Attribs[index].size = tmp->Size;
 | 
			
		||||
   inputs->Attribs[index].flags &= ~(VEC_BAD_STRIDE|VEC_NOT_WRITEABLE);
 | 
			
		||||
   if (inputs->Attribs[index].stride != 4 * sizeof(GLfloat))
 | 
			
		||||
      inputs->Attribs[index].flags |= VEC_BAD_STRIDE;
 | 
			
		||||
   if (!is_writeable)
 | 
			
		||||
      inputs->Attribs[index].flags |= VEC_NOT_WRITEABLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Callback for VB stages that need to improve the quality of arrays
 | 
			
		||||
 * bound to the VB.  This is only necessary for client arrays which
 | 
			
		||||
 * have not been transformed at any point in the pipeline.
 | 
			
		||||
 * \param required - bitmask of VERT_*_BIT flags
 | 
			
		||||
 * \param flags - bitmask of VEC_* flags (ex: VEC_NOT_WRITABLE)
 | 
			
		||||
 */
 | 
			
		||||
static void _tnl_upgrade_client_data( GLcontext *ctx,
 | 
			
		||||
				      GLuint required,
 | 
			
		||||
				      GLuint flags )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   GLboolean writeable = (flags & VEC_NOT_WRITEABLE) != 0;
 | 
			
		||||
   GLboolean stride = (flags & VEC_BAD_STRIDE) != 0;
 | 
			
		||||
   struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs;
 | 
			
		||||
   GLuint ca_flags = 0;
 | 
			
		||||
   (void) inputs;
 | 
			
		||||
 | 
			
		||||
   if (writeable || stride) ca_flags |= CA_CLIENT_DATA;
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_CLIP) && VB->ClipPtr == VB->ObjPtr)
 | 
			
		||||
      required |= VERT_BIT_POS;
 | 
			
		||||
 | 
			
		||||
/*     _tnl_print_vert_flags("_tnl_upgrade_client_data", required); */
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_POS) && (VB->ObjPtr->flags & flags)) {
 | 
			
		||||
      ASSERT(VB->ObjPtr == &inputs->Obj);
 | 
			
		||||
      _tnl_import_vertex( ctx, writeable, stride );
 | 
			
		||||
      VB->importable_data &= ~(VERT_BIT_POS|VERT_BIT_CLIP);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_NORMAL) && (VB->NormalPtr->flags & flags)) {
 | 
			
		||||
      ASSERT(VB->NormalPtr == &inputs->Normal);
 | 
			
		||||
      _tnl_import_normal( ctx, writeable, stride );
 | 
			
		||||
      VB->importable_data &= ~VERT_BIT_NORMAL;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_COLOR0) && (VB->ColorPtr[0]->Flags & ca_flags)) {
 | 
			
		||||
      ASSERT(VB->ColorPtr[0] == &inputs->Color);
 | 
			
		||||
      _tnl_import_color( ctx, GL_FLOAT, writeable, stride );
 | 
			
		||||
      VB->importable_data &= ~VERT_BIT_COLOR0;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_COLOR1) && 
 | 
			
		||||
       (VB->SecondaryColorPtr[0]->Flags & ca_flags)) {
 | 
			
		||||
      ASSERT(VB->SecondaryColorPtr[0] == &inputs->SecondaryColor);
 | 
			
		||||
      _tnl_import_secondarycolor( ctx, GL_FLOAT, writeable, stride );
 | 
			
		||||
      VB->importable_data &= ~VERT_BIT_COLOR1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_FOG)
 | 
			
		||||
       && (VB->FogCoordPtr->flags & flags)) {
 | 
			
		||||
      ASSERT(VB->FogCoordPtr == &inputs->FogCoord);
 | 
			
		||||
      _tnl_import_fogcoord( ctx, writeable, stride );
 | 
			
		||||
      VB->importable_data &= ~VERT_BIT_FOG;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_INDEX) && (VB->IndexPtr[0]->flags & flags)) {
 | 
			
		||||
      ASSERT(VB->IndexPtr[0] == &inputs->Index);
 | 
			
		||||
      _tnl_import_index( ctx, writeable, stride );
 | 
			
		||||
      VB->importable_data &= ~VERT_BIT_INDEX;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (required & VERT_BITS_TEX_ANY)
 | 
			
		||||
      for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
 | 
			
		||||
	 if ((required & VERT_BIT_TEX(i)) && (VB->TexCoordPtr[i]->flags & flags)) {
 | 
			
		||||
	    ASSERT(VB->TexCoordPtr[i] == &inputs->TexCoord[i]);
 | 
			
		||||
	    _tnl_import_texcoord( ctx, i, writeable, stride );
 | 
			
		||||
	    VB->importable_data &= ~VERT_BIT_TEX(i);
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
   /* XXX not sure what to do here for vertex program arrays */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -378,28 +245,15 @@ void _tnl_vb_bind_arrays( GLcontext *ctx, GLint start, GLsizei count )
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   GLuint inputs = tnl->pipeline.inputs;
 | 
			
		||||
   struct vertex_arrays *tmp = &tnl->array_inputs;
 | 
			
		||||
 | 
			
		||||
/*        _mesa_debug(ctx, "%s %d..%d // %d..%d\n", __FUNCTION__, */
 | 
			
		||||
/*  	      start, count, ctx->Array.LockFirst, ctx->Array.LockCount);  */
 | 
			
		||||
/*        _tnl_print_vert_flags("    inputs", inputs);  */
 | 
			
		||||
/*        _tnl_print_vert_flags("    _Enabled", ctx->Array._Enabled); */
 | 
			
		||||
/*        _tnl_print_vert_flags("    importable", inputs & VERT_BITS_FIXUP); */
 | 
			
		||||
   struct tnl_vertex_arrays *tmp = &tnl->array_inputs;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   VB->Count = count - start;
 | 
			
		||||
   VB->FirstClipped = VB->Count;
 | 
			
		||||
   VB->Elts = NULL;
 | 
			
		||||
   VB->MaterialMask = NULL;
 | 
			
		||||
   VB->Material = NULL;
 | 
			
		||||
   VB->Flag = NULL;
 | 
			
		||||
   VB->Primitive = tnl->tmp_primitive;
 | 
			
		||||
   VB->PrimitiveLength = tnl->tmp_primitive_length;
 | 
			
		||||
   VB->import_data = _tnl_upgrade_client_data;
 | 
			
		||||
   VB->importable_data = inputs & VERT_BITS_FIXUP;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Array.LockCount) {
 | 
			
		||||
      ASSERT(start == (GLint) ctx->Array.LockFirst);
 | 
			
		||||
      ASSERT(count == (GLint) ctx->Array.LockCount);
 | 
			
		||||
      assert(start == (GLint) ctx->Array.LockFirst);
 | 
			
		||||
      assert(count == (GLint) ctx->Array.LockCount);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   _ac_import_range( ctx, start, count );
 | 
			
		||||
@@ -416,63 +270,92 @@ void _tnl_vb_bind_arrays( GLcontext *ctx, GLint start, GLsizei count )
 | 
			
		||||
         VB->AttribPtr[index] = &tmp->Attribs[index];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
    * Conventional attributes
 | 
			
		||||
    */
 | 
			
		||||
   if (inputs & VERT_BIT_POS) {
 | 
			
		||||
      _tnl_import_vertex( ctx, 0, 0 );
 | 
			
		||||
      tmp->Obj.count = VB->Count;
 | 
			
		||||
      VB->ObjPtr = &tmp->Obj;
 | 
			
		||||
   }
 | 
			
		||||
      /*
 | 
			
		||||
       * Conventional attributes
 | 
			
		||||
       */
 | 
			
		||||
      if (inputs & _TNL_BIT_POS) {
 | 
			
		||||
	 _tnl_import_vertex( ctx, 0, 0 );
 | 
			
		||||
	 tmp->Obj.count = VB->Count;
 | 
			
		||||
	 VB->AttribPtr[_TNL_ATTRIB_POS] = &tmp->Obj;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_NORMAL) {
 | 
			
		||||
      _tnl_import_normal( ctx, 0, 0 );
 | 
			
		||||
      tmp->Normal.count = VB->Count;
 | 
			
		||||
      VB->NormalPtr = &tmp->Normal;
 | 
			
		||||
   }
 | 
			
		||||
      if (inputs & _TNL_BIT_NORMAL) {
 | 
			
		||||
	 _tnl_import_normal( ctx, 0, 0 );
 | 
			
		||||
	 tmp->Normal.count = VB->Count;
 | 
			
		||||
	 VB->AttribPtr[_TNL_ATTRIB_NORMAL] = &tmp->Normal;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_COLOR0) {
 | 
			
		||||
      _tnl_import_color( ctx, 0, 0, 0 );
 | 
			
		||||
      VB->ColorPtr[0] = &tmp->Color;
 | 
			
		||||
      VB->ColorPtr[1] = 0;
 | 
			
		||||
   }
 | 
			
		||||
      if (inputs & _TNL_BIT_COLOR0) {
 | 
			
		||||
	 _tnl_import_color( ctx, 0, 0 );
 | 
			
		||||
	 tmp->Color.count = VB->Count;
 | 
			
		||||
	 VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &tmp->Color;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BITS_TEX_ANY) {
 | 
			
		||||
      GLuint unit;
 | 
			
		||||
      for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
 | 
			
		||||
	 if (inputs & VERT_BIT_TEX(unit)) {
 | 
			
		||||
	    _tnl_import_texcoord( ctx, unit, GL_FALSE, GL_FALSE );
 | 
			
		||||
	    tmp->TexCoord[unit].count = VB->Count;
 | 
			
		||||
	    VB->TexCoordPtr[unit] = &tmp->TexCoord[unit];
 | 
			
		||||
      if (inputs & _TNL_BIT_INDEX) {
 | 
			
		||||
	 _tnl_import_index( ctx, 0, 0 );
 | 
			
		||||
	 tmp->Index.count = VB->Count;
 | 
			
		||||
	 VB->AttribPtr[_TNL_ATTRIB_INDEX] = &tmp->Index;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (inputs & _TNL_BIT_FOG) {
 | 
			
		||||
	 _tnl_import_fogcoord( ctx, 0, 0 );
 | 
			
		||||
	 tmp->FogCoord.count = VB->Count;
 | 
			
		||||
	 VB->AttribPtr[_TNL_ATTRIB_FOG] = &tmp->FogCoord;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (inputs & _TNL_BIT_EDGEFLAG) {
 | 
			
		||||
	 _tnl_import_edgeflag( ctx, GL_TRUE, sizeof(GLboolean) );
 | 
			
		||||
	 VB->EdgeFlag = (GLboolean *) tmp->EdgeFlag;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (inputs & _TNL_BIT_COLOR1) {
 | 
			
		||||
	 _tnl_import_secondarycolor( ctx, 0, 0 );
 | 
			
		||||
	 tmp->SecondaryColor.count = VB->Count;
 | 
			
		||||
	 VB->AttribPtr[_TNL_ATTRIB_COLOR1] = &tmp->SecondaryColor;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      if (inputs & _TNL_BITS_TEX_ANY) {
 | 
			
		||||
	 for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
 | 
			
		||||
	    if (inputs & _TNL_BIT_TEX(i)) {
 | 
			
		||||
	       _tnl_import_texcoord( ctx, i, GL_FALSE, GL_FALSE );
 | 
			
		||||
	       tmp->TexCoord[i].count = VB->Count;
 | 
			
		||||
	       VB->AttribPtr[_TNL_ATTRIB_TEX0 + i] = &tmp->TexCoord[i];
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & (VERT_BIT_INDEX | VERT_BIT_FOG |
 | 
			
		||||
                 VERT_BIT_EDGEFLAG | VERT_BIT_COLOR1)) {
 | 
			
		||||
      if (inputs & VERT_BIT_INDEX) {
 | 
			
		||||
	 _tnl_import_index( ctx, 0, 0 );
 | 
			
		||||
	 tmp->Index.count = VB->Count;
 | 
			
		||||
	 VB->IndexPtr[0] = &tmp->Index;
 | 
			
		||||
	 VB->IndexPtr[1] = 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (inputs & VERT_BIT_FOG) {
 | 
			
		||||
	 _tnl_import_fogcoord( ctx, 0, 0 );
 | 
			
		||||
	 tmp->FogCoord.count = VB->Count;
 | 
			
		||||
	 VB->FogCoordPtr = &tmp->FogCoord;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (inputs & VERT_BIT_EDGEFLAG) {
 | 
			
		||||
	 _tnl_import_edgeflag( ctx, GL_TRUE, sizeof(GLboolean) );
 | 
			
		||||
	 VB->EdgeFlag = (GLboolean *) tmp->EdgeFlag.data;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (inputs & VERT_BIT_COLOR1) {
 | 
			
		||||
	 _tnl_import_secondarycolor( ctx, 0, 0, 0 );
 | 
			
		||||
	 VB->SecondaryColorPtr[0] = &tmp->SecondaryColor;
 | 
			
		||||
	 VB->SecondaryColorPtr[1] = 0;
 | 
			
		||||
      }
 | 
			
		||||
   /* These are constant & can be precalculated:
 | 
			
		||||
    */
 | 
			
		||||
   if (inputs & _TNL_BITS_MAT_ANY) {
 | 
			
		||||
      for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT; i < _TNL_ATTRIB_INDEX; i++) {
 | 
			
		||||
	 tmp->Attribs[i].count = count;
 | 
			
		||||
	 tmp->Attribs[i].data = (GLfloat (*)[4]) tnl->vtx.current[i];
 | 
			
		||||
	 tmp->Attribs[i].start = tnl->vtx.current[i];
 | 
			
		||||
	 tmp->Attribs[i].size = 4; 
 | 
			
		||||
	 tmp->Attribs[i].stride = 0;
 | 
			
		||||
	 VB->AttribPtr[i] = &tmp->Attribs[i];
 | 
			
		||||
      }      
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Legacy pointers -- remove one day.
 | 
			
		||||
    */
 | 
			
		||||
   VB->ObjPtr = VB->AttribPtr[_TNL_ATTRIB_POS];
 | 
			
		||||
   VB->NormalPtr = VB->AttribPtr[_TNL_ATTRIB_NORMAL];
 | 
			
		||||
   VB->ColorPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR0];
 | 
			
		||||
   VB->ColorPtr[1] = 0;
 | 
			
		||||
   VB->IndexPtr[0] = VB->AttribPtr[_TNL_ATTRIB_INDEX];
 | 
			
		||||
   VB->IndexPtr[1] = 0;
 | 
			
		||||
   VB->SecondaryColorPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR1];
 | 
			
		||||
   VB->SecondaryColorPtr[1] = 0;
 | 
			
		||||
 | 
			
		||||
   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
 | 
			
		||||
      VB->TexCoordPtr[i] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "api_arrayelt.h"
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
@@ -37,17 +38,11 @@
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_array_api.h"
 | 
			
		||||
#include "t_eval_api.h"
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
#include "t_imm_api.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
#include "t_imm_dlist.h"
 | 
			
		||||
#include "t_vtx_api.h"
 | 
			
		||||
#include "t_save_api.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
#include "tnl.h"
 | 
			
		||||
 | 
			
		||||
#ifndef THREADS
 | 
			
		||||
struct immediate *_tnl_CurrentInput = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -55,9 +50,6 @@ _tnl_MakeCurrent( GLcontext *ctx,
 | 
			
		||||
		  GLframebuffer *drawBuffer,
 | 
			
		||||
		  GLframebuffer *readBuffer )
 | 
			
		||||
{
 | 
			
		||||
#ifndef THREADS
 | 
			
		||||
   SET_IMMEDIATE( ctx, TNL_CURRENT_IM(ctx) );
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +58,8 @@ install_driver_callbacks( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   ctx->Driver.NewList = _tnl_NewList;
 | 
			
		||||
   ctx->Driver.EndList = _tnl_EndList;
 | 
			
		||||
   ctx->Driver.FlushVertices = _tnl_flush_vertices;
 | 
			
		||||
   ctx->Driver.FlushVertices = _tnl_FlushVertices;
 | 
			
		||||
   ctx->Driver.SaveFlushVertices = _tnl_SaveFlushVertices;
 | 
			
		||||
   ctx->Driver.MakeCurrent = _tnl_MakeCurrent;
 | 
			
		||||
   ctx->Driver.BeginCallList = _tnl_BeginCallList;
 | 
			
		||||
   ctx->Driver.EndCallList = _tnl_EndCallList;
 | 
			
		||||
@@ -89,18 +82,21 @@ _tnl_CreateContext( GLcontext *ctx )
 | 
			
		||||
 | 
			
		||||
   /* Initialize the VB.
 | 
			
		||||
    */
 | 
			
		||||
   tnl->vb.Size = MAX2( IMM_SIZE,
 | 
			
		||||
			ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES);
 | 
			
		||||
   tnl->vb.Size = ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Initialize tnl state and tnl->vtxfmt.
 | 
			
		||||
    */
 | 
			
		||||
   _tnl_dlist_init( ctx );
 | 
			
		||||
   _tnl_save_init( ctx );
 | 
			
		||||
   _tnl_array_init( ctx );
 | 
			
		||||
   _tnl_imm_init( ctx );
 | 
			
		||||
   _tnl_eval_init( ctx );
 | 
			
		||||
   _tnl_vtx_init( ctx );
 | 
			
		||||
   _tnl_install_pipeline( ctx, _tnl_default_pipeline );
 | 
			
		||||
 | 
			
		||||
   /* Initialize the arrayelt helper
 | 
			
		||||
    */
 | 
			
		||||
   if (!_ae_create_context( ctx ))
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   tnl->NeedNdcCoords = GL_TRUE;
 | 
			
		||||
   tnl->LoopbackDListCassettes = GL_FALSE;
 | 
			
		||||
@@ -108,29 +104,19 @@ _tnl_CreateContext( GLcontext *ctx )
 | 
			
		||||
 | 
			
		||||
   /* Hook our functions into exec and compile dispatch tables.
 | 
			
		||||
    */
 | 
			
		||||
   _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt );
 | 
			
		||||
 | 
			
		||||
   tnl->save_vtxfmt = tnl->vtxfmt;
 | 
			
		||||
   tnl->save_vtxfmt.CallList = _mesa_save_CallList;	
 | 
			
		||||
   tnl->save_vtxfmt.EvalMesh1 = _mesa_save_EvalMesh1;	
 | 
			
		||||
   tnl->save_vtxfmt.EvalMesh2 = _mesa_save_EvalMesh2;
 | 
			
		||||
   tnl->save_vtxfmt.Begin = _tnl_save_Begin;
 | 
			
		||||
 | 
			
		||||
   _mesa_install_save_vtxfmt( ctx, &tnl->save_vtxfmt );
 | 
			
		||||
   _mesa_install_exec_vtxfmt( ctx, &tnl->exec_vtxfmt );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Set a few default values in the driver struct.
 | 
			
		||||
    */
 | 
			
		||||
   install_driver_callbacks(ctx);
 | 
			
		||||
   ctx->Driver.NeedFlush = FLUSH_UPDATE_CURRENT;
 | 
			
		||||
   ctx->Driver.NeedFlush = 0;
 | 
			
		||||
   ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
 | 
			
		||||
   ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN;
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
 | 
			
		||||
   tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
 | 
			
		||||
   tnl->Driver.NotifyMaterialChange = _mesa_validate_all_lighting_tables;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
   return GL_TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -142,9 +128,9 @@ _tnl_DestroyContext( GLcontext *ctx )
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   _tnl_array_destroy( ctx );
 | 
			
		||||
   _tnl_imm_destroy( ctx );
 | 
			
		||||
   _tnl_vtx_destroy( ctx );
 | 
			
		||||
   _tnl_save_destroy( ctx );
 | 
			
		||||
   _tnl_destroy_pipeline( ctx );
 | 
			
		||||
   _tnl_free_immediate( ctx, tnl->freed_immediate );
 | 
			
		||||
 | 
			
		||||
   FREE(tnl);
 | 
			
		||||
   ctx->swtnl_context = 0;
 | 
			
		||||
@@ -157,13 +143,6 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state )
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   if (new_state & _NEW_ARRAY) {
 | 
			
		||||
      struct immediate *IM = TNL_CURRENT_IM(ctx);
 | 
			
		||||
      IM->ArrayEltFlags = ~ctx->Array._Enabled;
 | 
			
		||||
      IM->ArrayEltFlush = (ctx->Array.LockCount 
 | 
			
		||||
			   ? FLUSH_ELT_LAZY : FLUSH_ELT_EAGER);
 | 
			
		||||
      IM->ArrayEltIncr = (ctx->Array.Vertex.Enabled ||
 | 
			
		||||
                          (ctx->VertexProgram.Enabled &&
 | 
			
		||||
                           ctx->Array.VertexAttrib[0].Enabled)) ? 1 : 0;
 | 
			
		||||
      tnl->pipeline.run_input_changes |= ctx->Array.NewState; /* overkill */
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -171,7 +150,7 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state )
 | 
			
		||||
   tnl->pipeline.build_state_changes |= (new_state &
 | 
			
		||||
					 tnl->pipeline.build_state_trigger);
 | 
			
		||||
 | 
			
		||||
   tnl->eval.EvalNewState |= new_state;
 | 
			
		||||
   tnl->vtx.eval.new_state |= new_state;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -185,7 +164,7 @@ _tnl_wakeup_exec( GLcontext *ctx )
 | 
			
		||||
 | 
			
		||||
   /* Hook our functions into exec and compile dispatch tables.
 | 
			
		||||
    */
 | 
			
		||||
   _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt );
 | 
			
		||||
   _mesa_install_exec_vtxfmt( ctx, &tnl->exec_vtxfmt );
 | 
			
		||||
 | 
			
		||||
   /* Call all appropriate driver callbacks to revive state.
 | 
			
		||||
    */
 | 
			
		||||
@@ -197,9 +176,9 @@ _tnl_wakeup_exec( GLcontext *ctx )
 | 
			
		||||
   tnl->pipeline.run_input_changes = ~0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Light.ColorMaterialEnabled) {
 | 
			
		||||
      _mesa_update_color_material( ctx, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
      _mesa_update_color_material( ctx, 
 | 
			
		||||
				   ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
 | 
			
		||||
@@ -37,9 +37,9 @@
 | 
			
		||||
 * necessary transformations (rotations, clipping, vertex shader etc.)
 | 
			
		||||
 * and passes then the output to the rasterizer.
 | 
			
		||||
 *
 | 
			
		||||
 * The gl_pipeline contains the array of all stages, which should be
 | 
			
		||||
 * The tnl_pipeline contains the array of all stages, which should be
 | 
			
		||||
 * applied. Each stage is a black-box, which is described by an
 | 
			
		||||
 * gl_pipeline_stage. The function ::_tnl_run_pipeline applies all the
 | 
			
		||||
 * tnl_pipeline_stage. The function ::_tnl_run_pipeline applies all the
 | 
			
		||||
 * stages to the vertex_buffer TNLcontext::vb, where the vertex data
 | 
			
		||||
 * is stored. The last stage in the pipeline is the rasterizer.
 | 
			
		||||
 *
 | 
			
		||||
@@ -68,7 +68,6 @@
 | 
			
		||||
 * into TNLcontext::vb, so that the pipeline can be started.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* What is ELT? */
 | 
			
		||||
 | 
			
		||||
#ifndef _T_CONTEXT_H
 | 
			
		||||
#define _T_CONTEXT_H
 | 
			
		||||
@@ -84,256 +83,346 @@
 | 
			
		||||
#define MAX_PIPELINE_STAGES     30
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Numbers for sizing immediate structs.
 | 
			
		||||
enum {
 | 
			
		||||
	_TNL_ATTRIB_POS = 0,
 | 
			
		||||
	_TNL_ATTRIB_WEIGHT = 1,
 | 
			
		||||
	_TNL_ATTRIB_NORMAL = 2,
 | 
			
		||||
	_TNL_ATTRIB_COLOR0 = 3,
 | 
			
		||||
	_TNL_ATTRIB_COLOR1 = 4,
 | 
			
		||||
	_TNL_ATTRIB_FOG = 5,
 | 
			
		||||
	_TNL_ATTRIB_SIX = 6,
 | 
			
		||||
	_TNL_ATTRIB_SEVEN = 7,
 | 
			
		||||
	_TNL_ATTRIB_TEX0 = 8,
 | 
			
		||||
	_TNL_ATTRIB_TEX1 = 9,
 | 
			
		||||
	_TNL_ATTRIB_TEX2 = 10,
 | 
			
		||||
	_TNL_ATTRIB_TEX3 = 11,
 | 
			
		||||
	_TNL_ATTRIB_TEX4 = 12,
 | 
			
		||||
	_TNL_ATTRIB_TEX5 = 13,
 | 
			
		||||
	_TNL_ATTRIB_TEX6 = 14,
 | 
			
		||||
	_TNL_ATTRIB_TEX7 = 15,
 | 
			
		||||
	_TNL_ATTRIB_MAT_FRONT_AMBIENT = 16,
 | 
			
		||||
	_TNL_ATTRIB_MAT_BACK_AMBIENT = 17,
 | 
			
		||||
	_TNL_ATTRIB_MAT_FRONT_DIFFUSE = 18,
 | 
			
		||||
	_TNL_ATTRIB_MAT_BACK_DIFFUSE = 19,
 | 
			
		||||
	_TNL_ATTRIB_MAT_FRONT_SPECULAR = 20,
 | 
			
		||||
	_TNL_ATTRIB_MAT_BACK_SPECULAR = 21,
 | 
			
		||||
	_TNL_ATTRIB_MAT_FRONT_EMISSION = 22,
 | 
			
		||||
	_TNL_ATTRIB_MAT_BACK_EMISSION = 23,
 | 
			
		||||
	_TNL_ATTRIB_MAT_FRONT_SHININESS = 24,
 | 
			
		||||
	_TNL_ATTRIB_MAT_BACK_SHININESS = 25,
 | 
			
		||||
	_TNL_ATTRIB_MAT_FRONT_INDEXES = 26,
 | 
			
		||||
	_TNL_ATTRIB_MAT_BACK_INDEXES = 27, 
 | 
			
		||||
	_TNL_ATTRIB_INDEX = 28,        
 | 
			
		||||
	_TNL_ATTRIB_EDGEFLAG = 29,     
 | 
			
		||||
	_TNL_ATTRIB_MAX = 30
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
/* Will probably have to revise this scheme fairly shortly, eg. by
 | 
			
		||||
 * compacting all the MAT flags down to one bit, or by using two
 | 
			
		||||
 * dwords to store the flags.
 | 
			
		||||
 */
 | 
			
		||||
#define IMM_MAX_COPIED_VERTS  3
 | 
			
		||||
#define IMM_MAXDATA          (216 + IMM_MAX_COPIED_VERTS)
 | 
			
		||||
#define IMM_SIZE             (IMM_MAXDATA + MAX_CLIPPED_VERTICES)
 | 
			
		||||
#define _TNL_BIT_POS                 (1<<0)
 | 
			
		||||
#define _TNL_BIT_WEIGHT              (1<<1)
 | 
			
		||||
#define _TNL_BIT_NORMAL              (1<<2)
 | 
			
		||||
#define _TNL_BIT_COLOR0              (1<<3)
 | 
			
		||||
#define _TNL_BIT_COLOR1              (1<<4)
 | 
			
		||||
#define _TNL_BIT_FOG                 (1<<5)
 | 
			
		||||
#define _TNL_BIT_SIX                 (1<<6)
 | 
			
		||||
#define _TNL_BIT_SEVEN               (1<<7)
 | 
			
		||||
#define _TNL_BIT_TEX0                (1<<8)
 | 
			
		||||
#define _TNL_BIT_TEX1                (1<<9)
 | 
			
		||||
#define _TNL_BIT_TEX2                (1<<10)
 | 
			
		||||
#define _TNL_BIT_TEX3                (1<<11)
 | 
			
		||||
#define _TNL_BIT_TEX4                (1<<12)
 | 
			
		||||
#define _TNL_BIT_TEX5                (1<<13)
 | 
			
		||||
#define _TNL_BIT_TEX6                (1<<14)
 | 
			
		||||
#define _TNL_BIT_TEX7                (1<<15)
 | 
			
		||||
#define _TNL_BIT_MAT_FRONT_AMBIENT   (1<<16)
 | 
			
		||||
#define _TNL_BIT_MAT_BACK_AMBIENT    (1<<17)
 | 
			
		||||
#define _TNL_BIT_MAT_FRONT_DIFFUSE   (1<<18)
 | 
			
		||||
#define _TNL_BIT_MAT_BACK_DIFFUSE    (1<<19)
 | 
			
		||||
#define _TNL_BIT_MAT_FRONT_SPECULAR  (1<<20)
 | 
			
		||||
#define _TNL_BIT_MAT_BACK_SPECULAR   (1<<21)
 | 
			
		||||
#define _TNL_BIT_MAT_FRONT_EMISSION  (1<<22)
 | 
			
		||||
#define _TNL_BIT_MAT_BACK_EMISSION   (1<<23)
 | 
			
		||||
#define _TNL_BIT_MAT_FRONT_SHININESS (1<<24)
 | 
			
		||||
#define _TNL_BIT_MAT_BACK_SHININESS  (1<<25)
 | 
			
		||||
#define _TNL_BIT_MAT_FRONT_INDEXES   (1<<26)
 | 
			
		||||
#define _TNL_BIT_MAT_BACK_INDEXES    (1<<27)
 | 
			
		||||
#define _TNL_BIT_INDEX               (1<<28)
 | 
			
		||||
#define _TNL_BIT_EDGEFLAG            (1<<29)
 | 
			
		||||
 | 
			
		||||
#define _TNL_BIT_TEX(u)  (1 << (_TNL_ATTRIB_TEX0 + (u)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Values for IM->BeginState
 | 
			
		||||
#define _TNL_BITS_MAT_ANY  (_TNL_BIT_MAT_FRONT_AMBIENT   | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_BACK_AMBIENT    | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_FRONT_DIFFUSE   | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_BACK_DIFFUSE    | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_FRONT_SPECULAR  | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_BACK_SPECULAR   | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_FRONT_EMISSION  | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_BACK_EMISSION   | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_FRONT_SHININESS | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_BACK_SHININESS  | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_FRONT_INDEXES   | 	\
 | 
			
		||||
			    _TNL_BIT_MAT_BACK_INDEXES)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define _TNL_BITS_TEX_ANY  (_TNL_BIT_TEX0 |	\
 | 
			
		||||
                            _TNL_BIT_TEX1 |	\
 | 
			
		||||
                            _TNL_BIT_TEX2 |	\
 | 
			
		||||
                            _TNL_BIT_TEX3 |	\
 | 
			
		||||
                            _TNL_BIT_TEX4 |	\
 | 
			
		||||
                            _TNL_BIT_TEX5 |	\
 | 
			
		||||
                            _TNL_BIT_TEX6 |	\
 | 
			
		||||
                            _TNL_BIT_TEX7)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define _TNL_BITS_PROG_ANY   (_TNL_BIT_POS    |		\
 | 
			
		||||
			      _TNL_BIT_WEIGHT |		\
 | 
			
		||||
			      _TNL_BIT_NORMAL |		\
 | 
			
		||||
			      _TNL_BIT_COLOR0 |		\
 | 
			
		||||
			      _TNL_BIT_COLOR1 |		\
 | 
			
		||||
			      _TNL_BIT_FOG    |		\
 | 
			
		||||
			      _TNL_BIT_SIX    |		\
 | 
			
		||||
			      _TNL_BIT_SEVEN  |		\
 | 
			
		||||
			      _TNL_BITS_TEX_ANY)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define PRIM_BEGIN     0x10
 | 
			
		||||
#define PRIM_END       0x20
 | 
			
		||||
#define PRIM_WEAK      0x40
 | 
			
		||||
#define PRIM_MODE_MASK 0x0f
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 */
 | 
			
		||||
#define VERT_BEGIN_0    0x1	   /* glBegin (if initially inside beg/end) */
 | 
			
		||||
#define VERT_BEGIN_1    0x2	   /* glBegin (if initially outside beg/end) */
 | 
			
		||||
#define VERT_ERROR_0    0x4	   /* invalid_operation in initial state 0 */
 | 
			
		||||
#define VERT_ERROR_1    0x8        /* invalid_operation in initial state 1 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Flags to be added to the primitive enum in VB->Primitive.
 | 
			
		||||
 */
 | 
			
		||||
#define PRIM_MODE_MASK  0xff   /* Extract the actual primitive */
 | 
			
		||||
#define PRIM_BEGIN      0x100  /* The prim starts here (not wrapped) */
 | 
			
		||||
#define PRIM_END        0x200  /* The prim ends in this VB (does not wrap) */
 | 
			
		||||
#define PRIM_PARITY     0x400  /* The prim wrapped on an odd number of verts */
 | 
			
		||||
#define PRIM_LAST       0x800  /* No more prims in the VB */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Flags that describe the inputs and outputs of pipeline stages, and
 | 
			
		||||
 * the contents of a vertex-cassette.  We reuse the VERT_BIT_* flags
 | 
			
		||||
 * defined in mtypes.h and add a bunch of new ones.
 | 
			
		||||
 */
 | 
			
		||||
/* bits 0..5 defined in mtypes.h */
 | 
			
		||||
#define VERT_BIT_INDEX       VERT_BIT_SIX    /* a free vertex attrib bit */
 | 
			
		||||
#define VERT_BIT_EDGEFLAG    VERT_BIT_SEVEN  /* a free vertex attrib bit */
 | 
			
		||||
/* bits 8..15 defined in mtypes.h */
 | 
			
		||||
#define VERT_BIT_EVAL_C1     (1 << 16)  /* imm only */
 | 
			
		||||
#define VERT_BIT_EVAL_C2     (1 << 17)  /* imm only */
 | 
			
		||||
#define VERT_BIT_EVAL_P1     (1 << 18)  /* imm only */
 | 
			
		||||
#define VERT_BIT_EVAL_P2     (1 << 19)  /* imm only */
 | 
			
		||||
#define VERT_BIT_OBJ_3       (1 << 20)  /* imm only */
 | 
			
		||||
#define VERT_BIT_OBJ_4       (1 << 21)  /* imm only */
 | 
			
		||||
#define VERT_BIT_MATERIAL    (1 << 22)  /* imm only, but tested in vb code */
 | 
			
		||||
#define VERT_BIT_ELT         (1 << 23)  /* imm only */
 | 
			
		||||
#define VERT_BIT_BEGIN       (1 << 24)  /* imm only, but tested in vb code */
 | 
			
		||||
#define VERT_BIT_END         (1 << 25)  /* imm only, but tested in vb code */
 | 
			
		||||
#define VERT_BIT_END_VB      (1 << 26)  /* imm only, but tested in vb code */
 | 
			
		||||
#define VERT_BIT_POINT_SIZE  (1 << 27)  /* vb only, could reuse a bit */
 | 
			
		||||
#define VERT_BIT_EYE         VERT_BIT_BEGIN /* vb only, reuse imm bit */
 | 
			
		||||
#define VERT_BIT_CLIP        VERT_BIT_END   /* vb only, reuse imm bit*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Flags for IM->TexCoordSize.  Enough flags for 16 units.
 | 
			
		||||
 */
 | 
			
		||||
#define TEX_0_SIZE_3          (unsigned)0x1
 | 
			
		||||
#define TEX_0_SIZE_4          (unsigned)0x10001
 | 
			
		||||
#define TEX_SIZE_3(unit)      (TEX_0_SIZE_3 << (unit))
 | 
			
		||||
#define TEX_SIZE_4(unit)      (TEX_0_SIZE_4 << (unit))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Shorthands.
 | 
			
		||||
 */
 | 
			
		||||
#define VERT_BITS_OBJ_23   (VERT_BIT_POS | VERT_BIT_OBJ_3)
 | 
			
		||||
#define VERT_BITS_OBJ_234  (VERT_BIT_POS | VERT_BIT_OBJ_3 | VERT_BIT_OBJ_4)
 | 
			
		||||
 | 
			
		||||
#define VERT_BITS_TEX_ANY  (VERT_BIT_TEX0 |	\
 | 
			
		||||
                            VERT_BIT_TEX1 |	\
 | 
			
		||||
                            VERT_BIT_TEX2 |	\
 | 
			
		||||
                            VERT_BIT_TEX3 |	\
 | 
			
		||||
                            VERT_BIT_TEX4 |	\
 | 
			
		||||
                            VERT_BIT_TEX5 |	\
 | 
			
		||||
                            VERT_BIT_TEX6 |	\
 | 
			
		||||
                            VERT_BIT_TEX7)
 | 
			
		||||
 | 
			
		||||
#define VERT_BITS_EVAL_ANY (VERT_BIT_EVAL_C1 | VERT_BIT_EVAL_P1 | \
 | 
			
		||||
                            VERT_BIT_EVAL_C2 | VERT_BIT_EVAL_P2)
 | 
			
		||||
 | 
			
		||||
#define VERT_BITS_FIXUP    (VERT_BITS_TEX_ANY |		\
 | 
			
		||||
                            VERT_BIT_COLOR0 |		\
 | 
			
		||||
                            VERT_BIT_COLOR1 |		\
 | 
			
		||||
                            VERT_BIT_FOG |		\
 | 
			
		||||
			    VERT_BIT_INDEX |		\
 | 
			
		||||
                            VERT_BIT_EDGEFLAG |		\
 | 
			
		||||
                            VERT_BIT_NORMAL)
 | 
			
		||||
 | 
			
		||||
#define VERT_BITS_CURRENT_DATA  (VERT_BITS_FIXUP |	\
 | 
			
		||||
			         VERT_BIT_MATERIAL)
 | 
			
		||||
 | 
			
		||||
#define VERT_BITS_DATA     (VERT_BITS_TEX_ANY |		\
 | 
			
		||||
			    VERT_BIT_COLOR0 |		\
 | 
			
		||||
			    VERT_BIT_COLOR1 |		\
 | 
			
		||||
			    VERT_BIT_FOG |		\
 | 
			
		||||
                            VERT_BIT_INDEX |		\
 | 
			
		||||
                            VERT_BIT_EDGEFLAG |		\
 | 
			
		||||
                            VERT_BIT_NORMAL |		\
 | 
			
		||||
	                    VERT_BIT_POS |		\
 | 
			
		||||
                            VERT_BIT_MATERIAL |		\
 | 
			
		||||
                            VERT_BIT_ELT |		\
 | 
			
		||||
	                    VERT_BITS_EVAL_ANY)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \struct immediate
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
   GLuint id, ref_count;
 | 
			
		||||
 | 
			
		||||
   /* This must be saved when immediates are shared in display lists.
 | 
			
		||||
    */
 | 
			
		||||
   GLuint CopyStart, Start, Count;
 | 
			
		||||
   GLuint LastData;		/* count or count+1 */
 | 
			
		||||
   GLuint AndFlag, OrFlag;
 | 
			
		||||
   GLuint TexSize;		/* keep track of texcoord sizes */
 | 
			
		||||
   GLuint BeginState, SavedBeginState;
 | 
			
		||||
   GLuint LastPrimitive;
 | 
			
		||||
 | 
			
		||||
   GLuint ArrayEltFlags;	/* precalc'ed for glArrayElt */
 | 
			
		||||
   GLuint ArrayEltIncr;
 | 
			
		||||
   GLuint ArrayEltFlush;
 | 
			
		||||
 | 
			
		||||
#define FLUSH_ELT_EAGER 0x1
 | 
			
		||||
#define FLUSH_ELT_LAZY 0x2
 | 
			
		||||
   GLuint FlushElt;
 | 
			
		||||
 | 
			
		||||
   GLuint MaxTextureUnits;	/* precalc'ed for glMultiTexCoordARB */
 | 
			
		||||
 | 
			
		||||
   /* Temporary values created when vertices are copied into the
 | 
			
		||||
    * first 3 slots of the struct:
 | 
			
		||||
    */
 | 
			
		||||
   GLuint CopyOrFlag;
 | 
			
		||||
   GLuint CopyAndFlag;
 | 
			
		||||
   GLuint CopyTexSize;
 | 
			
		||||
   GLuint Evaluated;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* allocate storage for these on demand:
 | 
			
		||||
    */
 | 
			
		||||
   struct gl_material *Material;
 | 
			
		||||
   GLuint *MaterialMask;
 | 
			
		||||
   GLuint LastMaterial;
 | 
			
		||||
   GLuint MaterialOrMask;
 | 
			
		||||
   GLuint MaterialAndMask;
 | 
			
		||||
 | 
			
		||||
   GLuint  Primitive[IMM_SIZE];	      /* BEGIN/END */
 | 
			
		||||
   GLuint  PrimitiveLength[IMM_SIZE]; /* BEGIN/END */
 | 
			
		||||
   GLuint  Flag[IMM_SIZE];	      /* VERT_BIT_* flags */
 | 
			
		||||
 | 
			
		||||
   /* Attrib is an array [MAX_VERT_ATTRIBS] of pointer to array [][4]
 | 
			
		||||
    * of GLfloat.
 | 
			
		||||
    * We only pre-allocate the vertex position array.  The other vertex
 | 
			
		||||
    * attribute arrays are only allocated when needed to save memory.
 | 
			
		||||
    */
 | 
			
		||||
   GLfloat (*Attrib[VERT_ATTRIB_MAX])[4];
 | 
			
		||||
 | 
			
		||||
   GLfloat *NormalLengthPtr; /* length of normal vectors (display list only) */
 | 
			
		||||
 | 
			
		||||
   GLuint  Elt[IMM_SIZE];
 | 
			
		||||
   GLubyte EdgeFlag[IMM_SIZE];
 | 
			
		||||
   GLuint  Index[IMM_SIZE];
 | 
			
		||||
struct tnl_prim {
 | 
			
		||||
   GLuint mode;
 | 
			
		||||
   GLuint start;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct vertex_arrays
 | 
			
		||||
 | 
			
		||||
struct tnl_eval1_map {
 | 
			
		||||
   struct gl_1d_map *map;
 | 
			
		||||
   GLuint sz;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct tnl_eval2_map {
 | 
			
		||||
   struct gl_2d_map *map;
 | 
			
		||||
   GLuint sz;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct tnl_eval {
 | 
			
		||||
   GLuint new_state;
 | 
			
		||||
   struct tnl_eval1_map map1[_TNL_ATTRIB_INDEX + 1];
 | 
			
		||||
   struct tnl_eval2_map map2[_TNL_ATTRIB_INDEX + 1];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define TNL_MAX_PRIM 16
 | 
			
		||||
#define TNL_MAX_COPIED_VERTS 3
 | 
			
		||||
 | 
			
		||||
struct tnl_copied_vtx {
 | 
			
		||||
   GLfloat buffer[_TNL_ATTRIB_MAX * 4 * TNL_MAX_COPIED_VERTS];
 | 
			
		||||
   GLuint nr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define VERT_BUFFER_SIZE 2048	/* 8kbytes */
 | 
			
		||||
 | 
			
		||||
typedef void (*attrfv_func)( const GLfloat * );
 | 
			
		||||
 | 
			
		||||
/* The assembly of vertices in immediate mode is separated from
 | 
			
		||||
 * display list compilation.  This allows a simpler immediate mode
 | 
			
		||||
 * treatment and a display list compiler better suited to
 | 
			
		||||
 * hardware-acceleration.
 | 
			
		||||
 */
 | 
			
		||||
struct tnl_vtx {
 | 
			
		||||
   GLfloat buffer[VERT_BUFFER_SIZE];
 | 
			
		||||
   GLubyte attrsz[_TNL_ATTRIB_MAX];
 | 
			
		||||
   GLuint vertex_size;
 | 
			
		||||
   struct tnl_prim prim[TNL_MAX_PRIM];
 | 
			
		||||
   GLuint prim_count;
 | 
			
		||||
   GLfloat *vbptr;		      /* cursor, points into buffer */
 | 
			
		||||
   GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */
 | 
			
		||||
   GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */
 | 
			
		||||
   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */
 | 
			
		||||
   GLuint counter, initial_counter;
 | 
			
		||||
   struct tnl_copied_vtx copied;
 | 
			
		||||
   attrfv_func tabfv[_TNL_ATTRIB_MAX][4];
 | 
			
		||||
   struct tnl_eval eval;
 | 
			
		||||
   GLboolean *edgeflag_tmp;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* For display lists, this structure holds a run of vertices of the
 | 
			
		||||
 * same format, and a strictly well-formed set of begin/end pairs,
 | 
			
		||||
 * starting on the first vertex and ending at the last.  Vertex
 | 
			
		||||
 * copying on buffer breaks is precomputed according to these
 | 
			
		||||
 * primitives, though there are situations where the copying will need
 | 
			
		||||
 * correction at execute-time, perhaps by replaying the list as
 | 
			
		||||
 * immediate mode commands.
 | 
			
		||||
 *
 | 
			
		||||
 * On executing this list, the 'current' values may be updated with
 | 
			
		||||
 * the values of the final vertex, and often no fixup of the start of
 | 
			
		||||
 * the vertex list is required.
 | 
			
		||||
 *
 | 
			
		||||
 * Eval and other commands that don't fit into these vertex lists are
 | 
			
		||||
 * compiled using the fallback opcode mechanism provided by dlist.c.
 | 
			
		||||
 */
 | 
			
		||||
struct tnl_vertex_list {
 | 
			
		||||
   GLubyte attrsz[_TNL_ATTRIB_MAX];
 | 
			
		||||
   GLuint vertex_size;
 | 
			
		||||
 | 
			
		||||
   GLfloat *buffer;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint wrap_count;		/* number of copied vertices at start */
 | 
			
		||||
   GLuint dangling_attr_ref;	/* current attr implicitly referenced 
 | 
			
		||||
				   outside the list */
 | 
			
		||||
 | 
			
		||||
   GLfloat *normal_lengths;
 | 
			
		||||
   struct tnl_prim *prim;
 | 
			
		||||
   GLuint prim_count;
 | 
			
		||||
 | 
			
		||||
   struct tnl_vertex_store *vertex_store;
 | 
			
		||||
   struct tnl_primitive_store *prim_store;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* These buffers should be a reasonable size to support upload to
 | 
			
		||||
 * hardware?  Maybe drivers should stitch them back together, or
 | 
			
		||||
 * specify a desired size?
 | 
			
		||||
 */
 | 
			
		||||
#define SAVE_BUFFER_SIZE (16*1024)
 | 
			
		||||
#define SAVE_PRIM_SIZE   128
 | 
			
		||||
 | 
			
		||||
/* Storage to be shared among several vertex_lists.
 | 
			
		||||
 */
 | 
			
		||||
struct tnl_vertex_store {
 | 
			
		||||
   GLfloat buffer[SAVE_BUFFER_SIZE];
 | 
			
		||||
   GLuint used;
 | 
			
		||||
   GLuint refcount;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct tnl_primitive_store {
 | 
			
		||||
   struct tnl_prim buffer[SAVE_PRIM_SIZE];
 | 
			
		||||
   GLuint used;
 | 
			
		||||
   GLuint refcount;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct tnl_save {
 | 
			
		||||
   GLubyte attrsz[_TNL_ATTRIB_MAX];
 | 
			
		||||
   GLuint vertex_size;
 | 
			
		||||
 | 
			
		||||
   GLfloat *buffer;
 | 
			
		||||
   GLuint count;
 | 
			
		||||
   GLuint wrap_count;
 | 
			
		||||
 | 
			
		||||
   struct tnl_prim *prim;
 | 
			
		||||
   GLuint prim_count, prim_max;
 | 
			
		||||
 | 
			
		||||
   struct tnl_vertex_store *vertex_store;
 | 
			
		||||
   struct tnl_primitive_store *prim_store;
 | 
			
		||||
 | 
			
		||||
   GLfloat *vbptr;		   /* cursor, points into buffer */
 | 
			
		||||
   GLfloat vertex[_TNL_ATTRIB_MAX*4];	   /* current values */
 | 
			
		||||
   GLfloat *attrptr[_TNL_ATTRIB_MAX];
 | 
			
		||||
   GLuint counter, initial_counter;
 | 
			
		||||
   GLuint dangling_attr_ref;
 | 
			
		||||
 | 
			
		||||
   GLuint opcode_vertex_list;
 | 
			
		||||
 | 
			
		||||
   struct tnl_copied_vtx copied;
 | 
			
		||||
 | 
			
		||||
   GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */
 | 
			
		||||
   GLubyte *currentsz[_TNL_ATTRIB_MAX];
 | 
			
		||||
 | 
			
		||||
   void (*tabfv[_TNL_ATTRIB_MAX][4])( const GLfloat * );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct tnl_vertex_arrays
 | 
			
		||||
{
 | 
			
		||||
   /* Conventional vertex attribute arrays */
 | 
			
		||||
   GLvector4f  Obj;
 | 
			
		||||
   GLvector4f  Normal;
 | 
			
		||||
   struct gl_client_array Color;
 | 
			
		||||
   struct gl_client_array SecondaryColor;
 | 
			
		||||
   GLvector4f  Color;
 | 
			
		||||
   GLvector4f  SecondaryColor;
 | 
			
		||||
   GLvector4f  FogCoord;
 | 
			
		||||
   GLvector4f  TexCoord[MAX_TEXTURE_COORD_UNITS];
 | 
			
		||||
   GLvector1ub EdgeFlag;
 | 
			
		||||
   GLvector1ui Index;
 | 
			
		||||
   GLvector1ui Elt;
 | 
			
		||||
   GLvector4f  Index;
 | 
			
		||||
 | 
			
		||||
   GLubyte     *EdgeFlag;
 | 
			
		||||
   GLuint      *Elt;
 | 
			
		||||
 | 
			
		||||
   /* 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];
 | 
			
		||||
   GLvector4f  Attribs[_TNL_ATTRIB_MAX];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Contains the current state of a running pipeline.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct vertex_buffer
 | 
			
		||||
struct vertex_buffer
 | 
			
		||||
{
 | 
			
		||||
   /* Constant over life of the vertex_buffer.
 | 
			
		||||
    */
 | 
			
		||||
   GLuint Size;
 | 
			
		||||
   GLuint      Size;
 | 
			
		||||
 | 
			
		||||
   /* Constant over the pipeline.
 | 
			
		||||
    */
 | 
			
		||||
   GLuint     Count;		              /* for everything except Elts */
 | 
			
		||||
   GLuint     FirstClipped;	              /* temp verts for clipping */
 | 
			
		||||
   GLuint     FirstPrimitive;	              /* usually zero */
 | 
			
		||||
   GLuint      Count;		              /* for everything except Elts */
 | 
			
		||||
 | 
			
		||||
   /* Pointers to current data.
 | 
			
		||||
    */
 | 
			
		||||
   GLuint      *Elts;		                /* VERT_BIT_ELT */
 | 
			
		||||
   GLvector4f  *ObjPtr;		                /* VERT_BIT_POS */
 | 
			
		||||
   GLvector4f  *EyePtr;		                /* VERT_BIT_EYE */
 | 
			
		||||
   GLvector4f  *ClipPtr;	                /* VERT_BIT_CLIP */
 | 
			
		||||
   GLvector4f  *NdcPtr;                         /* VERT_BIT_CLIP (2) */
 | 
			
		||||
   GLubyte     ClipOrMask;	                /* VERT_BIT_CLIP (3) */
 | 
			
		||||
   GLubyte     *ClipMask;		        /* VERT_BIT_CLIP (4) */
 | 
			
		||||
   GLvector4f  *NormalPtr;	                /* VERT_BIT_NORMAL */
 | 
			
		||||
   GLfloat     *NormalLengthPtr;	        /* VERT_BIT_NORMAL */
 | 
			
		||||
   GLboolean   *EdgeFlag;	                /* VERT_BIT_EDGEFLAG */
 | 
			
		||||
   GLuint      *Elts;		                
 | 
			
		||||
   GLvector4f  *ObjPtr;		                /* _TNL_BIT_POS */
 | 
			
		||||
   GLvector4f  *EyePtr;		                /* _TNL_BIT_POS */
 | 
			
		||||
   GLvector4f  *ClipPtr;	                /* _TNL_BIT_POS */
 | 
			
		||||
   GLvector4f  *NdcPtr;                         /* _TNL_BIT_POS */
 | 
			
		||||
   GLubyte     ClipOrMask;	                /* _TNL_BIT_POS */
 | 
			
		||||
   GLubyte     *ClipMask;		        /* _TNL_BIT_POS */
 | 
			
		||||
   GLvector4f  *NormalPtr;	                /* _TNL_BIT_NORMAL */
 | 
			
		||||
   GLfloat     *NormalLengthPtr;	        /* _TNL_BIT_NORMAL */
 | 
			
		||||
   GLboolean   *EdgeFlag;	                /* _TNL_BIT_EDGEFLAG */
 | 
			
		||||
   GLvector4f  *TexCoordPtr[MAX_TEXTURE_COORD_UNITS]; /* VERT_TEX_0..n */
 | 
			
		||||
   GLvector1ui *IndexPtr[2];	                /* VERT_BIT_INDEX */
 | 
			
		||||
   struct gl_client_array *ColorPtr[2];	        /* VERT_BIT_COLOR0 */
 | 
			
		||||
   struct gl_client_array *SecondaryColorPtr[2];/* VERT_BIT_COLOR1 */
 | 
			
		||||
   GLvector4f  *PointSizePtr;	                /* VERT_BIT_POINT_SIZE */
 | 
			
		||||
   GLvector4f  *FogCoordPtr;	                /* VERT_BIT_FOG */
 | 
			
		||||
   struct gl_material *Material;              /* VERT_BIT_MATERIAL, optional */
 | 
			
		||||
   GLuint      *MaterialMask;	              /* VERT_BIT_MATERIAL, optional */
 | 
			
		||||
   GLuint      *Flag;		              /* VERT_BIT_* flags, optional */
 | 
			
		||||
   GLuint      *Primitive;	              /* GL_(mode)|PRIM_* flags */
 | 
			
		||||
   GLuint      *PrimitiveLength;	      /* integers */
 | 
			
		||||
   GLvector4f  *IndexPtr[2];	                /* _TNL_BIT_INDEX */
 | 
			
		||||
   GLvector4f  *ColorPtr[2];	                /* _TNL_BIT_COLOR0 */
 | 
			
		||||
   GLvector4f  *SecondaryColorPtr[2];           /* _TNL_BIT_COLOR1 */
 | 
			
		||||
   GLvector4f  *PointSizePtr;	                /* _TNL_BIT_POS */
 | 
			
		||||
   GLvector4f  *FogCoordPtr;	                /* _TNL_BIT_FOG */
 | 
			
		||||
 | 
			
		||||
   struct tnl_prim  *Primitive;	              
 | 
			
		||||
   GLuint      PrimitiveCount;	      
 | 
			
		||||
 | 
			
		||||
   /* Inputs to the vertex program stage */
 | 
			
		||||
   GLvector4f *AttribPtr[VERT_ATTRIB_MAX];      /* GL_NV_vertex_program */
 | 
			
		||||
 | 
			
		||||
   GLuint importable_data;
 | 
			
		||||
   void *import_source;
 | 
			
		||||
   void (*import_data)( GLcontext *ctx, GLuint flags, GLuint vecflags );
 | 
			
		||||
   /* Callback to the provider of the untransformed input for the
 | 
			
		||||
    * render stage (or other stages) to call if they need to write into
 | 
			
		||||
    * write-protected arrays, or fixup the stride on input arrays.
 | 
			
		||||
    *
 | 
			
		||||
    * This is currently only necessary for client arrays that make it
 | 
			
		||||
    * as far down the pipeline as the render stage.
 | 
			
		||||
    */
 | 
			
		||||
   GLvector4f *AttribPtr[_TNL_ATTRIB_MAX];      /* GL_NV_vertex_program */
 | 
			
		||||
 | 
			
		||||
   GLuint LastClipped;
 | 
			
		||||
   /* Private data from _tnl_render_stage that has no business being
 | 
			
		||||
    * in this struct.
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
} TNLvertexbuffer;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** Describes an individual operation on the pipeline.
 | 
			
		||||
 */
 | 
			
		||||
struct gl_pipeline_stage {
 | 
			
		||||
struct tnl_pipeline_stage {
 | 
			
		||||
   const char *name;
 | 
			
		||||
   GLuint check_state;		/* All state referenced in check() --
 | 
			
		||||
				 * When is the pipeline_stage struct
 | 
			
		||||
@@ -365,12 +454,12 @@ struct gl_pipeline_stage {
 | 
			
		||||
 | 
			
		||||
   /* Free private data.  May not be null.
 | 
			
		||||
    */
 | 
			
		||||
   void (*destroy)( struct gl_pipeline_stage * );
 | 
			
		||||
   void (*destroy)( struct tnl_pipeline_stage * );
 | 
			
		||||
 | 
			
		||||
   /* Called from _tnl_validate_pipeline().  Must update all fields in
 | 
			
		||||
    * the pipeline_stage struct for the current state.
 | 
			
		||||
    */
 | 
			
		||||
   void (*check)( GLcontext *ctx, struct gl_pipeline_stage * );
 | 
			
		||||
   void (*check)( GLcontext *ctx, struct tnl_pipeline_stage * );
 | 
			
		||||
 | 
			
		||||
   /* Called from _tnl_run_pipeline().  The stage.changed_inputs value
 | 
			
		||||
    * encodes all inputs to thee struct which have changed.  If
 | 
			
		||||
@@ -380,31 +469,23 @@ struct gl_pipeline_stage {
 | 
			
		||||
    * Return value: GL_TRUE - keep going
 | 
			
		||||
    *               GL_FALSE - finished pipeline
 | 
			
		||||
    */
 | 
			
		||||
   GLboolean (*run)( GLcontext *ctx, struct gl_pipeline_stage * );
 | 
			
		||||
   GLboolean (*run)( GLcontext *ctx, struct tnl_pipeline_stage * );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Contains the array of all pipeline stages.
 | 
			
		||||
 * The default values are defined at the end of t_pipeline.c */
 | 
			
		||||
struct gl_pipeline {
 | 
			
		||||
struct tnl_pipeline {
 | 
			
		||||
   GLuint build_state_trigger;	  /**< state changes which require build */
 | 
			
		||||
   GLuint build_state_changes;    /**< state changes since last build */
 | 
			
		||||
   GLuint run_state_changes;	  /**< state changes since last run */
 | 
			
		||||
   GLuint run_input_changes;	  /**< VERT_* changes since last run */
 | 
			
		||||
   GLuint inputs;		  /**< VERT_* inputs to pipeline */
 | 
			
		||||
   /** This array has to end with a NULL-pointer. */
 | 
			
		||||
   struct gl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
 | 
			
		||||
   struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
 | 
			
		||||
   GLuint nr_stages;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct tnl_eval_store {
 | 
			
		||||
   GLuint EvalMap1Flags;
 | 
			
		||||
   GLuint EvalMap2Flags;
 | 
			
		||||
   GLuint EvalMap1AttribFlags;  /* GL_NV_vertex_program */
 | 
			
		||||
   GLuint EvalMap2AttribFlags;  /* GL_NV_vertex_program */
 | 
			
		||||
   GLuint EvalNewState;
 | 
			
		||||
   struct immediate *im;	/* used for temporary data */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last );
 | 
			
		||||
@@ -533,50 +614,26 @@ typedef struct {
 | 
			
		||||
    */
 | 
			
		||||
   struct tnl_device_driver Driver;
 | 
			
		||||
 | 
			
		||||
   /* Track whether the module is active.
 | 
			
		||||
   /* Execute:
 | 
			
		||||
    */
 | 
			
		||||
   GLboolean bound_exec;
 | 
			
		||||
 | 
			
		||||
   /* Display list extensions
 | 
			
		||||
   struct tnl_vtx vtx;
 | 
			
		||||
   
 | 
			
		||||
   /* Compile:
 | 
			
		||||
    */
 | 
			
		||||
   GLuint opcode_vertex_cassette;
 | 
			
		||||
   struct tnl_save save;
 | 
			
		||||
 | 
			
		||||
   /* Pipeline
 | 
			
		||||
    */
 | 
			
		||||
   struct gl_pipeline pipeline;
 | 
			
		||||
   struct tnl_pipeline pipeline;
 | 
			
		||||
   struct vertex_buffer vb;
 | 
			
		||||
 | 
			
		||||
   /* GLvectors for binding to vb:
 | 
			
		||||
    */
 | 
			
		||||
   struct vertex_arrays imm_inputs;
 | 
			
		||||
   struct vertex_arrays array_inputs;
 | 
			
		||||
   GLuint *tmp_primitive;
 | 
			
		||||
   GLuint *tmp_primitive_length;
 | 
			
		||||
   struct tnl_vertex_arrays vtx_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays save_inputs;
 | 
			
		||||
   struct tnl_vertex_arrays current;
 | 
			
		||||
   struct tnl_vertex_arrays array_inputs;
 | 
			
		||||
 | 
			
		||||
   /* Set when executing an internally generated begin/end object.  If
 | 
			
		||||
    * such an object is encountered in a display list, it will be
 | 
			
		||||
    * replayed only if the list is outside any existing begin/end
 | 
			
		||||
    * objects.  
 | 
			
		||||
    */
 | 
			
		||||
   GLboolean ReplayHardBeginEnd;
 | 
			
		||||
 | 
			
		||||
   /* Note which vertices need copying over succesive immediates.
 | 
			
		||||
    * Will add save versions to precompute vertex copying where
 | 
			
		||||
    * possible.
 | 
			
		||||
    */
 | 
			
		||||
   struct immediate *ExecCopySource;
 | 
			
		||||
   GLuint ExecCopyCount;
 | 
			
		||||
   GLuint ExecCopyElts[IMM_MAX_COPIED_VERTS];
 | 
			
		||||
   GLuint ExecCopyTexSize;
 | 
			
		||||
   GLuint ExecParity;
 | 
			
		||||
 | 
			
		||||
   GLuint DlistPrimitive;
 | 
			
		||||
   GLuint DlistPrimitiveLength;
 | 
			
		||||
   GLuint DlistLastPrimitive;
 | 
			
		||||
 | 
			
		||||
   /* Cache a single free immediate (refcount == 0)
 | 
			
		||||
    */
 | 
			
		||||
   struct immediate *freed_immediate;   
 | 
			
		||||
 | 
			
		||||
   /* Probably need a better configuration mechanism:
 | 
			
		||||
    */
 | 
			
		||||
@@ -585,13 +642,8 @@ typedef struct {
 | 
			
		||||
   GLboolean CalcDListNormalLengths;
 | 
			
		||||
   GLboolean IsolateMaterials;
 | 
			
		||||
 | 
			
		||||
   /* Derived state and storage for _tnl_eval_vb:
 | 
			
		||||
    */
 | 
			
		||||
   struct tnl_eval_store eval;
 | 
			
		||||
 | 
			
		||||
   /* Functions to be plugged into dispatch when tnl is active.
 | 
			
		||||
    */
 | 
			
		||||
   GLvertexformat vtxfmt;
 | 
			
		||||
   GLvertexformat exec_vtxfmt;
 | 
			
		||||
   GLvertexformat save_vtxfmt;
 | 
			
		||||
 | 
			
		||||
} TNLcontext;
 | 
			
		||||
@@ -599,7 +651,6 @@ typedef struct {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context))
 | 
			
		||||
#define TNL_CURRENT_IM(ctx) ((struct immediate *)(ctx->swtnl_im))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define TYPE_IDX(t) ((t) & 0xf)
 | 
			
		||||
@@ -610,21 +661,6 @@ extern void _tnl_MakeCurrent( GLcontext *ctx,
 | 
			
		||||
			      GLframebuffer *readBuffer );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Macros for fetching current input buffer.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef THREADS
 | 
			
		||||
#define GET_IMMEDIATE  struct immediate *IM = TNL_CURRENT_IM(((GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context())))
 | 
			
		||||
#define SET_IMMEDIATE(ctx, im)  ctx->swtnl_im = (void *)im
 | 
			
		||||
#else
 | 
			
		||||
extern struct immediate *_tnl_CurrentInput;
 | 
			
		||||
#define GET_IMMEDIATE struct immediate *IM = _tnl_CurrentInput
 | 
			
		||||
#define SET_IMMEDIATE(ctx, im)			\
 | 
			
		||||
do {						\
 | 
			
		||||
   ctx->swtnl_im = (void *)im;			\
 | 
			
		||||
   _tnl_CurrentInput = im;			\
 | 
			
		||||
} while (0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,246 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell - original code
 | 
			
		||||
 *    Brian Paul - vertex program updates
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "colormac.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "math/m_eval.h"
 | 
			
		||||
 | 
			
		||||
#include "t_eval_api.h"
 | 
			
		||||
#include "t_imm_api.h"
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* KW: If are compiling, we don't know whether eval will produce a
 | 
			
		||||
 *     vertex when it is run in the future.  If this is pure immediate
 | 
			
		||||
 *     mode, eval is a noop if neither vertex map is enabled.
 | 
			
		||||
 *
 | 
			
		||||
 *     Thus we need to have a check in the display list code or
 | 
			
		||||
 *     elsewhere for eval(1,2) vertices in the case where
 | 
			
		||||
 *     map(1,2)_vertex is disabled, and to purge those vertices from
 | 
			
		||||
 *     the vb.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_exec_EvalMesh1( GLenum mode, GLint i1, GLint i2 )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLint i;
 | 
			
		||||
   GLfloat u, du;
 | 
			
		||||
   GLenum prim;
 | 
			
		||||
   ASSERT_OUTSIDE_BEGIN_END(ctx);
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_API)
 | 
			
		||||
      _mesa_debug(ctx, "glEvalMesh1()");
 | 
			
		||||
 | 
			
		||||
   switch (mode) {
 | 
			
		||||
      case GL_POINT:
 | 
			
		||||
         prim = GL_POINTS;
 | 
			
		||||
         break;
 | 
			
		||||
      case GL_LINE:
 | 
			
		||||
         prim = GL_LINE_STRIP;
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
         _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh1(mode)" );
 | 
			
		||||
         return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* No effect if vertex maps disabled.
 | 
			
		||||
    */
 | 
			
		||||
   if (!ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3 &&
 | 
			
		||||
       (!ctx->VertexProgram.Enabled || !ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]))
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   du = ctx->Eval.MapGrid1du;
 | 
			
		||||
   u = ctx->Eval.MapGrid1u1 + i1 * du;
 | 
			
		||||
 | 
			
		||||
   /* Need to turn off compilation -- this is already saved, and the
 | 
			
		||||
    * coordinates generated and the test above depend on state that
 | 
			
		||||
    * may change before the list is executed.
 | 
			
		||||
    *
 | 
			
		||||
    * TODO: Anaylse display lists to determine if this state is
 | 
			
		||||
    * constant.
 | 
			
		||||
    *
 | 
			
		||||
    * State to watch:
 | 
			
		||||
    *       - enabled maps
 | 
			
		||||
    *       - map state for each enabled map, including control points
 | 
			
		||||
    *       - grid state
 | 
			
		||||
    *
 | 
			
		||||
    * Could alternatively cache individual maps in arrays, rather than
 | 
			
		||||
    * building immediates.  
 | 
			
		||||
    */
 | 
			
		||||
   {
 | 
			
		||||
      GLboolean compiling = ctx->CompileFlag;
 | 
			
		||||
      TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
      struct immediate *im = TNL_CURRENT_IM(ctx);
 | 
			
		||||
      GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
 | 
			
		||||
 | 
			
		||||
      NotifyBegin = tnl->Driver.NotifyBegin;
 | 
			
		||||
      tnl->Driver.NotifyBegin = 0;
 | 
			
		||||
 | 
			
		||||
      if (compiling) {
 | 
			
		||||
	 struct immediate *tmp = _tnl_alloc_immediate( ctx );
 | 
			
		||||
	 FLUSH_VERTICES( ctx, 0 );
 | 
			
		||||
	 SET_IMMEDIATE( ctx, tmp );
 | 
			
		||||
	 TNL_CURRENT_IM(ctx)->ref_count++;	 
 | 
			
		||||
	 ctx->CompileFlag = GL_FALSE;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      _tnl_Begin( prim );
 | 
			
		||||
      for (i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	 _tnl_eval_coord1f( ctx, u );
 | 
			
		||||
      }
 | 
			
		||||
      _tnl_end_ctx(ctx);
 | 
			
		||||
 | 
			
		||||
      /* Need this for replay *and* compile:
 | 
			
		||||
       */
 | 
			
		||||
      FLUSH_VERTICES( ctx, 0 );
 | 
			
		||||
      tnl->Driver.NotifyBegin = NotifyBegin;
 | 
			
		||||
 | 
			
		||||
      if (compiling) {
 | 
			
		||||
	 TNL_CURRENT_IM(ctx)->ref_count--;
 | 
			
		||||
	 ASSERT( TNL_CURRENT_IM(ctx)->ref_count == 0 );
 | 
			
		||||
	 _tnl_free_immediate( ctx, TNL_CURRENT_IM(ctx) );
 | 
			
		||||
	 SET_IMMEDIATE( ctx, im );
 | 
			
		||||
	 ctx->CompileFlag = GL_TRUE;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_exec_EvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 )
 | 
			
		||||
{
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLint i, j;
 | 
			
		||||
   GLfloat u, du, v, dv, v1, u1;
 | 
			
		||||
   ASSERT_OUTSIDE_BEGIN_END(ctx);
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_API)
 | 
			
		||||
      _mesa_debug(ctx, "glEvalMesh2()");
 | 
			
		||||
 | 
			
		||||
   /* No effect if vertex maps disabled.
 | 
			
		||||
    */
 | 
			
		||||
   if (!ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3 &&
 | 
			
		||||
       (!ctx->VertexProgram.Enabled || !ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]))
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   du = ctx->Eval.MapGrid2du;
 | 
			
		||||
   dv = ctx->Eval.MapGrid2dv;
 | 
			
		||||
   v1 = ctx->Eval.MapGrid2v1 + j1 * dv;
 | 
			
		||||
   u1 = ctx->Eval.MapGrid2u1 + i1 * du;
 | 
			
		||||
 | 
			
		||||
   /* Need to turn off compilation -- this is already saved, and the
 | 
			
		||||
    * coordinates generated and the test above depend on state that
 | 
			
		||||
    * may change before the list is executed.
 | 
			
		||||
    */
 | 
			
		||||
   {
 | 
			
		||||
      GLboolean compiling = ctx->CompileFlag;
 | 
			
		||||
      struct immediate *im = TNL_CURRENT_IM(ctx);
 | 
			
		||||
      TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
      GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
 | 
			
		||||
 | 
			
		||||
      NotifyBegin = tnl->Driver.NotifyBegin;
 | 
			
		||||
      tnl->Driver.NotifyBegin = 0;
 | 
			
		||||
 | 
			
		||||
      if (compiling) {
 | 
			
		||||
	 struct immediate *tmp = _tnl_alloc_immediate( ctx );
 | 
			
		||||
	 FLUSH_VERTICES( ctx, 0 );
 | 
			
		||||
	 SET_IMMEDIATE( ctx, tmp );
 | 
			
		||||
	 TNL_CURRENT_IM(ctx)->ref_count++;	 
 | 
			
		||||
	 ctx->CompileFlag = GL_FALSE;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      switch (mode) {
 | 
			
		||||
      case GL_POINT:
 | 
			
		||||
	 _tnl_Begin( GL_POINTS );
 | 
			
		||||
	 for (v=v1,j=j1;j<=j2;j++,v+=dv) {
 | 
			
		||||
	    for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	       _tnl_eval_coord2f( ctx, u, v );
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
	 _tnl_end_ctx(ctx);
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_LINE:
 | 
			
		||||
	 for (v=v1,j=j1;j<=j2;j++,v+=dv) {
 | 
			
		||||
	    _tnl_Begin( GL_LINE_STRIP );
 | 
			
		||||
	    for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	       _tnl_eval_coord2f( ctx, u, v );
 | 
			
		||||
	    }
 | 
			
		||||
	    _tnl_end_ctx(ctx);
 | 
			
		||||
	 }
 | 
			
		||||
	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	    _tnl_Begin( GL_LINE_STRIP );
 | 
			
		||||
	    for (v=v1,j=j1;j<=j2;j++,v+=dv) {
 | 
			
		||||
	       _tnl_eval_coord2f( ctx, u, v );
 | 
			
		||||
	    }
 | 
			
		||||
	    _tnl_end_ctx(ctx);
 | 
			
		||||
	 }
 | 
			
		||||
	 break;
 | 
			
		||||
      case GL_FILL:
 | 
			
		||||
	 for (v=v1,j=j1;j<j2;j++,v+=dv) {
 | 
			
		||||
	    _tnl_Begin( GL_TRIANGLE_STRIP );
 | 
			
		||||
	    for (u=u1,i=i1;i<=i2;i++,u+=du) {
 | 
			
		||||
	       _tnl_eval_coord2f( ctx, u, v );
 | 
			
		||||
	       _tnl_eval_coord2f( ctx, u, v+dv );
 | 
			
		||||
	    }
 | 
			
		||||
	    _tnl_end_ctx(ctx);
 | 
			
		||||
	 }
 | 
			
		||||
	 break;
 | 
			
		||||
      default:
 | 
			
		||||
	 _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh2(mode)" );
 | 
			
		||||
	 return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* Need this for replay *and* compile:
 | 
			
		||||
       */
 | 
			
		||||
      FLUSH_VERTICES( ctx, 0 );
 | 
			
		||||
      tnl->Driver.NotifyBegin = NotifyBegin;
 | 
			
		||||
	 
 | 
			
		||||
      if (compiling) {
 | 
			
		||||
	 TNL_CURRENT_IM(ctx)->ref_count--;
 | 
			
		||||
	 _tnl_free_immediate( ctx, TNL_CURRENT_IM( ctx ) );
 | 
			
		||||
	 SET_IMMEDIATE( ctx, im );
 | 
			
		||||
	 ctx->CompileFlag = GL_TRUE;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_eval_init( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   GLvertexformat *vfmt = &(TNL_CONTEXT(ctx)->vtxfmt);
 | 
			
		||||
   vfmt->EvalMesh1 = _tnl_exec_EvalMesh1;
 | 
			
		||||
   vfmt->EvalMesh2 = _tnl_exec_EvalMesh2;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,43 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  3.5
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_EVAL_H
 | 
			
		||||
#define _T_EVAL_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
/* Use _mesa_save_EvalMesh{1,2} to save these to display lists.
 | 
			
		||||
 */
 | 
			
		||||
extern void _tnl_exec_EvalMesh1( GLenum mode, GLint i1, GLint i2 );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_exec_EvalMesh2( GLenum mode, GLint i1, GLint i2,
 | 
			
		||||
				 GLint j1, GLint j2 );
 | 
			
		||||
 | 
			
		||||
void _tnl_eval_init( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,151 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int id = 0;  /* give each struct immediate a unique ID number */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static struct immediate *
 | 
			
		||||
real_alloc_immediate( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   struct immediate *immed = ALIGN_CALLOC_STRUCT( immediate, 32 );
 | 
			
		||||
 | 
			
		||||
   if (!immed)
 | 
			
		||||
      return NULL;
 | 
			
		||||
 | 
			
		||||
   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;
 | 
			
		||||
 | 
			
		||||
   /* Only allocate space for vertex positions right now.  Color, texcoord,
 | 
			
		||||
    * etc storage will be allocated as needed.
 | 
			
		||||
    */
 | 
			
		||||
   immed->Attrib[VERT_ATTRIB_POS] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
 | 
			
		||||
   /* Enable this to allocate all attribute arrays up front */
 | 
			
		||||
   if (0)
 | 
			
		||||
   {
 | 
			
		||||
      int i;
 | 
			
		||||
      for (i = 1; i < VERT_ATTRIB_MAX; i++) {
 | 
			
		||||
         immed->Attrib[i] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   immed->CopyTexSize = 0;
 | 
			
		||||
   immed->CopyStart = immed->Start;
 | 
			
		||||
 | 
			
		||||
   return immed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
real_free_immediate( struct immediate *immed )
 | 
			
		||||
{
 | 
			
		||||
   static int freed = 0;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i =0; i < VERT_ATTRIB_MAX; i++) {
 | 
			
		||||
      if (immed->Attrib[i])
 | 
			
		||||
         _mesa_free(immed->Attrib[i]);
 | 
			
		||||
      immed->Attrib[i] = NULL;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (immed->Material) {
 | 
			
		||||
      FREE( immed->Material );
 | 
			
		||||
      FREE( immed->MaterialMask );
 | 
			
		||||
      immed->Material = 0;
 | 
			
		||||
      immed->MaterialMask = 0;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (immed->NormalLengthPtr)
 | 
			
		||||
      ALIGN_FREE( immed->NormalLengthPtr );
 | 
			
		||||
 | 
			
		||||
   ALIGN_FREE( immed );
 | 
			
		||||
   freed++;
 | 
			
		||||
/*     printf("outstanding %d\n", id - freed);    */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct immediate *tmp = tnl->freed_immediate;
 | 
			
		||||
   
 | 
			
		||||
   if (tmp) {
 | 
			
		||||
      tnl->freed_immediate = 0;
 | 
			
		||||
      return tmp;
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      return real_alloc_immediate( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Free a 'struct immediate' object.
 | 
			
		||||
 * May be called after tnl is destroyed.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_free_immediate( GLcontext *ctx, struct immediate *immed )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   ASSERT(immed->ref_count == 0);
 | 
			
		||||
 | 
			
		||||
   if (immed->NormalLengthPtr) {
 | 
			
		||||
      ALIGN_FREE(immed->NormalLengthPtr);
 | 
			
		||||
      immed->NormalLengthPtr = NULL;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (!tnl) {
 | 
			
		||||
      real_free_immediate( immed );
 | 
			
		||||
   } 
 | 
			
		||||
   else {
 | 
			
		||||
      if (tnl->freed_immediate)
 | 
			
		||||
	 real_free_immediate( tnl->freed_immediate );
 | 
			
		||||
      
 | 
			
		||||
      tnl->freed_immediate = immed;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,39 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  3.5
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_IMM_ALLOC_H
 | 
			
		||||
#define _T_IMM_ALLOC_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern struct immediate *_tnl_alloc_immediate( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_free_immediate( GLcontext *ctx, struct immediate *im );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,56 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  4.1
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_VTXFMT_H
 | 
			
		||||
#define _T_VTXFMT_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern void _tnl_save_Begin( GLenum mode );
 | 
			
		||||
extern void _tnl_Begin( GLenum mode );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_Begin( GLenum mode );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_End(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* TNL-private internal functions for building higher-level operations:
 | 
			
		||||
 */
 | 
			
		||||
extern GLboolean _tnl_hard_begin( GLcontext *ctx, GLenum p );
 | 
			
		||||
extern void _tnl_end_ctx( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_vertex2f( GLcontext *ctx, GLfloat x, GLfloat y );
 | 
			
		||||
extern void _tnl_eval_coord1f( GLcontext *CC, GLfloat u );
 | 
			
		||||
extern void _tnl_eval_coord2f( GLcontext *CC, GLfloat u, GLfloat v );
 | 
			
		||||
extern void _tnl_array_element( GLcontext *CC, GLint i );
 | 
			
		||||
 | 
			
		||||
/* Initialize our part of the vtxfmt struct:
 | 
			
		||||
 */
 | 
			
		||||
extern void _tnl_imm_vtxfmt_init( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,182 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2002  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_imm_debug.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_print_vert_flags( const char *name, GLuint flags )
 | 
			
		||||
{
 | 
			
		||||
   _mesa_debug(NULL,
 | 
			
		||||
	   "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
 | 
			
		||||
	   name,
 | 
			
		||||
	   flags,
 | 
			
		||||
	   (flags & VERT_BIT_CLIP)       ? "clip/proj-clip/glend, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_EDGEFLAG)       ? "edgeflag, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_ELT)        ? "array-elt, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_END_VB)     ? "end-vb, " : "",
 | 
			
		||||
	   (flags & VERT_BITS_EVAL_ANY)   ? "eval-coord, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_EYE)        ? "eye/glbegin, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_FOG)  ? "fog-coord, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_INDEX)      ? "index, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_MATERIAL)   ? "material, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_NORMAL)       ? "normals, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_POS)        ? "obj, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_OBJ_3)      ? "obj-3, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_OBJ_4)      ? "obj-4, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_POINT_SIZE) ? "point-size, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_COLOR0)       ? "colors, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_COLOR1)   ? "specular, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX0)       ? "texcoord0, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX1)       ? "texcoord1, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX2)       ? "texcoord2, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX3)       ? "texcoord3, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX4)       ? "texcoord4, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX5)       ? "texcoord5, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX6)       ? "texcoord6, " : "",
 | 
			
		||||
	   (flags & VERT_BIT_TEX7)       ? "texcoord7, " : ""
 | 
			
		||||
      );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _tnl_print_cassette( struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   GLuint *flags = IM->Flag;
 | 
			
		||||
   GLuint andflag = IM->CopyAndFlag;
 | 
			
		||||
   GLuint orflag = (IM->CopyOrFlag|IM->Evaluated);
 | 
			
		||||
   GLuint state = IM->BeginState;
 | 
			
		||||
   GLuint req = ~0;
 | 
			
		||||
 | 
			
		||||
   _mesa_debug(NULL, "Cassette id %d, %u rows.\n", IM->id,
 | 
			
		||||
	   IM->Count - IM->CopyStart);
 | 
			
		||||
 | 
			
		||||
   _tnl_print_vert_flags("Contains at least one", orflag);
 | 
			
		||||
 | 
			
		||||
   if (IM->Count != IM->CopyStart)
 | 
			
		||||
   {
 | 
			
		||||
      _tnl_print_vert_flags("Contains a full complement of", andflag);
 | 
			
		||||
 | 
			
		||||
      _mesa_debug(NULL, "Final begin/end state %s/%s, errors %s/%s\n",
 | 
			
		||||
	     (state & VERT_BEGIN_0) ? "in" : "out",
 | 
			
		||||
	     (state & VERT_BEGIN_1) ? "in" : "out",
 | 
			
		||||
	     (state & VERT_ERROR_0) ? "y" : "n",
 | 
			
		||||
	     (state & VERT_ERROR_1) ? "y" : "n");
 | 
			
		||||
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = IM->CopyStart ; i <= IM->Count ; i++) {
 | 
			
		||||
      _mesa_debug(NULL, "%u: ", i);
 | 
			
		||||
      if (req & VERT_BITS_OBJ_234) {
 | 
			
		||||
	 if (flags[i] & VERT_BIT_EVAL_C1)
 | 
			
		||||
	    _mesa_debug(NULL, "EvalCoord %f ",
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][0]);
 | 
			
		||||
	 else if (flags[i] & VERT_BIT_EVAL_P1)
 | 
			
		||||
	    _mesa_debug(NULL, "EvalPoint %.0f ",
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][0]);
 | 
			
		||||
	 else if (flags[i] & VERT_BIT_EVAL_C2)
 | 
			
		||||
	    _mesa_debug(NULL, "EvalCoord %f %f ",
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][0],
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][1]);
 | 
			
		||||
	 else if (flags[i] & VERT_BIT_EVAL_P2)
 | 
			
		||||
	    _mesa_debug(NULL, "EvalPoint %.0f %.0f ",
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][0],
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][1]);
 | 
			
		||||
	 else if (i < IM->Count && (flags[i] & VERT_BITS_OBJ_234)) {
 | 
			
		||||
	    _mesa_debug(NULL, "Obj %f %f %f %f",
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][0],
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][1],
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][2],
 | 
			
		||||
                    IM->Attrib[VERT_ATTRIB_POS][i][3]);
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_ELT)
 | 
			
		||||
	 _mesa_debug(NULL, " Elt %u\t", IM->Elt[i]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_NORMAL)
 | 
			
		||||
	 _mesa_debug(NULL, " Norm %f %f %f ",
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_NORMAL][i][0],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_NORMAL][i][1],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_NORMAL][i][2]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BITS_TEX_ANY) {
 | 
			
		||||
	 GLuint j;
 | 
			
		||||
	 for (j = 0 ; j < MAX_TEXTURE_COORD_UNITS ; j++) {
 | 
			
		||||
	    if (req & flags[i] & VERT_BIT_TEX(j)) {
 | 
			
		||||
	       _mesa_debug(NULL, "TC%d %f %f %f %f", j,
 | 
			
		||||
		       IM->Attrib[VERT_ATTRIB_TEX0 + j][i][0],
 | 
			
		||||
		       IM->Attrib[VERT_ATTRIB_TEX0 + j][i][1],
 | 
			
		||||
		       IM->Attrib[VERT_ATTRIB_TEX0 + j][i][2],
 | 
			
		||||
		       IM->Attrib[VERT_ATTRIB_TEX0 + j][i][3]);
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_COLOR0)
 | 
			
		||||
	 _mesa_debug(NULL, " Rgba %f %f %f %f ",
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR0][i][0],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR0][i][1],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR0][i][2],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR0][i][3]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_COLOR1)
 | 
			
		||||
	 _mesa_debug(NULL, " Spec %f %f %f ",
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR1][i][0],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR1][i][1],
 | 
			
		||||
                 IM->Attrib[VERT_ATTRIB_COLOR1][i][2]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_FOG)
 | 
			
		||||
	 _mesa_debug(NULL, " Fog %f ", IM->Attrib[VERT_ATTRIB_FOG][i][0]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_INDEX)
 | 
			
		||||
	 _mesa_debug(NULL, " Index %u ", IM->Index[i]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_EDGEFLAG)
 | 
			
		||||
	 _mesa_debug(NULL, " Edgeflag %d ", IM->EdgeFlag[i]);
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_MATERIAL)
 | 
			
		||||
	 _mesa_debug(NULL, " Material ");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      /* The order of these two is not easily knowable, but this is
 | 
			
		||||
       * the usually correct way to look at them.
 | 
			
		||||
       */
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_END)
 | 
			
		||||
	 _mesa_debug(NULL, " END ");
 | 
			
		||||
 | 
			
		||||
      if (req & flags[i] & VERT_BIT_BEGIN)
 | 
			
		||||
	 _mesa_debug(NULL, " BEGIN(%s) (%s%s%s%s)",
 | 
			
		||||
		 _mesa_prim_name[IM->Primitive[i] & PRIM_MODE_MASK],
 | 
			
		||||
		 (IM->Primitive[i] & PRIM_LAST) ? "LAST," : "",
 | 
			
		||||
		 (IM->Primitive[i] & PRIM_BEGIN) ? "BEGIN," : "",
 | 
			
		||||
		 (IM->Primitive[i] & PRIM_END) ? "END," : "",
 | 
			
		||||
		 (IM->Primitive[i] & PRIM_PARITY) ? "PARITY," : "");
 | 
			
		||||
 | 
			
		||||
      _mesa_debug(NULL, "\n");
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  3.5
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _T_DEBUG_H
 | 
			
		||||
#define _T_DEBUG_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
void _tnl_print_cassette( struct immediate *IM );
 | 
			
		||||
void _tnl_print_vert_flags( const char *name, GLuint flags );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,667 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "dlist.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "state.h"
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_imm_api.h"
 | 
			
		||||
#include "t_imm_elt.h"
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
#include "t_imm_dlist.h"
 | 
			
		||||
#include "t_imm_debug.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
#include "t_imm_fixup.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
   struct immediate *IM;
 | 
			
		||||
   GLuint Start;
 | 
			
		||||
   GLuint Count;
 | 
			
		||||
   GLuint BeginState;
 | 
			
		||||
   GLuint SavedBeginState;
 | 
			
		||||
   GLuint OrFlag;
 | 
			
		||||
   GLuint AndFlag;
 | 
			
		||||
   GLuint TexSize;
 | 
			
		||||
   GLuint LastData;
 | 
			
		||||
   GLuint LastPrimitive;
 | 
			
		||||
   GLuint LastMaterial;
 | 
			
		||||
   GLuint MaterialOrMask;
 | 
			
		||||
   GLuint MaterialAndMask;
 | 
			
		||||
} TNLvertexcassette;
 | 
			
		||||
 | 
			
		||||
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)[4] = IM->Attrib[VERT_ATTRIB_NORMAL] + IM->Start;
 | 
			
		||||
   GLfloat *dest = IM->NormalLengthPtr;
 | 
			
		||||
   const GLuint *flags = IM->Flag + IM->Start;
 | 
			
		||||
   const GLuint count = IM->Count - IM->Start;
 | 
			
		||||
 | 
			
		||||
   if (!dest) {
 | 
			
		||||
      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.0F) len = 1.0F / len;
 | 
			
		||||
   
 | 
			
		||||
   for (i = 0 ; i < count ; ) {
 | 
			
		||||
      dest[i] = len;
 | 
			
		||||
      if (flags[++i] & VERT_BIT_NORMAL) {
 | 
			
		||||
	 len = (GLfloat) LEN_3FV( data[i] );
 | 
			
		||||
	 if (len > 0.0F) len = 1.0F / len;
 | 
			
		||||
      }
 | 
			
		||||
   } 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
fixup_normal_lengths( struct immediate *IM ) 
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   GLfloat len = 1.0F;  /* just to silence warnings */
 | 
			
		||||
   GLfloat (*data)[4] = IM->Attrib[VERT_ATTRIB_NORMAL];
 | 
			
		||||
   GLfloat *dest = IM->NormalLengthPtr;
 | 
			
		||||
   const GLuint *flags = IM->Flag;
 | 
			
		||||
 | 
			
		||||
   for (i = IM->CopyStart ; i <= IM->Start ; i++) {
 | 
			
		||||
      len = (GLfloat) LEN_3FV( data[i] );
 | 
			
		||||
      if (len > 0.0F)
 | 
			
		||||
         len = 1.0F / len;
 | 
			
		||||
      dest[i] = len;
 | 
			
		||||
   } 
 | 
			
		||||
 | 
			
		||||
   if (i < IM->Count) {
 | 
			
		||||
      while (!(flags[i] & (VERT_BIT_NORMAL|VERT_BIT_END_VB))) {
 | 
			
		||||
	 dest[i] = len;
 | 
			
		||||
	 i++;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Insert the active immediate struct onto the display list currently
 | 
			
		||||
 * being built.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_compile_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   struct immediate *im = TNL_CURRENT_IM(ctx);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   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 );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   _tnl_compute_orflag( IM, IM->Start );
 | 
			
		||||
 | 
			
		||||
   /* 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_BIT_ELT;	
 | 
			
		||||
   IM->AndFlag &= ~VERT_BIT_ELT;	
 | 
			
		||||
 | 
			
		||||
   _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,
 | 
			
		||||
			      sizeof(TNLvertexcassette));
 | 
			
		||||
   if (!node)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   node->IM = im; im->ref_count++;
 | 
			
		||||
   node->Start = im->Start;
 | 
			
		||||
   node->Count = im->Count;
 | 
			
		||||
   node->BeginState = im->BeginState;
 | 
			
		||||
   node->SavedBeginState = im->SavedBeginState;
 | 
			
		||||
   node->OrFlag = im->OrFlag;
 | 
			
		||||
   node->TexSize = im->TexSize;
 | 
			
		||||
   node->AndFlag = im->AndFlag;
 | 
			
		||||
   node->LastData = im->LastData;
 | 
			
		||||
   node->LastPrimitive = im->LastPrimitive;
 | 
			
		||||
   node->LastMaterial = im->LastMaterial;
 | 
			
		||||
   node->MaterialOrMask = im->MaterialOrMask;
 | 
			
		||||
   node->MaterialAndMask = im->MaterialAndMask;
 | 
			
		||||
   
 | 
			
		||||
   /*
 | 
			
		||||
    * XXX always allocate VERT_ATTRIB_NORMAL array now???
 | 
			
		||||
    */
 | 
			
		||||
   if (tnl->CalcDListNormalLengths && IM->Attrib[VERT_ATTRIB_NORMAL]) {
 | 
			
		||||
      build_normal_lengths( im );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (ctx->ExecuteFlag) {
 | 
			
		||||
      execute_compiled_cassette( ctx, (void *)node );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Discard any errors raised in the last cassette.
 | 
			
		||||
    */
 | 
			
		||||
   new_beginstate = node->BeginState & (VERT_BEGIN_0|VERT_BEGIN_1);
 | 
			
		||||
 | 
			
		||||
   /* Decide whether this immediate struct is full, or can be used for
 | 
			
		||||
    * the next batch of vertices as well.
 | 
			
		||||
    */
 | 
			
		||||
   if (im->Count > IMM_MAXDATA - 16) {
 | 
			
		||||
      /* Call it full...
 | 
			
		||||
       */
 | 
			
		||||
      struct immediate *new_im = _tnl_alloc_immediate(ctx);
 | 
			
		||||
      new_im->ref_count++;
 | 
			
		||||
      im->ref_count--;		 /* remove CURRENT_IM reference */
 | 
			
		||||
      ASSERT(im->ref_count > 0); /* it is compiled into a display list */
 | 
			
		||||
      SET_IMMEDIATE( ctx, new_im );
 | 
			
		||||
      _tnl_reset_compile_input( ctx, IMM_MAX_COPIED_VERTS,
 | 
			
		||||
				new_beginstate, node->SavedBeginState );
 | 
			
		||||
   } else {
 | 
			
		||||
      /* Still some room in the current immediate.
 | 
			
		||||
       */
 | 
			
		||||
      _tnl_reset_compile_input( ctx, im->Count+1+IMM_MAX_COPIED_VERTS,
 | 
			
		||||
			new_beginstate, node->SavedBeginState);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
fixup_compiled_primitives( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   /* Can potentially overwrite primitive details - need to save the
 | 
			
		||||
    * first slot:
 | 
			
		||||
    */
 | 
			
		||||
   tnl->DlistPrimitive = IM->Primitive[IM->Start];
 | 
			
		||||
   tnl->DlistPrimitiveLength = IM->PrimitiveLength[IM->Start];
 | 
			
		||||
   tnl->DlistLastPrimitive = IM->LastPrimitive;
 | 
			
		||||
 | 
			
		||||
   /* The first primitive may be different from what was recorded in
 | 
			
		||||
    * the immediate struct.  Consider an immediate that starts with a
 | 
			
		||||
    * glBegin, compiled in a display list, which is called from within
 | 
			
		||||
    * an existing Begin/End object.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) {
 | 
			
		||||
      GLuint i;
 | 
			
		||||
 | 
			
		||||
      if (IM->BeginState & VERT_ERROR_1)
 | 
			
		||||
	 _mesa_error( ctx, GL_INVALID_OPERATION, "glBegin/glEnd");
 | 
			
		||||
 | 
			
		||||
      for (i = IM->Start ; i <= IM->Count ; i += IM->PrimitiveLength[i])
 | 
			
		||||
	 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 || !(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_BIT_END_VB) {
 | 
			
		||||
	    IM->Primitive[IM->CopyStart] |= PRIM_LAST;
 | 
			
		||||
	    IM->LastPrimitive = IM->CopyStart;
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      GLuint i;
 | 
			
		||||
 | 
			
		||||
      if (IM->BeginState & VERT_ERROR_0)
 | 
			
		||||
	 _mesa_error( ctx, GL_INVALID_OPERATION, "glBegin/glEnd");
 | 
			
		||||
 | 
			
		||||
      if (IM->CopyStart == IM->Start &&
 | 
			
		||||
	  IM->Flag[IM->Start] & (VERT_BIT_END | VERT_BIT_END_VB))
 | 
			
		||||
      {
 | 
			
		||||
         /* nothing */
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
	 IM->Primitive[IM->CopyStart] = ctx->Driver.CurrentExecPrimitive;
 | 
			
		||||
	 if (tnl->ExecParity)
 | 
			
		||||
	    IM->Primitive[IM->CopyStart] |= PRIM_PARITY;
 | 
			
		||||
 | 
			
		||||
         /* 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_BIT_END | VERT_BIT_END_VB));
 | 
			
		||||
 | 
			
		||||
	 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) {
 | 
			
		||||
		  IM->Primitive[IM->CopyStart] |= PRIM_LAST;
 | 
			
		||||
		  IM->LastPrimitive = IM->CopyStart;
 | 
			
		||||
	       }
 | 
			
		||||
	       if (IM->Flag[i] & VERT_BIT_END) {
 | 
			
		||||
		  IM->Primitive[IM->CopyStart] |= PRIM_END;
 | 
			
		||||
	       }
 | 
			
		||||
	       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 )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   IM->Primitive[IM->Start] = tnl->DlistPrimitive;
 | 
			
		||||
   IM->PrimitiveLength[IM->Start] = tnl->DlistPrimitiveLength;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
execute_compiled_cassette( GLcontext *ctx, void *data )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   TNLvertexcassette *node = (TNLvertexcassette *)data;
 | 
			
		||||
   struct immediate *IM = node->IM;
 | 
			
		||||
 | 
			
		||||
/*     _mesa_debug("%s\n", __FUNCTION__); */
 | 
			
		||||
 | 
			
		||||
   IM->Start = node->Start;
 | 
			
		||||
   IM->CopyStart = node->Start;
 | 
			
		||||
   IM->Count = node->Count;
 | 
			
		||||
   IM->BeginState = node->BeginState;
 | 
			
		||||
   IM->SavedBeginState = node->SavedBeginState;
 | 
			
		||||
   IM->OrFlag = node->OrFlag;
 | 
			
		||||
   IM->TexSize = node->TexSize;
 | 
			
		||||
   IM->AndFlag = node->AndFlag;
 | 
			
		||||
   IM->LastData = node->LastData;
 | 
			
		||||
   IM->LastPrimitive = node->LastPrimitive;
 | 
			
		||||
   IM->LastMaterial = node->LastMaterial;
 | 
			
		||||
   IM->MaterialOrMask = node->MaterialOrMask;
 | 
			
		||||
   IM->MaterialAndMask = node->MaterialAndMask;
 | 
			
		||||
 | 
			
		||||
   if ((MESA_VERBOSE & VERBOSE_DISPLAY_LIST) &&
 | 
			
		||||
       (MESA_VERBOSE & VERBOSE_IMMEDIATE))
 | 
			
		||||
      _tnl_print_cassette( IM );
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST) {
 | 
			
		||||
      _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);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Need to respect 'HardBeginEnd' even if the commands are looped
 | 
			
		||||
    * back to a driver tnl module.
 | 
			
		||||
    */
 | 
			
		||||
   if (IM->SavedBeginState) {
 | 
			
		||||
      if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1)
 | 
			
		||||
	 tnl->ReplayHardBeginEnd = 1;
 | 
			
		||||
      if (!tnl->ReplayHardBeginEnd) {
 | 
			
		||||
	 /* This is a user error.  Whatever operation (like glRectf)
 | 
			
		||||
	  * decomposed to this hard begin/end pair is now being run
 | 
			
		||||
	  * inside a begin/end object -- illegally.  Reject it and
 | 
			
		||||
	  * raise an error.
 | 
			
		||||
	  */
 | 
			
		||||
	 _mesa_error(ctx, GL_INVALID_OPERATION, "hard replay");
 | 
			
		||||
	 return;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (tnl->LoopbackDListCassettes) {
 | 
			
		||||
/*        (tnl->IsolateMaterials && (IM->OrFlag & VERT_MATERIAL)) ) { */
 | 
			
		||||
      fixup_compiled_primitives( ctx, IM );
 | 
			
		||||
      loopback_compiled_cassette( ctx, IM );
 | 
			
		||||
      restore_compiled_primitives( ctx, IM );
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      if (ctx->NewState)
 | 
			
		||||
	 _mesa_update_state(ctx);
 | 
			
		||||
 | 
			
		||||
      if (tnl->pipeline.build_state_changes)
 | 
			
		||||
	 _tnl_validate_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
      _tnl_fixup_compiled_cassette( ctx, IM );
 | 
			
		||||
      fixup_compiled_primitives( ctx, IM );
 | 
			
		||||
 | 
			
		||||
      if (IM->Primitive[IM->LastPrimitive] & PRIM_END)
 | 
			
		||||
	 ctx->Driver.CurrentExecPrimitive = GL_POLYGON+1;
 | 
			
		||||
      else if ((IM->Primitive[IM->LastPrimitive] & PRIM_BEGIN) ||
 | 
			
		||||
	       (IM->Primitive[IM->LastPrimitive] & PRIM_MODE_MASK) == 
 | 
			
		||||
	       PRIM_OUTSIDE_BEGIN_END) {
 | 
			
		||||
	 ctx->Driver.CurrentExecPrimitive =
 | 
			
		||||
	    IM->Primitive[IM->LastPrimitive] & PRIM_MODE_MASK;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      _tnl_get_exec_copy_verts( ctx, IM );
 | 
			
		||||
 | 
			
		||||
      if (IM->NormalLengthPtr) 
 | 
			
		||||
	 fixup_normal_lengths( IM );
 | 
			
		||||
      
 | 
			
		||||
      if (IM->Count == IM->Start) 
 | 
			
		||||
	 _tnl_copy_to_current( ctx, IM, IM->OrFlag, IM->LastData );
 | 
			
		||||
      else {
 | 
			
		||||
/*  	 _tnl_print_cassette( IM ); */
 | 
			
		||||
	 _tnl_run_cassette( ctx, IM );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      restore_compiled_primitives( ctx, IM );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1)
 | 
			
		||||
      tnl->ReplayHardBeginEnd = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
destroy_compiled_cassette( GLcontext *ctx, void *data )
 | 
			
		||||
{
 | 
			
		||||
   TNLvertexcassette *node = (TNLvertexcassette *)data;
 | 
			
		||||
 | 
			
		||||
   if ( --node->IM->ref_count == 0 )
 | 
			
		||||
      _tnl_free_immediate( ctx, node->IM );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
print_compiled_cassette( GLcontext *ctx, void *data )
 | 
			
		||||
{
 | 
			
		||||
   TNLvertexcassette *node = (TNLvertexcassette *)data;
 | 
			
		||||
   struct immediate *IM = node->IM;
 | 
			
		||||
 | 
			
		||||
   _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;
 | 
			
		||||
   IM->Count = node->Count;
 | 
			
		||||
   IM->BeginState = node->BeginState;
 | 
			
		||||
   IM->OrFlag = node->OrFlag;
 | 
			
		||||
   IM->TexSize = node->TexSize;
 | 
			
		||||
   IM->AndFlag = node->AndFlag;
 | 
			
		||||
   IM->LastData = node->LastData;
 | 
			
		||||
   IM->LastPrimitive = node->LastPrimitive;
 | 
			
		||||
   IM->LastMaterial = node->LastMaterial;
 | 
			
		||||
   IM->MaterialOrMask = node->MaterialOrMask;
 | 
			
		||||
   IM->MaterialAndMask = node->MaterialAndMask;
 | 
			
		||||
 | 
			
		||||
   _tnl_print_cassette( node->IM );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_BeginCallList( GLcontext *ctx, GLuint list )
 | 
			
		||||
{
 | 
			
		||||
   (void) ctx;
 | 
			
		||||
   (void) list;
 | 
			
		||||
   FLUSH_CURRENT(ctx, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Called at the tail of a CallList.  Make current immediate aware of
 | 
			
		||||
 * any new to-be-copied vertices.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_EndCallList( GLcontext *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 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_EndList( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   struct immediate *IM = TNL_CURRENT_IM(ctx);
 | 
			
		||||
 | 
			
		||||
   ctx->swtnl_im = 0;
 | 
			
		||||
   IM->ref_count--;
 | 
			
		||||
 | 
			
		||||
   /* outside begin/end, even in COMPILE_AND_EXEC,
 | 
			
		||||
    * so no vertices to copy, right?
 | 
			
		||||
    */
 | 
			
		||||
   ASSERT(TNL_CONTEXT(ctx)->ExecCopyCount == 0);
 | 
			
		||||
 | 
			
		||||
   /* If this one isn't free, get a clean one.  (Otherwise we'll be
 | 
			
		||||
    * using one that's already half full).
 | 
			
		||||
    */
 | 
			
		||||
   if (IM->ref_count != 0)
 | 
			
		||||
      IM = _tnl_alloc_immediate( ctx );
 | 
			
		||||
 | 
			
		||||
   ASSERT(IM->ref_count == 0);
 | 
			
		||||
 | 
			
		||||
   SET_IMMEDIATE( ctx, IM );
 | 
			
		||||
   IM->ref_count++;
 | 
			
		||||
 | 
			
		||||
   _tnl_reset_exec_input( ctx, IMM_MAX_COPIED_VERTS, 0, 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_NewList( GLcontext *ctx, GLuint list, GLenum mode )
 | 
			
		||||
{
 | 
			
		||||
   struct immediate *IM = TNL_CURRENT_IM(ctx);
 | 
			
		||||
 | 
			
		||||
   /* Use the installed immediate struct.  No vertices in the current
 | 
			
		||||
    * immediate, no copied vertices in the system.
 | 
			
		||||
    */
 | 
			
		||||
   ASSERT(TNL_CURRENT_IM(ctx));
 | 
			
		||||
   ASSERT(TNL_CURRENT_IM(ctx)->Start == IMM_MAX_COPIED_VERTS);
 | 
			
		||||
   ASSERT(TNL_CURRENT_IM(ctx)->Start == TNL_CURRENT_IM(ctx)->Count);
 | 
			
		||||
   ASSERT(TNL_CONTEXT(ctx)->ExecCopyCount == 0);
 | 
			
		||||
 | 
			
		||||
   /* Set current Begin/End state to unknown:
 | 
			
		||||
    */
 | 
			
		||||
   IM->BeginState = VERT_BEGIN_0;
 | 
			
		||||
   ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_dlist_init( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   tnl->opcode_vertex_cassette =
 | 
			
		||||
      _mesa_alloc_opcode( ctx,
 | 
			
		||||
			  sizeof(TNLvertexcassette),
 | 
			
		||||
			  execute_compiled_cassette,
 | 
			
		||||
			  destroy_compiled_cassette,
 | 
			
		||||
			  print_compiled_cassette );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat (*attr)[4] = src->Attrib;
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_FRONT_EMISSION) 
 | 
			
		||||
      glMaterialfv( GL_FRONT, GL_EMISSION, attr[MAT_ATTRIB_FRONT_EMISSION] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_BACK_EMISSION) 
 | 
			
		||||
      glMaterialfv( GL_BACK, GL_EMISSION, attr[MAT_ATTRIB_BACK_EMISSION] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_FRONT_AMBIENT) 
 | 
			
		||||
      glMaterialfv( GL_FRONT, GL_AMBIENT, attr[MAT_ATTRIB_FRONT_AMBIENT] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_BACK_AMBIENT) 
 | 
			
		||||
      glMaterialfv( GL_BACK, GL_AMBIENT, attr[MAT_ATTRIB_BACK_AMBIENT] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_FRONT_DIFFUSE) 
 | 
			
		||||
      glMaterialfv( GL_FRONT, GL_DIFFUSE, attr[MAT_ATTRIB_FRONT_DIFFUSE] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_BACK_DIFFUSE) 
 | 
			
		||||
      glMaterialfv( GL_BACK, GL_DIFFUSE, attr[MAT_ATTRIB_BACK_DIFFUSE] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_FRONT_SPECULAR) 
 | 
			
		||||
      glMaterialfv( GL_FRONT, GL_SPECULAR, attr[MAT_ATTRIB_FRONT_SPECULAR] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_BACK_SPECULAR) 
 | 
			
		||||
      glMaterialfv( GL_BACK, GL_SPECULAR, attr[MAT_ATTRIB_BACK_SPECULAR] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_FRONT_SHININESS) 
 | 
			
		||||
      glMaterialfv( GL_FRONT, GL_SHININESS, attr[MAT_ATTRIB_FRONT_SHININESS] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_BACK_SHININESS) 
 | 
			
		||||
      glMaterialfv( GL_BACK, GL_SHININESS, attr[MAT_ATTRIB_BACK_SHININESS] );
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_FRONT_INDEXES)
 | 
			
		||||
      glMaterialfv( GL_FRONT, GL_COLOR_INDEXES, attr[MAT_ATTRIB_FRONT_INDEXES]);
 | 
			
		||||
 | 
			
		||||
   if (bitmask & MAT_BIT_BACK_INDEXES) 
 | 
			
		||||
      glMaterialfv( GL_BACK, GL_COLOR_INDEXES, attr[MAT_ATTRIB_BACK_INDEXES] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Low-performance helper function to allow driver-supplied tnl
 | 
			
		||||
 * modules to process tnl display lists.  This is primarily supplied
 | 
			
		||||
 * to avoid fallbacks if CallList is invoked inside a Begin/End pair.
 | 
			
		||||
 * For higher performance, drivers should fallback to tnl (if outside
 | 
			
		||||
 * begin/end), or (for tnl hardware) implement their own display list
 | 
			
		||||
 * mechanism. 
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
loopback_compiled_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   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 i, j, p, length, prim = 0, maxtex = 0;
 | 
			
		||||
   
 | 
			
		||||
   if (orflag & VERT_BITS_OBJ_234)
 | 
			
		||||
      vertex = (void (GLAPIENTRY *)(const GLfloat *)) glVertex4fv;
 | 
			
		||||
   else
 | 
			
		||||
      vertex = (void (GLAPIENTRY *)(const GLfloat *)) glVertex3fv;
 | 
			
		||||
   
 | 
			
		||||
   if (orflag & VERT_BITS_TEX_ANY) {
 | 
			
		||||
      for (j = 0 ; j < ctx->Const.MaxTextureCoordUnits ; j++) {
 | 
			
		||||
	 if (orflag & VERT_BIT_TEX(j)) {
 | 
			
		||||
	    maxtex = j+1;
 | 
			
		||||
	    if ((IM->TexSize & TEX_SIZE_4(j)) == TEX_SIZE_4(j))
 | 
			
		||||
	       texcoordfv[j] = glMultiTexCoord4fvARB;
 | 
			
		||||
	    else if (IM->TexSize & TEX_SIZE_3(j))
 | 
			
		||||
	       texcoordfv[j] = glMultiTexCoord3fvARB;
 | 
			
		||||
	    else
 | 
			
		||||
	       texcoordfv[j] = glMultiTexCoord2fvARB;
 | 
			
		||||
	 }
 | 
			
		||||
      }      
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (p = IM->Start ; !(prim & PRIM_LAST) ; p += length)
 | 
			
		||||
   {
 | 
			
		||||
      prim = IM->Primitive[p];
 | 
			
		||||
      length= IM->PrimitiveLength[p];
 | 
			
		||||
      ASSERT(length || (prim & PRIM_LAST));
 | 
			
		||||
      ASSERT((prim & PRIM_MODE_MASK) <= GL_POLYGON+1);
 | 
			
		||||
 | 
			
		||||
      if (prim & PRIM_BEGIN) {
 | 
			
		||||
	 glBegin(prim & PRIM_MODE_MASK);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      for ( i = p ; i <= p+length ; i++) {
 | 
			
		||||
	 if (flags[i] & VERT_BITS_TEX_ANY) {
 | 
			
		||||
	    GLuint k;
 | 
			
		||||
	    for (k = 0 ; k < maxtex ; k++) {
 | 
			
		||||
	       if (flags[i] & VERT_BIT_TEX(k)) {
 | 
			
		||||
		  texcoordfv[k]( GL_TEXTURE0_ARB + k,
 | 
			
		||||
                                 IM->Attrib[VERT_ATTRIB_TEX0 + k][i] );
 | 
			
		||||
	       }
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
         /* XXX Maybe we should jump through _glapi->Dispatch all the time?? */
 | 
			
		||||
	 if (flags[i] & VERT_BIT_NORMAL) 
 | 
			
		||||
	    glNormal3fv(IM->Attrib[VERT_ATTRIB_NORMAL][i]);
 | 
			
		||||
 | 
			
		||||
	 if (flags[i] & VERT_BIT_COLOR0) 
 | 
			
		||||
	    glColor4fv( IM->Attrib[VERT_ATTRIB_COLOR0][i] );
 | 
			
		||||
 | 
			
		||||
	 if (flags[i] & VERT_BIT_COLOR1)
 | 
			
		||||
	    _glapi_Dispatch->SecondaryColor3fvEXT( IM->Attrib[VERT_ATTRIB_COLOR1][i] );
 | 
			
		||||
 | 
			
		||||
	 if (flags[i] & VERT_BIT_FOG)
 | 
			
		||||
	    _glapi_Dispatch->FogCoordfEXT( IM->Attrib[VERT_ATTRIB_FOG][i][0] );
 | 
			
		||||
 | 
			
		||||
	 if (flags[i] & VERT_BIT_INDEX)
 | 
			
		||||
	    glIndexi( IM->Index[i] );
 | 
			
		||||
 | 
			
		||||
	 if (flags[i] & VERT_BIT_EDGEFLAG)
 | 
			
		||||
	    glEdgeFlag( IM->EdgeFlag[i] );
 | 
			
		||||
 | 
			
		||||
	 if (flags[i] & VERT_BIT_MATERIAL) 
 | 
			
		||||
	    emit_material( &IM->Material[i], IM->MaterialMask[i] );
 | 
			
		||||
 | 
			
		||||
	 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) {
 | 
			
		||||
	 glEnd();
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,44 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  3.5
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _T_DLIST_H
 | 
			
		||||
#define _T_DLIST_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
extern void _tnl_dlist_init( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
extern void _tnl_EndList( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_NewList( GLcontext *ctx, GLuint list, GLenum mode );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_EndCallList( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_BeginCallList( GLcontext *ctx, GLuint list );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,744 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "colormac.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
 | 
			
		||||
#include "math/m_translate.h"
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_imm_elt.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef void (*trans_elt_1ui_func)(GLuint *to,
 | 
			
		||||
				   CONST void *ptr,
 | 
			
		||||
				   GLuint stride,
 | 
			
		||||
				   const GLuint *flags,
 | 
			
		||||
				   const GLuint *elts,
 | 
			
		||||
				   GLuint match,
 | 
			
		||||
				   GLuint start,
 | 
			
		||||
				   GLuint n );
 | 
			
		||||
 | 
			
		||||
typedef void (*trans_elt_1ub_func)(GLubyte *to,
 | 
			
		||||
				   CONST void *ptr,
 | 
			
		||||
				   GLuint stride,
 | 
			
		||||
				   const GLuint *flags,
 | 
			
		||||
				   const GLuint *elts,
 | 
			
		||||
				   GLuint match,
 | 
			
		||||
				   GLuint start,
 | 
			
		||||
				   GLuint n );
 | 
			
		||||
 | 
			
		||||
typedef void (*trans_elt_4f_func)(GLfloat (*to)[4],
 | 
			
		||||
				  CONST void *ptr,
 | 
			
		||||
				  GLuint stride,
 | 
			
		||||
				  const GLuint *flags,
 | 
			
		||||
				  const GLuint *elts,
 | 
			
		||||
				  GLuint match,
 | 
			
		||||
				  GLuint start,
 | 
			
		||||
				  GLuint n );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static trans_elt_1ui_func _tnl_trans_elt_1ui_tab[MAX_TYPES];
 | 
			
		||||
static trans_elt_1ub_func _tnl_trans_elt_1ub_tab[MAX_TYPES];
 | 
			
		||||
static trans_elt_4f_func  _tnl_trans_elt_4f_tab[5][MAX_TYPES];
 | 
			
		||||
static trans_elt_4f_func  _tnl_trans_elt_4fc_tab[5][MAX_TYPES];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define PTR_ELT(ptr, elt) (((SRC *)ptr)[elt])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Code specific to array element implementation.  There is a small
 | 
			
		||||
 * subtlety in the bits CHECK() tests, and the way bits are set in
 | 
			
		||||
 * glArrayElement which ensures that if, eg, in the case that the
 | 
			
		||||
 * vertex array is disabled and normal array is enabled, and we get
 | 
			
		||||
 * either sequence:
 | 
			
		||||
 *
 | 
			
		||||
 * ArrayElement()    OR   Normal()
 | 
			
		||||
 * Normal()               ArrayElement()
 | 
			
		||||
 * Vertex()               Vertex()
 | 
			
		||||
 *
 | 
			
		||||
 * That the correct value for normal is used.
 | 
			
		||||
 */
 | 
			
		||||
#define TAB(x) _tnl_trans_elt##x##_tab
 | 
			
		||||
#define ARGS   const GLuint *flags, const GLuint *elts, GLuint match, \
 | 
			
		||||
               GLuint start, GLuint n
 | 
			
		||||
#define SRC_START  0
 | 
			
		||||
#define DST_START  start
 | 
			
		||||
#define CHECK  if ((flags[i]&match) == VERT_BIT_ELT)
 | 
			
		||||
#define NEXT_F  (void)1
 | 
			
		||||
#define NEXT_F2 f = first + elts[i] * stride;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GL_BYTE
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLbyte
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_BYTE)
 | 
			
		||||
#define TRX_4F(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_4FC(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UB(ub, f,n)  ub = BYTE_TO_UBYTE( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLbyte_elt
 | 
			
		||||
#define DEST_4F trans_4_GLbyte_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLbyte_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLbyte_elt
 | 
			
		||||
#define DEST_4F trans_3_GLbyte_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLbyte_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLbyte_elt
 | 
			
		||||
#define DEST_4F trans_2_GLbyte_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLbyte_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLbyte_elt
 | 
			
		||||
#define DEST_4F trans_1_GLbyte_4f_elt
 | 
			
		||||
#define DEST_4FC trans_1_GLbyte_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLbyte_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLbyte_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
 | 
			
		||||
/* GL_UNSIGNED_BYTE
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLubyte
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_UNSIGNED_BYTE)
 | 
			
		||||
#define TRX_4F(f,n)	     UBYTE_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_4FC(f,n)	     UBYTE_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UB(ub, f,n)	     ub = PTR_ELT(f,n)
 | 
			
		||||
#define TRX_UI(f,n)          (GLuint)PTR_ELT(f,n)
 | 
			
		||||
 | 
			
		||||
/* 4ub->4ub handled in special case below.
 | 
			
		||||
 */
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLubyte_elt
 | 
			
		||||
#define DEST_4F trans_4_GLubyte_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLubyte_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLubyte_elt
 | 
			
		||||
#define DEST_4F trans_3_GLubyte_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLubyte_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLubyte_elt
 | 
			
		||||
#define DEST_4F  trans_1_GLubyte_4f_elt
 | 
			
		||||
#define DEST_4FC  trans_1_GLubyte_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLubyte_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLubyte_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GL_SHORT
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLshort
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_SHORT)
 | 
			
		||||
#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_4FC(f,n)   SHORT_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UB(ub, f,n)  ub = SHORT_TO_UBYTE(PTR_ELT(f,n))
 | 
			
		||||
#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ  4
 | 
			
		||||
#define INIT init_trans_4_GLshort_elt
 | 
			
		||||
#define DEST_4F trans_4_GLshort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLshort_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLshort_elt
 | 
			
		||||
#define DEST_4F trans_3_GLshort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLshort_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLshort_elt
 | 
			
		||||
#define DEST_4F trans_2_GLshort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLshort_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLshort_elt
 | 
			
		||||
#define DEST_4F trans_1_GLshort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_1_GLshort_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLshort_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLshort_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GL_UNSIGNED_SHORT
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLushort
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_UNSIGNED_SHORT)
 | 
			
		||||
#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_4FC(f,n)   USHORT_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UB(ub,f,n)  ub = (GLubyte) (PTR_ELT(f,n) >> 8)
 | 
			
		||||
#define TRX_UI(f,n)  (GLuint)   PTR_ELT(f,n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLushort_elt
 | 
			
		||||
#define DEST_4F trans_4_GLushort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLushort_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLushort_elt
 | 
			
		||||
#define DEST_4F trans_3_GLushort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLushort_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLushort_elt
 | 
			
		||||
#define DEST_4F trans_2_GLushort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLushort_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLushort_elt
 | 
			
		||||
#define DEST_4F trans_1_GLushort_4f_elt
 | 
			
		||||
#define DEST_4FC trans_1_GLushort_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLushort_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLushort_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GL_INT
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLint
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_INT)
 | 
			
		||||
#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_4FC(f,n)   INT_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UB(ub, f,n)  ub = INT_TO_UBYTE(PTR_ELT(f,n))
 | 
			
		||||
#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLint_elt
 | 
			
		||||
#define DEST_4F trans_4_GLint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLint_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLint_elt
 | 
			
		||||
#define DEST_4F trans_3_GLint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLint_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLint_elt
 | 
			
		||||
#define DEST_4F trans_2_GLint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLint_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLint_elt
 | 
			
		||||
#define DEST_4F trans_1_GLint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_1_GLint_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLint_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLint_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GL_UNSIGNED_INT
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLuint
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_UNSIGNED_INT)
 | 
			
		||||
#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_4FC(f,n)   UINT_TO_FLOAT( PTR_ELT(f,n) )
 | 
			
		||||
#define TRX_UB(ub, f,n)  ub = (GLubyte) (PTR_ELT(f,n) >> 24)
 | 
			
		||||
#define TRX_UI(f,n)		PTR_ELT(f,n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLuint_elt
 | 
			
		||||
#define DEST_4F trans_4_GLuint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLuint_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLuint_elt
 | 
			
		||||
#define DEST_4F trans_3_GLuint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLuint_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLuint_elt
 | 
			
		||||
#define DEST_4F trans_2_GLuint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLuint_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLuint_elt
 | 
			
		||||
#define DEST_4F trans_1_GLuint_4f_elt
 | 
			
		||||
#define DEST_4FC trans_1_GLuint_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLuint_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLuint_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GL_DOUBLE
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLdouble
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_DOUBLE)
 | 
			
		||||
#define TRX_4F(f,n)    (GLfloat) PTR_ELT(f,n)
 | 
			
		||||
#define TRX_4FC(f,n)    (GLfloat) PTR_ELT(f,n)
 | 
			
		||||
#define TRX_UB(ub,f,n) UNCLAMPED_FLOAT_TO_UBYTE(ub, PTR_ELT(f,n))
 | 
			
		||||
#define TRX_UI(f,n)    (GLuint) (GLint) PTR_ELT(f,n)
 | 
			
		||||
#define TRX_1F(f,n)    (GLfloat) PTR_ELT(f,n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLdouble_elt
 | 
			
		||||
#define DEST_4F trans_4_GLdouble_4f_elt
 | 
			
		||||
#define DEST_4FC trans_4_GLdouble_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLdouble_elt
 | 
			
		||||
#define DEST_4F trans_3_GLdouble_4f_elt
 | 
			
		||||
#define DEST_4FC trans_3_GLdouble_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLdouble_elt
 | 
			
		||||
#define DEST_4F trans_2_GLdouble_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLdouble_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLdouble_elt
 | 
			
		||||
#define DEST_4F trans_1_GLdouble_4f_elt
 | 
			
		||||
#define DEST_4FC trans_1_GLdouble_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLdouble_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLdouble_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
/* GL_FLOAT
 | 
			
		||||
 */
 | 
			
		||||
#define SRC GLfloat
 | 
			
		||||
#define SRC_IDX TYPE_IDX(GL_FLOAT)
 | 
			
		||||
#define TRX_4F(f,n)    (GLfloat) PTR_ELT(f,n)
 | 
			
		||||
#define TRX_4FC(f,n)    (GLfloat) PTR_ELT(f,n)
 | 
			
		||||
#define TRX_UB(ub,f,n) UNCLAMPED_FLOAT_TO_UBYTE(ub, PTR_ELT(f,n))
 | 
			
		||||
#define TRX_UI(f,n)    (GLuint) (GLint) PTR_ELT(f,n)
 | 
			
		||||
#define TRX_1F(f,n)    (GLfloat) PTR_ELT(f,n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SZ 4
 | 
			
		||||
#define INIT init_trans_4_GLfloat_elt
 | 
			
		||||
#define DEST_4F  trans_4_GLfloat_4f_elt
 | 
			
		||||
#define DEST_4FC  trans_4_GLfloat_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 3
 | 
			
		||||
#define INIT init_trans_3_GLfloat_elt
 | 
			
		||||
#define DEST_4F  trans_3_GLfloat_4f_elt
 | 
			
		||||
#define DEST_4FC  trans_3_GLfloat_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 2
 | 
			
		||||
#define INIT init_trans_2_GLfloat_elt
 | 
			
		||||
#define DEST_4F trans_2_GLfloat_4f_elt
 | 
			
		||||
#define DEST_4FC trans_2_GLfloat_4fc_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#define SZ 1
 | 
			
		||||
#define INIT init_trans_1_GLfloat_elt
 | 
			
		||||
#define DEST_4F  trans_1_GLfloat_4f_elt
 | 
			
		||||
#define DEST_4FC  trans_1_GLfloat_4fc_elt
 | 
			
		||||
#define DEST_1UB trans_1_GLfloat_1ub_elt
 | 
			
		||||
#define DEST_1UI trans_1_GLfloat_1ui_elt
 | 
			
		||||
#include "math/m_trans_tmp.h"
 | 
			
		||||
 | 
			
		||||
#undef SRC
 | 
			
		||||
#undef SRC_IDX
 | 
			
		||||
#undef TRX_4F
 | 
			
		||||
#undef TRX_4FC
 | 
			
		||||
#undef TRX_UB
 | 
			
		||||
#undef TRX_UI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void init_translate_elt(void)
 | 
			
		||||
{
 | 
			
		||||
   MEMSET( TAB(_1ui), 0, sizeof(TAB(_1ui)) );
 | 
			
		||||
   MEMSET( TAB(_1ub), 0, sizeof(TAB(_1ub)) );
 | 
			
		||||
   MEMSET( TAB(_4f),  0, sizeof(TAB(_4f)) );
 | 
			
		||||
   MEMSET( TAB(_4fc),  0, sizeof(TAB(_4fc)) );
 | 
			
		||||
 | 
			
		||||
   init_trans_4_GLbyte_elt();
 | 
			
		||||
   init_trans_3_GLbyte_elt();
 | 
			
		||||
   init_trans_2_GLbyte_elt();
 | 
			
		||||
   init_trans_1_GLbyte_elt();
 | 
			
		||||
   init_trans_1_GLubyte_elt();
 | 
			
		||||
   init_trans_3_GLubyte_elt();
 | 
			
		||||
   init_trans_4_GLubyte_elt();
 | 
			
		||||
   init_trans_4_GLshort_elt();
 | 
			
		||||
   init_trans_3_GLshort_elt();
 | 
			
		||||
   init_trans_2_GLshort_elt();
 | 
			
		||||
   init_trans_1_GLshort_elt();
 | 
			
		||||
   init_trans_4_GLushort_elt();
 | 
			
		||||
   init_trans_3_GLushort_elt();
 | 
			
		||||
   init_trans_2_GLushort_elt();
 | 
			
		||||
   init_trans_1_GLushort_elt();
 | 
			
		||||
   init_trans_4_GLint_elt();
 | 
			
		||||
   init_trans_3_GLint_elt();
 | 
			
		||||
   init_trans_2_GLint_elt();
 | 
			
		||||
   init_trans_1_GLint_elt();
 | 
			
		||||
   init_trans_4_GLuint_elt();
 | 
			
		||||
   init_trans_3_GLuint_elt();
 | 
			
		||||
   init_trans_2_GLuint_elt();
 | 
			
		||||
   init_trans_1_GLuint_elt();
 | 
			
		||||
   init_trans_4_GLdouble_elt();
 | 
			
		||||
   init_trans_3_GLdouble_elt();
 | 
			
		||||
   init_trans_2_GLdouble_elt();
 | 
			
		||||
   init_trans_1_GLdouble_elt();
 | 
			
		||||
   init_trans_4_GLfloat_elt();
 | 
			
		||||
   init_trans_3_GLfloat_elt();
 | 
			
		||||
   init_trans_2_GLfloat_elt();
 | 
			
		||||
   init_trans_1_GLfloat_elt();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#undef TAB
 | 
			
		||||
#undef CLASS
 | 
			
		||||
#undef ARGS
 | 
			
		||||
#undef CHECK
 | 
			
		||||
#ifdef START
 | 
			
		||||
#undef START
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_imm_elt_init( void )
 | 
			
		||||
{
 | 
			
		||||
   init_translate_elt();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void _tnl_trans_elt_1ui(GLuint *to,
 | 
			
		||||
			const struct gl_client_array *from,
 | 
			
		||||
			const GLuint *flags,
 | 
			
		||||
			const GLuint *elts,
 | 
			
		||||
			GLuint match,
 | 
			
		||||
			GLuint start,
 | 
			
		||||
			GLuint n )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
 | 
			
		||||
   _tnl_trans_elt_1ui_tab[TYPE_IDX(from->Type)]( to,
 | 
			
		||||
                                                 fromData,
 | 
			
		||||
                                                 from->StrideB,
 | 
			
		||||
                                                 flags,
 | 
			
		||||
                                                 elts,
 | 
			
		||||
                                                 match,
 | 
			
		||||
                                                 start,
 | 
			
		||||
                                                 n );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void _tnl_trans_elt_1ub(GLubyte *to,
 | 
			
		||||
			const struct gl_client_array *from,
 | 
			
		||||
			const GLuint *flags,
 | 
			
		||||
			const GLuint *elts,
 | 
			
		||||
			GLuint match,
 | 
			
		||||
			GLuint start,
 | 
			
		||||
			GLuint n )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
 | 
			
		||||
   _tnl_trans_elt_1ub_tab[TYPE_IDX(from->Type)]( to,
 | 
			
		||||
                                                 fromData,
 | 
			
		||||
                                                 from->StrideB,
 | 
			
		||||
                                                 flags,
 | 
			
		||||
                                                 elts,
 | 
			
		||||
                                                 match,
 | 
			
		||||
                                                 start,
 | 
			
		||||
                                                 n );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tnl_trans_elt_4f(GLfloat (*to)[4],
 | 
			
		||||
                              const struct gl_client_array *from,
 | 
			
		||||
                              const GLuint *flags,
 | 
			
		||||
                              const GLuint *elts,
 | 
			
		||||
                              GLuint match,
 | 
			
		||||
                              GLuint start,
 | 
			
		||||
                              GLuint n )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
 | 
			
		||||
   _tnl_trans_elt_4f_tab[from->Size][TYPE_IDX(from->Type)]( to,
 | 
			
		||||
					      fromData,
 | 
			
		||||
					      from->StrideB,
 | 
			
		||||
					      flags,
 | 
			
		||||
					      elts,
 | 
			
		||||
					      match,
 | 
			
		||||
					      start,
 | 
			
		||||
					      n );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void _tnl_trans_elt_4fc(GLfloat (*to)[4],
 | 
			
		||||
			       const struct gl_client_array *from,
 | 
			
		||||
			       const GLuint *flags,
 | 
			
		||||
			       const GLuint *elts,
 | 
			
		||||
			       GLuint match,
 | 
			
		||||
			       GLuint start,
 | 
			
		||||
			       GLuint n )
 | 
			
		||||
{
 | 
			
		||||
   GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
 | 
			
		||||
   _tnl_trans_elt_4fc_tab[from->Size][TYPE_IDX(from->Type)]( to,
 | 
			
		||||
					      fromData,
 | 
			
		||||
					      from->StrideB,
 | 
			
		||||
					      flags,
 | 
			
		||||
					      elts,
 | 
			
		||||
					      match,
 | 
			
		||||
					      start,
 | 
			
		||||
					      n );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Batch function to translate away all the array elements in the
 | 
			
		||||
 * input buffer prior to transform.  Done only the first time a vertex
 | 
			
		||||
 * buffer is executed or compiled.
 | 
			
		||||
 *
 | 
			
		||||
 * KW: Have to do this after each glEnd if arrays aren't locked.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_translate_array_elts( GLcontext *ctx, struct immediate *IM,
 | 
			
		||||
				GLuint start, GLuint count )
 | 
			
		||||
{
 | 
			
		||||
   GLuint *flags = IM->Flag;
 | 
			
		||||
   const GLuint *elts = IM->Elt;
 | 
			
		||||
   GLuint translate = ctx->Array._Enabled;
 | 
			
		||||
   GLuint translateConventional;
 | 
			
		||||
   GLuint attr;
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
 | 
			
		||||
      _mesa_debug(ctx, "exec_array_elements %d .. %d\n", start, count);
 | 
			
		||||
 | 
			
		||||
   /* XXX It would be nice to replace this code with a loop over the vertex
 | 
			
		||||
    * attributes but there's a fair number of special cases.
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
   /* Allocate destination attribute arrays if needed */
 | 
			
		||||
   ASSERT(IM->Attrib[VERT_ATTRIB_POS]);
 | 
			
		||||
   for (attr = 1; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
      if ((translate & (1 << attr)) && !IM->Attrib[attr]) {
 | 
			
		||||
         IM->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
         if (!IM->Attrib[attr]) {
 | 
			
		||||
            _mesa_error(ctx, GL_OUT_OF_MEMORY, "vertex processing2");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   translateConventional = translate;
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
    * When vertex program mode is enabled, the generic vertex attribute arrays
 | 
			
		||||
    * have priority over the conventional arrays.  Process those arrays now.
 | 
			
		||||
    * When we're done here, translateConventional will indicate which
 | 
			
		||||
    * conventional arrays still have to be translated when we're done.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->VertexProgram.Enabled) {
 | 
			
		||||
      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
         const GLuint attrBit = 1 << attr;
 | 
			
		||||
         if ((translate & attrBit) && ctx->Array.VertexAttrib[attr].Enabled) {
 | 
			
		||||
            _tnl_trans_elt_4f( IM->Attrib[attr],
 | 
			
		||||
                               &ctx->Array.VertexAttrib[attr],
 | 
			
		||||
                               flags, elts, (VERT_BIT_ELT | attrBit),
 | 
			
		||||
                               start, count);
 | 
			
		||||
            /* special case stuff */
 | 
			
		||||
            if (attr == VERT_ATTRIB_POS) {
 | 
			
		||||
               if (ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Size == 4)
 | 
			
		||||
                  translate |= VERT_BITS_OBJ_234;
 | 
			
		||||
               else if (ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Size == 3)
 | 
			
		||||
                  translate |= VERT_BITS_OBJ_23;
 | 
			
		||||
            }
 | 
			
		||||
            else if (attr >= VERT_ATTRIB_TEX0 && attr <= VERT_ATTRIB_TEX7) {
 | 
			
		||||
               if (ctx->Array.VertexAttrib[attr].Size == 4)
 | 
			
		||||
                  IM->TexSize |= TEX_SIZE_4(attr - VERT_ATTRIB_TEX0);
 | 
			
		||||
               else if (ctx->Array.VertexAttrib[attr].Size == 3)
 | 
			
		||||
                  IM->TexSize |= TEX_SIZE_3(attr - VERT_ATTRIB_TEX0);
 | 
			
		||||
            }
 | 
			
		||||
            /* override the conventional array */
 | 
			
		||||
            translateConventional &= ~attrBit;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
    * Check which conventional arrays are needed.
 | 
			
		||||
    */
 | 
			
		||||
   if (translateConventional & VERT_BIT_POS) {
 | 
			
		||||
      _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_POS],
 | 
			
		||||
                         &ctx->Array.Vertex,
 | 
			
		||||
                         flags, elts, (VERT_BIT_ELT|VERT_BIT_POS),
 | 
			
		||||
                         start, count);
 | 
			
		||||
 | 
			
		||||
      if (ctx->Array.Vertex.Size == 4)
 | 
			
		||||
         translate |= VERT_BITS_OBJ_234;
 | 
			
		||||
      else if (ctx->Array.Vertex.Size == 3)
 | 
			
		||||
         translate |= VERT_BITS_OBJ_23;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (translateConventional & VERT_BIT_NORMAL) {
 | 
			
		||||
      _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_NORMAL],
 | 
			
		||||
                         &ctx->Array.Normal,
 | 
			
		||||
                         flags, elts, (VERT_BIT_ELT|VERT_BIT_NORMAL),
 | 
			
		||||
                         start, count);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (translateConventional & VERT_BIT_COLOR0) {
 | 
			
		||||
      _tnl_trans_elt_4fc( IM->Attrib[VERT_ATTRIB_COLOR0],
 | 
			
		||||
			  &ctx->Array.Color,
 | 
			
		||||
			  flags, elts, (VERT_BIT_ELT|VERT_BIT_COLOR0),
 | 
			
		||||
			  start, count);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (translateConventional & VERT_BIT_COLOR1) {
 | 
			
		||||
      _tnl_trans_elt_4fc( IM->Attrib[VERT_ATTRIB_COLOR1],
 | 
			
		||||
			  &ctx->Array.SecondaryColor,
 | 
			
		||||
			  flags, elts, (VERT_BIT_ELT|VERT_BIT_COLOR1),
 | 
			
		||||
			  start, count);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (translateConventional & VERT_BIT_FOG) {
 | 
			
		||||
      _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_FOG],
 | 
			
		||||
                         &ctx->Array.FogCoord,
 | 
			
		||||
                         flags, elts, (VERT_BIT_ELT|VERT_BIT_FOG),
 | 
			
		||||
                         start, count);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (translateConventional & VERT_BITS_TEX_ANY) {
 | 
			
		||||
      GLuint i;
 | 
			
		||||
      for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
 | 
			
		||||
	 if (translateConventional & VERT_BIT_TEX(i)) {
 | 
			
		||||
            _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_TEX0 + i],
 | 
			
		||||
                               &ctx->Array.TexCoord[i],
 | 
			
		||||
                               flags, elts, (VERT_BIT_ELT|VERT_BIT_TEX(i)),
 | 
			
		||||
                               start, count);
 | 
			
		||||
 | 
			
		||||
            if (ctx->Array.TexCoord[i].Size == 4)
 | 
			
		||||
               IM->TexSize |= TEX_SIZE_4(i);
 | 
			
		||||
            else if (ctx->Array.TexCoord[i].Size == 3)
 | 
			
		||||
               IM->TexSize |= TEX_SIZE_3(i);
 | 
			
		||||
	 }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (translate & VERT_BIT_INDEX)
 | 
			
		||||
      _tnl_trans_elt_1ui( IM->Index,
 | 
			
		||||
			  &ctx->Array.Index,
 | 
			
		||||
			  flags, elts, (VERT_BIT_ELT|VERT_BIT_INDEX),
 | 
			
		||||
			  start, count);
 | 
			
		||||
 | 
			
		||||
   if (translate & VERT_BIT_EDGEFLAG)
 | 
			
		||||
      _tnl_trans_elt_1ub( IM->EdgeFlag,
 | 
			
		||||
			  &ctx->Array.EdgeFlag,
 | 
			
		||||
			  flags, elts, (VERT_BIT_ELT|VERT_BIT_EDGEFLAG),
 | 
			
		||||
			  start, count);
 | 
			
		||||
 | 
			
		||||
   {
 | 
			
		||||
      GLuint i;
 | 
			
		||||
      for (i = start ; i < count ; i++)
 | 
			
		||||
         if (flags[i] & VERT_BIT_ELT)
 | 
			
		||||
            flags[i] |= translate;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   IM->FlushElt = 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  3.5
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_IMM_ELT_H_
 | 
			
		||||
#define _T_IMM_ELT_H_
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern void _tnl_imm_elt_init( void );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_translate_array_elts( GLcontext *ctx,
 | 
			
		||||
				       struct immediate *IM,
 | 
			
		||||
				       GLuint start,
 | 
			
		||||
				       GLuint end );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,868 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 *    Brian Paul - vertex program updates
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "colormac.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "math/m_eval.h"
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_imm_debug.h"
 | 
			
		||||
#include "t_imm_eval.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
#include "t_imm_fixup.h"
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval_points1( GLfloat outcoord[][4],
 | 
			
		||||
			  GLfloat coord[][4],
 | 
			
		||||
			  const GLuint *flags,
 | 
			
		||||
			  GLfloat du, GLfloat u1 )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & VERT_BITS_EVAL_ANY) {
 | 
			
		||||
	 outcoord[i][0] = coord[i][0];
 | 
			
		||||
	 outcoord[i][1] = coord[i][1];
 | 
			
		||||
	 if (flags[i] & VERT_BIT_EVAL_P1)
 | 
			
		||||
	    outcoord[i][0] = coord[i][0] * du + u1;
 | 
			
		||||
      }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void eval_points2( GLfloat outcoord[][4],
 | 
			
		||||
			  GLfloat coord[][4],
 | 
			
		||||
			  const GLuint *flags,
 | 
			
		||||
			  GLfloat du, GLfloat u1,
 | 
			
		||||
			  GLfloat dv, GLfloat v1 )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++) {
 | 
			
		||||
      if (flags[i] & VERT_BITS_EVAL_ANY) {
 | 
			
		||||
	 outcoord[i][0] = coord[i][0];
 | 
			
		||||
	 outcoord[i][1] = coord[i][1];
 | 
			
		||||
	 if (flags[i] & VERT_BIT_EVAL_P2) {
 | 
			
		||||
	    outcoord[i][0] = coord[i][0] * du + u1;
 | 
			
		||||
	    outcoord[i][1] = coord[i][1] * dv + v1;
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const GLubyte dirty_flags[5] = {
 | 
			
		||||
   0,				/* not possible */
 | 
			
		||||
   VEC_DIRTY_0,
 | 
			
		||||
   VEC_DIRTY_1,
 | 
			
		||||
   VEC_DIRTY_2,
 | 
			
		||||
   VEC_DIRTY_3
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval1_4f( GLvector4f *dest,
 | 
			
		||||
		      GLfloat coord[][4],
 | 
			
		||||
		      const GLuint *flags,
 | 
			
		||||
		      GLuint dimension,
 | 
			
		||||
		      const struct gl_1d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   GLfloat (*to)[4] = dest->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 ASSIGN_4V(to[i], 0,0,0,1);
 | 
			
		||||
	 _math_horner_bezier_curve(map->Points, to[i], u,
 | 
			
		||||
				   dimension, map->Order);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   dest->size = MAX2(dest->size, dimension);
 | 
			
		||||
   dest->flags |= dirty_flags[dimension];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* as above, but dest is a gl_client_array */
 | 
			
		||||
static void eval1_4f_ca( struct gl_client_array *dest,
 | 
			
		||||
			 GLfloat coord[][4],
 | 
			
		||||
			 const GLuint *flags,
 | 
			
		||||
			 GLuint dimension,
 | 
			
		||||
			 const struct gl_1d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   GLubyte *destData = ADD_POINTERS(dest->Ptr, dest->BufferObj->Data);
 | 
			
		||||
   GLfloat (*to)[4] = (GLfloat (*)[4]) destData;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   ASSERT(dest->Type == GL_FLOAT);
 | 
			
		||||
   ASSERT(dest->StrideB == 4 * sizeof(GLfloat));
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 ASSIGN_4V(to[i], 0,0,0,1);
 | 
			
		||||
	 _math_horner_bezier_curve(map->Points, to[i], u,
 | 
			
		||||
				   dimension, map->Order);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   dest->Size = MAX2(dest->Size, (GLint) dimension);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval1_1ui( GLvector1ui *dest,
 | 
			
		||||
		       GLfloat coord[][4],
 | 
			
		||||
		       const GLuint *flags,
 | 
			
		||||
		       const struct gl_1d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   GLuint *to = dest->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 GLfloat tmp;
 | 
			
		||||
	 _math_horner_bezier_curve(map->Points, &tmp, u, 1, map->Order);
 | 
			
		||||
	 to[i] = (GLuint) (GLint) tmp;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void eval1_norm( GLvector4f *dest,
 | 
			
		||||
			GLfloat coord[][4],
 | 
			
		||||
			const GLuint *flags,
 | 
			
		||||
			const struct gl_1d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   GLfloat (*to)[4] = dest->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 _math_horner_bezier_curve(map->Points, to[i], u, 3, map->Order);
 | 
			
		||||
      }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval2_obj_norm( GLvector4f *obj_ptr,
 | 
			
		||||
			    GLvector4f *norm_ptr,
 | 
			
		||||
			    GLfloat coord[][4],
 | 
			
		||||
			    GLuint *flags,
 | 
			
		||||
			    GLuint dimension,
 | 
			
		||||
			    const struct gl_2d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   const GLfloat v1 = map->v1;
 | 
			
		||||
   const GLfloat dv = map->dv;
 | 
			
		||||
   GLfloat (*obj)[4] = obj_ptr->data;
 | 
			
		||||
   GLfloat (*normal)[4] = norm_ptr->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 GLfloat v = (coord[i][1] - v1) * dv;
 | 
			
		||||
	 GLfloat du[4], dv[4];
 | 
			
		||||
 | 
			
		||||
	 ASSIGN_4V(obj[i], 0,0,0,1);
 | 
			
		||||
	 _math_de_casteljau_surf(map->Points, obj[i], du, dv, u, v, dimension,
 | 
			
		||||
				 map->Uorder, map->Vorder);
 | 
			
		||||
 | 
			
		||||
	 if (dimension == 4) {
 | 
			
		||||
	    du[0] = du[0]*obj[i][3] - du[3]*obj[i][0];
 | 
			
		||||
	    du[1] = du[1]*obj[i][3] - du[3]*obj[i][1];
 | 
			
		||||
	    du[2] = du[2]*obj[i][3] - du[3]*obj[i][2];
 | 
			
		||||
	 
 | 
			
		||||
	    dv[0] = dv[0]*obj[i][3] - dv[3]*obj[i][0];
 | 
			
		||||
	    dv[1] = dv[1]*obj[i][3] - dv[3]*obj[i][1];
 | 
			
		||||
	    dv[2] = dv[2]*obj[i][3] - dv[3]*obj[i][2];
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 CROSS3(normal[i], du, dv);
 | 
			
		||||
	 NORMALIZE_3FV(normal[i]);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   obj_ptr->size = MAX2(obj_ptr->size, dimension);
 | 
			
		||||
   obj_ptr->flags |= dirty_flags[dimension];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval2_4f( GLvector4f *dest,
 | 
			
		||||
		      GLfloat coord[][4],
 | 
			
		||||
		      const GLuint *flags,
 | 
			
		||||
		      GLuint dimension,
 | 
			
		||||
		      const struct gl_2d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   const GLfloat v1 = map->v1;
 | 
			
		||||
   const GLfloat dv = map->dv;
 | 
			
		||||
   GLfloat (*to)[4] = dest->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 GLfloat v = (coord[i][1] - v1) * dv;
 | 
			
		||||
 | 
			
		||||
	 _math_horner_bezier_surf(map->Points, to[i], u, v, dimension,
 | 
			
		||||
				  map->Uorder, map->Vorder);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   dest->size = MAX2(dest->size, dimension);
 | 
			
		||||
   dest->flags |= dirty_flags[dimension];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* as above, but dest is a gl_client_array */
 | 
			
		||||
static void eval2_4f_ca( struct gl_client_array *dest,
 | 
			
		||||
			 GLfloat coord[][4],
 | 
			
		||||
			 const GLuint *flags,
 | 
			
		||||
			 GLuint dimension,
 | 
			
		||||
			 const struct gl_2d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   const GLfloat v1 = map->v1;
 | 
			
		||||
   const GLfloat dv = map->dv;
 | 
			
		||||
   GLubyte *destData = ADD_POINTERS(dest->Ptr, dest->BufferObj->Data);
 | 
			
		||||
   GLfloat (*to)[4] = (GLfloat (*)[4]) destData;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   ASSERT(dest->Type == GL_FLOAT);
 | 
			
		||||
   ASSERT(dest->StrideB == 4 * sizeof(GLfloat));
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 GLfloat v = (coord[i][1] - v1) * dv;
 | 
			
		||||
	 _math_horner_bezier_surf(map->Points, to[i], u, v, dimension,
 | 
			
		||||
				  map->Uorder, map->Vorder);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   dest->Size = MAX2(dest->Size, (GLint) dimension);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval2_norm( GLvector4f *dest,
 | 
			
		||||
			GLfloat coord[][4],
 | 
			
		||||
			GLuint *flags,
 | 
			
		||||
			const struct gl_2d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   const GLfloat v1 = map->v1;
 | 
			
		||||
   const GLfloat dv = map->dv;
 | 
			
		||||
   GLfloat (*to)[4] = dest->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++) {
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 GLfloat v = (coord[i][1] - v1) * dv;
 | 
			
		||||
	 _math_horner_bezier_surf(map->Points, to[i], u, v, 3,
 | 
			
		||||
				  map->Uorder, map->Vorder);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void eval2_1ui( GLvector1ui *dest,
 | 
			
		||||
		       GLfloat coord[][4],
 | 
			
		||||
		       const GLuint *flags,
 | 
			
		||||
		       const struct gl_2d_map *map )
 | 
			
		||||
{
 | 
			
		||||
   const GLfloat u1 = map->u1;
 | 
			
		||||
   const GLfloat du = map->du;
 | 
			
		||||
   const GLfloat v1 = map->v1;
 | 
			
		||||
   const GLfloat dv = map->dv;
 | 
			
		||||
   GLuint *to = dest->data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
 | 
			
		||||
      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
 | 
			
		||||
	 GLfloat u = (coord[i][0] - u1) * du;
 | 
			
		||||
	 GLfloat v = (coord[i][1] - v1) * dv;
 | 
			
		||||
	 GLfloat tmp;
 | 
			
		||||
	 _math_horner_bezier_surf(map->Points, &tmp, u, v, 1,
 | 
			
		||||
				  map->Uorder, map->Vorder);
 | 
			
		||||
 | 
			
		||||
	 to[i] = (GLuint) (GLint) tmp;
 | 
			
		||||
      }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void copy_4f( GLfloat to[][4], GLfloat from[][4], GLuint count )
 | 
			
		||||
{
 | 
			
		||||
   MEMCPY( to, from, count * sizeof(to[0]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void copy_4f_stride( GLfloat to[][4], const GLfloat *from, 
 | 
			
		||||
			    GLuint stride, GLuint count )
 | 
			
		||||
{
 | 
			
		||||
   if (stride == 4 * sizeof(GLfloat))
 | 
			
		||||
      MEMCPY( to, from, count * sizeof(to[0]));
 | 
			
		||||
   else {
 | 
			
		||||
      GLuint i;
 | 
			
		||||
      for (i = 0 ; i < count ; i++, STRIDE_F(from, stride))
 | 
			
		||||
	 COPY_4FV( to[i], from );
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void copy_3f( GLfloat to[][4], GLfloat from[][4], GLuint count )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   for (i = 0 ; i < count ; i++) {
 | 
			
		||||
      COPY_3FV(to[i], from[i]);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void copy_1ui( GLuint to[], const GLuint from[], GLuint count )
 | 
			
		||||
{
 | 
			
		||||
   MEMCPY( to, from, (count) * sizeof(to[0]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Translate eval enabled flags to VERT_* flags.
 | 
			
		||||
 */
 | 
			
		||||
static void update_eval( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLuint eval1 = 0, eval2 = 0;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map1Index)
 | 
			
		||||
      eval1 |= VERT_BIT_INDEX;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map2Index)
 | 
			
		||||
      eval2 |= VERT_BIT_INDEX;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map1Color4)
 | 
			
		||||
      eval1 |= VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map2Color4)
 | 
			
		||||
      eval2 |= VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map1Normal)
 | 
			
		||||
      eval1 |= VERT_BIT_NORMAL;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map2Normal)
 | 
			
		||||
      eval2 |= VERT_BIT_NORMAL;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map1TextureCoord4 ||
 | 
			
		||||
       ctx->Eval.Map1TextureCoord3 ||
 | 
			
		||||
       ctx->Eval.Map1TextureCoord2 ||
 | 
			
		||||
       ctx->Eval.Map1TextureCoord1)
 | 
			
		||||
      eval1 |= VERT_BIT_TEX0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map2TextureCoord4 ||
 | 
			
		||||
       ctx->Eval.Map2TextureCoord3 ||
 | 
			
		||||
       ctx->Eval.Map2TextureCoord2 ||
 | 
			
		||||
       ctx->Eval.Map2TextureCoord1)
 | 
			
		||||
      eval2 |= VERT_BIT_TEX0;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map1Vertex4)
 | 
			
		||||
      eval1 |= VERT_BITS_OBJ_234;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map1Vertex3)
 | 
			
		||||
      eval1 |= VERT_BITS_OBJ_23;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Eval.Map2Vertex4) {
 | 
			
		||||
      if (ctx->Eval.AutoNormal)
 | 
			
		||||
	 eval2 |= VERT_BITS_OBJ_234 | VERT_BIT_NORMAL;
 | 
			
		||||
      else
 | 
			
		||||
	 eval2 |= VERT_BITS_OBJ_234;
 | 
			
		||||
   }
 | 
			
		||||
   else if (ctx->Eval.Map2Vertex3) {
 | 
			
		||||
      if (ctx->Eval.AutoNormal)
 | 
			
		||||
	 eval2 |= VERT_BITS_OBJ_23 | VERT_BIT_NORMAL;
 | 
			
		||||
      else
 | 
			
		||||
	 eval2 |= VERT_BITS_OBJ_23;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   tnl->eval.EvalMap1Flags = eval1;
 | 
			
		||||
   tnl->eval.EvalMap2Flags = eval2;
 | 
			
		||||
 | 
			
		||||
   /* GL_NV_vertex_program evaluators */
 | 
			
		||||
   eval1 = eval2 = 0;
 | 
			
		||||
   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
 | 
			
		||||
      if (ctx->Eval.Map1Attrib[i])
 | 
			
		||||
         eval1 |= (1 << i);
 | 
			
		||||
      if (ctx->Eval.Map2Attrib[i])
 | 
			
		||||
         eval2 |= (1 << i);
 | 
			
		||||
   }
 | 
			
		||||
   tnl->eval.EvalMap1AttribFlags = eval1;
 | 
			
		||||
   tnl->eval.EvalMap2AttribFlags = eval2;
 | 
			
		||||
 | 
			
		||||
   tnl->eval.EvalNewState = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* This looks a lot like a pipeline stage, but for various reasons is
 | 
			
		||||
 * better handled outside the pipeline, and considered the final stage
 | 
			
		||||
 * of fixing up an immediate struct for execution.
 | 
			
		||||
 *
 | 
			
		||||
 * Really want to cache the results of this function in display lists,
 | 
			
		||||
 * at least for EvalMesh commands.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_eval_immediate( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_arrays *tmp = &tnl->imm_inputs;
 | 
			
		||||
   struct immediate *store = tnl->eval.im;
 | 
			
		||||
   GLuint *flags = IM->Flag + IM->CopyStart;
 | 
			
		||||
   GLuint copycount;
 | 
			
		||||
   GLuint orflag = IM->OrFlag;
 | 
			
		||||
   GLuint any_eval1 = orflag & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1);
 | 
			
		||||
   GLuint any_eval2 = orflag & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2);
 | 
			
		||||
   GLuint req = 0;
 | 
			
		||||
   GLuint purge_flags = 0;
 | 
			
		||||
   GLfloat (*coord)[4] = IM->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
 | 
			
		||||
   GLuint attr;
 | 
			
		||||
 | 
			
		||||
   if (IM->AndFlag & VERT_BITS_EVAL_ANY)
 | 
			
		||||
      copycount = IM->Start - IM->CopyStart; /* just copy copied vertices */
 | 
			
		||||
   else
 | 
			
		||||
      copycount = IM->Count - IM->CopyStart; /* copy all vertices */
 | 
			
		||||
 | 
			
		||||
   if (!store)
 | 
			
		||||
      store = tnl->eval.im = _tnl_alloc_immediate( ctx );
 | 
			
		||||
 | 
			
		||||
   if (tnl->eval.EvalNewState & _NEW_EVAL)
 | 
			
		||||
      update_eval( ctx );
 | 
			
		||||
 | 
			
		||||
   if (any_eval1) {
 | 
			
		||||
      req |= tnl->pipeline.inputs
 | 
			
		||||
         & (tnl->eval.EvalMap1Flags | tnl->eval.EvalMap1AttribFlags);
 | 
			
		||||
 | 
			
		||||
      if (!ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3 &&
 | 
			
		||||
          !ctx->Eval.Map1Attrib[0])
 | 
			
		||||
	 purge_flags = (VERT_BIT_EVAL_P1|VERT_BIT_EVAL_C1);
 | 
			
		||||
 | 
			
		||||
      if (orflag & VERT_BIT_EVAL_P1) {
 | 
			
		||||
	 eval_points1( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart, 
 | 
			
		||||
		       coord, flags,
 | 
			
		||||
		       ctx->Eval.MapGrid1du,
 | 
			
		||||
		       ctx->Eval.MapGrid1u1);
 | 
			
		||||
	 
 | 
			
		||||
	 coord = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (any_eval2) {
 | 
			
		||||
      req |= tnl->pipeline.inputs
 | 
			
		||||
         & (tnl->eval.EvalMap2Flags | tnl->eval.EvalMap2AttribFlags);
 | 
			
		||||
 | 
			
		||||
      if (!ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3 &&
 | 
			
		||||
          !ctx->Eval.Map2Attrib[0])
 | 
			
		||||
	 purge_flags |= (VERT_BIT_EVAL_P2|VERT_BIT_EVAL_C2);
 | 
			
		||||
 | 
			
		||||
      if (orflag & VERT_BIT_EVAL_P2) {
 | 
			
		||||
	 eval_points2( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart, 
 | 
			
		||||
		       coord, flags,
 | 
			
		||||
		       ctx->Eval.MapGrid2du,
 | 
			
		||||
		       ctx->Eval.MapGrid2u1,
 | 
			
		||||
		       ctx->Eval.MapGrid2dv,
 | 
			
		||||
		       ctx->Eval.MapGrid2v1 );
 | 
			
		||||
 | 
			
		||||
	 coord = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Allocate vertex attribute storage now */
 | 
			
		||||
   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
      if ((req & (1 << attr)) && !store->Attrib[attr]) {
 | 
			
		||||
         store->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
         if (!store->Attrib[attr]) {
 | 
			
		||||
            _mesa_error(ctx, GL_OUT_OF_MEMORY, "evaluator processing");
 | 
			
		||||
            return;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Perform the evaluations on active data elements.
 | 
			
		||||
    */
 | 
			
		||||
   if (req & VERT_BIT_INDEX) {
 | 
			
		||||
      GLuint generated = 0;
 | 
			
		||||
 | 
			
		||||
      if (copycount)
 | 
			
		||||
	 copy_1ui( store->Index + IM->CopyStart, tmp->Index.data, copycount );
 | 
			
		||||
 | 
			
		||||
      tmp->Index.data = store->Index + IM->CopyStart;
 | 
			
		||||
      tmp->Index.start = store->Index + IM->CopyStart;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Eval.Map1Index && any_eval1) {
 | 
			
		||||
	 eval1_1ui( &tmp->Index, coord, flags, &ctx->EvalMap.Map1Index );
 | 
			
		||||
	 generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (ctx->Eval.Map2Index && any_eval2) {
 | 
			
		||||
	 eval2_1ui( &tmp->Index, coord, flags, &ctx->EvalMap.Map2Index );
 | 
			
		||||
	 generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (req & VERT_BIT_COLOR0) {
 | 
			
		||||
      GLuint generated = 0;
 | 
			
		||||
 | 
			
		||||
      if (copycount) {
 | 
			
		||||
         GLubyte *destData = ADD_POINTERS(tmp->Color.Ptr, tmp->Color.BufferObj->Data);
 | 
			
		||||
         copy_4f_stride( store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart, 
 | 
			
		||||
                         (GLfloat *) destData,
 | 
			
		||||
                         tmp->Color.StrideB,
 | 
			
		||||
                         copycount );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      tmp->Color.Ptr = (GLubyte *) (store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart);
 | 
			
		||||
      tmp->Color.StrideB = 4 * sizeof(GLfloat);
 | 
			
		||||
      tmp->Color.Flags = 0;
 | 
			
		||||
      tnl->vb.importable_data &= ~VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
      if (ctx->VertexProgram.Enabled) {
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_COLOR0].data =
 | 
			
		||||
            store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart;
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_COLOR0].start =
 | 
			
		||||
            (GLfloat *) tmp->Attribs[VERT_ATTRIB_COLOR0].data;
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_COLOR0].size = 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* Vertex program maps have priority over conventional attribs */
 | 
			
		||||
      if (any_eval1) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled
 | 
			
		||||
             && ctx->Eval.Map1Attrib[VERT_ATTRIB_COLOR0]) {
 | 
			
		||||
            eval1_4f_ca( &tmp->Color, coord, flags, 4,
 | 
			
		||||
                         &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
         }
 | 
			
		||||
         else if (ctx->Eval.Map1Color4) {
 | 
			
		||||
            eval1_4f_ca( &tmp->Color, coord, flags, 4,
 | 
			
		||||
                         &ctx->EvalMap.Map1Color4 );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (any_eval2) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled
 | 
			
		||||
             && ctx->Eval.Map2Attrib[VERT_ATTRIB_COLOR0]) {
 | 
			
		||||
            eval2_4f_ca( &tmp->Color, coord, flags, 4,
 | 
			
		||||
                         &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
         }
 | 
			
		||||
         else if (ctx->Eval.Map2Color4) {
 | 
			
		||||
            eval2_4f_ca( &tmp->Color, coord, flags, 4,
 | 
			
		||||
                         &ctx->EvalMap.Map2Color4 );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (req & VERT_BIT_TEX0) {
 | 
			
		||||
      GLuint generated = 0;
 | 
			
		||||
 | 
			
		||||
      if (copycount)
 | 
			
		||||
	 copy_4f( store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart, 
 | 
			
		||||
		  tmp->TexCoord[0].data, copycount );
 | 
			
		||||
      else
 | 
			
		||||
	 tmp->TexCoord[0].size = 0;
 | 
			
		||||
 | 
			
		||||
      tmp->TexCoord[0].data = store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart;
 | 
			
		||||
      tmp->TexCoord[0].start = (GLfloat *)tmp->TexCoord[0].data;
 | 
			
		||||
 | 
			
		||||
      if (ctx->VertexProgram.Enabled) {
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_TEX0].data =
 | 
			
		||||
            store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart;
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_TEX0].start =
 | 
			
		||||
            (GLfloat *) tmp->Attribs[VERT_ATTRIB_TEX0].data;
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_TEX0].size = 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* Vertex program maps have priority over conventional attribs */
 | 
			
		||||
      if (any_eval1) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled
 | 
			
		||||
             && ctx->Eval.Map1Attrib[VERT_ATTRIB_TEX0]) {
 | 
			
		||||
	    eval1_4f( &tmp->TexCoord[0], coord, flags, 4,
 | 
			
		||||
		      &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_TEX0] );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
         }
 | 
			
		||||
	 else if (ctx->Eval.Map1TextureCoord4) {
 | 
			
		||||
	    eval1_4f( &tmp->TexCoord[0], coord, flags, 4,
 | 
			
		||||
		      &ctx->EvalMap.Map1Texture4 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map1TextureCoord3) {
 | 
			
		||||
	    eval1_4f( &tmp->TexCoord[0], coord, flags, 3,
 | 
			
		||||
		      &ctx->EvalMap.Map1Texture3 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map1TextureCoord2) {
 | 
			
		||||
	    eval1_4f( &tmp->TexCoord[0], coord, flags, 2,
 | 
			
		||||
		      &ctx->EvalMap.Map1Texture2 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map1TextureCoord1) {
 | 
			
		||||
	    eval1_4f( &tmp->TexCoord[0], coord, flags, 1,
 | 
			
		||||
		      &ctx->EvalMap.Map1Texture1 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (any_eval2) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled
 | 
			
		||||
             && ctx->Eval.Map2Attrib[VERT_ATTRIB_TEX0]) {
 | 
			
		||||
	    eval2_4f( &tmp->TexCoord[0], coord, flags, 4,
 | 
			
		||||
		      &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_TEX0] );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
         }
 | 
			
		||||
	 else if (ctx->Eval.Map2TextureCoord4) {
 | 
			
		||||
	    eval2_4f( &tmp->TexCoord[0], coord, flags, 4,
 | 
			
		||||
		      &ctx->EvalMap.Map2Texture4 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map2TextureCoord3) {
 | 
			
		||||
	    eval2_4f( &tmp->TexCoord[0], coord, flags, 3,
 | 
			
		||||
		      &ctx->EvalMap.Map2Texture3 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map2TextureCoord2) {
 | 
			
		||||
	    eval2_4f( &tmp->TexCoord[0], coord, flags, 2,
 | 
			
		||||
		      &ctx->EvalMap.Map2Texture2 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map2TextureCoord1) {
 | 
			
		||||
	    eval2_4f( &tmp->TexCoord[0], coord, flags, 1,
 | 
			
		||||
		      &ctx->EvalMap.Map2Texture1 );
 | 
			
		||||
	    generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (req & VERT_BIT_NORMAL) {
 | 
			
		||||
      GLuint generated = 0;
 | 
			
		||||
 | 
			
		||||
      if (copycount) {
 | 
			
		||||
	 copy_3f( store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart,
 | 
			
		||||
                  tmp->Normal.data, copycount );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      tmp->Normal.data = store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart;
 | 
			
		||||
      tmp->Normal.start = (GLfloat *)tmp->Normal.data;
 | 
			
		||||
 | 
			
		||||
      if (ctx->VertexProgram.Enabled) {
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_NORMAL].data =
 | 
			
		||||
            store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart;
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_NORMAL].start =
 | 
			
		||||
            (GLfloat *) tmp->Attribs[VERT_ATTRIB_NORMAL].data;
 | 
			
		||||
         tmp->Attribs[VERT_ATTRIB_NORMAL].size = 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (any_eval1) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled &&
 | 
			
		||||
             ctx->Eval.Map1Attrib[VERT_ATTRIB_NORMAL]) {
 | 
			
		||||
            eval1_norm( &tmp->Normal, coord, flags,
 | 
			
		||||
                        &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_NORMAL] );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
         }
 | 
			
		||||
         else if (ctx->Eval.Map1Normal) {
 | 
			
		||||
            eval1_norm( &tmp->Normal, coord, flags, &ctx->EvalMap.Map1Normal );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (any_eval2) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled &&
 | 
			
		||||
             ctx->Eval.Map2Attrib[VERT_ATTRIB_NORMAL]) {
 | 
			
		||||
            eval2_norm( &tmp->Normal, coord, flags,
 | 
			
		||||
                        &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_NORMAL] );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
         }
 | 
			
		||||
         else if (ctx->Eval.Map2Normal) {
 | 
			
		||||
            eval2_norm( &tmp->Normal, coord, flags, &ctx->EvalMap.Map2Normal );
 | 
			
		||||
            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* In the AutoNormal case, the copy and assignment of tmp->NormalPtr
 | 
			
		||||
    * are done above.
 | 
			
		||||
    */
 | 
			
		||||
   if (req & VERT_BIT_POS) {
 | 
			
		||||
      if (copycount) {
 | 
			
		||||
	 /* This copy may already have occurred when eliminating
 | 
			
		||||
	  * glEvalPoint calls:
 | 
			
		||||
	  */
 | 
			
		||||
	 if (coord != store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart) {
 | 
			
		||||
	    copy_4f( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart,
 | 
			
		||||
                     tmp->Obj.data, copycount );
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
	 tmp->Obj.size = 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      tmp->Obj.data = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
 | 
			
		||||
      tmp->Obj.start = (GLfloat *) tmp->Obj.data;
 | 
			
		||||
 | 
			
		||||
#if 1
 | 
			
		||||
      /*tmp->Attribs[0].count = count;*/
 | 
			
		||||
      tmp->Attribs[0].data = store->Attrib[0] + IM->CopyStart;
 | 
			
		||||
      tmp->Attribs[0].start = (GLfloat *) tmp->Attribs[0].data;
 | 
			
		||||
      tmp->Attribs[0].size = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
      /* Note: Normal data is already prepared above.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      if (any_eval1) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled &&
 | 
			
		||||
             ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]) {
 | 
			
		||||
	    eval1_4f( &tmp->Obj, coord, flags, 4,
 | 
			
		||||
		      &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_POS] );
 | 
			
		||||
         }
 | 
			
		||||
	 else if (ctx->Eval.Map1Vertex4) {
 | 
			
		||||
	    eval1_4f( &tmp->Obj, coord, flags, 4,
 | 
			
		||||
		      &ctx->EvalMap.Map1Vertex4 );
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map1Vertex3) {
 | 
			
		||||
	    eval1_4f( &tmp->Obj, coord, flags, 3,
 | 
			
		||||
		      &ctx->EvalMap.Map1Vertex3 );
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (any_eval2) {
 | 
			
		||||
         if (ctx->VertexProgram.Enabled &&
 | 
			
		||||
             ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]) {
 | 
			
		||||
	    if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
 | 
			
		||||
	       eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 4,
 | 
			
		||||
			       &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_POS] );
 | 
			
		||||
	    else
 | 
			
		||||
	       eval2_4f( &tmp->Obj, coord, flags, 4,
 | 
			
		||||
			 &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_POS] );
 | 
			
		||||
         }
 | 
			
		||||
	 else if (ctx->Eval.Map2Vertex4) {
 | 
			
		||||
	    if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
 | 
			
		||||
	       eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 4,
 | 
			
		||||
			       &ctx->EvalMap.Map2Vertex4 );
 | 
			
		||||
	    else
 | 
			
		||||
	       eval2_4f( &tmp->Obj, coord, flags, 4,
 | 
			
		||||
			 &ctx->EvalMap.Map2Vertex4 );
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (ctx->Eval.Map2Vertex3) {
 | 
			
		||||
	    if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
 | 
			
		||||
	       eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 3,
 | 
			
		||||
			       &ctx->EvalMap.Map2Vertex3 );
 | 
			
		||||
	    else
 | 
			
		||||
	       eval2_4f( &tmp->Obj, coord, flags, 3,
 | 
			
		||||
			 &ctx->EvalMap.Map2Vertex3 );
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   if (ctx->VertexProgram.Enabled) {
 | 
			
		||||
      /* We already evaluated position, normal, color and texture 0 above.
 | 
			
		||||
       * now evaluate any other generic attributes.
 | 
			
		||||
       */
 | 
			
		||||
      const GLuint skipBits = (VERT_BIT_POS |
 | 
			
		||||
                               VERT_BIT_NORMAL |
 | 
			
		||||
                               VERT_BIT_COLOR0 |
 | 
			
		||||
                               VERT_BIT_TEX0);
 | 
			
		||||
      GLuint generated = 0;
 | 
			
		||||
      GLuint attr;
 | 
			
		||||
      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
         if ((1 << attr) & req & ~skipBits) {
 | 
			
		||||
            if (any_eval1 && ctx->Eval.Map1Attrib[attr]) {
 | 
			
		||||
               /* evaluate 1-D vertex attrib map [i] */
 | 
			
		||||
               eval1_4f( &tmp->Attribs[attr], coord, flags, 4,
 | 
			
		||||
                         &ctx->EvalMap.Map1Attrib[attr] );
 | 
			
		||||
               generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
            }
 | 
			
		||||
            if (any_eval2 && ctx->Eval.Map2Attrib[attr]) {
 | 
			
		||||
               /* evaluate 2-D vertex attrib map [i] */
 | 
			
		||||
               eval2_4f( &tmp->Attribs[attr], coord, flags, 4,
 | 
			
		||||
                         &ctx->EvalMap.Map2Attrib[attr] );
 | 
			
		||||
               generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Calculate new IM->Elts, IM->Primitive, IM->PrimitiveLength for
 | 
			
		||||
    * the case where vertex maps are not enabled for some received
 | 
			
		||||
    * eval coordinates.  In this case those slots in the immediate
 | 
			
		||||
    * must be ignored.
 | 
			
		||||
    */
 | 
			
		||||
   if (purge_flags) {
 | 
			
		||||
      const GLuint vertex = VERT_BIT_POS|(VERT_BITS_EVAL_ANY & ~purge_flags);
 | 
			
		||||
      GLuint last_new_prim = 0;
 | 
			
		||||
      GLuint new_prim_length = 0;
 | 
			
		||||
      GLuint next_old_prim = 0;
 | 
			
		||||
      struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
      const GLuint count = VB->Count;
 | 
			
		||||
      GLuint i, j;
 | 
			
		||||
 | 
			
		||||
      for (i = 0, j = 0 ; i < count ; i++) {
 | 
			
		||||
	 if (flags[i] & vertex) {
 | 
			
		||||
	    store->Elt[j++] = i;
 | 
			
		||||
	    new_prim_length++;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (i == next_old_prim) {
 | 
			
		||||
	    next_old_prim += VB->PrimitiveLength[i];
 | 
			
		||||
	    VB->PrimitiveLength[last_new_prim] = new_prim_length;
 | 
			
		||||
	    VB->Primitive[j] = VB->Primitive[i];
 | 
			
		||||
	    last_new_prim = j;
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      VB->Elts = store->Elt;
 | 
			
		||||
      _tnl_get_purged_copy_verts( ctx, store );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Produce new flags array:
 | 
			
		||||
    */
 | 
			
		||||
   {
 | 
			
		||||
      const GLuint count = tnl->vb.Count + 1;
 | 
			
		||||
      GLuint i;
 | 
			
		||||
 | 
			
		||||
      copy_1ui( store->Flag, flags, count );
 | 
			
		||||
      tnl->vb.Flag = store->Flag;
 | 
			
		||||
      for (i = 0 ; i < count ; i++)
 | 
			
		||||
	 store->Flag[i] |= req;
 | 
			
		||||
      IM->Evaluated = req;	/* hack for copying. */
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  3.5
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2001  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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_IMM_EVAL_H
 | 
			
		||||
#define _T_IMM_EVAL_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
extern void _tnl_eval_init( void );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_eval_immediate( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,586 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file tnl/t_imm_exec.c
 | 
			
		||||
 * \brief Setup to execute immediate-mode vertex data.
 | 
			
		||||
 * \author Keith Whitwell
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "colormac.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "enums.h"
 | 
			
		||||
#include "dlist.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "light.h"
 | 
			
		||||
#include "state.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
 | 
			
		||||
#include "math/m_matrix.h"
 | 
			
		||||
#include "math/m_xform.h"
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_array_import.h"
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
#include "t_imm_api.h"
 | 
			
		||||
#include "t_imm_debug.h"
 | 
			
		||||
#include "t_imm_dlist.h"
 | 
			
		||||
#include "t_imm_eval.h"
 | 
			
		||||
#include "t_imm_elt.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
#include "t_imm_fixup.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void reset_input( GLcontext *ctx,
 | 
			
		||||
			 GLuint start,
 | 
			
		||||
			 GLuint beginstate,
 | 
			
		||||
			 GLuint savedbeginstate )
 | 
			
		||||
{
 | 
			
		||||
   struct immediate *IM = TNL_CURRENT_IM(ctx);
 | 
			
		||||
 | 
			
		||||
   /* Clear the dirty part of the flag array.
 | 
			
		||||
    */
 | 
			
		||||
   if (start < IM->Count+2)
 | 
			
		||||
      MEMSET(IM->Flag + start, 0, sizeof(GLuint) * (IM->Count+2-start));
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
 | 
			
		||||
      _mesa_debug(ctx, "reset_input: IM(%d) new %x\n", IM->id, beginstate);
 | 
			
		||||
 | 
			
		||||
   IM->Start = start;
 | 
			
		||||
   IM->Count = start;
 | 
			
		||||
   IM->LastMaterial = start;
 | 
			
		||||
   IM->BeginState = beginstate;
 | 
			
		||||
   IM->SavedBeginState = savedbeginstate;
 | 
			
		||||
   IM->TexSize = 0;
 | 
			
		||||
   IM->MaterialOrMask = 0;
 | 
			
		||||
 | 
			
		||||
   if (IM->MaterialMask) 
 | 
			
		||||
      IM->MaterialMask[IM->Start] = 0;
 | 
			
		||||
 | 
			
		||||
   IM->ArrayEltFlags = ~ctx->Array._Enabled;
 | 
			
		||||
   IM->ArrayEltIncr = (ctx->Array.Vertex.Enabled ||
 | 
			
		||||
                       (ctx->VertexProgram.Enabled &&
 | 
			
		||||
                        ctx->Array.VertexAttrib[0].Enabled)) ? 1 : 0;
 | 
			
		||||
   IM->ArrayEltFlush = ctx->Array.LockCount ? FLUSH_ELT_LAZY : FLUSH_ELT_EAGER;
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
void _tnl_reset_exec_input( GLcontext *ctx,
 | 
			
		||||
			    GLuint start,
 | 
			
		||||
			    GLuint beginstate,
 | 
			
		||||
			    GLuint savedbeginstate )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct immediate *IM = TNL_CURRENT_IM(ctx);
 | 
			
		||||
 | 
			
		||||
   reset_input( ctx, start, beginstate, savedbeginstate );
 | 
			
		||||
 | 
			
		||||
   IM->CopyStart = start - tnl->ExecCopyCount;
 | 
			
		||||
 | 
			
		||||
   IM->Primitive[IM->CopyStart] = ctx->Driver.CurrentExecPrimitive;
 | 
			
		||||
   if (tnl->ExecParity)
 | 
			
		||||
      IM->Primitive[IM->CopyStart] |= PRIM_PARITY;
 | 
			
		||||
 | 
			
		||||
   IM->LastPrimitive = IM->CopyStart;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_reset_compile_input( GLcontext *ctx,
 | 
			
		||||
			    GLuint start,
 | 
			
		||||
			    GLuint beginstate,
 | 
			
		||||
			    GLuint savedbeginstate )
 | 
			
		||||
{
 | 
			
		||||
   struct immediate *IM = TNL_CURRENT_IM(ctx);
 | 
			
		||||
 | 
			
		||||
   reset_input( ctx, start, beginstate, savedbeginstate );
 | 
			
		||||
   IM->CopyStart = start;
 | 
			
		||||
   IM->LastPrimitive = IM->Start;
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Copy the last specified normal, color, texcoord, edge flag, etc
 | 
			
		||||
 * from the immediate struct into the ctx->Current attribute group.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_copy_to_current( GLcontext *ctx, struct immediate *IM,
 | 
			
		||||
			   GLuint flag, GLuint count )
 | 
			
		||||
{
 | 
			
		||||
   GLuint attr;
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
 | 
			
		||||
      _tnl_print_vert_flags("copy to current", flag);
 | 
			
		||||
 | 
			
		||||
   for (attr = 1; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
      if ((flag & (1 << attr)) && IM->Attrib[attr]) {
 | 
			
		||||
         COPY_4FV(ctx->Current.Attrib[attr], IM->Attrib[attr][count]);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* special cases */
 | 
			
		||||
   if (flag & VERT_BIT_INDEX)
 | 
			
		||||
      ctx->Current.Index = IM->Index[count];
 | 
			
		||||
 | 
			
		||||
   if (flag & VERT_BIT_EDGEFLAG)
 | 
			
		||||
      ctx->Current.EdgeFlag = IM->EdgeFlag[count];
 | 
			
		||||
 | 
			
		||||
   if ((flag & VERT_BIT_COLOR0) && ctx->Light.ColorMaterialEnabled) {
 | 
			
		||||
      _mesa_update_color_material(ctx,
 | 
			
		||||
                                  ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
 | 
			
		||||
      TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (flag & VERT_BIT_MATERIAL) {
 | 
			
		||||
      _mesa_copy_materials( &ctx->Light.Material,
 | 
			
		||||
			    &IM->Material[IM->LastMaterial],
 | 
			
		||||
			    IM->MaterialOrMask );
 | 
			
		||||
 | 
			
		||||
      _mesa_update_material( ctx, IM->MaterialOrMask );
 | 
			
		||||
 | 
			
		||||
      TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_compute_orflag( struct immediate *IM, GLuint start )
 | 
			
		||||
{
 | 
			
		||||
   GLuint count = IM->Count;
 | 
			
		||||
   GLuint orflag = 0;
 | 
			
		||||
   GLuint andflag = ~0U;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   IM->LastData = count-1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Compute the flags for the whole buffer.
 | 
			
		||||
    */
 | 
			
		||||
   for (i = start ; i < count ; i++) {
 | 
			
		||||
      andflag &= IM->Flag[i];
 | 
			
		||||
      orflag |= IM->Flag[i];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* It is possible there will be data in the buffer arising from
 | 
			
		||||
    * calls like 'glNormal', 'glMaterial' that occur after the final
 | 
			
		||||
    * glVertex, glEval, etc.  Additionally, a buffer can consist of
 | 
			
		||||
    * eg. a single glMaterial call, in which case IM->Start ==
 | 
			
		||||
    * IM->Count, but the buffer is definitely not empty.
 | 
			
		||||
    */
 | 
			
		||||
   if (IM->Flag[i] & VERT_BITS_DATA) {
 | 
			
		||||
      IM->LastData++;
 | 
			
		||||
      orflag |= IM->Flag[i];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   IM->Flag[IM->LastData+1] |= VERT_BIT_END_VB;
 | 
			
		||||
   IM->CopyAndFlag = IM->AndFlag = andflag;
 | 
			
		||||
   IM->OrFlag = orflag;
 | 
			
		||||
   IM->CopyOrFlag = orflag;
 | 
			
		||||
   IM->Evaluated = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is where the vertex data is transfered from the 'struct immediate
 | 
			
		||||
 * into the 'struct vertex_buffer'.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: The 'start' member of the GLvector structs is now redundant
 | 
			
		||||
 * because we always re-transform copied vertices, and the vectors
 | 
			
		||||
 * below are set up so that the first copied vertex (if any) appears
 | 
			
		||||
 * at position zero.
 | 
			
		||||
 */
 | 
			
		||||
static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   struct vertex_arrays *tmp = &tnl->imm_inputs;
 | 
			
		||||
   GLuint inputs = tnl->pipeline.inputs; /* for copy-to-current */
 | 
			
		||||
   const GLuint start = IM->CopyStart;
 | 
			
		||||
   const GLuint count = IM->Count - start;
 | 
			
		||||
 | 
			
		||||
   /* TODO: optimize the case where nothing has changed.  (Just bind
 | 
			
		||||
    * tmp to vb).
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
   /* Setup constant data in the VB.
 | 
			
		||||
    */
 | 
			
		||||
   VB->Count = count;
 | 
			
		||||
   VB->FirstClipped = IMM_MAXDATA - IM->CopyStart;
 | 
			
		||||
   VB->import_data = NULL;
 | 
			
		||||
   VB->importable_data = 0;
 | 
			
		||||
 | 
			
		||||
   /* Need an IM->FirstPrimitive?
 | 
			
		||||
    */
 | 
			
		||||
   VB->Primitive = IM->Primitive + IM->CopyStart;
 | 
			
		||||
   VB->PrimitiveLength = IM->PrimitiveLength + IM->CopyStart;
 | 
			
		||||
   VB->FirstPrimitive = 0;
 | 
			
		||||
 | 
			
		||||
   VB->Flag = IM->Flag + start;
 | 
			
		||||
 | 
			
		||||
   /* TexCoordPtr's are zeroed in loop below.
 | 
			
		||||
    */
 | 
			
		||||
   VB->NormalPtr = NULL;
 | 
			
		||||
   VB->NormalLengthPtr = NULL;
 | 
			
		||||
   VB->EdgeFlag = NULL;
 | 
			
		||||
   VB->IndexPtr[0] = NULL;
 | 
			
		||||
   VB->IndexPtr[1] = NULL;
 | 
			
		||||
   VB->ColorPtr[0] = NULL;
 | 
			
		||||
   VB->ColorPtr[1] = NULL;
 | 
			
		||||
   VB->SecondaryColorPtr[0] = NULL;
 | 
			
		||||
   VB->SecondaryColorPtr[1] = NULL;
 | 
			
		||||
   VB->Elts = NULL;
 | 
			
		||||
   VB->MaterialMask = NULL;
 | 
			
		||||
   VB->Material = NULL;
 | 
			
		||||
 | 
			
		||||
/*     _tnl_print_vert_flags("copy-orflag", IM->CopyOrFlag); */
 | 
			
		||||
/*     _tnl_print_vert_flags("orflag", IM->OrFlag); */
 | 
			
		||||
/*      _tnl_print_vert_flags("inputs", inputs);  */
 | 
			
		||||
 | 
			
		||||
   /* Setup the initial values of array pointers in the vb.
 | 
			
		||||
    */
 | 
			
		||||
   if (inputs & VERT_BIT_POS) {
 | 
			
		||||
      tmp->Obj.data = IM->Attrib[VERT_ATTRIB_POS] + start;
 | 
			
		||||
      tmp->Obj.start = (GLfloat *)(IM->Attrib[VERT_ATTRIB_POS] + start);
 | 
			
		||||
      tmp->Obj.count = count;
 | 
			
		||||
      VB->ObjPtr = &tmp->Obj;
 | 
			
		||||
      if ((IM->CopyOrFlag & VERT_BITS_OBJ_234) == VERT_BITS_OBJ_234)
 | 
			
		||||
	 tmp->Obj.size = 4;
 | 
			
		||||
      else if ((IM->CopyOrFlag & VERT_BITS_OBJ_234) == VERT_BITS_OBJ_23)
 | 
			
		||||
	 tmp->Obj.size = 3;
 | 
			
		||||
      else
 | 
			
		||||
	 tmp->Obj.size = 2;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_NORMAL) {
 | 
			
		||||
      tmp->Normal.data = IM->Attrib[VERT_ATTRIB_NORMAL] + start;
 | 
			
		||||
      tmp->Normal.start = (GLfloat *) (IM->Attrib[VERT_ATTRIB_NORMAL] + start);
 | 
			
		||||
      tmp->Normal.count = count;
 | 
			
		||||
      tmp->Normal.size = 3; /* just to be safe */
 | 
			
		||||
      VB->NormalPtr = &tmp->Normal;
 | 
			
		||||
      if (IM->NormalLengthPtr)
 | 
			
		||||
	 VB->NormalLengthPtr = IM->NormalLengthPtr + start;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_INDEX) {
 | 
			
		||||
      tmp->Index.count = count;
 | 
			
		||||
      tmp->Index.data = IM->Index + start;
 | 
			
		||||
      tmp->Index.start = IM->Index + start;
 | 
			
		||||
      VB->IndexPtr[0] = &tmp->Index;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_FOG) {
 | 
			
		||||
      tmp->FogCoord.data = IM->Attrib[VERT_ATTRIB_FOG] + start;
 | 
			
		||||
      tmp->FogCoord.start = (GLfloat *) (IM->Attrib[VERT_ATTRIB_FOG] + start);
 | 
			
		||||
      tmp->FogCoord.count = count;
 | 
			
		||||
      VB->FogCoordPtr = &tmp->FogCoord;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_COLOR1) {
 | 
			
		||||
      tmp->SecondaryColor.Ptr = (GLubyte *) (IM->Attrib[VERT_ATTRIB_COLOR1] + start);
 | 
			
		||||
      VB->SecondaryColorPtr[0] = &tmp->SecondaryColor;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_EDGEFLAG) {
 | 
			
		||||
      VB->EdgeFlag = IM->EdgeFlag + start;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BIT_COLOR0) {
 | 
			
		||||
      if (IM->CopyOrFlag & VERT_BIT_COLOR0) {
 | 
			
		||||
	 tmp->Color.Ptr = (GLubyte *) (IM->Attrib[VERT_ATTRIB_COLOR0] + start);
 | 
			
		||||
	 tmp->Color.StrideB = 4 * sizeof(GLfloat);
 | 
			
		||||
	 tmp->Color.Flags = 0;
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
	 tmp->Color.Ptr = (GLubyte *) ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
 | 
			
		||||
	 tmp->Color.StrideB = 0;
 | 
			
		||||
	 tmp->Color.Flags = CA_CLIENT_DATA; /* hack */
 | 
			
		||||
	 VB->import_source = IM;
 | 
			
		||||
	 VB->importable_data |= VERT_BIT_COLOR0;
 | 
			
		||||
	 VB->import_data = _tnl_upgrade_current_data;
 | 
			
		||||
      }
 | 
			
		||||
      VB->ColorPtr[0] = &tmp->Color;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (inputs & VERT_BITS_TEX_ANY) {
 | 
			
		||||
      GLuint i;
 | 
			
		||||
      for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
 | 
			
		||||
	 VB->TexCoordPtr[i] = NULL;
 | 
			
		||||
	 if (inputs & VERT_BIT_TEX(i)) {
 | 
			
		||||
	    tmp->TexCoord[i].count = count;
 | 
			
		||||
	    tmp->TexCoord[i].data = IM->Attrib[VERT_ATTRIB_TEX0 + i] + start;
 | 
			
		||||
	    tmp->TexCoord[i].start = (GLfloat *)(IM->Attrib[VERT_ATTRIB_TEX0 + i] + start);
 | 
			
		||||
	    tmp->TexCoord[i].size = 2;
 | 
			
		||||
	    if (IM->TexSize & TEX_SIZE_3(i)) {
 | 
			
		||||
	       tmp->TexCoord[i].size = 3;
 | 
			
		||||
	       if (IM->TexSize & TEX_SIZE_4(i))
 | 
			
		||||
		  tmp->TexCoord[i].size = 4;
 | 
			
		||||
	    }
 | 
			
		||||
	    VB->TexCoordPtr[i] = &tmp->TexCoord[i];
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if ((inputs & IM->OrFlag & VERT_BIT_MATERIAL) && IM->Material) {
 | 
			
		||||
      VB->MaterialMask = IM->MaterialMask + start;
 | 
			
		||||
      VB->Material = IM->Material + start;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* GL_NV_vertex_program */
 | 
			
		||||
   if (ctx->VertexProgram.Enabled) {
 | 
			
		||||
      GLuint attr;
 | 
			
		||||
      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
         tmp->Attribs[attr].count = count;
 | 
			
		||||
         tmp->Attribs[attr].data = IM->Attrib[attr] + start;
 | 
			
		||||
         tmp->Attribs[attr].start = (GLfloat *) (IM->Attrib[attr] + start);
 | 
			
		||||
         tmp->Attribs[attr].size = 4;
 | 
			
		||||
         VB->AttribPtr[attr] = &(tmp->Attribs[attr]);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Called by exec_vert_cassette, execute_compiled_cassette, but not
 | 
			
		||||
 * exec_elt_cassette.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_run_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   _tnl_vb_bind_immediate( ctx, IM );
 | 
			
		||||
 | 
			
		||||
   if (IM->OrFlag & VERT_BITS_EVAL_ANY)
 | 
			
		||||
      _tnl_eval_immediate( ctx, IM );
 | 
			
		||||
 | 
			
		||||
   /* Invalidate all stored data before and after run:
 | 
			
		||||
    */
 | 
			
		||||
   tnl->pipeline.run_input_changes |= tnl->pipeline.inputs;
 | 
			
		||||
   tnl->Driver.RunPipeline( ctx );
 | 
			
		||||
   tnl->pipeline.run_input_changes |= tnl->pipeline.inputs;
 | 
			
		||||
 | 
			
		||||
   _tnl_copy_to_current( ctx, IM, IM->OrFlag, IM->LastData );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Called for regular vertex cassettes.
 | 
			
		||||
 */
 | 
			
		||||
static void exec_vert_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   if (IM->FlushElt) {
 | 
			
		||||
      /* Orflag is computed twice, but only reach this code if app is
 | 
			
		||||
       * using a mixture of glArrayElement() and glVertex() while
 | 
			
		||||
       * arrays are locked (else would be in exec_elt_cassette now).
 | 
			
		||||
       */
 | 
			
		||||
      ASSERT(ctx->Array.LockCount);
 | 
			
		||||
      ASSERT(IM->FlushElt == FLUSH_ELT_LAZY);
 | 
			
		||||
      _tnl_translate_array_elts( ctx, IM, IM->CopyStart, IM->Count );
 | 
			
		||||
      _tnl_compute_orflag( IM, IM->CopyStart ); 
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   _tnl_fixup_input( ctx, IM );
 | 
			
		||||
/*     _tnl_print_cassette( IM ); */
 | 
			
		||||
   _tnl_run_cassette( ctx, IM );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Called for pure, locked VERT_BIT_ELT cassettes instead of
 | 
			
		||||
 * _tnl_run_cassette.
 | 
			
		||||
 */
 | 
			
		||||
static void exec_elt_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
 | 
			
		||||
   _tnl_vb_bind_arrays( ctx, ctx->Array.LockFirst, ctx->Array.LockCount );
 | 
			
		||||
 | 
			
		||||
   /* Take only elements and primitive information from the immediate:
 | 
			
		||||
    */
 | 
			
		||||
   VB->Elts = IM->Elt + IM->CopyStart;
 | 
			
		||||
   VB->Primitive = IM->Primitive + IM->CopyStart;
 | 
			
		||||
   VB->PrimitiveLength = IM->PrimitiveLength + IM->CopyStart;
 | 
			
		||||
   VB->FirstPrimitive = 0;
 | 
			
		||||
 | 
			
		||||
   /* Run the pipeline.  No input changes as a result of this action.
 | 
			
		||||
    */
 | 
			
		||||
   tnl->Driver.RunPipeline( ctx );
 | 
			
		||||
 | 
			
		||||
   /* Still need to update current values:  
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) {
 | 
			
		||||
      _tnl_translate_array_elts( ctx, IM, IM->LastData, IM->LastData );
 | 
			
		||||
      _tnl_copy_to_current( ctx, IM, ctx->Array._Enabled, IM->LastData );
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
exec_empty_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   if (IM->FlushElt)
 | 
			
		||||
      _tnl_translate_array_elts( ctx, IM, IM->CopyStart, IM->CopyStart );
 | 
			
		||||
 | 
			
		||||
   _tnl_copy_to_current( ctx, IM, IM->OrFlag, IM->LastData );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Called for all cassettes when not compiling or playing a display
 | 
			
		||||
 * list.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_execute_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   _tnl_compute_orflag( IM, IM->Start );
 | 
			
		||||
   _tnl_copy_immediate_vertices( ctx, IM ); 
 | 
			
		||||
   _tnl_get_exec_copy_verts( ctx, IM );
 | 
			
		||||
 | 
			
		||||
   if (tnl->pipeline.build_state_changes)
 | 
			
		||||
      _tnl_validate_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
   if (IM->CopyStart == IM->Count) {
 | 
			
		||||
      exec_empty_cassette( ctx, IM );
 | 
			
		||||
   }
 | 
			
		||||
   else if ((IM->CopyOrFlag & VERT_BITS_DATA) == VERT_BIT_ELT &&
 | 
			
		||||
	    ctx->Array.LockCount &&
 | 
			
		||||
	    (ctx->Array.Vertex.Enabled ||
 | 
			
		||||
             (ctx->VertexProgram.Enabled &&
 | 
			
		||||
              ctx->Array.VertexAttrib[0].Enabled))) {
 | 
			
		||||
      exec_elt_cassette( ctx, IM );
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      exec_vert_cassette( ctx, IM );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Only reuse the immediate if there are no copied vertices living
 | 
			
		||||
    * inside it:
 | 
			
		||||
    */
 | 
			
		||||
   { 
 | 
			
		||||
      GLuint begin_state = IM->BeginState & (VERT_BEGIN_0|VERT_BEGIN_1);
 | 
			
		||||
      GLuint saved_begin_state = IM->SavedBeginState;
 | 
			
		||||
 | 
			
		||||
      if (--IM->ref_count != 0) {
 | 
			
		||||
	 IM = _tnl_alloc_immediate( ctx );
 | 
			
		||||
	 SET_IMMEDIATE( ctx, IM );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      IM->ref_count++;
 | 
			
		||||
	 
 | 
			
		||||
      _tnl_reset_exec_input( ctx, IMM_MAX_COPIED_VERTS, 
 | 
			
		||||
			     begin_state, saved_begin_state );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Don't unset FLUSH_STORED_VERTICES flag here as the driver might
 | 
			
		||||
    * have other stored data of its own & be relying on the
 | 
			
		||||
    * FlushVertices notification to clear it.
 | 
			
		||||
    */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Setup vector pointers that will be used to bind immediates to VB's.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_imm_init( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_arrays *tmp = &tnl->imm_inputs;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   static int firsttime = 1;
 | 
			
		||||
 | 
			
		||||
   if (firsttime) {
 | 
			
		||||
      firsttime = 0;
 | 
			
		||||
      _tnl_imm_elt_init();
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   ctx->swtnl_im = _tnl_alloc_immediate( ctx );
 | 
			
		||||
   TNL_CURRENT_IM(ctx)->ref_count++;
 | 
			
		||||
 | 
			
		||||
   tnl->ExecCopyTexSize = 0;
 | 
			
		||||
   tnl->ExecCopyCount = 0;
 | 
			
		||||
   tnl->ExecCopySource = 0;
 | 
			
		||||
 | 
			
		||||
   TNL_CURRENT_IM(ctx)->CopyStart = IMM_MAX_COPIED_VERTS;
 | 
			
		||||
 | 
			
		||||
   _mesa_vector4f_init( &tmp->Obj, 0, 0 );
 | 
			
		||||
   _mesa_vector4f_init( &tmp->Normal, 0, 0 );
 | 
			
		||||
 | 
			
		||||
   tmp->Color.Ptr = NULL;
 | 
			
		||||
   tmp->Color.Type = GL_FLOAT;
 | 
			
		||||
   tmp->Color.Size = 4;
 | 
			
		||||
   tmp->Color.Stride = 0;
 | 
			
		||||
   tmp->Color.StrideB = 4 * sizeof(GLfloat);
 | 
			
		||||
   tmp->Color.Flags = 0;
 | 
			
		||||
   tmp->Color.BufferObj = ctx->Array.NullBufferObj;
 | 
			
		||||
 | 
			
		||||
   tmp->SecondaryColor.Ptr = NULL;
 | 
			
		||||
   tmp->SecondaryColor.Type = GL_FLOAT;
 | 
			
		||||
   tmp->SecondaryColor.Size = 4;
 | 
			
		||||
   tmp->SecondaryColor.Stride = 0;
 | 
			
		||||
   tmp->SecondaryColor.StrideB = 4 * sizeof(GLfloat);
 | 
			
		||||
   tmp->SecondaryColor.Flags = 0;
 | 
			
		||||
   tmp->SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
 | 
			
		||||
 | 
			
		||||
   _mesa_vector4f_init( &tmp->FogCoord, 0, 0 );
 | 
			
		||||
   _mesa_vector1ui_init( &tmp->Index, 0, 0 );
 | 
			
		||||
   _mesa_vector1ub_init( &tmp->EdgeFlag, 0, 0 );
 | 
			
		||||
 | 
			
		||||
   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
 | 
			
		||||
      _mesa_vector4f_init( &tmp->TexCoord[i], 0, 0);
 | 
			
		||||
 | 
			
		||||
   /* Install the first immediate.  Intially outside begin/end.
 | 
			
		||||
    */
 | 
			
		||||
   _tnl_reset_exec_input( ctx, IMM_MAX_COPIED_VERTS, 0, 0 );
 | 
			
		||||
   tnl->ReplayHardBeginEnd = 0;
 | 
			
		||||
 | 
			
		||||
   _tnl_imm_vtxfmt_init( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Deallocate the immediate-mode buffer for the given context, if
 | 
			
		||||
 * its reference count goes to zero.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_imm_destroy( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   if (TNL_CURRENT_IM(ctx)) {
 | 
			
		||||
      TNL_CURRENT_IM(ctx)->ref_count--;
 | 
			
		||||
      if (TNL_CURRENT_IM(ctx)->ref_count == 0)
 | 
			
		||||
	 _tnl_free_immediate( ctx, TNL_CURRENT_IM(ctx) );
 | 
			
		||||
      /* 
 | 
			
		||||
       * Don't use SET_IMMEDIATE here, or else we'll whack the
 | 
			
		||||
       * _tnl_CurrentInput pointer - not good when another 
 | 
			
		||||
       * context has already been made current.
 | 
			
		||||
       * So we just set the context's own tnl immediate pointer
 | 
			
		||||
       * to 0.
 | 
			
		||||
       */
 | 
			
		||||
      ctx->swtnl_im = NULL;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_IMM_EXEC_H
 | 
			
		||||
#define _T_IMM_EXEC_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Hook for ctx->Driver.FlushVertices:
 | 
			
		||||
 */
 | 
			
		||||
extern void _tnl_flush_vertices( GLcontext *ctx, GLuint flush_flags );
 | 
			
		||||
 | 
			
		||||
/* Called from imm_api.c and _tnl_flush_vertices:
 | 
			
		||||
 */
 | 
			
		||||
extern void _tnl_flush_immediate( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
/* Called from imm_dlist.c and _tnl_flush_immediate:
 | 
			
		||||
 */
 | 
			
		||||
extern void _tnl_run_cassette( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
extern void _tnl_copy_to_current( GLcontext *ctx, struct immediate *IM,
 | 
			
		||||
				  GLuint flag, GLuint row );
 | 
			
		||||
 | 
			
		||||
/* Initialize some stuff:
 | 
			
		||||
 */
 | 
			
		||||
extern void _tnl_imm_init( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_imm_destroy( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_reset_exec_input( GLcontext *ctx,
 | 
			
		||||
				   GLuint start,
 | 
			
		||||
				   GLuint beginstate,
 | 
			
		||||
				   GLuint savedbeginstate );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_reset_compile_input( GLcontext *ctx,
 | 
			
		||||
				      GLuint start,
 | 
			
		||||
				      GLuint beginstate,
 | 
			
		||||
				      GLuint savedbeginstate );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_compute_orflag( struct immediate *IM, GLuint start );
 | 
			
		||||
extern void _tnl_execute_cassette( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,786 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "enums.h"
 | 
			
		||||
#include "dlist.h"
 | 
			
		||||
#include "colormac.h"
 | 
			
		||||
#include "light.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "state.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
 | 
			
		||||
#include "math/m_matrix.h"
 | 
			
		||||
#include "math/m_xform.h"
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_imm_alloc.h"
 | 
			
		||||
#include "t_imm_debug.h"
 | 
			
		||||
#include "t_imm_elt.h"
 | 
			
		||||
#include "t_imm_fixup.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Indexed by primitive type (GL_POINTS=0, GL_LINES=1, GL_LINE_LOOP=2, etc)
 | 
			
		||||
 */
 | 
			
		||||
static const GLuint increment[GL_POLYGON+2] = { 1,2,1,1,3,1,1,4,2,1,1 };
 | 
			
		||||
static const GLuint intro[GL_POLYGON+2]     = { 0,0,2,2,0,2,2,0,2,2,0 };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_fixup_4f( GLfloat data[][4], const GLuint flag[],
 | 
			
		||||
               GLuint start, GLuint match )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i = start;
 | 
			
		||||
 | 
			
		||||
   for (;;) {
 | 
			
		||||
      if ((flag[++i] & match) == 0) {
 | 
			
		||||
	 COPY_4FV(data[i], data[i-1]);
 | 
			
		||||
	 if (flag[i] & VERT_BIT_END_VB) break;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_fixup_1ui( GLuint *data, GLuint flag[], GLuint start, GLuint match )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i = start;
 | 
			
		||||
 | 
			
		||||
   for (;;) {
 | 
			
		||||
      if ((flag[++i] & match) == 0) {
 | 
			
		||||
	 data[i] = data[i-1];
 | 
			
		||||
	 if (flag[i] & VERT_BIT_END_VB) break;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   flag[i] |= match;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tnl_fixup_1ub( GLubyte *data, GLuint flag[], GLuint start, GLuint match)
 | 
			
		||||
{
 | 
			
		||||
   GLuint i = start;
 | 
			
		||||
 | 
			
		||||
   for (;;) {
 | 
			
		||||
      if ((flag[++i] & match) == 0) {
 | 
			
		||||
	 data[i] = data[i-1];
 | 
			
		||||
	 if (flag[i] & VERT_BIT_END_VB) break;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   flag[i] |= match;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
fixup_first_4f( GLfloat data[][4], const GLuint flag[], GLuint match,
 | 
			
		||||
		GLuint start, const GLfloat *dflt )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i = start-1;
 | 
			
		||||
   match |= VERT_BIT_END_VB;
 | 
			
		||||
 | 
			
		||||
   while ((flag[++i]&match) == 0)
 | 
			
		||||
      COPY_4FV(data[i], dflt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
fixup_first_1ui( GLuint data[], const GLuint flag[], GLuint match,
 | 
			
		||||
		 GLuint start, const GLuint dflt )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i = start-1;
 | 
			
		||||
   match |= VERT_BIT_END_VB;
 | 
			
		||||
 | 
			
		||||
   while ((flag[++i]&match) == 0)
 | 
			
		||||
      data[i] = dflt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
fixup_first_1ub( GLubyte data[], const GLuint flag[], GLuint match,
 | 
			
		||||
		 GLuint start, GLubyte dflt )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i = start-1;
 | 
			
		||||
   match |= VERT_BIT_END_VB;
 | 
			
		||||
 | 
			
		||||
   while ((flag[++i]&match) == 0)
 | 
			
		||||
      data[i] = dflt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Copy vertex attributes from the ctx->Current group into the immediate
 | 
			
		||||
 * struct at the given position according to copyMask.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
copy_from_current( GLcontext *ctx, struct immediate *IM, 
 | 
			
		||||
                   GLuint pos, GLuint copyMask )
 | 
			
		||||
{
 | 
			
		||||
   GLuint attrib, attribBit;
 | 
			
		||||
 | 
			
		||||
   if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
 | 
			
		||||
      _tnl_print_vert_flags("copy from current", copyMask); 
 | 
			
		||||
 | 
			
		||||
   for (attrib = 0, attribBit = 1; attrib < 16; attrib++, attribBit <<= 1) {
 | 
			
		||||
      if (copyMask & attribBit) {
 | 
			
		||||
         if (!IM->Attrib[attrib]) {
 | 
			
		||||
            IM->Attrib[attrib] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
            if (!IM->Attrib[attrib]) {
 | 
			
		||||
               _mesa_error(ctx, GL_OUT_OF_MEMORY, "vertex processing3");
 | 
			
		||||
               return;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         COPY_4FV( IM->Attrib[attrib][pos], ctx->Current.Attrib[attrib]);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (copyMask & VERT_BIT_INDEX)
 | 
			
		||||
      IM->Index[pos] = ctx->Current.Index;
 | 
			
		||||
 | 
			
		||||
   if (copyMask & VERT_BIT_EDGEFLAG)
 | 
			
		||||
      IM->EdgeFlag[pos] = ctx->Current.EdgeFlag;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fill in missing vertex attributes in the incoming immediate structure.
 | 
			
		||||
 * For example, suppose the following calls are made:
 | 
			
		||||
 * glBegin()
 | 
			
		||||
 * glColor(c1)
 | 
			
		||||
 * glVertex(v1)
 | 
			
		||||
 * glVertex(v2)
 | 
			
		||||
 * glEnd()
 | 
			
		||||
 * The v2 vertex should get color c1 since glColor wasn't called for v2.
 | 
			
		||||
 * This function will make c2 be c1.  Same story for all vertex attribs.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_fixup_input( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLuint start = IM->CopyStart;
 | 
			
		||||
   GLuint andflag = IM->CopyAndFlag;
 | 
			
		||||
   GLuint orflag = IM->CopyOrFlag | IM->Evaluated;
 | 
			
		||||
   GLuint fixup;
 | 
			
		||||
 | 
			
		||||
   IM->CopyTexSize = IM->TexSize;
 | 
			
		||||
 | 
			
		||||
/*     _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); */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   fixup = ~andflag & VERT_BITS_FIXUP;
 | 
			
		||||
 | 
			
		||||
   if (!ctx->CompileFlag)
 | 
			
		||||
      fixup &= tnl->pipeline.inputs;
 | 
			
		||||
 | 
			
		||||
   if (!ctx->ExecuteFlag)
 | 
			
		||||
      fixup &= orflag;
 | 
			
		||||
 | 
			
		||||
   if ((orflag & (VERT_BIT_POS|VERT_BITS_EVAL_ANY)) == 0)
 | 
			
		||||
      fixup = 0;
 | 
			
		||||
 | 
			
		||||
   if (fixup) {
 | 
			
		||||
      const GLuint copy = fixup & ~IM->Flag[start];
 | 
			
		||||
      GLuint attr;
 | 
			
		||||
 | 
			
		||||
      /* Equivalent to a lazy copy-from-current when setting up the
 | 
			
		||||
       * immediate.
 | 
			
		||||
       */
 | 
			
		||||
      if (ctx->ExecuteFlag && copy) 
 | 
			
		||||
	 copy_from_current( ctx, IM, start, copy );
 | 
			
		||||
 | 
			
		||||
      if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
 | 
			
		||||
  	 _tnl_print_vert_flags("fixup", fixup); 
 | 
			
		||||
 | 
			
		||||
      for (attr = 1; attr < VERT_ATTRIB_MAX; attr++) { /* skip 0 (POS) */
 | 
			
		||||
         const GLuint attrBit = 1 << attr;
 | 
			
		||||
         if (fixup & attrBit) {
 | 
			
		||||
            if (!IM->Attrib[attr]) {
 | 
			
		||||
               IM->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
               if (!IM->Attrib[attr]) {
 | 
			
		||||
                  _mesa_error(ctx, GL_OUT_OF_MEMORY, "vertex processing");
 | 
			
		||||
                  return;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (attr == VERT_BIT_COLOR0) {
 | 
			
		||||
               /* special case, darn - try to remove someday */
 | 
			
		||||
               if (orflag & VERT_BIT_COLOR0) {
 | 
			
		||||
                  _tnl_fixup_4f( IM->Attrib[VERT_ATTRIB_COLOR0], IM->Flag,
 | 
			
		||||
                                 start, VERT_BIT_COLOR0 );
 | 
			
		||||
               }
 | 
			
		||||
               /* No need for else case as the drivers understand stride
 | 
			
		||||
                * zero here.  (TODO - propogate this)
 | 
			
		||||
                */
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
               /* general case */
 | 
			
		||||
               if (orflag & attrBit)
 | 
			
		||||
                  _tnl_fixup_4f( IM->Attrib[attr], IM->Flag, start, attrBit );
 | 
			
		||||
               else
 | 
			
		||||
                  fixup_first_4f( IM->Attrib[attr], IM->Flag, VERT_BIT_END_VB,
 | 
			
		||||
                                  start, IM->Attrib[attr][start] );
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (fixup & VERT_BIT_EDGEFLAG) {
 | 
			
		||||
	 if (orflag & VERT_BIT_EDGEFLAG)
 | 
			
		||||
	    _tnl_fixup_1ub( IM->EdgeFlag, IM->Flag, start, VERT_BIT_EDGEFLAG );
 | 
			
		||||
	 else
 | 
			
		||||
	    fixup_first_1ub( IM->EdgeFlag, IM->Flag, VERT_BIT_END_VB, start,
 | 
			
		||||
			     IM->EdgeFlag[start] );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (fixup & VERT_BIT_INDEX) {
 | 
			
		||||
	 if (orflag & VERT_BIT_INDEX)
 | 
			
		||||
	    _tnl_fixup_1ui( IM->Index, IM->Flag, start, VERT_BIT_INDEX );
 | 
			
		||||
	 else
 | 
			
		||||
	    fixup_first_1ui( IM->Index, IM->Flag, VERT_BIT_END_VB, start, 
 | 
			
		||||
			     IM->Index[start] );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   }
 | 
			
		||||
      
 | 
			
		||||
   /* Prune possible half-filled slot.
 | 
			
		||||
    */
 | 
			
		||||
   IM->Flag[IM->LastData+1] &= ~VERT_BIT_END_VB;
 | 
			
		||||
   IM->Flag[IM->Count] |= VERT_BIT_END_VB;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Materials:
 | 
			
		||||
    */
 | 
			
		||||
   if (IM->MaterialOrMask & ~IM->MaterialAndMask) {
 | 
			
		||||
      GLuint vulnerable = IM->MaterialOrMask;
 | 
			
		||||
      GLuint i = IM->Start;
 | 
			
		||||
 | 
			
		||||
      do {
 | 
			
		||||
	 while (!(IM->Flag[i] & VERT_BIT_MATERIAL))
 | 
			
		||||
	    i++;
 | 
			
		||||
 | 
			
		||||
	 vulnerable &= ~IM->MaterialMask[i];
 | 
			
		||||
	 _mesa_copy_materials( &IM->Material[i],
 | 
			
		||||
			       &ctx->Light.Material,
 | 
			
		||||
			       vulnerable );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	++i;
 | 
			
		||||
      } while (vulnerable);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
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 *)
 | 
			
		||||
         MALLOC( sizeof(struct gl_material) * IMM_SIZE );
 | 
			
		||||
      next->MaterialMask = (GLuint *) MALLOC( sizeof(GLuint) * IMM_SIZE );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   next->MaterialMask[dst] = prev->MaterialOrMask;
 | 
			
		||||
   MEMCPY(&next->Material[dst], &prev->Material[src],
 | 
			
		||||
          sizeof(struct gl_material));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean is_fan_like[GL_POLYGON+1] = {
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_TRUE,			/* line loop */
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_TRUE,			/* tri fan */
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_FALSE,
 | 
			
		||||
   GL_TRUE			/* polygon */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Copy the untransformed data from the shared vertices of a primitive
 | 
			
		||||
 * that wraps over two immediate structs.  This is done prior to
 | 
			
		||||
 * set_immediate so that prev and next may point to the same
 | 
			
		||||
 * structure.  In general it's difficult to avoid this copy on long
 | 
			
		||||
 * primitives.
 | 
			
		||||
 *
 | 
			
		||||
 * Have to be careful with the transitions between display list
 | 
			
		||||
 * replay, compile and normal execute modes.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_copy_immediate_vertices( GLcontext *ctx, struct immediate *next )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct immediate *prev = tnl->ExecCopySource;
 | 
			
		||||
   struct vertex_arrays *inputs = &tnl->imm_inputs;
 | 
			
		||||
   GLuint count = tnl->ExecCopyCount;
 | 
			
		||||
   GLuint *elts = tnl->ExecCopyElts;
 | 
			
		||||
   GLuint offset = IMM_MAX_COPIED_VERTS - count;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   if (!prev) {
 | 
			
		||||
      ASSERT(tnl->ExecCopyCount == 0);
 | 
			
		||||
      return;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   next->CopyStart = next->Start - count;
 | 
			
		||||
 | 
			
		||||
   if ((prev->CopyOrFlag & VERT_BITS_DATA) == VERT_BIT_ELT &&
 | 
			
		||||
       ctx->Array.LockCount &&
 | 
			
		||||
       (ctx->Array.Vertex.Enabled ||
 | 
			
		||||
        (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)))
 | 
			
		||||
   {
 | 
			
		||||
      /* Copy Elt values only
 | 
			
		||||
       */
 | 
			
		||||
      for (i = 0 ; i < count ; i++)
 | 
			
		||||
      {
 | 
			
		||||
	 GLuint src = elts[i+offset];
 | 
			
		||||
	 GLuint dst = next->CopyStart+i;
 | 
			
		||||
	 next->Elt[dst] = prev->Elt[src];
 | 
			
		||||
	 next->Flag[dst] = VERT_BIT_ELT;
 | 
			
		||||
	 elts[i+offset] = dst;
 | 
			
		||||
      }
 | 
			
		||||
/*        _mesa_debug(ctx, "ADDING VERT_BIT_ELT!\n"); */
 | 
			
		||||
      next->CopyOrFlag |= VERT_BIT_ELT;
 | 
			
		||||
      next->CopyAndFlag &= VERT_BIT_ELT;
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      GLuint copy = tnl->pipeline.inputs & (prev->CopyOrFlag|prev->Evaluated);
 | 
			
		||||
      GLuint flag, attr;
 | 
			
		||||
 | 
			
		||||
      if (is_fan_like[ctx->Driver.CurrentExecPrimitive]) {
 | 
			
		||||
	 flag = ((prev->CopyOrFlag|prev->Evaluated) & VERT_BITS_FIXUP);
 | 
			
		||||
	 next->CopyOrFlag |= flag;
 | 
			
		||||
      } 
 | 
			
		||||
      else {
 | 
			
		||||
	 /* Don't let an early 'glColor', etc. poison the elt path.
 | 
			
		||||
	  */
 | 
			
		||||
	 flag = ((prev->OrFlag|prev->Evaluated) & VERT_BITS_FIXUP);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      next->TexSize |= tnl->ExecCopyTexSize;
 | 
			
		||||
      next->CopyAndFlag &= flag;
 | 
			
		||||
	 
 | 
			
		||||
 | 
			
		||||
/*        _tnl_print_vert_flags("copy vertex components", copy); */
 | 
			
		||||
/*        _tnl_print_vert_flags("prev copyorflag", prev->CopyOrFlag); */
 | 
			
		||||
/*        _tnl_print_vert_flags("flag", flag); */
 | 
			
		||||
 | 
			
		||||
      /* Allocate attribute arrays in the destination immediate struct */
 | 
			
		||||
      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
         if ((copy & (1 << attr)) && !next->Attrib[attr]) {
 | 
			
		||||
            next->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
            if (!next->Attrib[attr]) {
 | 
			
		||||
               _mesa_error(ctx, GL_OUT_OF_MEMORY, "vertex processing");
 | 
			
		||||
               return;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* Copy whole vertices
 | 
			
		||||
       */
 | 
			
		||||
      for (i = 0 ; i < count ; i++)
 | 
			
		||||
      {
 | 
			
		||||
	 GLuint src = elts[i+offset];
 | 
			
		||||
	 GLuint isrc = src - prev->CopyStart;
 | 
			
		||||
	 GLuint dst = next->CopyStart+i;
 | 
			
		||||
 | 
			
		||||
	 /* Values subject to eval must be copied out of the 'inputs'
 | 
			
		||||
	  * struct.  (Copied rows should not be evaluated twice).
 | 
			
		||||
	  *
 | 
			
		||||
	  * Note these pointers are null when inactive.
 | 
			
		||||
          *
 | 
			
		||||
          * XXX try to use a loop over vertex attribs here.
 | 
			
		||||
	  */
 | 
			
		||||
	 COPY_4FV( next->Attrib[VERT_ATTRIB_POS][dst],
 | 
			
		||||
                   inputs->Obj.data[isrc] );
 | 
			
		||||
 | 
			
		||||
	 if (copy & VERT_BIT_NORMAL) {
 | 
			
		||||
	    COPY_3FV( next->Attrib[VERT_ATTRIB_NORMAL][dst],
 | 
			
		||||
                      inputs->Normal.data[isrc] );
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 if (copy & VERT_BIT_COLOR0)
 | 
			
		||||
	    COPY_4FV( next->Attrib[VERT_ATTRIB_COLOR0][dst], 
 | 
			
		||||
		      ((GLfloat (*)[4])inputs->Color.Ptr)[isrc] );
 | 
			
		||||
 | 
			
		||||
	 if (copy & VERT_BITS_TEX_ANY) {
 | 
			
		||||
	    GLuint i;
 | 
			
		||||
	    for (i = 0 ; i < prev->MaxTextureUnits ; i++) {
 | 
			
		||||
	       if (copy & VERT_BIT_TEX(i))
 | 
			
		||||
		  COPY_4FV( next->Attrib[VERT_ATTRIB_TEX0 + i][dst], 
 | 
			
		||||
			    inputs->TexCoord[i].data[isrc] );
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
         /* the rest aren't used for evaluators */
 | 
			
		||||
         if (copy & VERT_BIT_COLOR1)
 | 
			
		||||
	    COPY_4FV( next->Attrib[VERT_ATTRIB_COLOR1][dst],
 | 
			
		||||
                      prev->Attrib[VERT_ATTRIB_COLOR1][src] );
 | 
			
		||||
 | 
			
		||||
         if (copy & VERT_BIT_FOG)
 | 
			
		||||
	    COPY_4FV( next->Attrib[VERT_ATTRIB_FOG][dst],
 | 
			
		||||
                      prev->Attrib[VERT_ATTRIB_FOG][src] );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	 if (copy & VERT_BIT_INDEX)
 | 
			
		||||
	    next->Index[dst] = inputs->Index.data[isrc];
 | 
			
		||||
 | 
			
		||||
         if (copy & VERT_BIT_EDGEFLAG)
 | 
			
		||||
	    next->EdgeFlag[dst] = prev->EdgeFlag[src];
 | 
			
		||||
 | 
			
		||||
	 if (copy & VERT_BIT_ELT)
 | 
			
		||||
	    next->Elt[dst] = prev->Elt[src];
 | 
			
		||||
 | 
			
		||||
         if (copy & VERT_BIT_MATERIAL)
 | 
			
		||||
	    if (prev->Flag[src] & VERT_BIT_MATERIAL)
 | 
			
		||||
	       copy_material(next, prev, dst, src);
 | 
			
		||||
 | 
			
		||||
	 next->Flag[dst] = flag;
 | 
			
		||||
	 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( ctx, tnl->ExecCopySource );
 | 
			
		||||
  
 | 
			
		||||
   tnl->ExecCopySource = next; next->ref_count++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 (or in the first execution of
 | 
			
		||||
 * the cassette).
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_fixup_compiled_cassette( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLuint fixup;
 | 
			
		||||
   GLuint start = IM->Start;
 | 
			
		||||
 | 
			
		||||
/*     _mesa_debug(ctx, "%s\n", __FUNCTION__); */
 | 
			
		||||
 | 
			
		||||
   IM->Evaluated = 0;
 | 
			
		||||
   IM->CopyOrFlag = IM->OrFlag;	  
 | 
			
		||||
   IM->CopyAndFlag = IM->AndFlag; 
 | 
			
		||||
   IM->CopyTexSize = IM->TexSize | tnl->ExecCopyTexSize;
 | 
			
		||||
 | 
			
		||||
   _tnl_copy_immediate_vertices( ctx, IM );
 | 
			
		||||
 | 
			
		||||
   if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) {
 | 
			
		||||
      ASSERT(IM->CopyStart == IM->Start);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Naked array elements can be copied into the first cassette in a
 | 
			
		||||
    * display list.  Need to translate them away:
 | 
			
		||||
    */
 | 
			
		||||
   if (IM->CopyOrFlag & VERT_BIT_ELT) {
 | 
			
		||||
      GLuint copy = tnl->pipeline.inputs & ~ctx->Array._Enabled;
 | 
			
		||||
      GLuint i;
 | 
			
		||||
 | 
			
		||||
      ASSERT(IM->CopyStart < IM->Start);
 | 
			
		||||
 | 
			
		||||
      _tnl_translate_array_elts( ctx, IM, IM->CopyStart, IM->Start );
 | 
			
		||||
 | 
			
		||||
      for (i = IM->CopyStart ; i < IM->Start ; i++)
 | 
			
		||||
	 copy_from_current( ctx, IM, i, copy ); 
 | 
			
		||||
 | 
			
		||||
      _tnl_copy_to_current( ctx, IM, ctx->Array._Enabled, IM->Start );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   fixup = tnl->pipeline.inputs & ~IM->Flag[start] & VERT_BITS_FIXUP;
 | 
			
		||||
 | 
			
		||||
/*     _tnl_print_vert_flags("fixup compiled", fixup); */
 | 
			
		||||
 | 
			
		||||
   if (fixup) {
 | 
			
		||||
      GLuint attr;
 | 
			
		||||
 | 
			
		||||
      for (attr = 1; attr < VERT_ATTRIB_MAX; attr++) { /* skip 0 (POS) */
 | 
			
		||||
         const GLuint attrBit = 1 << attr;
 | 
			
		||||
         if (fixup & attrBit) {
 | 
			
		||||
            if (!IM->Attrib[attr]) {
 | 
			
		||||
               IM->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
 | 
			
		||||
               if (!IM->Attrib[attr]) {
 | 
			
		||||
                  _mesa_error(ctx, GL_OUT_OF_MEMORY, "vertex processing");
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
            if (attr == VERT_ATTRIB_COLOR0) {
 | 
			
		||||
               /* special case, darn */
 | 
			
		||||
               if (IM->CopyOrFlag & VERT_BIT_COLOR0)
 | 
			
		||||
                  fixup_first_4f(IM->Attrib[VERT_ATTRIB_COLOR0], IM->Flag,
 | 
			
		||||
                                 VERT_BIT_COLOR0, start,
 | 
			
		||||
                                 ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
 | 
			
		||||
               else
 | 
			
		||||
                  fixup &= ~VERT_BIT_COLOR0;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
               fixup_first_4f(IM->Attrib[attr], IM->Flag,
 | 
			
		||||
                              attrBit, start, ctx->Current.Attrib[attr] );
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (fixup & VERT_BIT_EDGEFLAG)
 | 
			
		||||
	 fixup_first_1ub(IM->EdgeFlag, IM->Flag, VERT_BIT_EDGEFLAG, start,
 | 
			
		||||
			 ctx->Current.EdgeFlag );
 | 
			
		||||
 | 
			
		||||
      if (fixup & VERT_BIT_INDEX)
 | 
			
		||||
	 fixup_first_1ui(IM->Index, IM->Flag, VERT_BIT_INDEX, start,
 | 
			
		||||
			 ctx->Current.Index );
 | 
			
		||||
 | 
			
		||||
      IM->CopyOrFlag |= fixup;
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   /* Materials:
 | 
			
		||||
    */
 | 
			
		||||
   if (IM->MaterialOrMask & ~IM->MaterialAndMask) {
 | 
			
		||||
      GLuint vulnerable = IM->MaterialOrMask;
 | 
			
		||||
      GLuint i = IM->Start;
 | 
			
		||||
 | 
			
		||||
      do {
 | 
			
		||||
	 while (!(IM->Flag[i] & VERT_BIT_MATERIAL))
 | 
			
		||||
	    i++;
 | 
			
		||||
 | 
			
		||||
	 vulnerable &= ~IM->MaterialMask[i];
 | 
			
		||||
	 _mesa_copy_materials( &IM->Material[i],
 | 
			
		||||
			       &ctx->Light.Material,
 | 
			
		||||
			       vulnerable );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	 ++i;
 | 
			
		||||
      } while (vulnerable);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
copy_none( TNLcontext *tnl, GLuint start, GLuint count, GLuint ovf)
 | 
			
		||||
{
 | 
			
		||||
   (void) (start && ovf && tnl && count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
copy_last( TNLcontext *tnl, GLuint start, GLuint count, GLuint ovf)
 | 
			
		||||
{
 | 
			
		||||
   (void) start; (void) ovf;
 | 
			
		||||
   tnl->ExecCopyCount = 1;
 | 
			
		||||
   tnl->ExecCopyElts[2] = count-1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
copy_first_and_last( TNLcontext *tnl, GLuint start, GLuint count, GLuint ovf)
 | 
			
		||||
{
 | 
			
		||||
   (void) ovf;
 | 
			
		||||
   tnl->ExecCopyCount = 2;
 | 
			
		||||
   tnl->ExecCopyElts[1] = start;
 | 
			
		||||
   tnl->ExecCopyElts[2] = count-1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
copy_last_three( TNLcontext *tnl, GLuint start, GLuint count, GLuint ovf )
 | 
			
		||||
{
 | 
			
		||||
   (void) start;
 | 
			
		||||
   tnl->ExecCopyCount = 2+ovf;
 | 
			
		||||
   tnl->ExecCopyElts[0] = count-3;
 | 
			
		||||
   tnl->ExecCopyElts[1] = count-2;
 | 
			
		||||
   tnl->ExecCopyElts[2] = count-1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
copy_overflow( TNLcontext *tnl, GLuint start, GLuint count, GLuint ovf )
 | 
			
		||||
{
 | 
			
		||||
   (void) start;
 | 
			
		||||
   tnl->ExecCopyCount = ovf;
 | 
			
		||||
   tnl->ExecCopyElts[0] = count-3;
 | 
			
		||||
   tnl->ExecCopyElts[1] = count-2;
 | 
			
		||||
   tnl->ExecCopyElts[2] = count-1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef void (*copy_func)( TNLcontext *tnl, GLuint start, GLuint count,
 | 
			
		||||
			   GLuint ovf );
 | 
			
		||||
 | 
			
		||||
static copy_func copy_tab[GL_POLYGON+2] =
 | 
			
		||||
{
 | 
			
		||||
   copy_none,            /* GL_POINTS */
 | 
			
		||||
   copy_overflow,        /* GL_LINES */
 | 
			
		||||
   copy_first_and_last,  /* GL_LINE_LOOP */
 | 
			
		||||
   copy_last,            /* GL_LINE_STRIP */
 | 
			
		||||
   copy_overflow,        /* GL_TRIANGLES */
 | 
			
		||||
   copy_last_three,      /* GL_TRIANGLE_STRIP */
 | 
			
		||||
   copy_first_and_last,  /* GL_TRIANGLE_FAN */
 | 
			
		||||
   copy_overflow,        /* GL_QUADS */
 | 
			
		||||
   copy_last_three,      /* GL_QUAD_STRIP */
 | 
			
		||||
   copy_first_and_last,  /* GL_POLYGON */
 | 
			
		||||
   copy_none
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Figure out what vertices need to be copied next time.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_get_exec_copy_verts( GLcontext *ctx, struct immediate *IM )
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   GLuint last = IM->LastPrimitive;
 | 
			
		||||
   GLuint prim = ctx->Driver.CurrentExecPrimitive;
 | 
			
		||||
   GLuint pincr = increment[prim];
 | 
			
		||||
   GLuint pintro = intro[prim];
 | 
			
		||||
   GLuint ovf = 0;
 | 
			
		||||
 | 
			
		||||
/*     _mesa_debug(ctx, "_tnl_get_exec_copy_verts %s\n",  */
 | 
			
		||||
/*  	   _mesa_lookup_enum_by_nr(prim)); */
 | 
			
		||||
 | 
			
		||||
   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.
 | 
			
		||||
       */
 | 
			
		||||
      tnl->ExecCopySource = IM; IM->ref_count++;
 | 
			
		||||
      tnl->ExecCopyCount = 0;
 | 
			
		||||
      tnl->ExecCopyTexSize = IM->CopyTexSize;
 | 
			
		||||
 | 
			
		||||
      if (IM->LastPrimitive != IM->CopyStart)
 | 
			
		||||
	 tnl->ExecParity = 0;
 | 
			
		||||
	 
 | 
			
		||||
      tnl->ExecParity ^= IM->PrimitiveLength[IM->LastPrimitive] & 1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      if (pincr != 1 && (IM->Count - last - pintro))
 | 
			
		||||
	 ovf = (IM->Count - last - pintro) % pincr;
 | 
			
		||||
 | 
			
		||||
      if (last < IM->Count)
 | 
			
		||||
	 copy_tab[prim]( tnl, last, IM->Count, ovf );
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Recalculate ExecCopyElts, ExecParity, etc.  
 | 
			
		||||
 */
 | 
			
		||||
void 
 | 
			
		||||
_tnl_get_purged_copy_verts( GLcontext *ctx, struct immediate *IM ) 
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   if (ctx->Driver.CurrentExecPrimitive != GL_POLYGON+1) {
 | 
			
		||||
      GLuint last = IM->LastPrimitive;
 | 
			
		||||
      GLenum prim = IM->Primitive[last];
 | 
			
		||||
      GLuint pincr = increment[prim];
 | 
			
		||||
      GLuint pintro = intro[prim];
 | 
			
		||||
      GLuint ovf = 0, i;
 | 
			
		||||
 | 
			
		||||
      tnl->ExecCopyCount = 0;
 | 
			
		||||
      if (IM->LastPrimitive != IM->CopyStart)
 | 
			
		||||
	 tnl->ExecParity = 0;
 | 
			
		||||
	 
 | 
			
		||||
      tnl->ExecParity ^= IM->PrimitiveLength[IM->LastPrimitive] & 1;
 | 
			
		||||
 | 
			
		||||
      if (pincr != 1 && (IM->Count - last - pintro))
 | 
			
		||||
	 ovf = (IM->Count - last - pintro) % pincr;
 | 
			
		||||
 | 
			
		||||
      if (last < IM->Count)
 | 
			
		||||
	 copy_tab[prim]( tnl, last, IM->Count, ovf );
 | 
			
		||||
 | 
			
		||||
      for (i = 0 ; i < tnl->ExecCopyCount ; i++)
 | 
			
		||||
	 tnl->ExecCopyElts[i] = IM->Elt[tnl->ExecCopyElts[i]];
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Called via the VB->import_data function pointer.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_tnl_upgrade_current_data( GLcontext *ctx, GLuint required, GLuint flags )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   struct immediate *IM = (struct immediate *)VB->import_source;
 | 
			
		||||
 | 
			
		||||
   ASSERT(IM);
 | 
			
		||||
 | 
			
		||||
/*     _tnl_print_vert_flags("_tnl_upgrade_client_data", required); */
 | 
			
		||||
 | 
			
		||||
   if ((required & VERT_BIT_COLOR0) && (VB->ColorPtr[0]->Flags & CA_CLIENT_DATA)) {
 | 
			
		||||
      struct gl_client_array *tmp = &tnl->imm_inputs.Color;
 | 
			
		||||
      GLuint start = IM->CopyStart;
 | 
			
		||||
 | 
			
		||||
      tmp->Ptr = (GLubyte *) (IM->Attrib[VERT_ATTRIB_COLOR0] + start);
 | 
			
		||||
      tmp->StrideB = 4 * sizeof(GLfloat);
 | 
			
		||||
      tmp->Flags = 0;
 | 
			
		||||
 | 
			
		||||
      COPY_4FV( IM->Attrib[VERT_ATTRIB_COLOR0][start],
 | 
			
		||||
                ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);   
 | 
			
		||||
 | 
			
		||||
      /*
 | 
			
		||||
      ASSERT(IM->Flag[IM->LastData+1] & VERT_BIT_END_VB);
 | 
			
		||||
      */
 | 
			
		||||
 | 
			
		||||
      fixup_first_4f( IM->Attrib[VERT_ATTRIB_COLOR0], IM->Flag,
 | 
			
		||||
                      VERT_BIT_END_VB,
 | 
			
		||||
                      start, IM->Attrib[VERT_ATTRIB_COLOR0][start] );
 | 
			
		||||
 | 
			
		||||
      VB->importable_data &= ~VERT_BIT_COLOR0;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,56 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef _T_IMM_FIXUP_H
 | 
			
		||||
#define _T_IMM_FIXUP_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
extern void _tnl_fixup_1ub( GLubyte *data, GLuint flag[],
 | 
			
		||||
			    GLuint start, GLuint match );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_fixup_1ui( GLuint *data, GLuint flag[],
 | 
			
		||||
			    GLuint start, GLuint match );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_fixup_4f( GLfloat data[][4], const GLuint flag[],
 | 
			
		||||
			   GLuint start, GLuint match );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_fixup_input( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_fixup_compiled_cassette( GLcontext *ctx,
 | 
			
		||||
					  struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_copy_immediate_vertices( GLcontext *ctx, 
 | 
			
		||||
					  struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_get_purged_copy_verts( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_get_exec_copy_verts( GLcontext *ctx, struct immediate *IM );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_upgrade_current_data( GLcontext *ctx, GLuint required,
 | 
			
		||||
				       GLuint flags );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -40,10 +40,10 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_install_pipeline( GLcontext *ctx,
 | 
			
		||||
			    const struct gl_pipeline_stage **stages )
 | 
			
		||||
			    const struct tnl_pipeline_stage **stages )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct gl_pipeline *pipe = &tnl->pipeline;
 | 
			
		||||
   struct tnl_pipeline *pipe = &tnl->pipeline;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   ASSERT(pipe->nr_stages == 0);
 | 
			
		||||
@@ -82,8 +82,8 @@ void _tnl_destroy_pipeline( GLcontext *ctx )
 | 
			
		||||
void _tnl_validate_pipeline( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct gl_pipeline *pipe = &tnl->pipeline;
 | 
			
		||||
   struct gl_pipeline_stage *s = pipe->stages;
 | 
			
		||||
   struct tnl_pipeline *pipe = &tnl->pipeline;
 | 
			
		||||
   struct tnl_pipeline_stage *s = pipe->stages;
 | 
			
		||||
   GLuint newstate = pipe->build_state_changes;
 | 
			
		||||
   GLuint generated = 0;
 | 
			
		||||
   GLuint changed_inputs = 0;
 | 
			
		||||
@@ -118,9 +118,8 @@ void _tnl_validate_pipeline( GLcontext *ctx )
 | 
			
		||||
void _tnl_run_pipeline( GLcontext *ctx )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   struct gl_pipeline *pipe = &tnl->pipeline;
 | 
			
		||||
   struct gl_pipeline_stage *s = pipe->stages;
 | 
			
		||||
   struct tnl_pipeline *pipe = &tnl->pipeline;
 | 
			
		||||
   struct tnl_pipeline_stage *s = pipe->stages;
 | 
			
		||||
   GLuint changed_state = pipe->run_state_changes;
 | 
			
		||||
   GLuint changed_inputs = pipe->run_input_changes;
 | 
			
		||||
   GLboolean running = GL_TRUE;
 | 
			
		||||
@@ -153,7 +152,6 @@ void _tnl_run_pipeline( GLcontext *ctx )
 | 
			
		||||
	 running = s->run( ctx, s );
 | 
			
		||||
 | 
			
		||||
	 s->changed_inputs = 0;
 | 
			
		||||
	 VB->importable_data &= ~s->outputs;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@@ -184,7 +182,7 @@ void _tnl_run_pipeline( GLcontext *ctx )
 | 
			
		||||
 *
 | 
			
		||||
 * - inserting optimized (but specialized) stages ahead of the
 | 
			
		||||
 *   general-purpose fallback implementation.  For example, the old
 | 
			
		||||
 *   fastpath mechanism, which only works when the VERT_BIT_ELT input is
 | 
			
		||||
 *   fastpath mechanism, which only works when the VB->Elts input is
 | 
			
		||||
 *   available, can be duplicated by placing the fastpath stage at the
 | 
			
		||||
 *   head of this pipeline.  Such specialized stages are currently
 | 
			
		||||
 *   constrained to have no outputs (ie. they must either finish the *
 | 
			
		||||
@@ -193,7 +191,7 @@ void _tnl_run_pipeline( GLcontext *ctx )
 | 
			
		||||
 * Some work can be done to lift some of the restrictions in the final
 | 
			
		||||
 * case, if it becomes necessary to do so.
 | 
			
		||||
 */
 | 
			
		||||
const struct gl_pipeline_stage *_tnl_default_pipeline[] = {
 | 
			
		||||
const struct tnl_pipeline_stage *_tnl_default_pipeline[] = {
 | 
			
		||||
   &_tnl_vertex_transform_stage,
 | 
			
		||||
   &_tnl_normal_transform_stage,
 | 
			
		||||
   &_tnl_lighting_stage,
 | 
			
		||||
 
 | 
			
		||||
@@ -41,24 +41,24 @@ extern void _tnl_validate_pipeline( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_destroy_pipeline( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_install_pipeline( GLcontext *ctx,
 | 
			
		||||
				   const struct gl_pipeline_stage **stages );
 | 
			
		||||
				   const struct tnl_pipeline_stage **stages );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* These are implemented in the t_vb_*.c files:
 | 
			
		||||
 */
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_vertex_transform_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_normal_transform_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_lighting_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_fog_coordinate_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_texgen_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_texture_transform_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_point_attenuation_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_vertex_program_stage;
 | 
			
		||||
extern const struct gl_pipeline_stage _tnl_render_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_vertex_transform_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_normal_transform_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_lighting_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_fog_coordinate_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_texgen_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_texture_transform_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_point_attenuation_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_vertex_program_stage;
 | 
			
		||||
extern const struct tnl_pipeline_stage _tnl_render_stage;
 | 
			
		||||
 | 
			
		||||
/* Shorthand to plug in the default pipeline:
 | 
			
		||||
 */
 | 
			
		||||
extern const struct gl_pipeline_stage *_tnl_default_pipeline[];
 | 
			
		||||
extern const struct tnl_pipeline_stage *_tnl_default_pipeline[];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Convenience routines provided by t_vb_render.c:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1580
									
								
								src/mesa/tnl/t_save_api.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1580
									
								
								src/mesa/tnl/t_save_api.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -29,63 +29,30 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
/*
 | 
			
		||||
 * Authors:
 | 
			
		||||
 *   Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imports.h" 
 | 
			
		||||
#include "simple_list.h" 
 | 
			
		||||
#include "t_vtx_api.h"
 | 
			
		||||
#ifndef __T_SAVE_API_H__
 | 
			
		||||
#define __T_SAVE_API_H__
 | 
			
		||||
 | 
			
		||||
#if defined(USE_SSE_ASM)
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
 | 
			
		||||
/* Build specialized versions of the immediate calls on the fly for
 | 
			
		||||
 * the current state.  ???P4 SSE2 versions???
 | 
			
		||||
 */
 | 
			
		||||
extern GLboolean _tnl_weak_begin( GLcontext *ctx, GLenum mode );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_EndList( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_NewList( GLcontext *ctx, GLuint list, GLenum mode );
 | 
			
		||||
 | 
			
		||||
static struct dynfn *makeSSENormal3fv( struct _vb *vb, int key )
 | 
			
		||||
{
 | 
			
		||||
   /* Requires P4 (sse2?)
 | 
			
		||||
    */
 | 
			
		||||
   static unsigned char temp[] = {
 | 
			
		||||
      0x8b, 0x44, 0x24, 0x04,          	/*  mov    0x4(%esp,1),%eax */
 | 
			
		||||
      0xba, 0x78, 0x56, 0x34, 0x12,   	/*  mov    $0x12345678,%edx */
 | 
			
		||||
      0xf3, 0x0f, 0x7e, 0x00,          	/*  movq   (%eax),%xmm0 */
 | 
			
		||||
      0x66, 0x0f, 0x6e, 0x48, 0x08,    	/*  movd   0x8(%eax),%xmm1 */
 | 
			
		||||
      0x66, 0x0f, 0xd6, 0x42, 0x0c,    	/*  movq   %xmm0,0xc(%edx) */
 | 
			
		||||
      0x66, 0x0f, 0x7e, 0x4a, 0x14,    	/*  movd   %xmm1,0x14(%edx) */
 | 
			
		||||
      0xc3,                   	        /*  ret     */
 | 
			
		||||
   };
 | 
			
		||||
extern void _tnl_EndCallList( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_BeginCallList( GLcontext *ctx, GLuint list );
 | 
			
		||||
 | 
			
		||||
extern void _tnl_SaveFlushVertices( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
   struct dynfn *dfn = MALLOC_STRUCT( dynfn );
 | 
			
		||||
   insert_at_head( &vb->dfn_cache.Normal3fv, dfn );
 | 
			
		||||
   dfn->key = key;
 | 
			
		||||
extern void _tnl_save_init( GLcontext *ctx );
 | 
			
		||||
extern void _tnl_save_destroy( GLcontext *ctx );
 | 
			
		||||
 | 
			
		||||
   dfn->code = ALIGN_MALLOC( sizeof(temp), 16 );
 | 
			
		||||
   memcpy (dfn->code, temp, sizeof(temp));
 | 
			
		||||
   FIXUP(dfn->code, 5, 0x0, (int)vb->normalptr); 
 | 
			
		||||
   return dfn;
 | 
			
		||||
}
 | 
			
		||||
extern void _tnl_loopback_vertex_list( GLcontext *ctx,
 | 
			
		||||
				       struct tnl_vertex_list *list );
 | 
			
		||||
 | 
			
		||||
void _tnl_InitSSECodegen( struct dfn_generators *gen )
 | 
			
		||||
{
 | 
			
		||||
   /* Need to: 
 | 
			
		||||
    *    - check kernel sse support
 | 
			
		||||
    *    - check p4/sse2
 | 
			
		||||
    */
 | 
			
		||||
   (void) makeSSENormal3fv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#else 
 | 
			
		||||
 | 
			
		||||
void _tnl_InitSSECodegen( struct dfn_generators *gen )
 | 
			
		||||
{
 | 
			
		||||
   (void) gen;
 | 
			
		||||
}
 | 
			
		||||
extern void _tnl_playback_vertex_list( GLcontext *ctx, void *data );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										301
									
								
								src/mesa/tnl/t_save_loopback.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										301
									
								
								src/mesa/tnl/t_save_loopback.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,301 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Author:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "enums.h"
 | 
			
		||||
#include "glapi.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_save_api.h"
 | 
			
		||||
 | 
			
		||||
/* If someone compiles a display list like:
 | 
			
		||||
 *      glBegin(Triangles)
 | 
			
		||||
 *      glVertex() 
 | 
			
		||||
 *      ... lots of vertices ...
 | 
			
		||||
 *      glEnd()
 | 
			
		||||
 *
 | 
			
		||||
 * or: 
 | 
			
		||||
 *      glDrawArrays(...)
 | 
			
		||||
 * 
 | 
			
		||||
 * and then tries to execute it like this:
 | 
			
		||||
 *
 | 
			
		||||
 *      glBegin(Lines)
 | 
			
		||||
 *      glCallList()
 | 
			
		||||
 *      glEnd()
 | 
			
		||||
 *
 | 
			
		||||
 * it will wind up in here, as the vertex copying used when wrapping
 | 
			
		||||
 * buffers in list compilation (Triangles) won't be right for how the
 | 
			
		||||
 * list is being executed (as Lines). 
 | 
			
		||||
 *
 | 
			
		||||
 * This could be avoided by not compiling as vertex_lists until after
 | 
			
		||||
 * the first glEnd() has been seen.  However, that would miss an
 | 
			
		||||
 * important category of display lists, for the sake of a degenerate
 | 
			
		||||
 * usage. 
 | 
			
		||||
 *
 | 
			
		||||
 * Further, replaying degenerately-called lists in this fashion is
 | 
			
		||||
 * probably still faster than the replay using opcodes.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
typedef void (*attr_func)( GLcontext *ctx, GLint target, const GLfloat * );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Wrapper functions in case glVertexAttrib*fvNV doesn't exist */
 | 
			
		||||
static void VertexAttrib1fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ctx->Exec->VertexAttrib1fvNV(target, v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void VertexAttrib2fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ctx->Exec->VertexAttrib2fvNV(target, v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void VertexAttrib3fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ctx->Exec->VertexAttrib3fvNV(target, v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void VertexAttrib4fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ctx->Exec->VertexAttrib4fvNV(target, v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static attr_func vert_attrfunc[4] = {
 | 
			
		||||
   VertexAttrib1fvNV,
 | 
			
		||||
   VertexAttrib2fvNV,
 | 
			
		||||
   VertexAttrib3fvNV,
 | 
			
		||||
   VertexAttrib4fvNV
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void mat_attr1fv( GLcontext *ctx, GLint target, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   switch (target) {
 | 
			
		||||
   case _TNL_ATTRIB_MAT_FRONT_SHININESS:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_FRONT, GL_SHININESS, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_BACK_SHININESS:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_BACK, GL_SHININESS, v );
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void mat_attr3fv( GLcontext *ctx, GLint target, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   switch (target) {
 | 
			
		||||
   case _TNL_ATTRIB_MAT_FRONT_INDEXES:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_FRONT, GL_COLOR_INDEXES, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_BACK_INDEXES:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_BACK, GL_COLOR_INDEXES, v );
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void mat_attr4fv( GLcontext *ctx, GLint target, const GLfloat *v )
 | 
			
		||||
{
 | 
			
		||||
   switch (target) {
 | 
			
		||||
   case _TNL_ATTRIB_MAT_FRONT_EMISSION:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_FRONT, GL_EMISSION, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_BACK_EMISSION:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_BACK, GL_EMISSION, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_FRONT_AMBIENT:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_FRONT, GL_AMBIENT, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_BACK_AMBIENT:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_BACK, GL_AMBIENT, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_FRONT_DIFFUSE:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_FRONT, GL_DIFFUSE, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_BACK_DIFFUSE:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_BACK, GL_DIFFUSE, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_FRONT_SPECULAR:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_FRONT, GL_SPECULAR, v );
 | 
			
		||||
      break;
 | 
			
		||||
   case _TNL_ATTRIB_MAT_BACK_SPECULAR:
 | 
			
		||||
      ctx->Exec->Materialfv( GL_BACK, GL_SPECULAR, v );
 | 
			
		||||
      break;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static attr_func mat_attrfunc[4] = {
 | 
			
		||||
   mat_attr1fv,
 | 
			
		||||
   0,
 | 
			
		||||
   mat_attr3fv,
 | 
			
		||||
   mat_attr4fv
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void index_attr1fv(GLcontext *ctx, GLint target, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ctx->Exec->Indexf(v[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void edgeflag_attr1fv(GLcontext *ctx, GLint target, const GLfloat *v)
 | 
			
		||||
{
 | 
			
		||||
   ctx->Exec->EdgeFlag((v[0] == 1.0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct loopback_attr {
 | 
			
		||||
   GLint target;
 | 
			
		||||
   GLint sz;
 | 
			
		||||
   attr_func func;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Don't emit ends and begins on wrapped primitives.  Don't replay
 | 
			
		||||
 * wrapped vertices.  If we get here, it's probably because the the
 | 
			
		||||
 * precalculated wrapping is wrong.
 | 
			
		||||
 */
 | 
			
		||||
static void loopback_prim( GLcontext *ctx,
 | 
			
		||||
			   struct tnl_vertex_list *list, GLuint i,
 | 
			
		||||
			   struct loopback_attr *la, GLuint nr )
 | 
			
		||||
{
 | 
			
		||||
   struct tnl_prim *prim = &list->prim[i];
 | 
			
		||||
   GLint begin = prim->start;
 | 
			
		||||
   GLint end = begin + prim->count;
 | 
			
		||||
   GLfloat *data;
 | 
			
		||||
   GLint j, k;
 | 
			
		||||
 | 
			
		||||
   if (prim->mode & PRIM_BEGIN) {
 | 
			
		||||
      glBegin( prim->mode & PRIM_MODE_MASK );
 | 
			
		||||
   } else {
 | 
			
		||||
      assert(i == 0);
 | 
			
		||||
      assert(begin == 0);
 | 
			
		||||
      begin += list->wrap_count;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   data = list->buffer + begin * list->vertex_size;
 | 
			
		||||
 | 
			
		||||
   for (j = begin ; j < end ; j++) {
 | 
			
		||||
      GLfloat *tmp = data + la[0].sz;
 | 
			
		||||
 | 
			
		||||
      for (k = 1 ; k < nr ; k++) {
 | 
			
		||||
	 la[k].func( ctx, la[k].target, tmp );
 | 
			
		||||
	 tmp += la[k].sz;
 | 
			
		||||
      }
 | 
			
		||||
	 
 | 
			
		||||
      /* Fire the vertex
 | 
			
		||||
       */
 | 
			
		||||
      la[0].func( ctx, VERT_ATTRIB_POS, data );
 | 
			
		||||
      data = tmp;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (prim->mode & PRIM_END) {
 | 
			
		||||
      glEnd();
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      assert (i == list->prim_count-1);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Primitives generated by DrawArrays/DrawElements/Rectf may be
 | 
			
		||||
 * caught here.  If there is no primitive in progress, execute them
 | 
			
		||||
 * normally, otherwise need to track and discard the generated
 | 
			
		||||
 * primitives.
 | 
			
		||||
 */
 | 
			
		||||
static void loopback_weak_prim( GLcontext *ctx,
 | 
			
		||||
				struct tnl_vertex_list *list, GLuint i,
 | 
			
		||||
				struct loopback_attr *la, GLuint nr )
 | 
			
		||||
{
 | 
			
		||||
   if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END) 
 | 
			
		||||
      loopback_prim( ctx, list, i, la, nr );
 | 
			
		||||
   else {
 | 
			
		||||
      struct tnl_prim *prim = &list->prim[i];
 | 
			
		||||
 | 
			
		||||
      /* Use the prim_weak flag to ensure that if this primitive
 | 
			
		||||
       * wraps, we don't mistake future vertex_lists for part of the
 | 
			
		||||
       * surrounding primitive.
 | 
			
		||||
       *
 | 
			
		||||
       * While this flag is set, we are simply disposing of data
 | 
			
		||||
       * generated by an operation now known to be a noop.
 | 
			
		||||
       */
 | 
			
		||||
      if (prim->mode & PRIM_BEGIN)
 | 
			
		||||
	 ctx->Driver.CurrentExecPrimitive |= PRIM_WEAK;
 | 
			
		||||
      if (prim->mode & PRIM_END)
 | 
			
		||||
	 ctx->Driver.CurrentExecPrimitive &= ~PRIM_WEAK;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _tnl_loopback_vertex_list( GLcontext *ctx, struct tnl_vertex_list *list )
 | 
			
		||||
{
 | 
			
		||||
   struct loopback_attr la[_TNL_ATTRIB_MAX];
 | 
			
		||||
   GLuint i, nr = 0;
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i <= _TNL_ATTRIB_TEX7 ; i++) {
 | 
			
		||||
      if (list->attrsz[i]) {
 | 
			
		||||
	 la[nr].target = i;
 | 
			
		||||
	 la[nr].sz = list->attrsz[i];
 | 
			
		||||
	 la[nr].func = vert_attrfunc[list->attrsz[i]-1];
 | 
			
		||||
	 nr++;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT ; 
 | 
			
		||||
	i <= _TNL_ATTRIB_MAT_BACK_INDEXES ; 
 | 
			
		||||
	i++) {
 | 
			
		||||
      if (list->attrsz[i]) {
 | 
			
		||||
	 la[nr].target = i;
 | 
			
		||||
	 la[nr].sz = list->attrsz[i];
 | 
			
		||||
	 la[nr].func = mat_attrfunc[list->attrsz[i]-1];
 | 
			
		||||
	 nr++;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (list->attrsz[_TNL_ATTRIB_EDGEFLAG]) {
 | 
			
		||||
      la[nr].target = _TNL_ATTRIB_EDGEFLAG;
 | 
			
		||||
      la[nr].sz = list->attrsz[_TNL_ATTRIB_EDGEFLAG];
 | 
			
		||||
      la[nr].func = edgeflag_attr1fv;
 | 
			
		||||
      nr++;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (list->attrsz[_TNL_ATTRIB_INDEX]) {
 | 
			
		||||
      la[nr].target = _TNL_ATTRIB_INDEX;
 | 
			
		||||
      la[nr].sz = list->attrsz[_TNL_ATTRIB_INDEX];
 | 
			
		||||
      la[nr].func = index_attr1fv;
 | 
			
		||||
      nr++;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i < list->prim_count ; i++) {
 | 
			
		||||
      if (list->prim[i].mode & PRIM_WEAK)
 | 
			
		||||
	 loopback_weak_prim( ctx, list, i, la, nr );
 | 
			
		||||
      else
 | 
			
		||||
	 loopback_prim( ctx, list, i, la, nr );
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										218
									
								
								src/mesa/tnl/t_save_playback.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								src/mesa/tnl/t_save_playback.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,218 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  5.1
 | 
			
		||||
 *
 | 
			
		||||
 * 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"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included
 | 
			
		||||
 * in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
			
		||||
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Author:
 | 
			
		||||
 *    Keith Whitwell <keith@tungstengraphics.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "context.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "light.h"
 | 
			
		||||
#include "state.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
#include "t_save_api.h"
 | 
			
		||||
#include "t_vtx_api.h"
 | 
			
		||||
 | 
			
		||||
static GLint get_size( const GLfloat *f )
 | 
			
		||||
{
 | 
			
		||||
   if (f[3] != 1.0) return 4;
 | 
			
		||||
   if (f[2] != 0.0) return 3;
 | 
			
		||||
   return 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Some nasty stuff still hanging on here.  
 | 
			
		||||
 *
 | 
			
		||||
 * TODO - remove VB->ColorPtr, etc and just use the AttrPtr's.
 | 
			
		||||
 */
 | 
			
		||||
static void _tnl_bind_vertex_list( GLcontext *ctx,
 | 
			
		||||
				    struct tnl_vertex_list *node )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   struct tnl_vertex_arrays *tmp = &tnl->save_inputs;
 | 
			
		||||
   GLfloat *data = node->buffer;
 | 
			
		||||
   GLuint attr, i;
 | 
			
		||||
 | 
			
		||||
   /* Setup constant data in the VB.
 | 
			
		||||
    */
 | 
			
		||||
   VB->Count = node->count;
 | 
			
		||||
   VB->Primitive = node->prim;
 | 
			
		||||
   VB->PrimitiveCount = node->prim_count;
 | 
			
		||||
   VB->Elts = NULL;
 | 
			
		||||
   VB->NormalLengthPtr = node->normal_lengths;
 | 
			
		||||
 | 
			
		||||
   for (attr = 0; attr <= _TNL_ATTRIB_INDEX; attr++) {
 | 
			
		||||
      if (node->attrsz[attr]) {
 | 
			
		||||
	 tmp->Attribs[attr].count = node->count;
 | 
			
		||||
	 tmp->Attribs[attr].data = (GLfloat (*)[4]) data;
 | 
			
		||||
	 tmp->Attribs[attr].start = data;
 | 
			
		||||
	 tmp->Attribs[attr].size = node->attrsz[attr];
 | 
			
		||||
	 tmp->Attribs[attr].stride = node->vertex_size * sizeof(GLfloat);
 | 
			
		||||
	 VB->AttribPtr[attr] = &tmp->Attribs[attr];
 | 
			
		||||
	 data += node->attrsz[attr];
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
	 tmp->Attribs[attr].count = node->count;
 | 
			
		||||
	 tmp->Attribs[attr].data = (GLfloat (*)[4]) tnl->vtx.current[attr];
 | 
			
		||||
	 tmp->Attribs[attr].start = tnl->vtx.current[attr];
 | 
			
		||||
	 tmp->Attribs[attr].size = get_size( tnl->vtx.current[attr] );
 | 
			
		||||
	 tmp->Attribs[attr].stride = 0;
 | 
			
		||||
	 VB->AttribPtr[attr] = &tmp->Attribs[attr];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
   /* Copy edgeflag to a contiguous array
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Polygon.FrontMode != GL_FILL || ctx->Polygon.BackMode != GL_FILL) {
 | 
			
		||||
      if (node->attrsz[_TNL_ATTRIB_EDGEFLAG]) {
 | 
			
		||||
	 VB->EdgeFlag = _tnl_translate_edgeflag( ctx, data, 
 | 
			
		||||
						 node->count,
 | 
			
		||||
						 node->vertex_size );
 | 
			
		||||
	 data++;
 | 
			
		||||
      }
 | 
			
		||||
      else 
 | 
			
		||||
	 VB->EdgeFlag = _tnl_import_current_edgeflag( ctx, node->count );
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Legacy pointers -- remove one day.
 | 
			
		||||
    */
 | 
			
		||||
   VB->ObjPtr = VB->AttribPtr[_TNL_ATTRIB_POS];
 | 
			
		||||
   VB->NormalPtr = VB->AttribPtr[_TNL_ATTRIB_NORMAL];
 | 
			
		||||
   VB->ColorPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR0];
 | 
			
		||||
   VB->ColorPtr[1] = 0;
 | 
			
		||||
   VB->IndexPtr[0] = VB->AttribPtr[_TNL_ATTRIB_INDEX];
 | 
			
		||||
   VB->IndexPtr[1] = 0;
 | 
			
		||||
   VB->SecondaryColorPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR1];
 | 
			
		||||
   VB->SecondaryColorPtr[1] = 0;
 | 
			
		||||
 | 
			
		||||
   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
 | 
			
		||||
      VB->TexCoordPtr[i] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i];
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _playback_copy_to_current( GLcontext *ctx,
 | 
			
		||||
				       struct tnl_vertex_list *node )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx); 
 | 
			
		||||
   GLfloat *data;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   if (node->count)
 | 
			
		||||
      data = node->buffer + (node->count-1) * node->vertex_size;
 | 
			
		||||
   else
 | 
			
		||||
      data = node->buffer;
 | 
			
		||||
 | 
			
		||||
   for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_INDEX ; i++) {
 | 
			
		||||
      if (node->attrsz[i]) {
 | 
			
		||||
	 ASSIGN_4V(tnl->vtx.current[i], 0, 0, 0, 1);
 | 
			
		||||
	 COPY_SZ_4V(tnl->vtx.current[i], node->attrsz[i], data);
 | 
			
		||||
	 data += node->attrsz[i];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Edgeflag requires special treatment:
 | 
			
		||||
    */
 | 
			
		||||
   if (node->attrsz[_TNL_ATTRIB_EDGEFLAG]) {
 | 
			
		||||
      ctx->Current.EdgeFlag = (data[0] == 1.0);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Colormaterial -- this kindof sucks.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Light.ColorMaterialEnabled) {
 | 
			
		||||
      _mesa_update_color_material(ctx, ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* CurrentExecPrimitive
 | 
			
		||||
    */
 | 
			
		||||
   if (node->prim_count) {
 | 
			
		||||
      GLenum mode = node->prim[node->prim_count - 1].mode;
 | 
			
		||||
      if (mode & PRIM_END)
 | 
			
		||||
	 ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
 | 
			
		||||
      else
 | 
			
		||||
	 ctx->Driver.CurrentExecPrimitive = (mode & PRIM_MODE_MASK);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Execute the buffer and save copied verts.
 | 
			
		||||
 */
 | 
			
		||||
void _tnl_playback_vertex_list( GLcontext *ctx, void *data )
 | 
			
		||||
{
 | 
			
		||||
   struct tnl_vertex_list *node = (struct tnl_vertex_list *)data;
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
 | 
			
		||||
   FLUSH_CURRENT(ctx, 0);
 | 
			
		||||
 | 
			
		||||
   if (node->prim_count) {
 | 
			
		||||
 | 
			
		||||
      if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END &&
 | 
			
		||||
	       (node->prim[0].mode & PRIM_BEGIN)) {
 | 
			
		||||
 | 
			
		||||
	 /* Degenerate case: list is called inside begin/end pair and
 | 
			
		||||
	  * includes operations such as glBegin or glDrawArrays.
 | 
			
		||||
	  */
 | 
			
		||||
	 _mesa_error( ctx, GL_INVALID_OPERATION, "displaylist recursive begin");
 | 
			
		||||
	 _tnl_loopback_vertex_list( ctx, data );
 | 
			
		||||
	 return;
 | 
			
		||||
      }
 | 
			
		||||
      else if (tnl->LoopbackDListCassettes ||
 | 
			
		||||
	       node->dangling_attr_ref) {
 | 
			
		||||
	 /* Degenerate case: list references current data and would
 | 
			
		||||
	  * require fixup.  Take the easier option & loop it back.
 | 
			
		||||
	  */
 | 
			
		||||
	 _mesa_debug( 0, "%s: loopback dangling attr ref\n", __FUNCTION__);
 | 
			
		||||
	 _tnl_loopback_vertex_list( ctx, data );
 | 
			
		||||
	 return;
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      if (ctx->NewState)
 | 
			
		||||
	 _mesa_update_state( ctx );
 | 
			
		||||
 | 
			
		||||
      if (tnl->pipeline.build_state_changes)
 | 
			
		||||
	 _tnl_validate_pipeline( ctx );
 | 
			
		||||
 | 
			
		||||
      _tnl_bind_vertex_list( ctx, node );
 | 
			
		||||
 | 
			
		||||
      /* Invalidate all stored data before and after run:
 | 
			
		||||
       */
 | 
			
		||||
      tnl->pipeline.run_input_changes |= tnl->pipeline.inputs;
 | 
			
		||||
      tnl->Driver.RunPipeline( ctx );
 | 
			
		||||
      tnl->pipeline.run_input_changes |= tnl->pipeline.inputs;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Copy to current?
 | 
			
		||||
    */
 | 
			
		||||
   _playback_copy_to_current( ctx, node );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -126,7 +126,7 @@ TAG(clip_line)( GLcontext *ctx, GLuint i, GLuint j, GLubyte mask )
 | 
			
		||||
   GLfloat (*coord)[4] = VB->ClipPtr->data;
 | 
			
		||||
   GLuint ii = i, jj = j, p;
 | 
			
		||||
 | 
			
		||||
   VB->LastClipped = VB->FirstClipped;
 | 
			
		||||
   VB->LastClipped = VB->Count;
 | 
			
		||||
 | 
			
		||||
   if (mask & 0x3f) {
 | 
			
		||||
      LINE_CLIP( CLIP_RIGHT_BIT,  -1,  0,  0, 1 );
 | 
			
		||||
@@ -174,7 +174,7 @@ TAG(clip_tri)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLubyte mask )
 | 
			
		||||
 | 
			
		||||
   ASSIGN_3V(inlist, v2, v0, v1 ); /* pv rotated to slot zero */
 | 
			
		||||
 | 
			
		||||
   VB->LastClipped = VB->FirstClipped;
 | 
			
		||||
   VB->LastClipped = VB->Count;
 | 
			
		||||
 | 
			
		||||
   if (mask & 0x3f) {
 | 
			
		||||
      POLY_CLIP( CLIP_RIGHT_BIT,  -1,  0,  0, 1 );
 | 
			
		||||
@@ -199,7 +199,7 @@ TAG(clip_tri)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLubyte mask )
 | 
			
		||||
 | 
			
		||||
   if (ctx->_TriangleCaps & DD_FLATSHADE) {
 | 
			
		||||
      if (pv != inlist[0]) {
 | 
			
		||||
	 ASSERT( inlist[0] >= VB->FirstClipped );
 | 
			
		||||
	 ASSERT( inlist[0] >= VB->Count );
 | 
			
		||||
	 tnl->Driver.Render.CopyPV( ctx, inlist[0], pv );
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@@ -227,7 +227,7 @@ TAG(clip_quad)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3,
 | 
			
		||||
 | 
			
		||||
   ASSIGN_4V(inlist, v3, v0, v1, v2 ); /* pv rotated to slot zero */
 | 
			
		||||
 | 
			
		||||
   VB->LastClipped = VB->FirstClipped;
 | 
			
		||||
   VB->LastClipped = VB->Count;
 | 
			
		||||
 | 
			
		||||
   if (mask & 0x3f) {
 | 
			
		||||
      POLY_CLIP( CLIP_RIGHT_BIT,  -1,  0,  0, 1 );
 | 
			
		||||
@@ -252,7 +252,7 @@ TAG(clip_quad)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3,
 | 
			
		||||
 | 
			
		||||
   if (ctx->_TriangleCaps & DD_FLATSHADE) {
 | 
			
		||||
      if (pv != inlist[0]) {
 | 
			
		||||
	 ASSERT( inlist[0] >= VB->FirstClipped );
 | 
			
		||||
	 ASSERT( inlist[0] >= VB->Count );
 | 
			
		||||
	 tnl->Driver.Render.CopyPV( ctx, inlist[0], pv );
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -127,7 +127,7 @@ static void make_win_fog_coords( GLcontext *ctx, GLvector4f *out,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_fog_stage( GLcontext *ctx,
 | 
			
		||||
				struct gl_pipeline_stage *stage )
 | 
			
		||||
				struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct fog_stage_data *store = FOG_STAGE_DATA(stage);
 | 
			
		||||
@@ -189,21 +189,21 @@ static GLboolean run_fog_stage( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void check_fog_stage( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_fog_stage( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->active = ctx->Fog.Enabled && !ctx->VertexProgram.Enabled;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Fog.FogCoordinateSource == GL_FRAGMENT_DEPTH_EXT)
 | 
			
		||||
      stage->inputs = VERT_BIT_EYE;
 | 
			
		||||
      stage->inputs = _TNL_BIT_POS;
 | 
			
		||||
   else
 | 
			
		||||
      stage->inputs = VERT_BIT_FOG;
 | 
			
		||||
      stage->inputs = _TNL_BIT_FOG;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Called the first time stage->run() is invoked.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean alloc_fog_data( GLcontext *ctx,
 | 
			
		||||
				 struct gl_pipeline_stage *stage )
 | 
			
		||||
				 struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct fog_stage_data *store;
 | 
			
		||||
@@ -225,7 +225,7 @@ static GLboolean alloc_fog_data( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void free_fog_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void free_fog_data( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct fog_stage_data *store = FOG_STAGE_DATA(stage);
 | 
			
		||||
   if (store) {
 | 
			
		||||
@@ -236,14 +236,14 @@ static void free_fog_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_fog_coordinate_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_fog_coordinate_stage =
 | 
			
		||||
{
 | 
			
		||||
   "build fog coordinates",	/* name */
 | 
			
		||||
   _NEW_FOG,			/* check_state */
 | 
			
		||||
   _NEW_FOG,			/* run_state */
 | 
			
		||||
   GL_FALSE,			/* active? */
 | 
			
		||||
   0,				/* inputs */
 | 
			
		||||
   VERT_BIT_FOG,		/* outputs */
 | 
			
		||||
   _TNL_BIT_FOG,		/* outputs */
 | 
			
		||||
   0,				/* changed_inputs */
 | 
			
		||||
   NULL,			/* private_data */
 | 
			
		||||
   free_fog_data,		/* dtr */
 | 
			
		||||
 
 | 
			
		||||
@@ -38,68 +38,93 @@
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
 | 
			
		||||
#define LIGHT_FLAGS         0x1	/* must be first */
 | 
			
		||||
#define LIGHT_TWOSIDE       0x2
 | 
			
		||||
#define LIGHT_COLORMATERIAL 0x4
 | 
			
		||||
#define MAX_LIGHT_FUNC      0x8
 | 
			
		||||
#define LIGHT_TWOSIDE       0x1
 | 
			
		||||
#define LIGHT_MATERIAL      0x2
 | 
			
		||||
#define MAX_LIGHT_FUNC      0x4
 | 
			
		||||
 | 
			
		||||
typedef void (*light_func)( GLcontext *ctx,
 | 
			
		||||
			    struct vertex_buffer *VB,
 | 
			
		||||
			    struct gl_pipeline_stage *stage,
 | 
			
		||||
			    struct tnl_pipeline_stage *stage,
 | 
			
		||||
			    GLvector4f *input );
 | 
			
		||||
 | 
			
		||||
struct material_cursor {
 | 
			
		||||
   const GLfloat *ptr;
 | 
			
		||||
   GLuint stride;
 | 
			
		||||
   GLfloat *current;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct light_stage_data {
 | 
			
		||||
   struct gl_client_array FloatColor; 
 | 
			
		||||
   struct gl_client_array LitColor[2];
 | 
			
		||||
   struct gl_client_array LitSecondary[2];
 | 
			
		||||
   GLvector1ui LitIndex[2];
 | 
			
		||||
   GLvector4f Input;
 | 
			
		||||
   GLvector4f LitColor[2];
 | 
			
		||||
   GLvector4f LitSecondary[2];
 | 
			
		||||
   GLvector4f LitIndex[2];
 | 
			
		||||
   light_func *light_func_tab;
 | 
			
		||||
 | 
			
		||||
   struct material_cursor mat[MAT_ATTRIB_MAX];
 | 
			
		||||
   GLuint mat_count;
 | 
			
		||||
   GLuint mat_bitmask;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define LIGHT_STAGE_DATA(stage) ((struct light_stage_data *)(stage->privatePtr))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void import_color_material( GLcontext *ctx,
 | 
			
		||||
				   struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
/* In the case of colormaterial, the effected material attributes
 | 
			
		||||
 * should already have been bound to point to the incoming color data,
 | 
			
		||||
 * prior to running the pipeline.
 | 
			
		||||
 */
 | 
			
		||||
static void update_materials( GLcontext *ctx,
 | 
			
		||||
			      struct light_stage_data *store )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct gl_client_array *to = &LIGHT_STAGE_DATA(stage)->FloatColor;
 | 
			
		||||
   struct gl_client_array *from = VB->ColorPtr[0];
 | 
			
		||||
   GLuint count = VB->Count;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   if (!to->Ptr) {
 | 
			
		||||
      to->Ptr = (GLubyte *) ALIGN_MALLOC( VB->Size * 4 * sizeof(GLfloat), 32 );
 | 
			
		||||
      to->Type = GL_FLOAT;
 | 
			
		||||
   for (i = 0 ; i < store->mat_count ; i++) {
 | 
			
		||||
      COPY_4V(store->mat[i].current, store->mat[i].ptr);
 | 
			
		||||
      STRIDE_F(store->mat[i].ptr, store->mat[i].stride);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* No need to transform the same value 3000 times.
 | 
			
		||||
    */
 | 
			
		||||
   if (!from->StrideB) {
 | 
			
		||||
      to->StrideB = 0;
 | 
			
		||||
      count = 1;
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
      to->StrideB = 4 * sizeof(GLfloat);
 | 
			
		||||
   
 | 
			
		||||
   _math_trans_4fc( (GLfloat (*)[4]) to->Ptr,
 | 
			
		||||
		    from->Ptr,
 | 
			
		||||
		    from->StrideB,
 | 
			
		||||
		    from->Type,
 | 
			
		||||
		    from->Size,
 | 
			
		||||
		    0,
 | 
			
		||||
		    count);
 | 
			
		||||
 | 
			
		||||
   VB->ColorPtr[0] = to;
 | 
			
		||||
      
 | 
			
		||||
   _mesa_update_material( ctx, store->mat_bitmask );
 | 
			
		||||
   _mesa_validate_all_lighting_tables( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void update_materials( GLcontext *ctx,
 | 
			
		||||
			      const struct gl_material *src,
 | 
			
		||||
			      GLuint bitmask )
 | 
			
		||||
static GLuint prepare_materials( GLcontext *ctx,
 | 
			
		||||
				 struct vertex_buffer *VB,
 | 
			
		||||
				 struct light_stage_data *store )
 | 
			
		||||
{
 | 
			
		||||
   _mesa_copy_materials( &ctx->Light.Material, src, bitmask );
 | 
			
		||||
   _mesa_update_material( ctx, bitmask );
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   
 | 
			
		||||
   store->mat_count = 0;
 | 
			
		||||
   store->mat_bitmask = 0;
 | 
			
		||||
 | 
			
		||||
   /* If ColorMaterial enabled, overwrite affected AttrPtr's with
 | 
			
		||||
    * the color pointer.  This could be done earlier.
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Light.ColorMaterialEnabled) {
 | 
			
		||||
      GLuint bitmask = ctx->Light.ColorMaterialBitmask;
 | 
			
		||||
      for (i = 0 ; i < MAT_ATTRIB_MAX ; i++)
 | 
			
		||||
	 if (bitmask & (1<<i))
 | 
			
		||||
	    VB->AttribPtr[_TNL_ATTRIB_MAT_FRONT_AMBIENT + i] = VB->ColorPtr[0];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT ; i < _TNL_ATTRIB_INDEX ; i++) {
 | 
			
		||||
      if (VB->AttribPtr[i]->stride) {
 | 
			
		||||
	 GLuint j = store->mat_count++;
 | 
			
		||||
	 GLuint attr = i - _TNL_ATTRIB_MAT_FRONT_AMBIENT;
 | 
			
		||||
	 store->mat[j].ptr = VB->AttribPtr[i]->start;
 | 
			
		||||
	 store->mat[j].stride = VB->AttribPtr[i]->stride;
 | 
			
		||||
	 store->mat[j].current = ctx->Light.Material.Attrib[attr];
 | 
			
		||||
	 store->mat_bitmask |= (1<<attr);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   /* FIXME: Is this already done?
 | 
			
		||||
    */
 | 
			
		||||
   _mesa_update_material( ctx, ~0 );
 | 
			
		||||
   _mesa_validate_all_lighting_tables( ctx );
 | 
			
		||||
 | 
			
		||||
   return store->mat_count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Tables for all the shading functions.
 | 
			
		||||
@@ -114,32 +139,16 @@ static light_func _tnl_light_ci_tab[MAX_LIGHT_FUNC];
 | 
			
		||||
#define IDX              (0)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_tw
 | 
			
		||||
#define TAG(x)           x##_twoside
 | 
			
		||||
#define IDX              (LIGHT_TWOSIDE)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_fl
 | 
			
		||||
#define IDX              (LIGHT_FLAGS)
 | 
			
		||||
#define TAG(x)           x##_material
 | 
			
		||||
#define IDX              (LIGHT_MATERIAL)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_tw_fl
 | 
			
		||||
#define IDX              (LIGHT_FLAGS|LIGHT_TWOSIDE)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_cm
 | 
			
		||||
#define IDX              (LIGHT_COLORMATERIAL)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_tw_cm
 | 
			
		||||
#define IDX              (LIGHT_TWOSIDE|LIGHT_COLORMATERIAL)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_fl_cm
 | 
			
		||||
#define IDX              (LIGHT_FLAGS|LIGHT_COLORMATERIAL)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
#define TAG(x)           x##_tw_fl_cm
 | 
			
		||||
#define IDX              (LIGHT_FLAGS|LIGHT_TWOSIDE|LIGHT_COLORMATERIAL)
 | 
			
		||||
#define TAG(x)           x##_twoside_material
 | 
			
		||||
#define IDX              (LIGHT_TWOSIDE|LIGHT_MATERIAL)
 | 
			
		||||
#include "t_vb_lighttmp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -149,55 +158,64 @@ static void init_lighting( void )
 | 
			
		||||
 | 
			
		||||
   if (!done) {
 | 
			
		||||
      init_light_tab();
 | 
			
		||||
      init_light_tab_tw();
 | 
			
		||||
      init_light_tab_fl();
 | 
			
		||||
      init_light_tab_tw_fl();
 | 
			
		||||
      init_light_tab_cm();
 | 
			
		||||
      init_light_tab_tw_cm();
 | 
			
		||||
      init_light_tab_fl_cm();
 | 
			
		||||
      init_light_tab_tw_fl_cm();
 | 
			
		||||
      init_light_tab_twoside();
 | 
			
		||||
      init_light_tab_material();
 | 
			
		||||
      init_light_tab_twoside_material();
 | 
			
		||||
      done = 1;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_lighting( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static GLboolean run_lighting( GLcontext *ctx, 
 | 
			
		||||
			       struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
   GLvector4f *input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->ObjPtr;
 | 
			
		||||
   GLuint ind;
 | 
			
		||||
   GLuint idx;
 | 
			
		||||
 | 
			
		||||
/*     _tnl_print_vert_flags( __FUNCTION__, stage->changed_inputs ); */
 | 
			
		||||
 | 
			
		||||
   /* Make sure we can talk about elements 0..2 in the vector we are
 | 
			
		||||
    * lighting.
 | 
			
		||||
   /* Make sure we can talk about position x,y and z:
 | 
			
		||||
    */
 | 
			
		||||
   if (stage->changed_inputs & (VERT_BIT_EYE|VERT_BIT_POS)) {
 | 
			
		||||
      if (input->size <= 2) {
 | 
			
		||||
	 if (input->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	    ASSERT(VB->importable_data & VERT_BIT_POS);
 | 
			
		||||
   if (stage->changed_inputs & _TNL_BIT_POS) {
 | 
			
		||||
      if (input->size <= 2 && input == VB->ObjPtr) {
 | 
			
		||||
 | 
			
		||||
	    VB->import_data( ctx, VERT_BIT_POS, VEC_NOT_WRITEABLE );
 | 
			
		||||
	    input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->ObjPtr;
 | 
			
		||||
	 _math_trans_4f( store->Input.data,
 | 
			
		||||
			 VB->ObjPtr->data,
 | 
			
		||||
			 VB->ObjPtr->stride,
 | 
			
		||||
			 GL_FLOAT,
 | 
			
		||||
			 VB->ObjPtr->size,
 | 
			
		||||
			 0,
 | 
			
		||||
			 VB->Count );
 | 
			
		||||
 | 
			
		||||
	    ASSERT((input->flags & VEC_NOT_WRITEABLE) == 0);
 | 
			
		||||
	 if (input->size <= 2) {
 | 
			
		||||
	    /* Clean z.
 | 
			
		||||
	     */
 | 
			
		||||
	    _mesa_vector4f_clean_elem(&store->Input, VB->Count, 2);
 | 
			
		||||
	 }
 | 
			
		||||
	 
 | 
			
		||||
	 if (input->size <= 1) {
 | 
			
		||||
	    /* Clean y.
 | 
			
		||||
	     */
 | 
			
		||||
	    _mesa_vector4f_clean_elem(&store->Input, VB->Count, 1);
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 _mesa_vector4f_clean_elem(input, VB->Count, 2);
 | 
			
		||||
	 input = &store->Input;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
   idx = 0;
 | 
			
		||||
 | 
			
		||||
   if (VB->Flag)
 | 
			
		||||
      ind = LIGHT_FLAGS;
 | 
			
		||||
   else
 | 
			
		||||
      ind = 0;
 | 
			
		||||
   if (prepare_materials( ctx, VB, store ))
 | 
			
		||||
      idx |= LIGHT_MATERIAL;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Light.Model.TwoSide)
 | 
			
		||||
      idx |= LIGHT_TWOSIDE;
 | 
			
		||||
 | 
			
		||||
   /* The individual functions know about replaying side-effects
 | 
			
		||||
    * vs. full re-execution. 
 | 
			
		||||
    */
 | 
			
		||||
   store->light_func_tab[ind]( ctx, VB, stage, input );
 | 
			
		||||
   store->light_func_tab[idx]( ctx, VB, stage, input );
 | 
			
		||||
 | 
			
		||||
   return GL_TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -206,9 +224,8 @@ static GLboolean run_lighting( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
/* Called in place of do_lighting when the light table may have changed.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean run_validate_lighting( GLcontext *ctx,
 | 
			
		||||
					struct gl_pipeline_stage *stage )
 | 
			
		||||
					struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint ind = 0;
 | 
			
		||||
   light_func *tab;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Visual.rgbMode) {
 | 
			
		||||
@@ -228,13 +245,8 @@ static GLboolean run_validate_lighting( GLcontext *ctx,
 | 
			
		||||
   else
 | 
			
		||||
      tab = _tnl_light_ci_tab;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Light.ColorMaterialEnabled)
 | 
			
		||||
      ind |= LIGHT_COLORMATERIAL;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Light.Model.TwoSide)
 | 
			
		||||
      ind |= LIGHT_TWOSIDE;
 | 
			
		||||
 | 
			
		||||
   LIGHT_STAGE_DATA(stage)->light_func_tab = &tab[ind];
 | 
			
		||||
   LIGHT_STAGE_DATA(stage)->light_func_tab = tab;
 | 
			
		||||
 | 
			
		||||
   /* This and the above should only be done on _NEW_LIGHT:
 | 
			
		||||
    */
 | 
			
		||||
@@ -246,23 +258,13 @@ static GLboolean run_validate_lighting( GLcontext *ctx,
 | 
			
		||||
   return stage->run( ctx, stage );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void alloc_4chan( struct gl_client_array *a, GLuint sz )
 | 
			
		||||
{
 | 
			
		||||
   a->Ptr = (GLubyte *) ALIGN_MALLOC( sz * sizeof(GLchan) * 4, 32 );
 | 
			
		||||
   a->Size = 4;
 | 
			
		||||
   a->Type = CHAN_TYPE;
 | 
			
		||||
   a->Stride = 0;
 | 
			
		||||
   a->StrideB = sizeof(GLchan) * 4;
 | 
			
		||||
   a->Enabled = 0;
 | 
			
		||||
   a->Flags = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Called the first time stage->run is called.  In effect, don't
 | 
			
		||||
 * allocate data until the first time the stage is run.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean run_init_lighting( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct light_stage_data *store;
 | 
			
		||||
@@ -277,15 +279,18 @@ static GLboolean run_init_lighting( GLcontext *ctx,
 | 
			
		||||
    */
 | 
			
		||||
   init_lighting();
 | 
			
		||||
 | 
			
		||||
   store->FloatColor.Ptr = 0;
 | 
			
		||||
   _mesa_vector4f_alloc( &store->Input, 0, size, 32 );
 | 
			
		||||
   _mesa_vector4f_alloc( &store->LitColor[0], 0, size, 32 );
 | 
			
		||||
   _mesa_vector4f_alloc( &store->LitColor[1], 0, size, 32 );
 | 
			
		||||
   _mesa_vector4f_alloc( &store->LitSecondary[0], 0, size, 32 );
 | 
			
		||||
   _mesa_vector4f_alloc( &store->LitSecondary[1], 0, size, 32 );
 | 
			
		||||
   _mesa_vector4f_alloc( &store->LitIndex[0], 0, size, 32 );
 | 
			
		||||
   _mesa_vector4f_alloc( &store->LitIndex[1], 0, size, 32 );
 | 
			
		||||
 | 
			
		||||
   alloc_4chan( &store->LitColor[0], size );
 | 
			
		||||
   alloc_4chan( &store->LitColor[1], size );
 | 
			
		||||
   alloc_4chan( &store->LitSecondary[0], size );
 | 
			
		||||
   alloc_4chan( &store->LitSecondary[1], size );
 | 
			
		||||
 | 
			
		||||
   _mesa_vector1ui_alloc( &store->LitIndex[0], 0, size, 32 );
 | 
			
		||||
   _mesa_vector1ui_alloc( &store->LitIndex[1], 0, size, 32 );
 | 
			
		||||
   store->LitIndex[0].size = 1;
 | 
			
		||||
   store->LitIndex[0].stride = sizeof(GLfloat);
 | 
			
		||||
   store->LitIndex[1].size = 1;
 | 
			
		||||
   store->LitIndex[1].stride = sizeof(GLfloat);
 | 
			
		||||
 | 
			
		||||
   /* Now validate the stage derived data...
 | 
			
		||||
    */
 | 
			
		||||
@@ -299,52 +304,49 @@ static GLboolean run_init_lighting( GLcontext *ctx,
 | 
			
		||||
 * Check if lighting is enabled.  If so, configure the pipeline stage's
 | 
			
		||||
 * type, inputs, and outputs.
 | 
			
		||||
 */
 | 
			
		||||
static void check_lighting( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_lighting( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->active = ctx->Light.Enabled && !ctx->VertexProgram.Enabled;
 | 
			
		||||
   if (stage->active) {
 | 
			
		||||
      if (stage->privatePtr)
 | 
			
		||||
	 stage->run = run_validate_lighting;
 | 
			
		||||
      stage->inputs = VERT_BIT_NORMAL|VERT_BIT_MATERIAL;
 | 
			
		||||
      stage->inputs = _TNL_BIT_NORMAL|_TNL_BITS_MAT_ANY;
 | 
			
		||||
      if (ctx->Light._NeedVertices)
 | 
			
		||||
	 stage->inputs |= VERT_BIT_EYE; /* effectively, even when lighting in obj */
 | 
			
		||||
	 stage->inputs |= _TNL_BIT_POS; 
 | 
			
		||||
      if (ctx->Light.ColorMaterialEnabled)
 | 
			
		||||
	 stage->inputs |= VERT_BIT_COLOR0;
 | 
			
		||||
	 stage->inputs |= _TNL_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
      stage->outputs = VERT_BIT_COLOR0;
 | 
			
		||||
      stage->outputs = _TNL_BIT_COLOR0;
 | 
			
		||||
      if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)
 | 
			
		||||
	 stage->outputs |= VERT_BIT_COLOR1;
 | 
			
		||||
	 stage->outputs |= _TNL_BIT_COLOR1;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
 | 
			
		||||
   if (store) {
 | 
			
		||||
      ALIGN_FREE( store->LitColor[0].Ptr );
 | 
			
		||||
      ALIGN_FREE( store->LitColor[1].Ptr );
 | 
			
		||||
      ALIGN_FREE( store->LitSecondary[0].Ptr );
 | 
			
		||||
      ALIGN_FREE( store->LitSecondary[1].Ptr );
 | 
			
		||||
 | 
			
		||||
      if (store->FloatColor.Ptr)
 | 
			
		||||
	 ALIGN_FREE( store->FloatColor.Ptr );
 | 
			
		||||
 | 
			
		||||
      _mesa_vector1ui_free( &store->LitIndex[0] );
 | 
			
		||||
      _mesa_vector1ui_free( &store->LitIndex[1] );
 | 
			
		||||
      _mesa_vector4f_free( &store->Input );
 | 
			
		||||
      _mesa_vector4f_free( &store->LitColor[0] );
 | 
			
		||||
      _mesa_vector4f_free( &store->LitColor[1] );
 | 
			
		||||
      _mesa_vector4f_free( &store->LitSecondary[0] );
 | 
			
		||||
      _mesa_vector4f_free( &store->LitSecondary[1] );
 | 
			
		||||
      _mesa_vector4f_free( &store->LitIndex[0] );
 | 
			
		||||
      _mesa_vector4f_free( &store->LitIndex[1] );
 | 
			
		||||
      FREE( store );
 | 
			
		||||
      stage->privatePtr = 0;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_lighting_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_lighting_stage =
 | 
			
		||||
{
 | 
			
		||||
   "lighting",			/* name */
 | 
			
		||||
   _NEW_LIGHT,			/* recheck */
 | 
			
		||||
   _NEW_LIGHT|_NEW_MODELVIEW,	/* recalc -- modelview dependency
 | 
			
		||||
				 * otherwise not captured by inputs
 | 
			
		||||
				 * (which may be VERT_BIT_POS) */
 | 
			
		||||
				 * (which may be _TNL_BIT_POS) */
 | 
			
		||||
   GL_FALSE,			/* active? */
 | 
			
		||||
   0,				/* inputs */
 | 
			
		||||
   0,				/* outputs */
 | 
			
		||||
 
 | 
			
		||||
@@ -29,49 +29,6 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if (IDX & LIGHT_FLAGS)
 | 
			
		||||
#  define VSTRIDE (4 * sizeof(GLfloat))
 | 
			
		||||
#  define NSTRIDE nstride /*(3 * sizeof(GLfloat))*/
 | 
			
		||||
#  define CHECK_MATERIAL(x)  (flags[x] & VERT_BIT_MATERIAL)
 | 
			
		||||
#  define CHECK_END_VB(x)    (flags[x] & VERT_BIT_END_VB)
 | 
			
		||||
#  if (IDX & LIGHT_COLORMATERIAL)
 | 
			
		||||
#    define CMSTRIDE STRIDE_F(CMcolor, CMstride)
 | 
			
		||||
#    define CHECK_COLOR_MATERIAL(x) (flags[x] & VERT_BIT_COLOR0)
 | 
			
		||||
#    define CHECK_VALIDATE(x) (flags[x] & (VERT_BIT_COLOR0|VERT_BIT_MATERIAL))
 | 
			
		||||
#    define DO_ANOTHER_NORMAL(x) \
 | 
			
		||||
     ((flags[x] & (VERT_BIT_COLOR0|VERT_BIT_NORMAL|VERT_BIT_END_VB|VERT_BIT_MATERIAL)) == VERT_BIT_NORMAL)
 | 
			
		||||
#    define REUSE_LIGHT_RESULTS(x) \
 | 
			
		||||
     ((flags[x] & (VERT_BIT_COLOR0|VERT_BIT_NORMAL|VERT_BIT_END_VB|VERT_BIT_MATERIAL)) == 0)
 | 
			
		||||
#  else
 | 
			
		||||
#    define CMSTRIDE (void)0
 | 
			
		||||
#    define CHECK_COLOR_MATERIAL(x) 0
 | 
			
		||||
#    define CHECK_VALIDATE(x) (flags[x] & (VERT_BIT_MATERIAL))
 | 
			
		||||
#    define DO_ANOTHER_NORMAL(x) \
 | 
			
		||||
      ((flags[x] & (VERT_BIT_NORMAL|VERT_BIT_END_VB|VERT_BIT_MATERIAL)) == VERT_BIT_NORMAL)
 | 
			
		||||
#    define REUSE_LIGHT_RESULTS(x) \
 | 
			
		||||
      ((flags[x] & (VERT_BIT_NORMAL|VERT_BIT_END_VB|VERT_BIT_MATERIAL)) == 0)
 | 
			
		||||
#  endif
 | 
			
		||||
#else
 | 
			
		||||
#  define VSTRIDE vstride
 | 
			
		||||
#  define NSTRIDE nstride
 | 
			
		||||
#  define CHECK_MATERIAL(x)   0	           /* no materials on array paths */
 | 
			
		||||
#  define CHECK_END_VB(XX)     (XX >= nr)
 | 
			
		||||
#  if (IDX & LIGHT_COLORMATERIAL)
 | 
			
		||||
#     define CMSTRIDE STRIDE_F(CMcolor, CMstride)
 | 
			
		||||
#     define CHECK_COLOR_MATERIAL(x) (x < nr) /* always have colormaterial */
 | 
			
		||||
#     define CHECK_VALIDATE(x) (x < nr)
 | 
			
		||||
#     define DO_ANOTHER_NORMAL(x) 0        /* always stop to recalc colormat */
 | 
			
		||||
#  else
 | 
			
		||||
#     define CMSTRIDE (void)0
 | 
			
		||||
#     define CHECK_COLOR_MATERIAL(x) 0        /* no colormaterial */
 | 
			
		||||
#     define CHECK_VALIDATE(x) (0)
 | 
			
		||||
#     define DO_ANOTHER_NORMAL(XX) (XX < nr) /* keep going to end of vb */
 | 
			
		||||
#  endif
 | 
			
		||||
#  define REUSE_LIGHT_RESULTS(x) 0         /* always have a new normal */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
#  define NR_SIDES 2
 | 
			
		||||
#else
 | 
			
		||||
@@ -79,7 +36,7 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* define TRACE if to trace lighting code */
 | 
			
		||||
/* define TRACE to trace lighting code */
 | 
			
		||||
/* #define TRACE 1 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -90,12 +47,12 @@
 | 
			
		||||
 */
 | 
			
		||||
static void TAG(light_rgba_spec)( GLcontext *ctx,
 | 
			
		||||
				  struct vertex_buffer *VB,
 | 
			
		||||
				  struct gl_pipeline_stage *stage,
 | 
			
		||||
				  struct tnl_pipeline_stage *stage,
 | 
			
		||||
				  GLvector4f *input )
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
   GLfloat (*base)[3] = ctx->Light._BaseColor;
 | 
			
		||||
   GLchan sumA[2];
 | 
			
		||||
   GLfloat sumA[2];
 | 
			
		||||
   GLuint j;
 | 
			
		||||
 | 
			
		||||
   const GLuint vstride = input->stride;
 | 
			
		||||
@@ -103,20 +60,13 @@ static void TAG(light_rgba_spec)( GLcontext *ctx,
 | 
			
		||||
   const GLuint nstride = VB->NormalPtr->stride;
 | 
			
		||||
   const GLfloat *normal = (GLfloat *)VB->NormalPtr->data;
 | 
			
		||||
 | 
			
		||||
   GLfloat *CMcolor;
 | 
			
		||||
   GLuint CMstride;
 | 
			
		||||
 | 
			
		||||
   GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr;
 | 
			
		||||
   GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr;
 | 
			
		||||
   GLchan (*Fspec)[4] = (GLchan (*)[4]) store->LitSecondary[0].Ptr;
 | 
			
		||||
   GLchan (*Bspec)[4] = (GLchan (*)[4]) store->LitSecondary[1].Ptr;
 | 
			
		||||
   GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data;
 | 
			
		||||
   GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data;
 | 
			
		||||
   GLfloat (*Fspec)[4] = (GLfloat (*)[4]) store->LitSecondary[0].data;
 | 
			
		||||
   GLfloat (*Bspec)[4] = (GLfloat (*)[4]) store->LitSecondary[1].data;
 | 
			
		||||
 | 
			
		||||
   const GLuint nr = VB->Count;
 | 
			
		||||
   const GLuint *flags = VB->Flag;
 | 
			
		||||
   struct gl_material *new_material = VB->Material;
 | 
			
		||||
   const GLuint *new_material_mask = VB->MaterialMask;
 | 
			
		||||
 | 
			
		||||
   (void) flags;
 | 
			
		||||
   (void) nstride;
 | 
			
		||||
   (void) vstride;
 | 
			
		||||
 | 
			
		||||
@@ -124,23 +74,14 @@ static void TAG(light_rgba_spec)( GLcontext *ctx,
 | 
			
		||||
   fprintf(stderr, "%s\n", __FUNCTION__ );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_COLORMATERIAL) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type != GL_FLOAT || 
 | 
			
		||||
	  VB->ColorPtr[0]->Size != 4)
 | 
			
		||||
	 import_color_material( ctx, stage );
 | 
			
		||||
 | 
			
		||||
      CMcolor = (GLfloat *) VB->ColorPtr[0]->Ptr;
 | 
			
		||||
      CMstride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   VB->ColorPtr[0] = &store->LitColor[0];
 | 
			
		||||
   VB->SecondaryColorPtr[0] = &store->LitSecondary[0];
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
   sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
      VB->ColorPtr[1] = &store->LitColor[1];
 | 
			
		||||
      VB->SecondaryColorPtr[1] = &store->LitSecondary[1];
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
      sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Side-effects done, can we finish now?
 | 
			
		||||
@@ -148,24 +89,15 @@ static void TAG(light_rgba_spec)( GLcontext *ctx,
 | 
			
		||||
   if (stage->changed_inputs == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   for ( j=0 ;
 | 
			
		||||
	 j<nr ;
 | 
			
		||||
	 j++,STRIDE_F(vertex,VSTRIDE),STRIDE_F(normal,NSTRIDE),CMSTRIDE)
 | 
			
		||||
   {
 | 
			
		||||
   for (j = 0; j < nr; j++,STRIDE_F(vertex,vstride),STRIDE_F(normal,nstride)) {
 | 
			
		||||
      GLfloat sum[2][3], spec[2][3];
 | 
			
		||||
      struct gl_light *light;
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_COLOR_MATERIAL(j) )
 | 
			
		||||
	 _mesa_update_color_material( ctx, CMcolor );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_MATERIAL(j) )
 | 
			
		||||
	 update_materials( ctx, &new_material[j], new_material_mask[j] );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_VALIDATE(j) ) {
 | 
			
		||||
	 TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
      if ( IDX & LIGHT_MATERIAL ) {
 | 
			
		||||
	 update_materials( ctx, store );
 | 
			
		||||
	 sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE) 
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
	    sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      COPY_3V(sum[0], base[0]);
 | 
			
		||||
@@ -288,13 +220,13 @@ static void TAG(light_rgba_spec)( GLcontext *ctx,
 | 
			
		||||
	 }
 | 
			
		||||
      } /*loop over lights*/
 | 
			
		||||
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_RGB_CHAN( Fcolor[j], sum[0] );
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_RGB_CHAN( Fspec[j], spec[0] );
 | 
			
		||||
      COPY_3V( Fcolor[j], sum[0] );
 | 
			
		||||
      COPY_3V( Fspec[j], spec[0] );
 | 
			
		||||
      Fcolor[j][3] = sumA[0];
 | 
			
		||||
 | 
			
		||||
      if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGB_CHAN( Bcolor[j], sum[1] );
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGB_CHAN( Bspec[j], spec[1] );
 | 
			
		||||
	 COPY_3V( Bcolor[j], sum[1] );
 | 
			
		||||
	 COPY_3V( Bspec[j], spec[1] );
 | 
			
		||||
	 Bcolor[j][3] = sumA[1];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@@ -303,81 +235,56 @@ static void TAG(light_rgba_spec)( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
static void TAG(light_rgba)( GLcontext *ctx,
 | 
			
		||||
			     struct vertex_buffer *VB,
 | 
			
		||||
			     struct gl_pipeline_stage *stage,
 | 
			
		||||
			     struct tnl_pipeline_stage *stage,
 | 
			
		||||
			     GLvector4f *input )
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
   GLuint j;
 | 
			
		||||
 | 
			
		||||
   GLfloat (*base)[3] = ctx->Light._BaseColor;
 | 
			
		||||
   GLchan sumA[2];
 | 
			
		||||
   GLfloat sumA[2];
 | 
			
		||||
 | 
			
		||||
   const GLuint vstride = input->stride;
 | 
			
		||||
   const GLfloat *vertex = (GLfloat *) input->data;
 | 
			
		||||
   const GLuint nstride = VB->NormalPtr->stride;
 | 
			
		||||
   const GLfloat *normal = (GLfloat *)VB->NormalPtr->data;
 | 
			
		||||
 | 
			
		||||
   GLfloat *CMcolor;
 | 
			
		||||
   GLuint CMstride;
 | 
			
		||||
   GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data;
 | 
			
		||||
   GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data;
 | 
			
		||||
   GLfloat (*color[2])[4];
 | 
			
		||||
 | 
			
		||||
   GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr;
 | 
			
		||||
   GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr;
 | 
			
		||||
   GLchan (*color[2])[4];
 | 
			
		||||
   const GLuint *flags = VB->Flag;
 | 
			
		||||
 | 
			
		||||
   struct gl_material *new_material = VB->Material;
 | 
			
		||||
   const GLuint *new_material_mask = VB->MaterialMask;
 | 
			
		||||
   const GLuint nr = VB->Count;
 | 
			
		||||
 | 
			
		||||
#ifdef TRACE
 | 
			
		||||
   fprintf(stderr, "%s\n", __FUNCTION__ );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   (void) flags;
 | 
			
		||||
   (void) nstride;
 | 
			
		||||
   (void) vstride;
 | 
			
		||||
 | 
			
		||||
   color[0] = Fcolor;
 | 
			
		||||
   color[1] = Bcolor;
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_COLORMATERIAL) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type != GL_FLOAT || 
 | 
			
		||||
	  VB->ColorPtr[0]->Size != 4)
 | 
			
		||||
	 import_color_material( ctx, stage );
 | 
			
		||||
 | 
			
		||||
      CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr;
 | 
			
		||||
      CMstride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   VB->ColorPtr[0] = &store->LitColor[0];
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
   sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
      VB->ColorPtr[1] = &store->LitColor[1];
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
      sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (stage->changed_inputs == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   for ( j=0 ;
 | 
			
		||||
	 j<nr ;
 | 
			
		||||
	 j++,STRIDE_F(vertex,VSTRIDE), STRIDE_F(normal,NSTRIDE),CMSTRIDE)
 | 
			
		||||
   {
 | 
			
		||||
   for (j = 0; j < nr; j++,STRIDE_F(vertex,vstride),STRIDE_F(normal,nstride)) {
 | 
			
		||||
      GLfloat sum[2][3];
 | 
			
		||||
      struct gl_light *light;
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_COLOR_MATERIAL(j) )
 | 
			
		||||
	 _mesa_update_color_material( ctx, CMcolor );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_MATERIAL(j) )
 | 
			
		||||
	 update_materials( ctx, &new_material[j], new_material_mask[j] );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_VALIDATE(j) ) {
 | 
			
		||||
	 TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
      if ( IDX & LIGHT_MATERIAL ) {
 | 
			
		||||
	 update_materials( ctx, store );
 | 
			
		||||
	 sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
	    sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      COPY_3V(sum[0], base[0]);
 | 
			
		||||
@@ -503,11 +410,11 @@ static void TAG(light_rgba)( GLcontext *ctx,
 | 
			
		||||
	 ACC_SCALE_SCALAR_3V( sum[side], attenuation, contrib );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_RGB_CHAN( Fcolor[j], sum[0] );
 | 
			
		||||
      COPY_3V( Fcolor[j], sum[0] );
 | 
			
		||||
      Fcolor[j][3] = sumA[0];
 | 
			
		||||
 | 
			
		||||
      if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGB_CHAN( Bcolor[j], sum[1] );
 | 
			
		||||
	 COPY_3V( Bcolor[j], sum[1] );
 | 
			
		||||
	 Bcolor[j][3] = sumA[1];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@@ -520,23 +427,17 @@ static void TAG(light_rgba)( GLcontext *ctx,
 | 
			
		||||
 */
 | 
			
		||||
static void TAG(light_fast_rgba_single)( GLcontext *ctx,
 | 
			
		||||
					 struct vertex_buffer *VB,
 | 
			
		||||
					 struct gl_pipeline_stage *stage,
 | 
			
		||||
					 struct tnl_pipeline_stage *stage,
 | 
			
		||||
					 GLvector4f *input )
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
   const GLuint nstride = VB->NormalPtr->stride;
 | 
			
		||||
   const GLfloat *normal = (GLfloat *)VB->NormalPtr->data;
 | 
			
		||||
   GLfloat *CMcolor;
 | 
			
		||||
   GLuint CMstride;
 | 
			
		||||
   GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr;
 | 
			
		||||
   GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr;
 | 
			
		||||
   GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data;
 | 
			
		||||
   GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data;
 | 
			
		||||
   const struct gl_light *light = ctx->Light.EnabledList.next;
 | 
			
		||||
   const GLuint *flags = VB->Flag;
 | 
			
		||||
   GLchan basechan[2][4];
 | 
			
		||||
   GLuint j = 0;
 | 
			
		||||
   struct gl_material *new_material = VB->Material;
 | 
			
		||||
   const GLuint *new_material_mask = VB->MaterialMask;
 | 
			
		||||
   GLfloat base[2][3];
 | 
			
		||||
   const GLuint nr = VB->Count;
 | 
			
		||||
 | 
			
		||||
@@ -545,19 +446,9 @@ static void TAG(light_fast_rgba_single)( GLcontext *ctx,
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   (void) input;		/* doesn't refer to Eye or Obj */
 | 
			
		||||
   (void) flags;
 | 
			
		||||
   (void) nr;
 | 
			
		||||
   (void) nstride;
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_COLORMATERIAL) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type != GL_FLOAT || 
 | 
			
		||||
	  VB->ColorPtr[0]->Size != 4)
 | 
			
		||||
	 import_color_material( ctx, stage );
 | 
			
		||||
 | 
			
		||||
      CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr;
 | 
			
		||||
      CMstride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   VB->ColorPtr[0] = &store->LitColor[0];
 | 
			
		||||
   if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
      VB->ColorPtr[1] = &store->LitColor[1];
 | 
			
		||||
@@ -565,84 +456,61 @@ static void TAG(light_fast_rgba_single)( GLcontext *ctx,
 | 
			
		||||
   if (stage->changed_inputs == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   do {
 | 
			
		||||
      
 | 
			
		||||
      if ( CHECK_COLOR_MATERIAL(j) ) {
 | 
			
		||||
	 _mesa_update_color_material( ctx, CMcolor );
 | 
			
		||||
      }
 | 
			
		||||
   for (j = 0; j < nr; j++, STRIDE_F(normal,nstride)) {
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_MATERIAL(j) )
 | 
			
		||||
	 update_materials( ctx, &new_material[j], new_material_mask[j] );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_VALIDATE(j) )
 | 
			
		||||
	 TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
      GLfloat n_dot_VP;
 | 
			
		||||
 | 
			
		||||
      if ( IDX & LIGHT_MATERIAL )
 | 
			
		||||
	 update_materials( ctx, store );
 | 
			
		||||
 | 
			
		||||
      /* No attenuation, so incoporate _MatAmbient into base color.
 | 
			
		||||
       */
 | 
			
		||||
      COPY_3V(base[0], light->_MatAmbient[0]);
 | 
			
		||||
      ACC_3V(base[0], ctx->Light._BaseColor[0] );
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_RGB_CHAN( basechan[0], base[0] );
 | 
			
		||||
      UNCLAMPED_FLOAT_TO_CHAN(basechan[0][3], 
 | 
			
		||||
			      ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
      if ( j == 0 || (IDX & LIGHT_MATERIAL) ) {
 | 
			
		||||
	 COPY_3V(base[0], light->_MatAmbient[0]);
 | 
			
		||||
	 ACC_3V(base[0], ctx->Light._BaseColor[0] );
 | 
			
		||||
	 base[0][3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
 | 
			
		||||
      if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	 COPY_3V(base[1], light->_MatAmbient[1]);
 | 
			
		||||
	 ACC_3V(base[1], ctx->Light._BaseColor[1]);
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGB_CHAN( basechan[1], base[1]);
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_CHAN(basechan[1][3], 
 | 
			
		||||
				 ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	    COPY_3V(base[1], light->_MatAmbient[1]);
 | 
			
		||||
	    ACC_3V(base[1], ctx->Light._BaseColor[1]);
 | 
			
		||||
	    base[1][3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      do {
 | 
			
		||||
	 GLfloat n_dot_VP = DOT3(normal, light->_VP_inf_norm);
 | 
			
		||||
      n_dot_VP = DOT3(normal, light->_VP_inf_norm);
 | 
			
		||||
 | 
			
		||||
	 if (n_dot_VP < 0.0F) {
 | 
			
		||||
	    if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	       GLfloat n_dot_h = -DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	       GLfloat sum[3];
 | 
			
		||||
	       COPY_3V(sum, base[1]);
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V(sum, -n_dot_VP, light->_MatDiffuse[1]);
 | 
			
		||||
	       if (n_dot_h > 0.0F) {
 | 
			
		||||
		  GLfloat spec;
 | 
			
		||||
		  GET_SHINE_TAB_ENTRY( ctx->_ShineTable[1], n_dot_h, spec );
 | 
			
		||||
		  ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[1]);
 | 
			
		||||
	       }
 | 
			
		||||
	       UNCLAMPED_FLOAT_TO_RGB_CHAN(Bcolor[j], sum );
 | 
			
		||||
	       Bcolor[j][3] = basechan[1][3];
 | 
			
		||||
	    }
 | 
			
		||||
	    COPY_CHAN4(Fcolor[j], basechan[0]);
 | 
			
		||||
	 }
 | 
			
		||||
         else {
 | 
			
		||||
	    GLfloat n_dot_h = DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
      if (n_dot_VP < 0.0F) {
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	    GLfloat n_dot_h = -DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	    GLfloat sum[3];
 | 
			
		||||
	    COPY_3V(sum, base[0]);
 | 
			
		||||
	    ACC_SCALE_SCALAR_3V(sum, n_dot_VP, light->_MatDiffuse[0]);
 | 
			
		||||
	    COPY_3V(sum, base[1]);
 | 
			
		||||
	    ACC_SCALE_SCALAR_3V(sum, -n_dot_VP, light->_MatDiffuse[1]);
 | 
			
		||||
	    if (n_dot_h > 0.0F) {
 | 
			
		||||
	       GLfloat spec;
 | 
			
		||||
	       GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec );
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[0]);
 | 
			
		||||
 | 
			
		||||
	       GET_SHINE_TAB_ENTRY( ctx->_ShineTable[1], n_dot_h, spec );
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[1]);
 | 
			
		||||
	    }
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_RGB_CHAN(Fcolor[j], sum );
 | 
			
		||||
	    Fcolor[j][3] = basechan[0][3];
 | 
			
		||||
	    if (IDX & LIGHT_TWOSIDE) COPY_CHAN4(Bcolor[j], basechan[1]);
 | 
			
		||||
	    COPY_3V(Bcolor[j], sum );
 | 
			
		||||
	    Bcolor[j][3] = base[1][3];
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 j++;
 | 
			
		||||
	 CMSTRIDE;
 | 
			
		||||
	 STRIDE_F(normal, NSTRIDE);
 | 
			
		||||
      } while (DO_ANOTHER_NORMAL(j));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      for ( ; REUSE_LIGHT_RESULTS(j) ; j++, CMSTRIDE, STRIDE_F(normal,NSTRIDE))
 | 
			
		||||
      {
 | 
			
		||||
	 COPY_CHAN4(Fcolor[j], Fcolor[j-1]);
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	    COPY_CHAN4(Bcolor[j], Bcolor[j-1]);
 | 
			
		||||
	 COPY_4FV(Fcolor[j], base[0]);
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
	 GLfloat n_dot_h = DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	 GLfloat sum[3];
 | 
			
		||||
	 COPY_3V(sum, base[0]);
 | 
			
		||||
	 ACC_SCALE_SCALAR_3V(sum, n_dot_VP, light->_MatDiffuse[0]);
 | 
			
		||||
	 if (n_dot_h > 0.0F) {
 | 
			
		||||
	    GLfloat spec;
 | 
			
		||||
	    GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec );
 | 
			
		||||
	    ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[0]);
 | 
			
		||||
 | 
			
		||||
   } while (!CHECK_END_VB(j));
 | 
			
		||||
	 }
 | 
			
		||||
	 COPY_3V(Fcolor[j], sum );
 | 
			
		||||
	 Fcolor[j][3] = base[0][3];
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE) COPY_4FV(Bcolor[j], base[1]);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -650,44 +518,29 @@ static void TAG(light_fast_rgba_single)( GLcontext *ctx,
 | 
			
		||||
 */
 | 
			
		||||
static void TAG(light_fast_rgba)( GLcontext *ctx,
 | 
			
		||||
				  struct vertex_buffer *VB,
 | 
			
		||||
				  struct gl_pipeline_stage *stage,
 | 
			
		||||
				  struct tnl_pipeline_stage *stage,
 | 
			
		||||
				  GLvector4f *input )
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
   GLchan sumA[2];
 | 
			
		||||
   GLfloat sumA[2];
 | 
			
		||||
   const GLuint nstride = VB->NormalPtr->stride;
 | 
			
		||||
   const GLfloat *normal = (GLfloat *)VB->NormalPtr->data;
 | 
			
		||||
   GLfloat *CMcolor;
 | 
			
		||||
   GLuint CMstride;
 | 
			
		||||
   GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr;
 | 
			
		||||
   GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr;
 | 
			
		||||
   const GLuint *flags = VB->Flag;
 | 
			
		||||
   GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data;
 | 
			
		||||
   GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data;
 | 
			
		||||
   GLuint j = 0;
 | 
			
		||||
   struct gl_material *new_material = VB->Material;
 | 
			
		||||
   GLuint *new_material_mask = VB->MaterialMask;
 | 
			
		||||
   const GLuint nr = VB->Count;
 | 
			
		||||
   const struct gl_light *light;
 | 
			
		||||
 | 
			
		||||
#ifdef TRACE
 | 
			
		||||
   fprintf(stderr, "%s\n", __FUNCTION__ );
 | 
			
		||||
   fprintf(stderr, "%s %d\n", __FUNCTION__, nr );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   (void) flags;
 | 
			
		||||
   (void) input;
 | 
			
		||||
   (void) nr;
 | 
			
		||||
   (void) nstride;
 | 
			
		||||
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
   UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_COLORMATERIAL) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type != GL_FLOAT || 
 | 
			
		||||
	  VB->ColorPtr[0]->Size != 4)
 | 
			
		||||
	 import_color_material( ctx, stage );
 | 
			
		||||
 | 
			
		||||
      CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr;
 | 
			
		||||
      CMstride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
   }
 | 
			
		||||
   sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
   sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
 | 
			
		||||
   VB->ColorPtr[0] = &store->LitColor[0];
 | 
			
		||||
   if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
@@ -696,84 +549,60 @@ static void TAG(light_fast_rgba)( GLcontext *ctx,
 | 
			
		||||
   if (stage->changed_inputs == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   do {
 | 
			
		||||
      do {
 | 
			
		||||
	 GLfloat sum[2][3];
 | 
			
		||||
   for (j = 0; j < nr; j++, STRIDE_F(normal,nstride)) {
 | 
			
		||||
 | 
			
		||||
	 if ( CHECK_COLOR_MATERIAL(j) )
 | 
			
		||||
	    _mesa_update_color_material( ctx, CMcolor );
 | 
			
		||||
      GLfloat sum[2][3];
 | 
			
		||||
 | 
			
		||||
	 if ( CHECK_MATERIAL(j) )
 | 
			
		||||
	    update_materials( ctx, &new_material[j], new_material_mask[j] );
 | 
			
		||||
      if ( IDX & LIGHT_MATERIAL ) {
 | 
			
		||||
	 update_materials( ctx, store );
 | 
			
		||||
 | 
			
		||||
	 if ( CHECK_VALIDATE(j) ) {
 | 
			
		||||
	    TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 | 
			
		||||
	    if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	       UNCLAMPED_FLOAT_TO_CHAN(sumA[1], 
 | 
			
		||||
				       ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]);
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	 COPY_3V(sum[0], ctx->Light._BaseColor[0]);
 | 
			
		||||
	 sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	    COPY_3V(sum[1], ctx->Light._BaseColor[1]);
 | 
			
		||||
 | 
			
		||||
	 foreach (light, &ctx->Light.EnabledList) {
 | 
			
		||||
	    GLfloat n_dot_h, n_dot_VP, spec;
 | 
			
		||||
 | 
			
		||||
	    ACC_3V(sum[0], light->_MatAmbient[0]);
 | 
			
		||||
	    if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	       ACC_3V(sum[1], light->_MatAmbient[1]);
 | 
			
		||||
 | 
			
		||||
	    n_dot_VP = DOT3(normal, light->_VP_inf_norm);
 | 
			
		||||
 | 
			
		||||
	    if (n_dot_VP > 0.0F) {
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V(sum[0], n_dot_VP, light->_MatDiffuse[0]);
 | 
			
		||||
	       n_dot_h = DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	       if (n_dot_h > 0.0F) {
 | 
			
		||||
		  struct gl_shine_tab *tab = ctx->_ShineTable[0];
 | 
			
		||||
		  GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec );
 | 
			
		||||
		  ACC_SCALE_SCALAR_3V( sum[0], spec,
 | 
			
		||||
				       light->_MatSpecular[0]);
 | 
			
		||||
	       }
 | 
			
		||||
	    }
 | 
			
		||||
	    else if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V(sum[1], -n_dot_VP, light->_MatDiffuse[1]);
 | 
			
		||||
	       n_dot_h = -DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	       if (n_dot_h > 0.0F) {
 | 
			
		||||
		  struct gl_shine_tab *tab = ctx->_ShineTable[1];
 | 
			
		||||
		  GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec );
 | 
			
		||||
		  ACC_SCALE_SCALAR_3V( sum[1], spec,
 | 
			
		||||
				       light->_MatSpecular[1]);
 | 
			
		||||
	       }
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 UNCLAMPED_FLOAT_TO_RGB_CHAN( Fcolor[j], sum[0] );
 | 
			
		||||
	 Fcolor[j][3] = sumA[0];
 | 
			
		||||
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	    UNCLAMPED_FLOAT_TO_RGB_CHAN( Bcolor[j], sum[1] );
 | 
			
		||||
	    Bcolor[j][3] = sumA[1];
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	 j++;
 | 
			
		||||
	 CMSTRIDE;
 | 
			
		||||
	 STRIDE_F(normal, NSTRIDE);
 | 
			
		||||
      } while (DO_ANOTHER_NORMAL(j));
 | 
			
		||||
 | 
			
		||||
      /* Reuse the shading results while there is no change to
 | 
			
		||||
       * normal or material values.
 | 
			
		||||
       */
 | 
			
		||||
      for ( ; REUSE_LIGHT_RESULTS(j) ; j++, CMSTRIDE, STRIDE_F(normal, NSTRIDE))
 | 
			
		||||
      {
 | 
			
		||||
	 COPY_CHAN4(Fcolor[j], Fcolor[j-1]);
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	    COPY_CHAN4(Bcolor[j], Bcolor[j-1]);
 | 
			
		||||
	    sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   } while (!CHECK_END_VB(j));
 | 
			
		||||
 | 
			
		||||
      COPY_3V(sum[0], ctx->Light._BaseColor[0]);
 | 
			
		||||
      if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	 COPY_3V(sum[1], ctx->Light._BaseColor[1]);
 | 
			
		||||
 | 
			
		||||
      foreach (light, &ctx->Light.EnabledList) {
 | 
			
		||||
	 GLfloat n_dot_h, n_dot_VP, spec;
 | 
			
		||||
 | 
			
		||||
	 ACC_3V(sum[0], light->_MatAmbient[0]);
 | 
			
		||||
	 if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
	    ACC_3V(sum[1], light->_MatAmbient[1]);
 | 
			
		||||
 | 
			
		||||
	 n_dot_VP = DOT3(normal, light->_VP_inf_norm);
 | 
			
		||||
 | 
			
		||||
	 if (n_dot_VP > 0.0F) {
 | 
			
		||||
	    ACC_SCALE_SCALAR_3V(sum[0], n_dot_VP, light->_MatDiffuse[0]);
 | 
			
		||||
	    n_dot_h = DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	    if (n_dot_h > 0.0F) {
 | 
			
		||||
	       struct gl_shine_tab *tab = ctx->_ShineTable[0];
 | 
			
		||||
	       GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec );
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V( sum[0], spec, light->_MatSpecular[0]);
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
	 else if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	    ACC_SCALE_SCALAR_3V(sum[1], -n_dot_VP, light->_MatDiffuse[1]);
 | 
			
		||||
	    n_dot_h = -DOT3(normal, light->_h_inf_norm);
 | 
			
		||||
	    if (n_dot_h > 0.0F) {
 | 
			
		||||
	       struct gl_shine_tab *tab = ctx->_ShineTable[1];
 | 
			
		||||
	       GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec );
 | 
			
		||||
	       ACC_SCALE_SCALAR_3V( sum[1], spec, light->_MatSpecular[1]);
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      COPY_3V( Fcolor[j], sum[0] );
 | 
			
		||||
      Fcolor[j][3] = sumA[0];
 | 
			
		||||
 | 
			
		||||
      if (IDX & LIGHT_TWOSIDE) {
 | 
			
		||||
	 COPY_3V( Bcolor[j], sum[1] );
 | 
			
		||||
	 Bcolor[j][3] = sumA[1];
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -791,7 +620,7 @@ static void TAG(light_fast_rgba)( GLcontext *ctx,
 | 
			
		||||
 */
 | 
			
		||||
static void TAG(light_ci)( GLcontext *ctx,
 | 
			
		||||
			   struct vertex_buffer *VB,
 | 
			
		||||
			   struct gl_pipeline_stage *stage,
 | 
			
		||||
			   struct tnl_pipeline_stage *stage,
 | 
			
		||||
			   GLvector4f *input )
 | 
			
		||||
{
 | 
			
		||||
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
 | 
			
		||||
@@ -800,19 +629,13 @@ static void TAG(light_ci)( GLcontext *ctx,
 | 
			
		||||
   const GLfloat *vertex = (GLfloat *) input->data;
 | 
			
		||||
   const GLuint nstride = VB->NormalPtr->stride;
 | 
			
		||||
   const GLfloat *normal = (GLfloat *)VB->NormalPtr->data;
 | 
			
		||||
   GLfloat *CMcolor;
 | 
			
		||||
   GLuint CMstride;
 | 
			
		||||
   const GLuint *flags = VB->Flag;
 | 
			
		||||
   GLuint *indexResult[2];
 | 
			
		||||
   struct gl_material *new_material = VB->Material;
 | 
			
		||||
   GLuint *new_material_mask = VB->MaterialMask;
 | 
			
		||||
   GLfloat *indexResult[2];
 | 
			
		||||
   const GLuint nr = VB->Count;
 | 
			
		||||
 | 
			
		||||
#ifdef TRACE
 | 
			
		||||
   fprintf(stderr, "%s\n", __FUNCTION__ );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   (void) flags;
 | 
			
		||||
   (void) nstride;
 | 
			
		||||
   (void) vstride;
 | 
			
		||||
 | 
			
		||||
@@ -823,36 +646,18 @@ static void TAG(light_ci)( GLcontext *ctx,
 | 
			
		||||
   if (stage->changed_inputs == 0)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
   indexResult[0] = VB->IndexPtr[0]->data;
 | 
			
		||||
   indexResult[0] = (GLfloat *)VB->IndexPtr[0]->data;
 | 
			
		||||
   if (IDX & LIGHT_TWOSIDE)
 | 
			
		||||
      indexResult[1] = VB->IndexPtr[1]->data;
 | 
			
		||||
 | 
			
		||||
   if (IDX & LIGHT_COLORMATERIAL) {
 | 
			
		||||
      if (VB->ColorPtr[0]->Type != GL_FLOAT || 
 | 
			
		||||
	  VB->ColorPtr[0]->Size != 4)
 | 
			
		||||
	 import_color_material( ctx, stage );
 | 
			
		||||
 | 
			
		||||
      CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr;
 | 
			
		||||
      CMstride = VB->ColorPtr[0]->StrideB;
 | 
			
		||||
   }
 | 
			
		||||
      indexResult[1] = (GLfloat *)VB->IndexPtr[1]->data;
 | 
			
		||||
 | 
			
		||||
   /* loop over vertices */
 | 
			
		||||
   for ( j=0 ;
 | 
			
		||||
	 j<nr ;
 | 
			
		||||
	 j++,STRIDE_F(vertex,VSTRIDE),STRIDE_F(normal, NSTRIDE), CMSTRIDE)
 | 
			
		||||
   {
 | 
			
		||||
   for (j=0; j<nr; j++,STRIDE_F(vertex,vstride),STRIDE_F(normal, nstride)) {
 | 
			
		||||
      GLfloat diffuse[2], specular[2];
 | 
			
		||||
      GLuint side = 0;
 | 
			
		||||
      struct gl_light *light;
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_COLOR_MATERIAL(j) )
 | 
			
		||||
	 _mesa_update_color_material( ctx, CMcolor );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_MATERIAL(j) )
 | 
			
		||||
	 update_materials( ctx, &new_material[j], new_material_mask[j] );
 | 
			
		||||
 | 
			
		||||
      if ( CHECK_VALIDATE(j) )
 | 
			
		||||
	 TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx );
 | 
			
		||||
      if ( IDX & LIGHT_MATERIAL )
 | 
			
		||||
	 update_materials( ctx, store );
 | 
			
		||||
 | 
			
		||||
      diffuse[0] = specular[0] = 0.0F;
 | 
			
		||||
 | 
			
		||||
@@ -962,7 +767,6 @@ static void TAG(light_ci)( GLcontext *ctx,
 | 
			
		||||
	 else {
 | 
			
		||||
	    GLfloat d_a = ind[MAT_INDEX_DIFFUSE] - ind[MAT_INDEX_AMBIENT];
 | 
			
		||||
	    GLfloat s_a = ind[MAT_INDEX_SPECULAR] - ind[MAT_INDEX_AMBIENT];
 | 
			
		||||
	    
 | 
			
		||||
	    index = (ind[MAT_INDEX_AMBIENT]
 | 
			
		||||
		     + diffuse[side] * (1.0F-specular[side]) * d_a
 | 
			
		||||
		     + specular[side] * s_a);
 | 
			
		||||
@@ -970,7 +774,7 @@ static void TAG(light_ci)( GLcontext *ctx,
 | 
			
		||||
	       index = ind[MAT_INDEX_SPECULAR];
 | 
			
		||||
	    }
 | 
			
		||||
	 }
 | 
			
		||||
	 indexResult[side][j] = (GLuint) (GLint) index;
 | 
			
		||||
	 indexResult[side][j] = index;
 | 
			
		||||
      }
 | 
			
		||||
   } /*for vertex*/
 | 
			
		||||
}
 | 
			
		||||
@@ -990,12 +794,3 @@ static void TAG(init_light_tab)( void )
 | 
			
		||||
#undef TAG
 | 
			
		||||
#undef IDX
 | 
			
		||||
#undef NR_SIDES
 | 
			
		||||
#undef NSTRIDE
 | 
			
		||||
#undef VSTRIDE
 | 
			
		||||
#undef CHECK_MATERIAL
 | 
			
		||||
#undef CHECK_END_VB
 | 
			
		||||
#undef DO_ANOTHER_NORMAL
 | 
			
		||||
#undef REUSE_LIGHT_RESULTS
 | 
			
		||||
#undef CMSTRIDE
 | 
			
		||||
#undef CHECK_COLOR_MATERIAL
 | 
			
		||||
#undef CHECK_VALIDATE
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@ struct normal_stage_data {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_normal_stage( GLcontext *ctx,
 | 
			
		||||
				   struct gl_pipeline_stage *stage )
 | 
			
		||||
				   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct normal_stage_data *store = NORMAL_STAGE_DATA(stage);
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
@@ -83,7 +83,7 @@ static GLboolean run_normal_stage( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_validate_normal_stage( GLcontext *ctx,
 | 
			
		||||
					    struct gl_pipeline_stage *stage )
 | 
			
		||||
					    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct normal_stage_data *store = NORMAL_STAGE_DATA(stage);
 | 
			
		||||
 | 
			
		||||
@@ -133,7 +133,7 @@ static GLboolean run_validate_normal_stage( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void check_normal_transform( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->active = !ctx->VertexProgram.Enabled &&
 | 
			
		||||
      (ctx->Light.Enabled || (ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS));
 | 
			
		||||
@@ -146,7 +146,7 @@ static void check_normal_transform( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean alloc_normal_data( GLcontext *ctx,
 | 
			
		||||
				 struct gl_pipeline_stage *stage )
 | 
			
		||||
				 struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct normal_stage_data *store;
 | 
			
		||||
@@ -165,7 +165,7 @@ static GLboolean alloc_normal_data( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void free_normal_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void free_normal_data( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct normal_stage_data *store = NORMAL_STAGE_DATA(stage);
 | 
			
		||||
   if (store) {
 | 
			
		||||
@@ -182,14 +182,14 @@ static void free_normal_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_normal_transform_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_normal_transform_stage =
 | 
			
		||||
{
 | 
			
		||||
   "normal transform",		/* name */
 | 
			
		||||
   _TNL_NEW_NORMAL_TRANSFORM,	/* re-check */
 | 
			
		||||
   _TNL_NEW_NORMAL_TRANSFORM,	/* re-run */
 | 
			
		||||
   GL_FALSE,			/* active? */
 | 
			
		||||
   VERT_BIT_NORMAL,		/* inputs */
 | 
			
		||||
   VERT_BIT_NORMAL,		/* outputs */
 | 
			
		||||
   _TNL_BIT_NORMAL,		/* inputs */
 | 
			
		||||
   _TNL_BIT_NORMAL,		/* outputs */
 | 
			
		||||
   0,				/* changed_inputs */
 | 
			
		||||
   NULL,			/* private data */
 | 
			
		||||
   free_normal_data,		/* destructor */
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ struct point_stage_data {
 | 
			
		||||
 * Compute attenuated point sizes
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean run_point_stage( GLcontext *ctx,
 | 
			
		||||
				  struct gl_pipeline_stage *stage )
 | 
			
		||||
				  struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct point_stage_data *store = POINT_STAGE_DATA(stage);
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
@@ -73,13 +73,13 @@ static GLboolean run_point_stage( GLcontext *ctx,
 | 
			
		||||
/* If point size attenuation is on we'll compute the point size for
 | 
			
		||||
 * each vertex in a special pipeline stage.
 | 
			
		||||
 */
 | 
			
		||||
static void check_point_size( GLcontext *ctx, struct gl_pipeline_stage *d )
 | 
			
		||||
static void check_point_size( GLcontext *ctx, struct tnl_pipeline_stage *d )
 | 
			
		||||
{
 | 
			
		||||
   d->active = ctx->Point._Attenuated && !ctx->VertexProgram.Enabled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GLboolean alloc_point_data( GLcontext *ctx,
 | 
			
		||||
				   struct gl_pipeline_stage *stage )
 | 
			
		||||
				   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct point_stage_data *store;
 | 
			
		||||
@@ -97,7 +97,7 @@ static GLboolean alloc_point_data( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void free_point_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void free_point_data( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct point_stage_data *store = POINT_STAGE_DATA(stage);
 | 
			
		||||
   if (store) {
 | 
			
		||||
@@ -107,14 +107,14 @@ static void free_point_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_point_attenuation_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_point_attenuation_stage =
 | 
			
		||||
{
 | 
			
		||||
   "point size attenuation",	/* name */
 | 
			
		||||
   _NEW_POINT,			/* build_state_change */
 | 
			
		||||
   _NEW_POINT,			/* run_state_change */
 | 
			
		||||
   GL_FALSE,			/* active */
 | 
			
		||||
   VERT_BIT_EYE,			/* inputs */
 | 
			
		||||
   VERT_BIT_POINT_SIZE,		/* outputs */
 | 
			
		||||
   _TNL_BIT_POS,			/* inputs */
 | 
			
		||||
   _TNL_BIT_POS,		/* outputs */
 | 
			
		||||
   0,				/* changed_inputs (temporary value) */
 | 
			
		||||
   NULL,			/* stage private data */
 | 
			
		||||
   free_point_data,		/* destructor */
 | 
			
		||||
 
 | 
			
		||||
@@ -49,8 +49,6 @@
 | 
			
		||||
 | 
			
		||||
#include "t_context.h"
 | 
			
		||||
#include "t_pipeline.h"
 | 
			
		||||
#include "t_imm_api.h"
 | 
			
		||||
#include "t_imm_exec.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -81,10 +79,6 @@ struct vp_stage_data {
 | 
			
		||||
   /** The results of running the vertex program go into these arrays. */
 | 
			
		||||
   GLvector4f attribs[15];
 | 
			
		||||
 | 
			
		||||
   /* These point to the attribs[VERT_RESULT_COL0, COL1, BFC0, BFC1] arrays */
 | 
			
		||||
   struct gl_client_array color0[2];  /**< diffuse front and back */
 | 
			
		||||
   struct gl_client_array color1[2];  /**< specular front and back */
 | 
			
		||||
 | 
			
		||||
   GLvector4f ndcCoords;              /**< normalized device coords */
 | 
			
		||||
   GLubyte *clipmask;                 /**< clip flags */
 | 
			
		||||
   GLubyte ormask, andmask;           /**< for clipping */
 | 
			
		||||
@@ -97,7 +91,7 @@ struct vp_stage_data {
 | 
			
		||||
/**
 | 
			
		||||
 * This function executes vertex programs
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static GLboolean run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vp_stage_data *store = VP_STAGE_DATA(stage);
 | 
			
		||||
@@ -129,28 +123,16 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
             VB->AttribPtr[2]->data[i][3]);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
      /* load the input attribute registers */
 | 
			
		||||
      if (VB->Flag) {
 | 
			
		||||
         /* the traditional glBegin/glVertex/glEnd case */
 | 
			
		||||
         for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
            if (attr == 0 || (program->InputsRead & (1 << attr))) {
 | 
			
		||||
               COPY_4V(ctx->VertexProgram.Inputs[attr],
 | 
			
		||||
                       VB->AttribPtr[attr]->data[i]);
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
         /* the vertex array case */
 | 
			
		||||
         for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
            if (program->InputsRead & (1 << attr)) {
 | 
			
		||||
               const GLubyte *ptr = (const GLubyte*) VB->AttribPtr[attr]->data;
 | 
			
		||||
               const GLuint stride = VB->AttribPtr[attr]->stride;
 | 
			
		||||
               const GLfloat *data = (GLfloat *) (ptr + stride * i);
 | 
			
		||||
               COPY_4V(ctx->VertexProgram.Inputs[attr], data);
 | 
			
		||||
               /*ASSERT(VB->AttribPtr[attr]->size == 4);*/
 | 
			
		||||
               ASSERT(stride == 4 * sizeof(GLfloat) || stride == 0);
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      /* the vertex array case */
 | 
			
		||||
      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
 | 
			
		||||
	 if (program->InputsRead & (1 << attr)) {
 | 
			
		||||
	    const GLubyte *ptr = (const GLubyte*) VB->AttribPtr[attr]->data;
 | 
			
		||||
	    const GLuint size = VB->AttribPtr[attr]->size;
 | 
			
		||||
	    const GLuint stride = VB->AttribPtr[attr]->stride;
 | 
			
		||||
	    const GLfloat *data = (GLfloat *) (ptr + stride * i);
 | 
			
		||||
	    ASSIGN_4V(ctx->VertexProgram.Inputs[attr], 0, 0, 0, 1);
 | 
			
		||||
	    COPY_SZ_4V(ctx->VertexProgram.Inputs[attr], size, data);
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* execute the program */
 | 
			
		||||
@@ -182,10 +164,10 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
   VB->ClipPtr = &store->attribs[VERT_RESULT_HPOS];
 | 
			
		||||
   VB->ClipPtr->size = 4;
 | 
			
		||||
   VB->ClipPtr->count = VB->Count;
 | 
			
		||||
   VB->ColorPtr[0] = &store->color0[0];
 | 
			
		||||
   VB->ColorPtr[1] = &store->color0[1];
 | 
			
		||||
   VB->SecondaryColorPtr[0] = &store->color1[0];
 | 
			
		||||
   VB->SecondaryColorPtr[1] = &store->color1[1];
 | 
			
		||||
   VB->ColorPtr[0] = &store->attribs[VERT_RESULT_COL0];
 | 
			
		||||
   VB->ColorPtr[1] = &store->attribs[VERT_RESULT_BFC0];
 | 
			
		||||
   VB->SecondaryColorPtr[0] = &store->attribs[VERT_RESULT_COL1];
 | 
			
		||||
   VB->SecondaryColorPtr[1] = &store->attribs[VERT_RESULT_BFC1];
 | 
			
		||||
   VB->FogCoordPtr = &store->attribs[VERT_RESULT_FOGC];
 | 
			
		||||
   VB->PointSizePtr = &store->attribs[VERT_RESULT_PSIZ];
 | 
			
		||||
   for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
 | 
			
		||||
@@ -225,11 +207,6 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
   VB->ClipOrMask = store->ormask;
 | 
			
		||||
   VB->ClipMask = store->clipmask;
 | 
			
		||||
 | 
			
		||||
   /* XXXX what's this?
 | 
			
		||||
   if (VB->ClipPtr == VB->ObjPtr && (VB->importable_data & VERT_BIT_POS))
 | 
			
		||||
      VB->importable_data |= VERT_BIT_CLIP;
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
   return GL_TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -238,7 +215,7 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
 * This function validates stuff.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean run_validate_program( GLcontext *ctx,
 | 
			
		||||
					struct gl_pipeline_stage *stage )
 | 
			
		||||
					struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
#if 000
 | 
			
		||||
   /* XXX do we need any validation for vertex programs? */
 | 
			
		||||
@@ -282,27 +259,13 @@ static GLboolean run_validate_program( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize a gl_client_array to point into a GLvector4f color vector.
 | 
			
		||||
 */
 | 
			
		||||
static void init_color_array( struct gl_client_array *a, GLvector4f *vec )
 | 
			
		||||
{
 | 
			
		||||
   a->Ptr = (GLubyte *) vec->data;
 | 
			
		||||
   a->Size = 4;
 | 
			
		||||
   a->Type = GL_FLOAT;
 | 
			
		||||
   a->Stride = 0;
 | 
			
		||||
   a->StrideB = sizeof(GLfloat) * 4;
 | 
			
		||||
   a->Enabled = 0;
 | 
			
		||||
   a->Flags = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Called the first time stage->run is called.  In effect, don't
 | 
			
		||||
 * allocate data until the first time the stage is run.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean run_init_vp( GLcontext *ctx,
 | 
			
		||||
                              struct gl_pipeline_stage *stage )
 | 
			
		||||
                              struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &(tnl->vb);
 | 
			
		||||
@@ -321,12 +284,6 @@ static GLboolean run_init_vp( GLcontext *ctx,
 | 
			
		||||
      store->attribs[i].size = 4;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Make the color0[] and color1[] arrays point into the attribs[] arrays */
 | 
			
		||||
   init_color_array( &store->color0[0], &store->attribs[VERT_RESULT_COL0] );
 | 
			
		||||
   init_color_array( &store->color0[1], &store->attribs[VERT_RESULT_BFC0] );
 | 
			
		||||
   init_color_array( &store->color1[0], &store->attribs[VERT_RESULT_COL1] );
 | 
			
		||||
   init_color_array( &store->color1[1], &store->attribs[VERT_RESULT_BFC1] );
 | 
			
		||||
 | 
			
		||||
   /* a few other misc allocations */
 | 
			
		||||
   _mesa_vector4f_alloc( &store->ndcCoords, 0, size, 32 );
 | 
			
		||||
   store->clipmask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte)*size, 32 );
 | 
			
		||||
@@ -343,31 +300,15 @@ static GLboolean run_init_vp( GLcontext *ctx,
 | 
			
		||||
 * Check if vertex program mode is enabled. 
 | 
			
		||||
 * If so, configure the pipeline stage's type, inputs, and outputs.
 | 
			
		||||
 */
 | 
			
		||||
static void check_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->active = ctx->VertexProgram.Enabled;
 | 
			
		||||
 | 
			
		||||
   if (stage->active) {
 | 
			
		||||
      /* I believe this is right - Keith?
 | 
			
		||||
       * Set stage->inputs equal to the bitmask of vertex attributes
 | 
			
		||||
      /* Set stage->inputs equal to the bitmask of vertex attributes
 | 
			
		||||
       * which the program needs for inputs.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      stage->inputs = ctx->VertexProgram.Current->InputsRead;
 | 
			
		||||
 | 
			
		||||
#if 000
 | 
			
		||||
      if (stage->privatePtr)
 | 
			
		||||
	 stage->run = run_validate_program;
 | 
			
		||||
      stage->inputs = VERT_BIT_NORMAL|VERT_BIT_MATERIAL;
 | 
			
		||||
      if (ctx->Light._NeedVertices)
 | 
			
		||||
	 stage->inputs |= VERT_BIT_EYE; /* effectively, even when lighting in obj */
 | 
			
		||||
      if (ctx->Light.ColorMaterialEnabled)
 | 
			
		||||
	 stage->inputs |= VERT_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
      stage->outputs = VERT_BIT_COLOR0;
 | 
			
		||||
      if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)
 | 
			
		||||
	 stage->outputs |= VERT_BIT_COLOR1;
 | 
			
		||||
#endif
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -375,7 +316,7 @@ static void check_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
/**
 | 
			
		||||
 * Destructor for this pipeline stage.
 | 
			
		||||
 */
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vp_stage_data *store = VP_STAGE_DATA(stage);
 | 
			
		||||
 | 
			
		||||
@@ -398,16 +339,14 @@ static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
/**
 | 
			
		||||
 * Public description of this pipeline stage.
 | 
			
		||||
 */
 | 
			
		||||
const struct gl_pipeline_stage _tnl_vertex_program_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_vertex_program_stage =
 | 
			
		||||
{
 | 
			
		||||
   "vertex-program",
 | 
			
		||||
   _NEW_ALL,	/*XXX FIX */	/* recheck */
 | 
			
		||||
   _NEW_ALL,	/*XXX FIX */    /* recalc -- modelview dependency
 | 
			
		||||
				 * otherwise not captured by inputs
 | 
			
		||||
				 * (which may be VERT_BIT_POS) */
 | 
			
		||||
   _NEW_ALL,	/*XXX FIX */    /* recalc */
 | 
			
		||||
   GL_FALSE,			/* active */
 | 
			
		||||
   /*0*/ VERT_BIT_POS,				/* inputs  XXX OK? */
 | 
			
		||||
   VERT_BIT_CLIP | VERT_BIT_COLOR0,			/* outputs XXX OK? */
 | 
			
		||||
   0,				/* inputs - calculated on the fly */
 | 
			
		||||
   _TNL_BITS_PROG_ANY,		/* outputs -- could calculate */
 | 
			
		||||
   0,				/* changed_inputs */
 | 
			
		||||
   NULL,			/* private_data */
 | 
			
		||||
   dtr,				/* destroy */
 | 
			
		||||
 
 | 
			
		||||
@@ -261,7 +261,7 @@ void _tnl_RenderClippedLine( GLcontext *ctx, GLuint ii, GLuint jj )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_render( GLcontext *ctx,
 | 
			
		||||
			     struct gl_pipeline_stage *stage )
 | 
			
		||||
			     struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
   struct vertex_buffer *VB = &tnl->vb;
 | 
			
		||||
@@ -304,29 +304,29 @@ static GLboolean run_render( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
   do
 | 
			
		||||
   {
 | 
			
		||||
      GLuint i, length, flags = 0;
 | 
			
		||||
      for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
 | 
			
		||||
      {
 | 
			
		||||
	 flags = VB->Primitive[i];
 | 
			
		||||
	 length= VB->PrimitiveLength[i];
 | 
			
		||||
	 ASSERT(length || (flags & PRIM_LAST));
 | 
			
		||||
	 ASSERT((flags & PRIM_MODE_MASK) <= GL_POLYGON+1);
 | 
			
		||||
      GLint i;
 | 
			
		||||
 | 
			
		||||
	 if (MESA_VERBOSE & VERBOSE_PRIMS)
 | 
			
		||||
      for (i = 0 ; i < VB->PrimitiveCount ; i++)
 | 
			
		||||
      {
 | 
			
		||||
	 GLuint prim = VB->Primitive[i].mode;
 | 
			
		||||
	 GLuint start = VB->Primitive[i].start;
 | 
			
		||||
	 GLuint length = VB->Primitive[i].count;
 | 
			
		||||
 | 
			
		||||
	 assert((prim & PRIM_MODE_MASK) < GL_POLYGON+1);
 | 
			
		||||
 | 
			
		||||
	 if (MESA_VERBOSE & VERBOSE_PRIMS) 
 | 
			
		||||
	    _mesa_debug(NULL, "MESA prim %s %d..%d\n", 
 | 
			
		||||
		    _mesa_lookup_enum_by_nr(flags & PRIM_MODE_MASK), 
 | 
			
		||||
		    i, i+length);
 | 
			
		||||
			_mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK), 
 | 
			
		||||
			start, start+length);
 | 
			
		||||
 | 
			
		||||
	 if (length)
 | 
			
		||||
	    tab[flags & PRIM_MODE_MASK]( ctx, i, i + length, flags );
 | 
			
		||||
	    tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim );
 | 
			
		||||
      }
 | 
			
		||||
   } while (tnl->Driver.Render.Multipass &&
 | 
			
		||||
	    tnl->Driver.Render.Multipass( ctx, ++pass ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   tnl->Driver.Render.Finish( ctx );
 | 
			
		||||
/*     _swrast_flush(ctx); */
 | 
			
		||||
/*     usleep(1000000); */
 | 
			
		||||
 | 
			
		||||
   return GL_FALSE;		/* finished the pipe */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -340,41 +340,38 @@ static GLboolean run_render( GLcontext *ctx,
 | 
			
		||||
/* Quite a bit of work involved in finding out the inputs for the
 | 
			
		||||
 * render stage.
 | 
			
		||||
 */
 | 
			
		||||
static void check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint inputs = VERT_BIT_CLIP;
 | 
			
		||||
   GLuint inputs = _TNL_BIT_POS;
 | 
			
		||||
   GLuint i;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Visual.rgbMode) {
 | 
			
		||||
      inputs |= VERT_BIT_COLOR0;
 | 
			
		||||
      inputs |= _TNL_BIT_COLOR0;
 | 
			
		||||
 | 
			
		||||
      if (NEED_SECONDARY_COLOR(ctx))
 | 
			
		||||
	 inputs |= VERT_BIT_COLOR1;
 | 
			
		||||
	 inputs |= _TNL_BIT_COLOR1;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Texture._EnabledCoordUnits) {
 | 
			
		||||
	 for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) {
 | 
			
		||||
	    if (ctx->Texture._EnabledCoordUnits & (1 << i))
 | 
			
		||||
	       inputs |= VERT_BIT_TEX(i);
 | 
			
		||||
	       inputs |= _TNL_BIT_TEX(i);
 | 
			
		||||
	 }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      inputs |= VERT_BIT_INDEX;
 | 
			
		||||
      inputs |= _TNL_BIT_INDEX;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (ctx->Point._Attenuated)
 | 
			
		||||
      inputs |= VERT_BIT_POINT_SIZE;
 | 
			
		||||
 | 
			
		||||
   /* How do drivers turn this off?
 | 
			
		||||
    */
 | 
			
		||||
   if (ctx->Fog.Enabled)
 | 
			
		||||
      inputs |= VERT_BIT_FOG;
 | 
			
		||||
      inputs |= _TNL_BIT_FOG;
 | 
			
		||||
 | 
			
		||||
   if (ctx->Polygon.FrontMode != GL_FILL || ctx->Polygon.BackMode != GL_FILL)
 | 
			
		||||
      inputs |= VERT_BIT_EDGEFLAG;
 | 
			
		||||
      inputs |= _TNL_BIT_EDGEFLAG;
 | 
			
		||||
 | 
			
		||||
   if (ctx->RenderMode==GL_FEEDBACK)
 | 
			
		||||
      inputs |= VERT_BITS_TEX_ANY;
 | 
			
		||||
      inputs |= _TNL_BITS_TEX_ANY;
 | 
			
		||||
 | 
			
		||||
   stage->inputs = inputs;
 | 
			
		||||
}
 | 
			
		||||
@@ -382,12 +379,12 @@ static void check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_render_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_render_stage =
 | 
			
		||||
{
 | 
			
		||||
   "render",			/* name */
 | 
			
		||||
   (_NEW_BUFFERS |
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,6 @@
 | 
			
		||||
#ifndef TEST_PRIM_END
 | 
			
		||||
#define TEST_PRIM_END(flags) (flags & PRIM_END)
 | 
			
		||||
#define TEST_PRIM_BEGIN(flags) (flags & PRIM_BEGIN)
 | 
			
		||||
#define TEST_PRIM_PARITY(flags) (flags & PRIM_PARITY)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef ELT
 | 
			
		||||
@@ -187,9 +186,6 @@ static void TAG(render_tri_strip)( GLcontext *ctx,
 | 
			
		||||
   GLuint parity = 0;
 | 
			
		||||
   LOCAL_VARS;
 | 
			
		||||
 | 
			
		||||
   if (TEST_PRIM_PARITY(flags))
 | 
			
		||||
      parity = 1;
 | 
			
		||||
 | 
			
		||||
   INIT(GL_TRIANGLE_STRIP);
 | 
			
		||||
   if (NEED_EDGEFLAG_SETUP) {
 | 
			
		||||
      for (j=start+2;j<count;j++,parity^=1) {
 | 
			
		||||
 
 | 
			
		||||
@@ -319,10 +319,6 @@ static void texgen_sphere_map( GLcontext *ctx,
 | 
			
		||||
   GLfloat (*f)[3] = store->tmp_f;
 | 
			
		||||
   GLfloat *m = store->tmp_m;
 | 
			
		||||
 | 
			
		||||
/*     _mesa_debug(NULL, "%s normstride %d eyestride %d\n",  */
 | 
			
		||||
/*  	   __FUNCTION__, VB->NormalPtr->stride, */
 | 
			
		||||
/*  	   VB->EyePtr->stride); */
 | 
			
		||||
 | 
			
		||||
   (build_m_tab[VB->EyePtr->size])( store->tmp_f,
 | 
			
		||||
				    store->tmp_m,
 | 
			
		||||
				    VB->NormalPtr,
 | 
			
		||||
@@ -519,7 +515,7 @@ static void texgen( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_texgen_stage( GLcontext *ctx,
 | 
			
		||||
				   struct gl_pipeline_stage *stage )
 | 
			
		||||
				   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct texgen_stage_data *store = TEXGEN_STAGE_DATA( stage );
 | 
			
		||||
@@ -527,7 +523,7 @@ static GLboolean run_texgen_stage( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
 | 
			
		||||
      if (ctx->Texture._TexGenEnabled & ENABLE_TEXGEN(i)) {
 | 
			
		||||
	 if (stage->changed_inputs & (VERT_BIT_EYE | VERT_BIT_NORMAL | VERT_BIT_TEX(i)))
 | 
			
		||||
	 if (stage->changed_inputs & (_TNL_BIT_POS | _TNL_BIT_NORMAL | _TNL_BIT_TEX(i)))
 | 
			
		||||
	    store->TexgenFunc[i]( ctx, store, i );
 | 
			
		||||
 | 
			
		||||
	 VB->TexCoordPtr[i] = &store->texcoord[i];
 | 
			
		||||
@@ -540,7 +536,7 @@ static GLboolean run_texgen_stage( GLcontext *ctx,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_validate_texgen_stage( GLcontext *ctx,
 | 
			
		||||
					    struct gl_pipeline_stage *stage )
 | 
			
		||||
					    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage);
 | 
			
		||||
   GLuint i;
 | 
			
		||||
@@ -584,7 +580,7 @@ static GLboolean run_validate_texgen_stage( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void check_texgen( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_texgen( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   stage->active = 0;
 | 
			
		||||
@@ -593,24 +589,21 @@ static void check_texgen( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
      GLuint inputs = 0;
 | 
			
		||||
      GLuint outputs = 0;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Texture._GenFlags & TEXGEN_OBJ_LINEAR)
 | 
			
		||||
	 inputs |= VERT_BIT_POS;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Texture._GenFlags & TEXGEN_NEED_EYE_COORD)
 | 
			
		||||
	 inputs |= VERT_BIT_EYE;
 | 
			
		||||
      if (ctx->Texture._GenFlags & (TEXGEN_OBJ_LINEAR | TEXGEN_NEED_EYE_COORD))
 | 
			
		||||
	 inputs |= _TNL_BIT_POS;
 | 
			
		||||
 | 
			
		||||
      if (ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS)
 | 
			
		||||
	 inputs |= VERT_BIT_NORMAL;
 | 
			
		||||
	 inputs |= _TNL_BIT_NORMAL;
 | 
			
		||||
 | 
			
		||||
      for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
 | 
			
		||||
	 if (ctx->Texture._TexGenEnabled & ENABLE_TEXGEN(i))
 | 
			
		||||
	 {
 | 
			
		||||
	    outputs |= VERT_BIT_TEX(i);
 | 
			
		||||
	    outputs |= _TNL_BIT_TEX(i);
 | 
			
		||||
 | 
			
		||||
	    /* Need the original input in case it contains a Q coord:
 | 
			
		||||
	     * (sigh)
 | 
			
		||||
	     */
 | 
			
		||||
	    inputs |= VERT_BIT_TEX(i);
 | 
			
		||||
	    inputs |= _TNL_BIT_TEX(i);
 | 
			
		||||
 | 
			
		||||
	    /* Something for Feedback? */
 | 
			
		||||
	 }
 | 
			
		||||
@@ -629,7 +622,7 @@ static void check_texgen( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
/* Called the first time stage->run() is invoked.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean alloc_texgen_data( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct texgen_stage_data *store;
 | 
			
		||||
@@ -653,7 +646,7 @@ static GLboolean alloc_texgen_data( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void free_texgen_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void free_texgen_data( struct tnl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
   struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage);
 | 
			
		||||
@@ -674,7 +667,7 @@ static void free_texgen_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_texgen_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_texgen_stage =
 | 
			
		||||
{
 | 
			
		||||
   "texgen",			/* name */
 | 
			
		||||
   _NEW_TEXTURE,		/* when to call check() */
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@ struct texmat_stage_data {
 | 
			
		||||
 | 
			
		||||
#define TEXMAT_STAGE_DATA(stage) ((struct texmat_stage_data *)stage->privatePtr)
 | 
			
		||||
 | 
			
		||||
static void check_texmat( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_texmat( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   stage->active = 0;
 | 
			
		||||
@@ -62,7 +62,7 @@ static void check_texmat( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
      for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
 | 
			
		||||
	 if (ctx->Texture._TexMatEnabled & ENABLE_TEXMAT(i))
 | 
			
		||||
	    flags |= VERT_BIT_TEX(i);
 | 
			
		||||
	    flags |= _TNL_BIT_TEX(i);
 | 
			
		||||
 | 
			
		||||
      stage->active = 1;
 | 
			
		||||
      stage->inputs = flags;
 | 
			
		||||
@@ -71,7 +71,7 @@ static void check_texmat( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GLboolean run_texmat_stage( GLcontext *ctx,
 | 
			
		||||
				   struct gl_pipeline_stage *stage )
 | 
			
		||||
				   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct texmat_stage_data *store = TEXMAT_STAGE_DATA(stage);
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
@@ -82,7 +82,7 @@ static GLboolean run_texmat_stage( GLcontext *ctx,
 | 
			
		||||
    */
 | 
			
		||||
   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
 | 
			
		||||
      if (ctx->Texture._TexMatEnabled & ENABLE_TEXMAT(i)) {
 | 
			
		||||
	 if (stage->changed_inputs & VERT_BIT_TEX(i))
 | 
			
		||||
	 if (stage->changed_inputs & _TNL_BIT_TEX(i))
 | 
			
		||||
	    (void) TransformRaw( &store->texcoord[i],
 | 
			
		||||
                                 ctx->TextureMatrixStack[i].Top,
 | 
			
		||||
				 VB->TexCoordPtr[i]);
 | 
			
		||||
@@ -96,7 +96,7 @@ static GLboolean run_texmat_stage( GLcontext *ctx,
 | 
			
		||||
/* Called the first time stage->run() is invoked.
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean alloc_texmat_data( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct texmat_stage_data *store;
 | 
			
		||||
@@ -117,7 +117,7 @@ static GLboolean alloc_texmat_data( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void free_texmat_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void free_texmat_data( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct texmat_stage_data *store = TEXMAT_STAGE_DATA(stage);
 | 
			
		||||
   GLuint i;
 | 
			
		||||
@@ -133,7 +133,7 @@ static void free_texmat_data( struct gl_pipeline_stage *stage )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_texture_transform_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_texture_transform_stage =
 | 
			
		||||
{
 | 
			
		||||
   "texture transform",			/* name */
 | 
			
		||||
   _NEW_TEXTURE|_NEW_TEXTURE_MATRIX,	/* check_state */
 | 
			
		||||
 
 | 
			
		||||
@@ -129,7 +129,7 @@ static void (*(usercliptab[5]))( GLcontext *,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GLboolean run_vertex_stage( GLcontext *ctx,
 | 
			
		||||
				   struct gl_pipeline_stage *stage )
 | 
			
		||||
				   struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_stage_data *store = (struct vertex_stage_data *)stage->privatePtr;
 | 
			
		||||
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 | 
			
		||||
@@ -149,36 +149,23 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
 | 
			
		||||
	    VB->EyePtr = TransformRaw( &store->eye,
 | 
			
		||||
                                       ctx->ModelviewMatrixStack.Top,
 | 
			
		||||
				       VB->ObjPtr);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
	 if (ctx->ProjectionMatrixStack.Top->type == MATRIX_IDENTITY)
 | 
			
		||||
	    VB->ClipPtr = VB->EyePtr;
 | 
			
		||||
	 else
 | 
			
		||||
	    VB->ClipPtr = TransformRaw( &store->clip,
 | 
			
		||||
                                        &ctx->_ModelProjectMatrix,
 | 
			
		||||
					VB->ObjPtr );
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
	 /* Combined modelviewproject transform:
 | 
			
		||||
	  */
 | 
			
		||||
	 if (ctx->_ModelProjectMatrix.type == MATRIX_IDENTITY)
 | 
			
		||||
	    VB->ClipPtr = VB->ObjPtr;
 | 
			
		||||
	 else
 | 
			
		||||
	    VB->ClipPtr = TransformRaw( &store->clip,
 | 
			
		||||
                                        &ctx->_ModelProjectMatrix,
 | 
			
		||||
					VB->ObjPtr );
 | 
			
		||||
      }
 | 
			
		||||
      VB->ClipPtr = TransformRaw( &store->clip,
 | 
			
		||||
				  &ctx->_ModelProjectMatrix,
 | 
			
		||||
				  VB->ObjPtr );
 | 
			
		||||
 | 
			
		||||
      /* Drivers expect this to be clean to element 4...
 | 
			
		||||
       */
 | 
			
		||||
      if (VB->ClipPtr->size < 4) {
 | 
			
		||||
	 if (VB->ClipPtr->flags & VEC_NOT_WRITEABLE) {
 | 
			
		||||
	    ASSERT(VB->ClipPtr == VB->ObjPtr);
 | 
			
		||||
	    VB->import_data( ctx, VERT_BIT_POS, VEC_NOT_WRITEABLE );
 | 
			
		||||
	    VB->ClipPtr = VB->ObjPtr;
 | 
			
		||||
	 }
 | 
			
		||||
	 if (VB->ClipPtr->size == 2)
 | 
			
		||||
	    _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 );
 | 
			
		||||
      switch (VB->ClipPtr->size) {
 | 
			
		||||
      case 1:			
 | 
			
		||||
	 /* impossible */
 | 
			
		||||
      case 2:
 | 
			
		||||
	 _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 );
 | 
			
		||||
      case 3:
 | 
			
		||||
	 _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 3 );
 | 
			
		||||
      case 4:
 | 
			
		||||
	 break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* Cliptest and perspective divide.  Clip functions must clear
 | 
			
		||||
@@ -225,9 +212,6 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
 | 
			
		||||
      VB->ClipOrMask = store->ormask;
 | 
			
		||||
      VB->ClipMask = store->clipmask;
 | 
			
		||||
 | 
			
		||||
      if (VB->ClipPtr == VB->ObjPtr && (VB->importable_data & VERT_BIT_POS))
 | 
			
		||||
	 VB->importable_data |= VERT_BIT_CLIP;
 | 
			
		||||
 | 
			
		||||
      store->save_eyeptr = VB->EyePtr;
 | 
			
		||||
      store->save_clipptr = VB->ClipPtr;
 | 
			
		||||
      store->save_ndcptr = VB->NdcPtr;
 | 
			
		||||
@@ -240,8 +224,6 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
 | 
			
		||||
      VB->NdcPtr = store->save_ndcptr;
 | 
			
		||||
      VB->ClipMask = store->clipmask;
 | 
			
		||||
      VB->ClipOrMask = store->ormask;
 | 
			
		||||
      if (VB->ClipPtr == VB->ObjPtr && (VB->importable_data & VERT_BIT_POS))
 | 
			
		||||
	 VB->importable_data |= VERT_BIT_CLIP;
 | 
			
		||||
      if (store->andmask)
 | 
			
		||||
	 return GL_FALSE;
 | 
			
		||||
   }
 | 
			
		||||
@@ -250,13 +232,13 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void check_vertex( GLcontext *ctx, struct gl_pipeline_stage *stage )
 | 
			
		||||
static void check_vertex( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   stage->active = !ctx->VertexProgram.Enabled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GLboolean init_vertex_stage( GLcontext *ctx,
 | 
			
		||||
				    struct gl_pipeline_stage *stage )
 | 
			
		||||
				    struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 | 
			
		||||
   struct vertex_stage_data *store;
 | 
			
		||||
@@ -285,7 +267,7 @@ static GLboolean init_vertex_stage( GLcontext *ctx,
 | 
			
		||||
   return stage->run( ctx, stage );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
static void dtr( struct tnl_pipeline_stage *stage )
 | 
			
		||||
{
 | 
			
		||||
   struct vertex_stage_data *store = VERTEX_STAGE_DATA(stage);
 | 
			
		||||
 | 
			
		||||
@@ -301,7 +283,7 @@ static void dtr( struct gl_pipeline_stage *stage )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const struct gl_pipeline_stage _tnl_vertex_transform_stage =
 | 
			
		||||
const struct tnl_pipeline_stage _tnl_vertex_transform_stage =
 | 
			
		||||
{
 | 
			
		||||
   "modelview/project/cliptest/divide",
 | 
			
		||||
   _NEW_PROGRAM,                /* check_state: only care about vertex prog */
 | 
			
		||||
@@ -311,8 +293,8 @@ const struct gl_pipeline_stage _tnl_vertex_transform_stage =
 | 
			
		||||
   _NEW_PROGRAM|
 | 
			
		||||
   _NEW_TRANSFORM,
 | 
			
		||||
   GL_TRUE,			/* active */
 | 
			
		||||
   VERT_BIT_POS,		/* inputs */
 | 
			
		||||
   VERT_BIT_EYE|VERT_BIT_CLIP,		/* outputs */
 | 
			
		||||
   _TNL_BIT_POS,		/* inputs */
 | 
			
		||||
   _TNL_BIT_POS,		/* outputs */
 | 
			
		||||
   0,				/* changed_inputs */
 | 
			
		||||
   NULL,			/* private data */
 | 
			
		||||
   dtr,				/* destructor */
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user