first checkpoint commit of Klaus's new span code (struct sw_span)

This commit is contained in:
Brian Paul 2001-12-17 04:47:57 +00:00
parent c843a1a039
commit 57d6e1aebf

View file

@ -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; \