diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/drivers/dri/gamma/gamma_render.c | 18 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i810/i810render.c | 21 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i830/i830_render.c | 17 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/mga/mgarender.c | 18 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r200/r200_swtcl.c | 18 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_swtcl.c | 18 | ||||
| -rw-r--r-- | src/mesa/main/mtypes.h | 2 | ||||
| -rw-r--r-- | src/mesa/swrast_setup/ss_context.c | 40 | ||||
| -rw-r--r-- | src/mesa/swrast_setup/swrast_setup.h | 8 | ||||
| -rw-r--r-- | src/mesa/tnl/t_context.c | 26 | ||||
| -rw-r--r-- | src/mesa/tnl/t_context.h | 47 | ||||
| -rw-r--r-- | src/mesa/tnl/t_pipeline.c | 3 | ||||
| -rw-r--r-- | src/mesa/tnl/t_save_playback.c | 3 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_fog.c | 2 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_light.c | 4 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_normals.c | 2 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_program.c | 13 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_render.c | 33 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_texgen.c | 3 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vb_texmat.c | 3 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vertex.c | 605 | ||||
| -rw-r--r-- | src/mesa/tnl/t_vertex.h | 63 | ||||
| -rw-r--r-- | src/mesa/tnl/tnl.h | 1 | 
23 files changed, 616 insertions, 352 deletions
diff --git a/src/mesa/drivers/dri/gamma/gamma_render.c b/src/mesa/drivers/dri/gamma/gamma_render.c index 380c7b7044..a0b8a5dc18 100644 --- a/src/mesa/drivers/dri/gamma/gamma_render.c +++ b/src/mesa/drivers/dri/gamma/gamma_render.c @@ -212,23 +212,7 @@ static GLboolean gamma_run_render( GLcontext *ctx,  static void gamma_check_render( GLcontext *ctx,  				 struct tnl_pipeline_stage *stage )  { -   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0; - -   if (ctx->RenderMode == GL_RENDER) { -      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) -	 inputs |= VERT_BIT_COLOR1; - -      if (ctx->Texture.Unit[0]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX0; - -      if (ctx->Texture.Unit[1]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX1; - -      if (ctx->Fog.Enabled) -	 inputs |= VERT_BIT_FOG; -   } - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  } diff --git a/src/mesa/drivers/dri/i810/i810render.c b/src/mesa/drivers/dri/i810/i810render.c index 19c5dc07c4..c674378953 100644 --- a/src/mesa/drivers/dri/i810/i810render.c +++ b/src/mesa/drivers/dri/i810/i810render.c @@ -161,25 +161,10 @@ static GLboolean i810_run_render( GLcontext *ctx,  } -static void i810_check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage ) +static void i810_check_render( GLcontext *ctx,  +			       struct tnl_pipeline_stage *stage )  { -   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0; - -   if (ctx->RenderMode == GL_RENDER) { -      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) -	 inputs |= VERT_BIT_COLOR1; - -      if (ctx->Texture.Unit[0]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX0; - -      if (ctx->Texture.Unit[1]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX1; - -      if (ctx->Fog.Enabled) -	 inputs |= VERT_BIT_FOG; -   } - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  } diff --git a/src/mesa/drivers/dri/i830/i830_render.c b/src/mesa/drivers/dri/i830/i830_render.c index caed73ed67..ed4c94437b 100644 --- a/src/mesa/drivers/dri/i830/i830_render.c +++ b/src/mesa/drivers/dri/i830/i830_render.c @@ -221,22 +221,7 @@ static GLboolean i830_run_render( GLcontext *ctx,  static void i830_check_render( GLcontext *ctx,   			       struct tnl_pipeline_stage *stage )  { -   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0; -   if (ctx->RenderMode == GL_RENDER) { -      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) -	 inputs |= VERT_BIT_COLOR1; - -      if (ctx->Texture.Unit[0]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX0; - -      if (ctx->Texture.Unit[1]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX1; - -      if (ctx->Fog.Enabled) -	 inputs |= VERT_BIT_FOG; -   } - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  }  static void dtr( struct tnl_pipeline_stage *stage ) diff --git a/src/mesa/drivers/dri/mga/mgarender.c b/src/mesa/drivers/dri/mga/mgarender.c index 5852009852..3dd15e21a6 100644 --- a/src/mesa/drivers/dri/mga/mgarender.c +++ b/src/mesa/drivers/dri/mga/mgarender.c @@ -163,23 +163,7 @@ static GLboolean mga_run_render( GLcontext *ctx,  static void mga_check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )  { -   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0; - -   if (ctx->RenderMode == GL_RENDER) { -      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)  -	 inputs |= VERT_BIT_COLOR1; - -      if (ctx->Texture.Unit[0]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX0; - -      if (ctx->Texture.Unit[1]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX1; - -      if (ctx->Fog.Enabled)  -	 inputs |= VERT_BIT_FOG; -   } - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  } diff --git a/src/mesa/drivers/dri/r200/r200_swtcl.c b/src/mesa/drivers/dri/r200/r200_swtcl.c index edf00afcae..231a3ed83f 100644 --- a/src/mesa/drivers/dri/r200/r200_swtcl.c +++ b/src/mesa/drivers/dri/r200/r200_swtcl.c @@ -662,23 +662,7 @@ static GLboolean r200_run_render( GLcontext *ctx,  static void r200_check_render( GLcontext *ctx,  				 struct tnl_pipeline_stage *stage )  { -   GLuint inputs = _TNL_BIT_POS | _TNL_BIT_COLOR0; - -   if (ctx->RenderMode == GL_RENDER) { -      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) -	 inputs |= _TNL_BIT_COLOR1; - -      if (ctx->Texture.Unit[0]._ReallyEnabled) -	 inputs |= _TNL_BIT_TEX0; - -      if (ctx->Texture.Unit[1]._ReallyEnabled) -	 inputs |= _TNL_BIT_TEX1; - -      if (ctx->Fog.Enabled) -	 inputs |= _TNL_BIT_FOG; -   } - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  } diff --git a/src/mesa/drivers/dri/radeon/radeon_swtcl.c b/src/mesa/drivers/dri/radeon/radeon_swtcl.c index 61d80c9ac2..d7f9df762e 100644 --- a/src/mesa/drivers/dri/radeon/radeon_swtcl.c +++ b/src/mesa/drivers/dri/radeon/radeon_swtcl.c @@ -644,23 +644,7 @@ static GLboolean radeon_run_render( GLcontext *ctx,  static void radeon_check_render( GLcontext *ctx,  				 struct tnl_pipeline_stage *stage )  { -   GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0; - -   if (ctx->RenderMode == GL_RENDER) { -      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) -	 inputs |= VERT_BIT_COLOR1; - -      if (ctx->Texture.Unit[0]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX0; - -      if (ctx->Texture.Unit[1]._ReallyEnabled) -	 inputs |= VERT_BIT_TEX1; - -      if (ctx->Fog.Enabled) -	 inputs |= VERT_BIT_FOG; -   } - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 7e14da2559..a5f7e366c1 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1871,7 +1871,7 @@ struct matrix_stack  /**   * \name Bits to indicate what state has changed.     * - * 6 unused flags. + * 4 unused flags.   */  /*@{*/  #define _NEW_MODELVIEW		0x1        /**< __GLcontextRec::ModelView */ diff --git a/src/mesa/swrast_setup/ss_context.c b/src/mesa/swrast_setup/ss_context.c index eb133f969c..55fe141c25 100644 --- a/src/mesa/swrast_setup/ss_context.c +++ b/src/mesa/swrast_setup/ss_context.c @@ -28,6 +28,7 @@  #include "glheader.h"  #include "imports.h" +#include "colormac.h"  #include "ss_context.h"  #include "ss_triangle.h"  #include "ss_vb.h" @@ -35,6 +36,7 @@  #include "tnl/tnl.h"  #include "tnl/t_context.h"  #include "tnl/t_pipeline.h" +#include "tnl/t_vertex.h"  #define _SWSETUP_NEW_VERTS (_NEW_RENDERMODE|	\ @@ -164,3 +166,41 @@ _swsetup_Wakeup( GLcontext *ctx )     _tnl_need_projected_coords( ctx, GL_TRUE );     _swsetup_InvalidateState( ctx, ~0 );  } + + + + + +/* Populate a swrast SWvertex from an attrib-style vertex. + */ +void  +_swsetup_Translate( GLcontext *ctx, const void *vertex, SWvertex *dest ) +{ +   GLfloat tmp[4]; +   GLint i; + +   _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POS, dest->win ); + +   for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) +      _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_TEX0+i, dest->texcoord[i] ); +	   +   _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR0, tmp ); +   UNCLAMPED_FLOAT_TO_RGBA_CHAN( dest->color, tmp ); + +   _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR1, tmp ); +   UNCLAMPED_FLOAT_TO_RGB_CHAN( dest->specular, tmp ); + +   _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_FOG, tmp ); +   dest->fog = tmp[0]; + +   _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_INDEX, tmp ); +   dest->index = (GLuint) tmp[0]; + +/* +  Need to check how pointsize is related to vertex program attributes: + +   _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POINTSIZE, tmp ); +   dest->pointSize = tmp[0]; +*/ +} + diff --git a/src/mesa/swrast_setup/swrast_setup.h b/src/mesa/swrast_setup/swrast_setup.h index 4825c772f1..5dcbe2675b 100644 --- a/src/mesa/swrast_setup/swrast_setup.h +++ b/src/mesa/swrast_setup/swrast_setup.h @@ -38,6 +38,8 @@  #ifndef SWRAST_SETUP_H  #define SWRAST_SETUP_H +#include "swrast/swrast.h" +  extern GLboolean  _swsetup_CreateContext( GLcontext *ctx ); @@ -50,4 +52,10 @@ _swsetup_InvalidateState( GLcontext *ctx, GLuint new_state );  extern void  _swsetup_Wakeup( GLcontext *ctx ); +/* Helper function to translate a hardware vertex (as understood by + * the tnl/t_vertex.c code) to a swrast vertex. + */ +extern void  +_swsetup_Translate( GLcontext *ctx, const void *vertex, SWvertex *dest ); +  #endif diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c index a78d880d01..8b83372fa7 100644 --- a/src/mesa/tnl/t_context.c +++ b/src/mesa/tnl/t_context.c @@ -29,11 +29,13 @@  #include "api_arrayelt.h"  #include "glheader.h"  #include "imports.h" +#include "context.h"  #include "macros.h"  #include "mtypes.h"  #include "dlist.h"  #include "light.h"  #include "vtxfmt.h" +#include "nvfragprog.h"  #include "t_context.h"  #include "t_array_api.h" @@ -153,6 +155,30 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state )  					 tnl->pipeline.build_state_trigger);     tnl->vtx.eval.new_state |= new_state; + +   /* Calculate tnl->render_inputs: +    */ +   if (ctx->Visual.rgbMode) { +      tnl->render_inputs = (_TNL_BIT_POS| +			    _TNL_BIT_COLOR0| +			    (ctx->Texture._EnabledUnits << _TNL_ATTRIB_TEX0)); + +      if (NEED_SECONDARY_COLOR(ctx)) +	 tnl->render_inputs |= _TNL_BIT_COLOR1; +   } +   else { +      tnl->render_inputs |= (_TNL_BIT_POS|_TNL_BIT_INDEX); +   } +     +   if (ctx->Fog.Enabled) +      tnl->render_inputs |= _TNL_BIT_FOG; + +   if (ctx->Polygon.FrontMode != GL_FILL ||  +       ctx->Polygon.BackMode != GL_FILL) +      tnl->render_inputs |= _TNL_BIT_EDGEFLAG; + +   if (ctx->RenderMode == GL_FEEDBACK) +      tnl->render_inputs |= _TNL_BIT_TEX0;  } diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index 1d148be214..ab146b2930 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -160,6 +160,7 @@ enum {  #define _TNL_BIT_TEX(u)  (1 << (_TNL_ATTRIB_TEX0 + (u))) +  #define _TNL_BITS_MAT_ANY  (_TNL_BIT_MAT_FRONT_AMBIENT   | 	\  			    _TNL_BIT_MAT_BACK_AMBIENT    | 	\  			    _TNL_BIT_MAT_FRONT_DIFFUSE   | 	\ @@ -456,6 +457,7 @@ struct tnl_pipeline_stage {  				 * call to 'run'.  				 */ +     /* Private data for the pipeline stage:      */     void *privatePtr; @@ -494,6 +496,22 @@ struct tnl_pipeline {  }; +struct tnl_clipspace_attr { +   int attrib; +   int vertoffset; +   int vertattrsize; +   GLfloat *inputptr; +   int inputstride; + +   void (*insert)( const struct tnl_clipspace_attr *a,  +		   char *v, const GLfloat *input ); + +   void (*extract)( const struct tnl_clipspace_attr *a,  +		    GLfloat *output, const char *v ); + +   const GLfloat *vp; +}; +  typedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last ); @@ -513,6 +531,26 @@ typedef void (*setup_func)( GLcontext *ctx,  			    GLuint new_inputs); + + +struct tnl_clipspace { +   GLboolean need_extras; +    +   GLuint new_inputs; + +   GLubyte *vertex_buf; +   GLuint vertex_size; +   GLuint max_vertex_size; + +   struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX]; +   GLuint attr_count; + +   void (*emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest ); +   interp_func interp; +   copy_pv_func copy_pv; +}; + +  struct tnl_device_driver {     /***      *** TNL Pipeline @@ -643,6 +681,11 @@ typedef struct {     struct tnl_vertex_arrays array_inputs; +   /* Clipspace/ndc/window vertex managment: +    */ +   struct tnl_clipspace clipspace; + +     /* Probably need a better configuration mechanism:      */     GLboolean NeedNdcCoords; @@ -650,6 +693,10 @@ typedef struct {     GLboolean CalcDListNormalLengths;     GLboolean IsolateMaterials; +   /*  +    */ +   GLuint render_inputs; +     GLvertexformat exec_vtxfmt;     GLvertexformat save_vtxfmt; diff --git a/src/mesa/tnl/t_pipeline.c b/src/mesa/tnl/t_pipeline.c index bfb8996c8d..37ec84a06f 100644 --- a/src/mesa/tnl/t_pipeline.c +++ b/src/mesa/tnl/t_pipeline.c @@ -127,6 +127,9 @@ void _tnl_run_pipeline( GLcontext *ctx )     unsigned short __tmp;  #endif +   if (!tnl->vb.Count) +      return; +     pipe->run_state_changes = 0;     pipe->run_input_changes = 0; diff --git a/src/mesa/tnl/t_save_playback.c b/src/mesa/tnl/t_save_playback.c index eaf30a3c18..37258c0a9f 100644 --- a/src/mesa/tnl/t_save_playback.c +++ b/src/mesa/tnl/t_save_playback.c @@ -175,7 +175,8 @@ void _tnl_playback_vertex_list( GLcontext *ctx, void *data )     FLUSH_CURRENT(ctx, 0); -   if (node->prim_count) { +   if (node->prim_count && +       node->count) {        if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END &&  	       (node->prim[0].mode & PRIM_BEGIN)) { diff --git a/src/mesa/tnl/t_vb_fog.c b/src/mesa/tnl/t_vb_fog.c index 6d688ca041..2ad41f5bbd 100644 --- a/src/mesa/tnl/t_vb_fog.c +++ b/src/mesa/tnl/t_vb_fog.c @@ -185,6 +185,8 @@ static GLboolean run_fog_stage( GLcontext *ctx,     }     make_win_fog_coords( ctx, VB->FogCoordPtr, input ); + +   VB->AttribPtr[_TNL_ATTRIB_FOG] = VB->FogCoordPtr;     return GL_TRUE;  } diff --git a/src/mesa/tnl/t_vb_light.c b/src/mesa/tnl/t_vb_light.c index d7872675ca..7bdf54bf43 100644 --- a/src/mesa/tnl/t_vb_light.c +++ b/src/mesa/tnl/t_vb_light.c @@ -217,6 +217,10 @@ static GLboolean run_lighting( GLcontext *ctx,      */     store->light_func_tab[idx]( ctx, VB, stage, input ); +   VB->AttribPtr[_TNL_ATTRIB_COLOR0] = VB->ColorPtr[0]; +   VB->AttribPtr[_TNL_ATTRIB_COLOR1] = VB->SecondaryColorPtr[0]; +   VB->AttribPtr[_TNL_ATTRIB_INDEX] = VB->IndexPtr[0]; +     return GL_TRUE;  } diff --git a/src/mesa/tnl/t_vb_normals.c b/src/mesa/tnl/t_vb_normals.c index 96a43f6884..2908f1aee0 100644 --- a/src/mesa/tnl/t_vb_normals.c +++ b/src/mesa/tnl/t_vb_normals.c @@ -77,6 +77,8 @@ static GLboolean run_normal_stage( GLcontext *ctx,     }     VB->NormalPtr = &store->normal; +   VB->AttribPtr[_TNL_ATTRIB_NORMAL] = VB->NormalPtr; +     VB->NormalLengthPtr = 0;	/* no longer valid */     return GL_TRUE;  } diff --git a/src/mesa/tnl/t_vb_program.c b/src/mesa/tnl/t_vb_program.c index 6aa2890247..ba8a98f612 100644 --- a/src/mesa/tnl/t_vb_program.c +++ b/src/mesa/tnl/t_vb_program.c @@ -170,8 +170,17 @@ static GLboolean run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )     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++) -      VB->TexCoordPtr[i] = &store->attribs[VERT_RESULT_TEX0 + i]; + +   VB->AttribPtr[VERT_ATTRIB_COLOR0] = VB->ColorPtr[0]; +   VB->AttribPtr[VERT_ATTRIB_COLOR1] = VB->SecondaryColorPtr[0]; +   VB->AttribPtr[VERT_ATTRIB_FOG] = VB->FogCoordPtr; + +   for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { +      VB->AttribPtr[VERT_ATTRIB_TEX0+i] = VB->TexCoordPtr[i] =  +	 &store->attribs[VERT_RESULT_TEX0 + i]; +   } + +     /* Cliptest and perspective divide.  Clip functions must clear      * the clipmask. diff --git a/src/mesa/tnl/t_vb_render.c b/src/mesa/tnl/t_vb_render.c index 24cf028555..1c50168968 100644 --- a/src/mesa/tnl/t_vb_render.c +++ b/src/mesa/tnl/t_vb_render.c @@ -342,38 +342,7 @@ static GLboolean run_render( GLcontext *ctx,   */  static void check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )  { -   GLuint inputs = _TNL_BIT_POS; -   GLuint i; - -   if (ctx->Visual.rgbMode) { -      inputs |= _TNL_BIT_COLOR0; - -      if (NEED_SECONDARY_COLOR(ctx)) -	 inputs |= _TNL_BIT_COLOR1; - -      if (ctx->Texture._EnabledCoordUnits) { -	 for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) { -	    if (ctx->Texture._EnabledCoordUnits & (1 << i)) -	       inputs |= _TNL_BIT_TEX(i); -	 } -      } -   } -   else { -      inputs |= _TNL_BIT_INDEX; -   } - -   /* How do drivers turn this off? -    */ -   if (ctx->Fog.Enabled) -      inputs |= _TNL_BIT_FOG; - -   if (ctx->Polygon.FrontMode != GL_FILL || ctx->Polygon.BackMode != GL_FILL) -      inputs |= _TNL_BIT_EDGEFLAG; - -   if (ctx->RenderMode==GL_FEEDBACK) -      inputs |= _TNL_BITS_TEX_ANY; - -   stage->inputs = inputs; +   stage->inputs = TNL_CONTEXT(ctx)->render_inputs;  } diff --git a/src/mesa/tnl/t_vb_texgen.c b/src/mesa/tnl/t_vb_texgen.c index 45b4164d18..1a4f411878 100644 --- a/src/mesa/tnl/t_vb_texgen.c +++ b/src/mesa/tnl/t_vb_texgen.c @@ -524,7 +524,8 @@ static GLboolean run_texgen_stage( GLcontext *ctx,  	 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]; +	 VB->AttribPtr[VERT_ATTRIB_TEX0+i] =  +	    VB->TexCoordPtr[i] = &store->texcoord[i];        }     return GL_TRUE; diff --git a/src/mesa/tnl/t_vb_texmat.c b/src/mesa/tnl/t_vb_texmat.c index b6e672a8d4..363a76a487 100644 --- a/src/mesa/tnl/t_vb_texmat.c +++ b/src/mesa/tnl/t_vb_texmat.c @@ -87,7 +87,8 @@ static GLboolean run_texmat_stage( GLcontext *ctx,                                   ctx->TextureMatrixStack[i].Top,  				 VB->TexCoordPtr[i]); -	 VB->TexCoordPtr[i] = &store->texcoord[i]; +	 VB->AttribPtr[VERT_ATTRIB_TEX0+i] =  +	    VB->TexCoordPtr[i] = &store->texcoord[i];        }     return GL_TRUE;  } diff --git a/src/mesa/tnl/t_vertex.c b/src/mesa/tnl/t_vertex.c index 61ac08efc4..6ac9f8a90c 100644 --- a/src/mesa/tnl/t_vertex.c +++ b/src/mesa/tnl/t_vertex.c @@ -25,24 +25,26 @@   *    Keith Whitwell <keithw@tungstengraphics.com>   */ +#include "glheader.h" +#include "context.h" +#include "colormac.h" +#include "t_context.h" +#include "t_vertex.h" +/* Build and manage clipspace/ndc/window vertices. + * + * Another new mechanism designed and crying out for codegen.  Before + * that, it would be very interesting to investigate the merger of + * these vertices and those built in t_vtx_*. + */ -struct attr { -   int attrib; -   int vertoffset; -   int vertattrsize; -   int *inputptr; -   int inputstride; -   void (*insert)( const struct attr *a, char *v, const GLfloat *input ); -   void (*extract)( const struct attr *a, GLfloat *output, const char *v ); -   const GLfloat *vp; -}; +#define GET_VERTEX_STATE(ctx)  &(TNL_CONTEXT(ctx)->clipspace) -static void insert_4f_viewport( const struct attr *a, char *v, +static void insert_4f_viewport( const struct tnl_clipspace_attr *a, char *v,  				const GLfloat *in )  {     GLfloat *out = (GLfloat *)v; @@ -54,7 +56,7 @@ static void insert_4f_viewport( const struct attr *a, char *v,     out[3] = in[3];  } -static void insert_3f_viewport( const struct attr *a, char *v, +static void insert_3f_viewport( const struct tnl_clipspace_attr *a, char *v,  				const GLfloat *in )  {     GLfloat *out = (GLfloat *)v; @@ -65,7 +67,7 @@ static void insert_3f_viewport( const struct attr *a, char *v,     out[2] = vp[10] * in[2] + vp[14];  } -static void insert_2f_viewport( const struct attr *a, char *v, +static void insert_2f_viewport( const struct tnl_clipspace_attr *a, char *v,  				const GLfloat *in )  {     GLfloat *out = (GLfloat *)v; @@ -76,7 +78,7 @@ static void insert_2f_viewport( const struct attr *a, char *v,  } -static void insert_4f( const struct attr *a, char *v, const GLfloat *in ) +static void insert_4f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in )  {     GLfloat *out = (GLfloat *)(v); @@ -86,7 +88,7 @@ static void insert_4f( const struct attr *a, char *v, const GLfloat *in )     out[3] = in[3];  } -static void insert_3f_xyw( const struct attr *a, char *v, const GLfloat *in ) +static void insert_3f_xyw( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in )  {     GLfloat *out = (GLfloat *)(v); @@ -96,7 +98,7 @@ static void insert_3f_xyw( const struct attr *a, char *v, const GLfloat *in )  } -static void insert_3f( const struct attr *a, char *v, const GLfloat *in ) +static void insert_3f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in )  {     GLfloat *out = (GLfloat *)(v); @@ -106,22 +108,63 @@ static void insert_3f( const struct attr *a, char *v, const GLfloat *in )  } -static void insert_2f( const struct attr *a, char *v, const GLfloat *in ) +static void insert_2f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +{ +   GLfloat *out = (GLfloat *)(v); +    +   out[0] = in[0]; +   out[1] = in[1]; +} + +static void insert_1f( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +{ +   GLfloat *out = (GLfloat *)(v); +    +   out[0] = in[0]; +} + +static void insert_3f_pad( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in )  {     GLfloat *out = (GLfloat *)(v);     out[0] = in[0];     out[1] = in[1]; +   out[2] = in[2]; +   out[3] = 1;  } -static void insert_1f( const struct attr *a, char *v, const GLfloat *in ) + +static void insert_2f_pad( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in )  {     GLfloat *out = (GLfloat *)(v);     out[0] = in[0]; +   out[1] = in[1]; +   out[2] = 0; +   out[3] = 1;  } -static void insert_4ub_4f_rgba( const struct attr *a, char *v,  +static void insert_1f_pad( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ) +{ +   GLfloat *out = (GLfloat *)(v); +    +   out[0] = in[0]; +   out[1] = 0; +   out[2] = 0; +   out[3] = 1; +} + +static void insert_4chan_4f_rgba( const struct tnl_clipspace_attr *a, char *v,  +				  const GLfloat *in ) +{ +   GLchan *c = (GLchan *)v; +   UNCLAMPED_FLOAT_TO_CHAN(c[0], in[0]);  +   UNCLAMPED_FLOAT_TO_CHAN(c[1], in[1]);  +   UNCLAMPED_FLOAT_TO_CHAN(c[2], in[2]);  +   UNCLAMPED_FLOAT_TO_CHAN(c[3], in[3]); +} + +static void insert_4ub_4f_rgba( const struct tnl_clipspace_attr *a, char *v,   				const GLfloat *in )  {     UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); @@ -130,7 +173,7 @@ static void insert_4ub_4f_rgba( const struct attr *a, char *v,     UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]);  } -static void insert_4ub_4f_bgra( const struct attr *a, char *v,  +static void insert_4ub_4f_bgra( const struct tnl_clipspace_attr *a, char *v,   				const GLfloat *in )  {     UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); @@ -139,7 +182,7 @@ static void insert_4ub_4f_bgra( const struct attr *a, char *v,     UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]);  } -static void insert_3ub_3f_rgb( const struct attr *a, char *v,  +static void insert_3ub_3f_rgb( const struct tnl_clipspace_attr *a, char *v,   			       const GLfloat *in )  {     UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); @@ -147,7 +190,7 @@ static void insert_3ub_3f_rgb( const struct attr *a, char *v,     UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]);  } -static void insert_3ub_3f_bgr( const struct attr *a, char *v,  +static void insert_3ub_3f_bgr( const struct tnl_clipspace_attr *a, char *v,   			       const GLfloat *in )  {     UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); @@ -155,7 +198,7 @@ static void insert_3ub_3f_bgr( const struct attr *a, char *v,     UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]);  } -static void insert_1ub_1f( const struct attr *a, char *v,  +static void insert_1ub_1f( const struct tnl_clipspace_attr *a, char *v,   			   const GLfloat *in )  {     UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); @@ -169,7 +212,7 @@ static void insert_1ub_1f( const struct attr *a, char *v,   * Currently always extracts a full 4 floats.   */ -static void extract_4f_viewport( const struct attr *a, GLfloat *out,  +static void extract_4f_viewport( const struct tnl_clipspace_attr *a, GLfloat *out,   				 const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -181,7 +224,7 @@ static void extract_4f_viewport( const struct attr *a, GLfloat *out,     out[3] = in[3];  } -static void extract_3f_viewport( const struct attr *a, GLfloat *out,  +static void extract_3f_viewport( const struct tnl_clipspace_attr *a, GLfloat *out,   				 const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -194,7 +237,7 @@ static void extract_3f_viewport( const struct attr *a, GLfloat *out,  } -static void extract_2f_viewport( const struct attr *a, GLfloat *out,  +static void extract_2f_viewport( const struct tnl_clipspace_attr *a, GLfloat *out,   				 const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -207,7 +250,7 @@ static void extract_2f_viewport( const struct attr *a, GLfloat *out,  } -static void extract_4f( const struct attr *a, GLfloat *out, const char *v  ) +static void extract_4f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v  )  {     const GLfloat *in = (const GLfloat *)v; @@ -217,7 +260,7 @@ static void extract_4f( const struct attr *a, GLfloat *out, const char *v  )     out[3] = in[3];  } -static void extract_3f_xyw( const struct attr *a, GLfloat *out, const char *v ) +static void extract_3f_xyw( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -228,7 +271,7 @@ static void extract_3f_xyw( const struct attr *a, GLfloat *out, const char *v )  } -static void extract_3f( const struct attr *a, GLfloat *out, const char *v ) +static void extract_3f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -239,7 +282,7 @@ static void extract_3f( const struct attr *a, GLfloat *out, const char *v )  } -static void extract_2f( const struct attr *a, GLfloat *out, const char *v ) +static void extract_2f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -249,7 +292,7 @@ static void extract_2f( const struct attr *a, GLfloat *out, const char *v )     out[3] = 1;  } -static void extract_1f( const struct attr *a, GLfloat *out, const char *v ) +static void extract_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v )  {     const GLfloat *in = (const GLfloat *)v; @@ -259,50 +302,146 @@ static void extract_1f( const struct attr *a, GLfloat *out, const char *v )     out[3] = 1;  } -static void extract_4ub_4f_rgba( const struct attr *a, GLfloat *out,  +static void extract_4chan_4f_rgba( const struct tnl_clipspace_attr *a, GLfloat *out,   				 const char *v )  { -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]); +   GLchan *c = (GLchan *)v; + +   out[0] = CHAN_TO_FLOAT(c[0]); +   out[1] = CHAN_TO_FLOAT(c[1]); +   out[2] = CHAN_TO_FLOAT(c[2]); +   out[3] = CHAN_TO_FLOAT(c[3]);  } -static void extract_4ub_4f_bgra( const struct attr *a, GLfloat *out,  +static void extract_4ub_4f_rgba( const struct tnl_clipspace_attr *a, GLfloat *out,   				 const char *v )  { -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]); +   out[0] = UBYTE_TO_FLOAT(v[0]); +   out[1] = UBYTE_TO_FLOAT(v[1]); +   out[2] = UBYTE_TO_FLOAT(v[2]); +   out[3] = UBYTE_TO_FLOAT(v[3]); +} + +static void extract_4ub_4f_bgra( const struct tnl_clipspace_attr *a, GLfloat *out,  +				 const char *v ) +{ +   out[2] = UBYTE_TO_FLOAT(v[0]); +   out[1] = UBYTE_TO_FLOAT(v[1]); +   out[0] = UBYTE_TO_FLOAT(v[2]); +   out[3] = UBYTE_TO_FLOAT(v[3]);  } -static void extract_3ub_3f_rgb( const struct attr *a, GLfloat *out,  +static void extract_3ub_3f_rgb( const struct tnl_clipspace_attr *a, GLfloat *out,   				const char *v )  { -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); +   out[0] = UBYTE_TO_FLOAT(v[0]); +   out[1] = UBYTE_TO_FLOAT(v[1]); +   out[2] = UBYTE_TO_FLOAT(v[2]);     out[3] = 1;  } -static void extract_3ub_3f_bgr( const struct attr *a, GLfloat *out,  +static void extract_3ub_3f_bgr( const struct tnl_clipspace_attr *a, GLfloat *out,   				const char *v )  { -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); +   out[2] = UBYTE_TO_FLOAT(v[0]); +   out[1] = UBYTE_TO_FLOAT(v[1]); +   out[0] = UBYTE_TO_FLOAT(v[2]);     out[3] = 1;  } -static void extract_1ub_1f( const struct attr *a, GLfloat *out, const char *v ) +static void extract_1ub_1f( const struct tnl_clipspace_attr *a, GLfloat *out, const char *v )  { -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); +   out[0] = UBYTE_TO_FLOAT(v[0]);     out[1] = 0;     out[2] = 0;     out[3] = 1;  } + +typedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out,  +			      const char *v ); + +typedef void (*insert_func)( const struct tnl_clipspace_attr *a, char *v, const GLfloat *in ); + + +struct { +   extract_func extract; +   insert_func insert; +   GLuint attrsize; +} format_info[EMIT_MAX] = { + +   { extract_1f, +     insert_1f, +     sizeof(GLfloat) }, + +   { extract_2f, +     insert_2f, +     2 * sizeof(GLfloat) }, + +   { extract_3f, +     insert_3f, +     3 * sizeof(GLfloat) }, + +   { extract_4f, +     insert_4f, +     4 * sizeof(GLfloat) }, + +   { extract_2f_viewport, +     insert_2f_viewport, +     2 * sizeof(GLfloat) }, + +   { extract_3f_viewport, +     insert_3f_viewport, +     3 * sizeof(GLfloat) }, + +   { extract_4f_viewport, +     insert_4f_viewport, +     4 * sizeof(GLfloat) }, + +   { extract_3f_xyw, +     insert_3f_xyw, +     3 * sizeof(GLfloat) }, + +   { extract_1ub_1f, +     insert_1ub_1f, +     sizeof(GLubyte) }, + +   { extract_3ub_3f_rgb, +     insert_3ub_3f_rgb, +     3 * sizeof(GLubyte) }, + +   { extract_3ub_3f_bgr, +     insert_3ub_3f_bgr, +     3 * sizeof(GLubyte) }, + +   { extract_4ub_4f_rgba, +     insert_4ub_4f_rgba, +     4 * sizeof(GLubyte) }, + +   { extract_4ub_4f_bgra, +     insert_4ub_4f_bgra, +     4 * sizeof(GLubyte) }, + +   { extract_4chan_4f_rgba, +     insert_4chan_4f_rgba, +     4 * sizeof(GLchan) }, + +   { extract_1f, +     insert_1f_pad, +     4 * sizeof(GLfloat) }, + +   { extract_2f, +     insert_2f_pad, +     4 * sizeof(GLfloat) }, + +   { extract_3f, +     insert_3f_pad, +     4 * sizeof(GLfloat) }, + + +}; +      +  /***********************************************************************   * Generic (non-codegen) functions for whole vertices or groups of   * vertices @@ -310,27 +449,30 @@ static void extract_1ub_1f( const struct attr *a, GLfloat *out, const char *v )  static void generic_emit( GLcontext *ctx,  			  GLuint start, GLuint end, -			  void *dest, -			  GLuint stride ) +			  void *dest )  { -   int i, j; +   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   struct tnl_clipspace_attr *a = vtx->attr;     char *v = (char *)dest; +   int i, j; +   GLuint count = vtx->attr_count; +   GLuint stride; -   vtx->vertex_buf = v - start * stride; -   vtx->vertex_stride = stride; +   for (j = 0; j < count; j++) { +      GLvector4f *vptr = VB->AttribPtr[a[j].attrib]; +      a[j].inputstride = vptr->stride; +      a[j].inputptr = (GLfloat *)STRIDE_4F(vptr->data, start * vptr->stride); +   }     end -= start; - -   for (j = 0; j < vtx->attr_count; j++) { -      GLvector4f *vptr = VB->AttrPtr[a[j].attrib]; -      a[j].inputptr = STRIDE_4F(vptr->data, start * vptr->stride); -   } +   stride = vtx->vertex_size;     for (i = 0 ; i < end ; i++, v += stride) { -      for (j = 0; j < vtx->attr_count; j++) { -	 int *in = a[j].inputptr; +      for (j = 0; j < count; j++) { +	 GLfloat *in = a[j].inputptr;  	 (char *)a[j].inputptr += a[j].inputstride; -	 a[j].out( &a[j], v + a[j].vertoffset, in ); +	 a[j].insert( &a[j], v + a[j].vertoffset, in );        }     }  } @@ -341,26 +483,45 @@ static void generic_interp( GLcontext *ctx,  			    GLuint edst, GLuint eout, GLuint ein,  			    GLboolean force_boundary )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   char *vin  = vtx->vertex_buf + ein  * vtx->vertex_stride; -   char *vout = vtx->vertex_buf + eout * vtx->vertex_stride; -   char *vdst = vtx->vertex_buf + edst * vtx->vertex_stride; -   const struct attr *a = vtx->attr; +   TNLcontext *tnl = TNL_CONTEXT(ctx); +   struct vertex_buffer *VB = &tnl->vb; +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   char *vin  = vtx->vertex_buf + ein  * vtx->vertex_size; +   char *vout = vtx->vertex_buf + eout * vtx->vertex_size; +   char *vdst = vtx->vertex_buf + edst * vtx->vertex_size; +   const struct tnl_clipspace_attr *a = vtx->attr;     int attr_count = vtx->attr_count;     int j; -    -   for (j = 0; j < attr_count; j++) { + +   if (tnl->NeedNdcCoords) { +      const GLfloat *dstclip = VB->ClipPtr->data[edst]; +      const GLfloat w = 1.0 / dstclip[3]; +      GLfloat pos[4]; + +      pos[0] = dstclip[0] * w; +      pos[1] = dstclip[1] * w; +      pos[2] = dstclip[2] * w; +      pos[3] = w; + +      a[0].insert( &a[0], vdst, pos ); +   } +   else { +      a[0].insert( &a[0], vdst, VB->ClipPtr->data[edst] ); +   } + + +   for (j = 1; j < attr_count; j++) {        GLfloat fin[4], fout[4], fdst[4]; -       -      a[j].extract( &a[j], vin, fin ); -      a[j].extract( &a[j], vout, fout ); +	  +      a[j].extract( &a[j], fin, vin + a[j].vertoffset ); +      a[j].extract( &a[j], fout, vout + a[j].vertoffset );        INTERP_F( t, fdst[3], fout[3], fin[3] );        INTERP_F( t, fdst[2], fout[2], fin[2] );        INTERP_F( t, fdst[1], fout[1], fin[1] );        INTERP_F( t, fdst[0], fout[0], fin[0] ); -      a[j].insert( &a[j], vdst, fdst ); +      a[j].insert( &a[j], vdst + a[j].vertoffset, fdst );     }  } @@ -368,45 +529,77 @@ static void generic_interp( GLcontext *ctx,  /* Extract color attributes from one vertex and insert them into   * another.  (Shortcircuit extract/insert with memcpy).   */ -static void generic_copy_colors( GLcontext *ctx, GLuint edst, GLuint esrc ) +static void generic_copy_pv( GLcontext *ctx, GLuint edst, GLuint esrc )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   char *vsrc = vert_start + esrc * vert_stride; -   char *vdst = vert_start + edst * vert_stride; -   const struct attr *a = vtx->attr; +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   char *vsrc = vtx->vertex_buf + esrc * vtx->vertex_size; +   char *vdst = vtx->vertex_buf + edst * vtx->vertex_size; +   const struct tnl_clipspace_attr *a = vtx->attr;     int attr_count = vtx->attr_count;     int j;     for (j = 0; j < attr_count; j++) { -      if (a[j].attribute == VERT_ATTRIB_COLOR0 || -	  a[j].attribute == VERT_ATTRIB_COLOR1) { +      if (a[j].attrib == VERT_ATTRIB_COLOR0 || +	  a[j].attrib == VERT_ATTRIB_COLOR1) {  	 memcpy( vdst + a[j].vertoffset,  		 vsrc + a[j].vertoffset,  		 a[j].vertattrsize ); +      }     }  } -static void generic_get_attr( GLcontext *ctx, const char *vertex, -			      GLenum attr, GLfloat *dest ) + +/* Helper functions for hardware which doesn't put back colors and/or + * edgeflags into vertices. + */ +static void generic_interp_extras( GLcontext *ctx, +				   GLfloat t, +				   GLuint dst, GLuint out, GLuint in, +				   GLboolean force_boundary )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   const struct attr *a = vtx->attr; -   int attr_count = vtx->attr_count; -   int j; +   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; -   for (j = 0; j < attr_count; j++) { -      if (a[j].attribute == attr) { -	 a[j].extract( &a[j], vin, dest ); -	 return; +   if (VB->ColorPtr[1]) { +      assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); + +      INTERP_4F( t, +		 VB->ColorPtr[1]->data[dst], +		 VB->ColorPtr[1]->data[out], +		 VB->ColorPtr[1]->data[in] ); + +      if (VB->SecondaryColorPtr[1]) { +	 INTERP_3F( t, +		    VB->SecondaryColorPtr[1]->data[dst], +		    VB->SecondaryColorPtr[1]->data[out], +		    VB->SecondaryColorPtr[1]->data[in] );        }     } -   /* Else return the value from ctx->Current -    */ -   memcpy( dest, ctx->Current.Attrib[attr], 4*sizeof(GLfloat)); +   if (VB->EdgeFlag) { +      VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary; +   } + +   generic_interp(ctx, t, dst, out, in, force_boundary);  } +static void generic_copy_pv_extras( GLcontext *ctx,  +				    GLuint dst, GLuint src ) +{ +   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + +   if (VB->ColorPtr[1]) { +      COPY_4FV( VB->ColorPtr[1]->data[dst],  +		VB->ColorPtr[1]->data[src] ); + +      if (VB->SecondaryColorPtr[1]) { +	 COPY_4FV( VB->SecondaryColorPtr[1]->data[dst],  +		   VB->SecondaryColorPtr[1]->data[src] ); +      } +   } + +   _tnl_copy_pv(ctx, dst, src); +} @@ -420,12 +613,11 @@ static void generic_get_attr( GLcontext *ctx, const char *vertex,  static void choose_emit_func( GLcontext *ctx,  			      GLuint start, GLuint end, -			      void *dest, -			      GLuint stride ) +			      void *dest )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->emit_func = generic_emit_func; -   vtx->emit_func( ctx, start, end, dest, stride ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   vtx->emit = generic_emit; +   vtx->emit( ctx, start, end, dest );  } @@ -434,17 +626,31 @@ static void choose_interp_func( GLcontext *ctx,  				GLuint edst, GLuint eout, GLuint ein,  				GLboolean force_boundary )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->interp_func = generic_interp_func; -   vtx->interp_func( ctx, t, edst, eout, ein, force_boundary ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); + +   if (vtx->need_extras &&  +       (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { +      vtx->interp = generic_interp_extras; +   } else { +      vtx->interp = generic_interp; +   } + +   vtx->interp( ctx, t, edst, eout, ein, force_boundary );  } -static void choose_copy_color_func(  GLcontext *ctx, GLuint edst, GLuint esrc ) +static void choose_copy_pv_func(  GLcontext *ctx, GLuint edst, GLuint esrc )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->copy_color_func = generic_copy_color_func; -   vtx->copy_color_func( ctx, edst, esrc ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); + +   if (vtx->need_extras &&  +       (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { +      vtx->copy_pv = generic_copy_pv_extras; +   } else { +      vtx->copy_pv = generic_copy_pv; +   } + +   vtx->copy_pv( ctx, edst, esrc );  } @@ -452,14 +658,6 @@ static void choose_copy_color_func(  GLcontext *ctx, GLuint edst, GLuint esrc )   * Public entrypoints, mostly dispatch to the above:   */ -void _tnl_emit( GLcontext *ctx, -		GLuint start, GLuint end, -		void *dest, -		GLuint stride ) -{ -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->emit_func( ctx, start, end, dest, stride ); -}  /* Interpolate between two vertices to produce a third:   */ @@ -468,16 +666,16 @@ void _tnl_interp( GLcontext *ctx,  		  GLuint edst, GLuint eout, GLuint ein,  		  GLboolean force_boundary )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->interp_func( ctx, t, edst, eout, ein, force_boundary ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   vtx->interp( ctx, t, edst, eout, ein, force_boundary );  }  /* Copy colors from one vertex to another:   */ -void _tnl_copy_colors(  GLcontext *ctx, GLuint edst, GLuint esrc ) +void _tnl_copy_pv(  GLcontext *ctx, GLuint edst, GLuint esrc )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->copy_color_func( ctx, edst, esrc ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   vtx->copy_pv( ctx, edst, esrc );  } @@ -485,117 +683,136 @@ void _tnl_copy_colors(  GLcontext *ctx, GLuint edst, GLuint esrc )   * reverse any viewport transformation, swizzling or other conversions   * which may have been applied:   */ -void _tnl_get_attr( GLcontext *ctx, void *vertex, GLenum attrib, -		    GLfloat *dest ) +void _tnl_get_attr( GLcontext *ctx, const void *vin, +			      GLenum attr, GLfloat *dest )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); -   vtx->get_attr_func( ctx, vertex, attrib, dest ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   const struct tnl_clipspace_attr *a = vtx->attr; +   int attr_count = vtx->attr_count; +   int j; + +   for (j = 0; j < attr_count; j++) { +      if (a[j].attrib == attr) { +	 a[j].extract( &a[j], dest, vin ); +	 return; +      } +   } + +   /* Else return the value from ctx->Current +    */ +   memcpy( dest, ctx->Current.Attrib[attr], 4*sizeof(GLfloat));  } +void *_tnl_get_vertex( GLcontext *ctx, GLuint nr ) +{ +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   return vtx->vertex_buf + nr * vtx->vertex_size; +} -void _tnl_install_attrs( GLcontext *ctx, const struct dri_attr_map *map, +void _tnl_invalidate_vertex_state( GLcontext *ctx, GLuint new_state ) +{ +   if (new_state & (_DD_NEW_TRI_LIGHT_TWOSIDE|_DD_NEW_TRI_UNFILLED) ) { +      struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +      vtx->new_inputs = ~0; +      vtx->interp = choose_interp_func; +      vtx->copy_pv = choose_copy_pv_func; +   } +} + + +GLuint _tnl_install_attrs( GLcontext *ctx, const struct tnl_attr_map *map,  			 GLuint nr, const GLfloat *vp )  { -   struct dri_vertex_state *vtx = GET_VERTEX_STATE(ctx); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   int offset = 0;     int i; -   assert(nr < _TNL_ATTR_MAX); +   assert(nr < _TNL_ATTRIB_MAX); +   assert(nr == 0 || map[0].attrib == VERT_ATTRIB_POS);     vtx->attr_count = nr; -   vtx->emit_func = choose_emit_func; -   vtx->interp_func = choose_interp_func; -   vtx->copy_color_func = choose_copy_color_func; -   vtx->get_attr_func = choose_get_attr_func; +   vtx->emit = choose_emit_func; +   vtx->interp = choose_interp_func; +   vtx->copy_pv = choose_copy_pv_func; +   vtx->new_inputs = ~0;     for (i = 0; i < nr; i++) { -      GLuint attrib = map[i].attrib; +      GLuint format = map[i].format;        vtx->attr[i].attrib = map[i].attrib; -      vtx->attr[i].hw_format = map[i].hw_format; +/*       vtx->attr[i].format = map[i].format; */        vtx->attr[i].vp = vp; -      vtx->attr[i].insert = attrib_info[attrib].insert; -      vtx->attr[i].extract = attrib_info[attrib].extract; -      vtx->attr[i].vertattrsize = attrib_info[attrib].attrsize; +      vtx->attr[i].insert = format_info[format].insert; +      vtx->attr[i].extract = format_info[format].extract; +      vtx->attr[i].vertattrsize = format_info[format].attrsize;        vtx->attr[i].vertoffset = offset; -      offset += attrib_info[attrib].attrsize; +      offset += format_info[format].attrsize;     } -} +   assert(offset <= vtx->max_vertex_size); +    +   vtx->vertex_size = offset; +   return vtx->vertex_size; +} -/* Populate a swrast SWvertex from an attrib-style vertex. - */ -void _tnl_translate( GLcontext *ctx, const void *vertex, SWvertex *dest ) + +void _tnl_invalidate_vertices( GLcontext *ctx, GLuint newinputs )  { -   _tnl_get_attr( ctx, vertex, VERT_ATTRIB_POS, dest.win ); +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   vtx->new_inputs |= newinputs; +} -   for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) -      _tnl_get_attr( ctx, vertex, VERT_ATTRIB_TEX(i), dest.texcoord[i] ); -	   -   _tnl_get_attr( ctx, vertex, VERT_ATTRIB_COLOR0, tmp ); -   UNCLAMPED_FLOAT_TO_CHAN_RGBA( dest.color, tmp ); -   _tnl_get_attr( ctx, vertex, VERT_ATTRIB_COLOR1, tmp ); -   UNCLAMPED_FLOAT_TO_CHAN_RGB( dest.specular, tmp ); -   _tnl_get_attr( ctx, vertex, VERT_ATTRIB_FOG, tmp ); -   dest.fog = tmp[0]; +void _tnl_build_vertices( GLcontext *ctx, +		       GLuint start, +		       GLuint count, +		       GLuint newinputs ) +{ +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   GLuint stride = vtx->vertex_size; +   GLubyte *v = ((GLubyte *)vtx->vertex_buf + (start*stride)); -   _tnl_get_attr( ctx, vertex, VERT_ATTRIB_INDEX, tmp ); -   dest.index = (GLuint) tmp[0]; +   newinputs |= vtx->new_inputs; +   vtx->new_inputs = 0; -   _tnl_get_attr( ctx, vertex, VERT_ATTRIB_POINTSIZE, tmp ); -   dest.pointSize = tmp[0]; +   if (newinputs) +      vtx->emit( ctx, start, count, v );  } -static void interp_extras( GLcontext *ctx, -			   GLfloat t, -			   GLuint dst, GLuint out, GLuint in, -			   GLboolean force_boundary ) +void *_tnl_emit_vertices_to_buffer( GLcontext *ctx, +				   GLuint start, +				   GLuint count, +				   void *dest )  { -   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   vtx->emit( ctx, start, count, dest ); +   return (void *)((char *)dest + vtx->vertex_size * (count - start)); +} -   if (VB->ColorPtr[1]) { -      assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); -      INTERP_4F( t, -		 GET_COLOR(VB->ColorPtr[1], dst), -		 GET_COLOR(VB->ColorPtr[1], out), -		 GET_COLOR(VB->ColorPtr[1], in) ); +void _tnl_init_vertices( GLcontext *ctx,  +			GLuint vb_size, +			GLuint max_vertex_size ) +{ +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);   -      if (VB->SecondaryColorPtr[1]) { -	 INTERP_3F( t, -		    GET_COLOR(VB->SecondaryColorPtr[1], dst), -		    GET_COLOR(VB->SecondaryColorPtr[1], out), -		    GET_COLOR(VB->SecondaryColorPtr[1], in) ); -      } -   } +   _tnl_install_attrs( ctx, 0, 0, 0 ); -   if (VB->EdgeFlag) { -      VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary; -   } - -   generic_interp(ctx, t, dst, out, in, force_boundary); +   vtx->need_extras = GL_TRUE; +   vtx->max_vertex_size = max_vertex_size; +   vtx->vertex_buf = (char *)ALIGN_MALLOC(vb_size * 4 * 18, max_vertex_size);  } -static void copy_pv_extras( GLcontext *ctx,  -			    GLuint dst, GLuint src ) -{ -   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - -   if (VB->ColorPtr[1]) { -      COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst),  -		GET_COLOR(VB->ColorPtr[1], src) ); -      if (VB->SecondaryColorPtr[1]) { -	 COPY_4FV( GET_COLOR(VB->SecondaryColorPtr[1], dst),  -		   GET_COLOR(VB->SecondaryColorPtr[1], src) ); -      } +void _tnl_free_vertices( GLcontext *ctx ) +{ +   struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); +   if (vtx->vertex_buf) { +      ALIGN_FREE(vtx->vertex_buf); +      vtx->vertex_buf = 0;     } - -   generic_copy_colors(ctx, dst, src);  } - -#endif diff --git a/src/mesa/tnl/t_vertex.h b/src/mesa/tnl/t_vertex.h index 26f2619c52..050f525e29 100644 --- a/src/mesa/tnl/t_vertex.h +++ b/src/mesa/tnl/t_vertex.h @@ -32,11 +32,15 @@   * and manipulate them directly.     */ + +/* It will probably be necessary to allow drivers to specify new + * emit-styles to cover all the wierd and wacky things out there. + */  enum tnl_attr_format { -   EMIT_1F = 1, -   EMIT_2F = 2, -   EMIT_3F = 3, -   EMIT_4F = 4, +   EMIT_1F, +   EMIT_2F, +   EMIT_3F, +   EMIT_4F,     EMIT_2F_VIEWPORT,		/* do viewport transform and emit */     EMIT_3F_VIEWPORT,		/* do viewport transform and emit */     EMIT_4F_VIEWPORT,		/* do viewport transform and emit */ @@ -46,22 +50,19 @@ enum tnl_attr_format {     EMIT_3UB_3F_RGB,		/* for specular color */     EMIT_4UB_4F_BGRA,		/* for color */     EMIT_4UB_4F_RGBA,		/* for color */ -   EMIT_NOP_1F, -   EMIT_NOP_1UB, +   EMIT_4CHAN_4F_RGBA,		/* for swrast color */ +   EMIT_1F_PAD_4F,		/* for swrast texcoords */ +   EMIT_2F_PAD_4F,		/* for swrast texcoords */ +   EMIT_3F_PAD_4F,		/* for swrast texcoords */ +   EMIT_MAX  };  struct tnl_attr_map { -   GLuint attr;			/* VERT_ATTRIB_ enum */ +   GLuint attrib;			/* _TNL_ATTRIB_ enum */     enum tnl_attr_format format;  }; -/* Emit hardware vertices to a given buffer: - */ -extern void _tnl_emit( GLcontext *ctx, -		       GLuint start, GLuint end, -		       void *dest, -		       GLuint stride );  /* Interpolate between two vertices to produce a third:   */ @@ -72,21 +73,47 @@ extern void _tnl_interp( GLcontext *ctx,  /* Copy colors from one vertex to another:   */ -extern void _tnl_copy_colors(  GLcontext *ctx, GLuint edst, GLuint esrc ); +extern void _tnl_copy_pv(  GLcontext *ctx, GLuint edst, GLuint esrc );  /* Extract a named attribute from a hardware vertex.  Will have to   * reverse any viewport transformation, swizzling or other conversions   * which may have been applied:   */ -extern void _tnl_get_attr( GLcontext *ctx, void *vertex, GLenum attrib, +extern void _tnl_get_attr( GLcontext *ctx, const void *vertex, GLenum attrib,  			   GLfloat *dest ); -/* Populate a swrast SWvertex from an attrib-style vertex. +extern void *_tnl_get_vertex( GLcontext *ctx, GLuint nr ); + + +/*   */ -extern void _tnl_translate( GLcontext *ctx, const void *vertex,  -			    SWvertex *dest ); +extern GLuint _tnl_install_attrs( GLcontext *ctx, +				  const struct tnl_attr_map *map, +				  GLuint nr, const GLfloat *vp ); + + + + +extern void _tnl_free_vertices( GLcontext *ctx ); + +extern void _tnl_init_vertices( GLcontext *ctx,  +				GLuint vb_size, +				GLuint max_vertex_size ); + +extern void *_tnl_emit_vertices_to_buffer( GLcontext *ctx, +					   GLuint start, +					   GLuint count, +					   void *dest ); + +extern void _tnl_build_vertices( GLcontext *ctx, +				 GLuint start, +				 GLuint count, +				 GLuint newinputs ); + +extern void _tnl_invalidate_vertices( GLcontext *ctx, GLuint newinputs ); +extern void _tnl_invalidate_vertex_state( GLcontext *ctx, GLuint new_state );  #endif diff --git a/src/mesa/tnl/tnl.h b/src/mesa/tnl/tnl.h index 349a8c7d60..9a2241d8fc 100644 --- a/src/mesa/tnl/tnl.h +++ b/src/mesa/tnl/tnl.h @@ -74,4 +74,5 @@ _tnl_need_dlist_norm_lengths( GLcontext *ctx, GLboolean flag );  extern void  _tnl_isolate_materials( GLcontext *ctx, GLboolean flag ); +  #endif  | 
