diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2001-12-17 04:47:57 +0000 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2001-12-17 04:47:57 +0000 | 
| commit | 57d6e1aebf1f850686a2c8d3a246fb388ec23979 (patch) | |
| tree | f2f9f49caa28392a138c46380ee1e7365ca3346c | |
| parent | c843a1a039685e143b21297ef5be0e16ea18dfd5 (diff) | |
first checkpoint commit of Klaus's new span code (struct sw_span)
| -rw-r--r-- | src/mesa/swrast/s_triangle.c | 204 | 
1 files changed, 63 insertions, 141 deletions
| diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index 7c6a26aff3..37f6caee69 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -1,4 +1,4 @@ -/* $Id: s_triangle.c,v 1.41 2001/11/28 16:11:32 brianp Exp $ */ +/* $Id: s_triangle.c,v 1.42 2001/12/17 04:47:57 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -47,7 +47,6 @@  #include "s_feedback.h"  #include "s_span.h"  #include "s_triangle.h" -#include "s_trispan.h" @@ -82,17 +81,7 @@ static void flat_ci_triangle( GLcontext *ctx,  #define INTERP_FOG 1  #define RENDER_SPAN( span )						\ -   GLdepth zSpan[MAX_WIDTH];						\ -   GLfloat fogSpan[MAX_WIDTH];						\ -   GLuint i;								\ -   for (i = 0; i < span.count; i++) {					\ -      zSpan[i] = FixedToDepth(span.z);					\ -      span.z += span.zStep;						\ -      fogSpan[i] = span.fog;						\ -      span.fog += span.fogStep;						\ -   }									\ -   _mesa_write_monoindex_span(ctx, span.count, span.x, span.y,		\ -	                      zSpan, fogSpan, v2->index, NULL, GL_POLYGON ); +   _mesa_write_monoindex_span(ctx, &span, v2->index, GL_POLYGON );  #include "s_tritemp.h"  } @@ -112,20 +101,13 @@ static void smooth_ci_triangle( GLcontext *ctx,  #define INTERP_INDEX 1  #define RENDER_SPAN( span )						\ -   GLdepth zSpan[MAX_WIDTH];						\ -   GLfloat fogSpan[MAX_WIDTH];						\ -   GLuint indexSpan[MAX_WIDTH];						\     GLuint i;						                \ -   for (i = 0; i < span.count; i++) {					\ -      zSpan[i] = FixedToDepth(span.z);					\ -      span.z += span.zStep;						\ -      indexSpan[i] = FixedToInt(span.index);				\ +   SW_SPAN_SET_FLAG(span.filledColor);			                \ +   for (i = 0; i < span.end; i++) {					\ +      span.color.index[i] = FixedToInt(span.index);			\        span.index += span.indexStep;					\ -      fogSpan[i] = span.fog;						\ -      span.fog += span.fogStep;						\     }									\ -   _mesa_write_index_span(ctx, span.count, span.x, span.y,		\ -                          zSpan, fogSpan, indexSpan, NULL, GL_POLYGON); +   _mesa_write_index_span(ctx, &span, GL_POLYGON);  #include "s_tritemp.h"  } @@ -145,17 +127,7 @@ static void flat_rgba_triangle( GLcontext *ctx,  #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE  #define RENDER_SPAN( span )						\ -   GLdepth zSpan[MAX_WIDTH];						\ -   GLfloat fogSpan[MAX_WIDTH];						\ -   GLuint i;								\ -   for (i = 0; i < span.count; i++) {					\ -      zSpan[i] = FixedToDepth(span.z);					\ -      span.z += span.zStep;						\ -      fogSpan[i] = span.fog;						\ -      span.fog += span.fogStep;						\ -   }									\ -   _mesa_write_monocolor_span(ctx, span.count, span.x, span.y, zSpan,	\ -                              fogSpan, v2->color, NULL, GL_POLYGON ); +   _mesa_write_monocolor_span(ctx, &span, v2->color, GL_POLYGON );  #include "s_tritemp.h" @@ -181,27 +153,19 @@ static void smooth_rgba_triangle( GLcontext *ctx,  #define INTERP_ALPHA 1  #define RENDER_SPAN( span )					\ -   GLdepth zSpan[MAX_WIDTH];					\ -   GLchan rgbaSpan[MAX_WIDTH][4];				\ -   GLfloat fogSpan[MAX_WIDTH];					\     GLuint i;				        	        \ -   for (i = 0; i < span.count; i++) {				\ -      rgbaSpan[i][RCOMP] = FixedToChan(span.red);		\ -      rgbaSpan[i][GCOMP] = FixedToChan(span.green);		\ -      rgbaSpan[i][BCOMP] = FixedToChan(span.blue);		\ -      rgbaSpan[i][ACOMP] = FixedToChan(span.alpha);		\ +   SW_SPAN_SET_FLAG(span.filledColor);			        \ +   for (i = 0; i < span.end; i++) {				\ +      span.color.rgba[i][RCOMP] = FixedToChan(span.red);	\ +      span.color.rgba[i][GCOMP] = FixedToChan(span.green);	\ +      span.color.rgba[i][BCOMP] = FixedToChan(span.blue);	\ +      span.color.rgba[i][ACOMP] = FixedToChan(span.alpha);	\        span.red += span.redStep;					\        span.green += span.greenStep;				\        span.blue += span.blueStep;				\        span.alpha += span.alphaStep;				\ -      zSpan[i] = FixedToDepth(span.z);				\ -      span.z += span.zStep;					\ -      fogSpan[i] = span.fog;					\ -      span.fog += span.fogStep;					\     }								\ -   _mesa_write_rgba_span(ctx, span.count, span.x, span.y,	\ -                         (CONST GLdepth *) zSpan,		\ -                         fogSpan, rgbaSpan, NULL, GL_POLYGON); +   _mesa_write_rgba_span(ctx, &span, GL_POLYGON);  #include "s_tritemp.h" @@ -241,23 +205,23 @@ static void simple_textured_triangle( GLcontext *ctx,     }  #define RENDER_SPAN( span  )						\ -   GLchan rgbSpan[MAX_WIDTH][3];					\     GLuint i;								\ +   SW_SPAN_SET_FLAG(span.filledColor);					\     span.intTex[0] -= FIXED_HALF; /* off-by-one error? */		\     span.intTex[1] -= FIXED_HALF;					\ -   for (i = 0; i < span.count; i++) {					\ +   for (i = 0; i < span.end; i++) {					\        GLint s = FixedToInt(span.intTex[0]) & smask;			\        GLint t = FixedToInt(span.intTex[1]) & tmask;			\        GLint pos = (t << twidth_log2) + s;				\        pos = pos + pos + pos;  /* multiply by 3 */			\ -      rgbSpan[i][RCOMP] = texture[pos];					\ -      rgbSpan[i][GCOMP] = texture[pos+1];				\ -      rgbSpan[i][BCOMP] = texture[pos+2];				\ +      span.color.rgb[i][RCOMP] = texture[pos];				\ +      span.color.rgb[i][GCOMP] = texture[pos+1];			\ +      span.color.rgb[i][BCOMP] = texture[pos+2];			\        span.intTex[0] += span.intTexStep[0];				\        span.intTex[1] += span.intTexStep[1];				\     }									\ -   (*swrast->Driver.WriteRGBSpan)(ctx, span.count, span.x, span.y,	\ -                                  (CONST GLchan (*)[3]) rgbSpan, NULL ); +   (*swrast->Driver.WriteRGBSpan)(ctx, span.end, span.x, span.y,	\ +                                  (CONST GLchan (*)[3]) span.color.rgb, NULL );  #include "s_tritemp.h"  } @@ -297,33 +261,32 @@ static void simple_z_textured_triangle( GLcontext *ctx,     }  #define RENDER_SPAN( span )						\ -   GLchan rgbSpan[MAX_WIDTH][3];					\ -   GLubyte mask[MAX_WIDTH];						\     GLuint i;				    				\     span.intTex[0] -= FIXED_HALF; /* off-by-one error? */		\     span.intTex[1] -= FIXED_HALF;					\ -   for (i = 0; i < span.count; i++) {					\ +   SW_SPAN_SET_FLAG(span.filledColor);					\ +   for (i = 0; i < span.end; i++) {					\        const GLdepth z = FixedToDepth(span.z);				\        if (z < zRow[i]) {						\           GLint s = FixedToInt(span.intTex[0]) & smask;			\           GLint t = FixedToInt(span.intTex[1]) & tmask;			\           GLint pos = (t << twidth_log2) + s;				\           pos = pos + pos + pos;  /* multiply by 3 */			\ -         rgbSpan[i][RCOMP] = texture[pos];				\ -         rgbSpan[i][GCOMP] = texture[pos+1];				\ -         rgbSpan[i][BCOMP] = texture[pos+2];				\ +         span.color.rgb[i][RCOMP] = texture[pos];			\ +         span.color.rgb[i][GCOMP] = texture[pos+1];			\ +         span.color.rgb[i][BCOMP] = texture[pos+2];			\           zRow[i] = z;							\ -         mask[i] = 1;							\ +         span.mask[i] = 1;						\        }									\        else {								\ -         mask[i] = 0;							\ +         span.mask[i] = 0;						\        }									\        span.intTex[0] += span.intTexStep[0];				\        span.intTex[1] += span.intTexStep[1];				\        span.z += span.zStep;						\     }									\ -   (*swrast->Driver.WriteRGBSpan)(ctx, span.count, span.x, span.y,	\ -                                  (CONST GLchan (*)[3]) rgbSpan, mask ); +   (*swrast->Driver.WriteRGBSpan)(ctx, span.end, span.x, span.y,	\ +                                  (CONST GLchan (*)[3]) span.color.rgb, span.mask );  #include "s_tritemp.h"  } @@ -341,7 +304,6 @@ struct affine_info     const GLchan *texture;     GLchan er, eg, eb, ea;     GLint tbytesline, tsize; -   GLint fixedToDepthShift;  }; @@ -350,7 +312,7 @@ struct affine_info   * texture env modes.   */  static INLINE void -affine_span(GLcontext *ctx, struct triangle_span *span, +affine_span(GLcontext *ctx, struct sw_span *span,              struct affine_info *info)  {     GLchan sample[4];  /* the filtered texture sample */ @@ -435,17 +397,13 @@ affine_span(GLcontext *ctx, struct triangle_span *span,  #define NEAREST_RGBA_REPLACE  COPY_CHAN4(dest, tex00)  #define SPAN_NEAREST(DO_TEX,COMP)					\ -	for (i = 0; i < span->count; i++) {				\ +	for (i = 0; i < span->end; i++) {				\             /* Isn't it necessary to use FixedFloor below?? */		\             GLint s = FixedToInt(span->intTex[0]) & info->smask;		\             GLint t = FixedToInt(span->intTex[1]) & info->tmask;		\             GLint pos = (t << info->twidth_log2) + s;			\             const GLchan *tex00 = info->texture + COMP * pos;		\ -	   zspan[i] = FixedToDepth(span->z);				\ -	   fogspan[i] = span->fog;					\             DO_TEX;							\ -	   span->fog += span->fogStep;					\ -	   span->z += span->zStep;					\             span->red += span->redStep;					\  	   span->green += span->greenStep;				\             span->blue += span->blueStep;				\ @@ -456,7 +414,7 @@ affine_span(GLcontext *ctx, struct triangle_span *span,  	}  #define SPAN_LINEAR(DO_TEX,COMP)					\ -	for (i = 0; i < span->count; i++) {				\ +	for (i = 0; i < span->end; i++) {				\             /* Isn't it necessary to use FixedFloor below?? */		\             GLint s = FixedToInt(span->intTex[0]) & info->smask;		\             GLint t = FixedToInt(span->intTex[1]) & info->tmask;		\ @@ -479,11 +437,7 @@ affine_span(GLcontext *ctx, struct triangle_span *span,                tex01 -= info->tbytesline;				\                tex11 -= info->tbytesline;				\             }								\ -	   zspan[i] = FixedToDepth(span->z);				\ -	   fogspan[i] = span->fog;					\             DO_TEX;							\ -	   span->fog += span->fogStep;					\ -	   span->z += span->zStep;					\             span->red += span->redStep;					\  	   span->green += span->greenStep;				\             span->blue += span->blueStep;				\ @@ -493,14 +447,11 @@ affine_span(GLcontext *ctx, struct triangle_span *span,             dest += 4;							\  	} -#define FixedToDepth(F)  ((F) >> fixedToDepthShift)     GLuint i; -   GLdepth zspan[MAX_WIDTH]; -   GLfloat fogspan[MAX_WIDTH]; -   GLchan rgba[MAX_WIDTH][4]; -   GLchan *dest = rgba[0]; -   const GLint fixedToDepthShift = info->fixedToDepthShift; +   GLchan *dest = span->color.rgba[0]; + +   SW_SPAN_SET_FLAG(span->filledColor);     span->intTex[0] -= FIXED_HALF;     span->intTex[1] -= FIXED_HALF; @@ -596,12 +547,10 @@ affine_span(GLcontext *ctx, struct triangle_span *span,        }        break;     } -   _mesa_write_rgba_span(ctx, span->count, span->x, span->y, -                         zspan, fogspan, rgba, NULL, GL_POLYGON); +   _mesa_write_rgba_span(ctx, span, GL_POLYGON);  #undef SPAN_NEAREST  #undef SPAN_LINEAR -#undef FixedToDepth  } @@ -630,7 +579,6 @@ static void affine_textured_triangle( GLcontext *ctx,     GLint b = obj->BaseLevel;						\     GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\     GLfloat theight = (GLfloat) obj->Image[b]->Height;			\ -   info.fixedToDepthShift = ctx->Visual.depthBits <= 16 ? FIXED_SHIFT : 0;\     info.texture = (const GLchan *) obj->Image[b]->Data;			\     info.twidth_log2 = obj->Image[b]->WidthLog2;				\     info.smask = obj->Image[b]->Width - 1;				\ @@ -690,12 +638,11 @@ struct persp_info     const GLchan *texture;     GLchan er, eg, eb, ea;   /* texture env color */     GLint tbytesline, tsize; -   GLint fixedToDepthShift;  };  static INLINE void -fast_persp_span(GLcontext *ctx, struct triangle_span *span, +fast_persp_span(GLcontext *ctx, struct sw_span *span,  		struct persp_info *info)  {     GLchan sample[4];  /* the filtered texture sample */ @@ -706,7 +653,7 @@ fast_persp_span(GLcontext *ctx, struct triangle_span *span,     * unused variables (for instance tf,sf,ti,si in case of GL_NEAREST).     */  #define SPAN_NEAREST(DO_TEX,COMP)					\ -	for (i = 0; i < span->count; i++) {				\ +	for (i = 0; i < span->end; i++) {				\             GLdouble invQ = tex_coord[2] ?				\                                   (1.0 / tex_coord[2]) : 1.0;            \             GLfloat s_tmp = (GLfloat) (tex_coord[0] * invQ);		\ @@ -715,11 +662,7 @@ fast_persp_span(GLcontext *ctx, struct triangle_span *span,             GLint t = IFLOOR(t_tmp) & info->tmask;	        	\             GLint pos = (t << info->twidth_log2) + s;			\             const GLchan *tex00 = info->texture + COMP * pos;		\ -	   zspan[i] = FixedToDepth(span->z);				\ -	   fogspan[i] = span->fog;					\             DO_TEX;							\ -	   span->fog += span->fogStep;					\ -	   span->z += span->zStep;					\             span->red += span->redStep;					\  	   span->green += span->greenStep;				\             span->blue += span->blueStep;				\ @@ -731,7 +674,7 @@ fast_persp_span(GLcontext *ctx, struct triangle_span *span,  	}  #define SPAN_LINEAR(DO_TEX,COMP)					\ -	for (i = 0; i < span->count; i++) {				\ +	for (i = 0; i < span->end; i++) {				\             GLdouble invQ = tex_coord[2] ?				\                                   (1.0 / tex_coord[2]) : 1.0;            \             GLfloat s_tmp = (GLfloat) (tex_coord[0] * invQ);		\ @@ -759,11 +702,7 @@ fast_persp_span(GLcontext *ctx, struct triangle_span *span,                tex01 -= info->tbytesline;				\                tex11 -= info->tbytesline;				\             }								\ -	   zspan[i] = FixedToDepth(span->z);				\ -	   fogspan[i] = span->fog;					\             DO_TEX;							\ -	   span->fog += span->fogStep;					\ -	   span->z += span->zStep;					\             span->red   += span->redStep;				\  	   span->green += span->greenStep;				\             span->blue  += span->blueStep;				\ @@ -774,15 +713,11 @@ fast_persp_span(GLcontext *ctx, struct triangle_span *span,             dest += 4;							\  	} -#define FixedToDepth(F)  ((F) >> fixedToDepthShift) -     GLuint i; -   GLdepth zspan[MAX_WIDTH];     GLfloat tex_coord[3], tex_step[3]; -   GLfloat fogspan[MAX_WIDTH]; -   GLchan rgba[MAX_WIDTH][4]; -   GLchan *dest = rgba[0]; -   const GLint fixedToDepthShift = info->fixedToDepthShift; +   GLchan *dest = span->color.rgba[0]; + +   SW_SPAN_SET_FLAG(span->filledColor);     tex_coord[0] = span->tex[0][0]  * (info->smask + 1),       tex_step[0] = span->texStep[0][0] * (info->smask + 1); @@ -883,19 +818,12 @@ fast_persp_span(GLcontext *ctx, struct triangle_span *span,        }        break;     } -   /* This does not seem to be necessary, but I don't know !! */ -   /* span->tex[0][0] = tex_coord[0] / (info->smask + 1), -      span->tex[0][1] = tex_coord[1] / (info->tmask + 1),*/ -   /* span->tex[0][2] only if 3D-texturing, here only 2D */ -   /* span->tex[0][3] = tex_coord[2]; */ -   _mesa_write_rgba_span(ctx, span->count, span->x, span->y, -                         zspan, fogspan, rgba, NULL, GL_POLYGON); +   _mesa_write_rgba_span(ctx, span, GL_POLYGON);  #undef SPAN_NEAREST  #undef SPAN_LINEAR -#undef FixedToDepth  } @@ -922,7 +850,6 @@ static void persp_textured_triangle( GLcontext *ctx,     struct gl_texture_unit *unit = ctx->Texture.Unit+0;			\     struct gl_texture_object *obj = unit->Current2D;			\     GLint b = obj->BaseLevel;						\ -   info.fixedToDepthShift = ctx->Visual.depthBits <= 16 ? FIXED_SHIFT : 0;\     info.texture = (const GLchan *) obj->Image[b]->Data;			\     info.twidth_log2 = obj->Image[b]->WidthLog2;				\     info.smask = obj->Image[b]->Width - 1;				\ @@ -995,47 +922,42 @@ static void general_textured_triangle( GLcontext *ctx,  #define SETUP_CODE							\     const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;	\     const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];\ -   DEFARRAY(GLfloat, sSpan, MAX_WIDTH);  /* mac 32k limitation */	\ -   DEFARRAY(GLfloat, tSpan, MAX_WIDTH);  /* mac 32k limitation */	\ -   DEFARRAY(GLfloat, uSpan, MAX_WIDTH);  /* mac 32k limitation */	\ -   CHECKARRAY(sSpan, return);  /* mac 32k limitation */			\ -   CHECKARRAY(tSpan, return);  /* mac 32k limitation */			\ -   CHECKARRAY(uSpan, return);  /* mac 32k limitation */			\     span.texWidth[0] = (GLfloat) texImage->Width;			\     span.texHeight[0] = (GLfloat) texImage->Height;			\     (void) fixedToDepthShift;  #define RENDER_SPAN( span )						\ -   GLdepth zSpan[MAX_WIDTH];						\     GLfloat fogSpan[MAX_WIDTH];						\ -   GLchan rgbaSpan[MAX_WIDTH][4];					\     GLuint i;								\ +   SW_SPAN_SET_FLAG(span.filledColor);					\ +   SW_SPAN_SET_FLAG(span.filledTex[0]);					\     /* NOTE: we could just call rasterize_span() here instead */		\ -   for (i = 0; i < span.count; i++) {					\ +   for (i = 0; i < span.end; i++) {					\        GLdouble invQ = span.tex[0][3] ? (1.0 / span.tex[0][3]) : 1.0;	\ -      zSpan[i] = FixedToDepth(span.z);					\ +      span.depth[i] = FixedToDepth(span.z);				\        span.z += span.zStep;						\        fogSpan[i] = span.fog;			          		\ -      span.fog += span.fogStep;						\ -      rgbaSpan[i][RCOMP] = FixedToChan(span.red);			\ -      rgbaSpan[i][GCOMP] = FixedToChan(span.green);			\ -      rgbaSpan[i][BCOMP] = FixedToChan(span.blue);			\ -      rgbaSpan[i][ACOMP] = FixedToChan(span.alpha);			\ -      span.red += span.redStep;						\ +      span.fog += span.fogStep;					\ +      span.color.rgba[i][RCOMP] = FixedToChan(span.red);		\ +      span.color.rgba[i][GCOMP] = FixedToChan(span.green);		\ +      span.color.rgba[i][BCOMP] = FixedToChan(span.blue);		\ +      span.color.rgba[i][ACOMP] = FixedToChan(span.alpha);		\ +      span.red += span.redStep;					\        span.green += span.greenStep;					\        span.blue += span.blueStep;					\        span.alpha += span.alphaStep;					\ -      sSpan[i] = (GLfloat) (span.tex[0][0] * invQ);			\ -      tSpan[i] = (GLfloat) (span.tex[0][1] * invQ);			\ -      uSpan[i] = (GLfloat) (span.tex[0][2] * invQ);			\ +      span.texcoords[0][i][0] = (GLfloat) (span.tex[0][0] * invQ);	\ +      span.texcoords[0][i][1] = (GLfloat) (span.tex[0][1] * invQ);	\ +      span.texcoords[0][i][2] = (GLfloat) (span.tex[0][2] * invQ);	\        span.tex[0][0] += span.texStep[0][0];				\        span.tex[0][1] += span.texStep[0][1];				\        span.tex[0][2] += span.texStep[0][2];				\        span.tex[0][3] += span.texStep[0][3];				\     }									\ -   _mesa_write_texture_span(ctx, span.count, span.x, span.y,		\ -                            zSpan, fogSpan, sSpan, tSpan, uSpan,	\ -                            NULL, rgbaSpan, NULL, NULL, GL_POLYGON ); +   _old_write_texture_span( ctx, span.end, span.x, span.y,		\ +                            span.depth, fogSpan,			\ +			    span.texcoords[0],				\ +                            NULL, span.color.rgba, NULL, NULL, GL_POLYGON );  #define CLEANUP_CODE				\     UNDEFARRAY(sSpan);  /* mac 32k limitation */	\ @@ -1203,8 +1125,8 @@ static void occlusion_zless_triangle( GLcontext *ctx,  #define RENDER_SPAN( span )				\     GLuint i;						\ -   for (i = 0; i < span.count; i++) {			\ -      GLdepth z = FixedToDepth(span.z);			\ +   for (i = 0; i < span.end; i++) {			\ +      GLdepth z = FixedToDepth(span.z);		\        if (z < zRow[i]) {				\           ctx->OcclusionResult = GL_TRUE;		\           return;					\ | 
