latest changes from Klaus

This commit is contained in:
Brian Paul
2002-01-16 16:00:03 +00:00
parent b311950dde
commit 78940758e9
3 changed files with 149 additions and 12 deletions

View File

@@ -1,4 +1,4 @@
/* $Id: s_span.c,v 1.21 2002/01/10 16:54:29 brianp Exp $ */
/* $Id: s_span.c,v 1.22 2002/01/16 16:00:03 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -1208,6 +1208,146 @@ add_colors(CONST struct sw_span *span, GLchan rgba[][4])
}
/*
* Write a horizontal span of textured pixels to the frame buffer.
* The color of each pixel is different.
* Alpha-testing, stenciling, depth-testing, and blending are done
* as needed.
* Input: span - contains span-data with the exception of
* fog - array of fog factor values in [0,1]
* primitive - either GL_POINT, GL_LINE, GL_POLYGON or GL_BITMAP.
*/
void
_mesa_write_texture_span( GLcontext *ctx, struct sw_span *span,
const GLfloat fog[], GLenum primitive )
{
const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask);
GLchan rgbaBackup[MAX_WIDTH][4];
GLchan (*rgba)[4]; /* points to either rgbaIn or rgbaBackup */
SWcontext *swrast = SWRAST_CONTEXT(ctx);
SET_MASK_TO_ONE(span);
if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
if (clip_span(ctx,span) == GL_FALSE) {
return;
}
}
/* Do the scissor test */
if (ctx->Scissor.Enabled) {
if (_mesa_scissor_span( ctx, span ) == GL_FALSE) {
return;
}
}
/* Polygon Stippling */
if (ctx->Polygon.StippleFlag && primitive==GL_POLYGON) {
stipple_polygon_span( ctx, span);
}
if (primitive==GL_BITMAP || (swrast->_RasterMask & MULTI_DRAW_BIT)) {
/* must make a copy of the colors since they may be modified */
MEMCPY(rgbaBackup, span->color.rgba, 4 * span->end * sizeof(GLchan));
rgba = rgbaBackup;
}
else {
rgba = span->color.rgba;
}
/* Texture with alpha test */
if (ctx->Color.AlphaEnabled) {
/* Texturing without alpha is done after depth-testing which
gives a potential speed-up. */
ASSERT(ctx->Texture._ReallyEnabled);
_swrast_texture_fragments( ctx, 0, span, rgba );
/* Do the alpha test */
if (_mesa_alpha_test( ctx, span->end, (const GLchan (*)[4]) rgba, span->mask ) == 0) {
return;
}
span->write_all = GL_FALSE;
}
if (ctx->Stencil.Enabled) {
/* first stencil test */
if (_mesa_stencil_and_ztest_span(ctx, span) == GL_FALSE)
return;
}
else if (ctx->Depth.Test) {
/* regular depth testing */
if (_mesa_depth_test_span(ctx, span) == 0)
return;
}
/* if we get here, something passed the depth test */
ctx->OcclusionResult = GL_TRUE;
/* Texture without alpha test */
if (! ctx->Color.AlphaEnabled) {
ASSERT(ctx->Texture._ReallyEnabled);
_swrast_texture_fragments( ctx, 0, span, rgba );
}
/* Add base and specular colors */
if ((span->activeMask & SPAN_SPEC) && /* Is this right test ???*/
(ctx->Fog.ColorSumEnabled ||
(ctx->Light.Enabled &&
ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)))
add_colors(span, rgba); /* rgba = rgba + spec */
/* Per-pixel fog */
if (ctx->Fog.Enabled) {
/* Is this the right 'if' ?? */
if ((span->activeMask & SPAN_FOG) && !swrast->_PreferPixelFog)
_old_fog_rgba_pixels( ctx, span->end, fog, rgba );
else
_mesa_depth_fog_rgba_pixels(ctx, span, rgba);
}
/* Antialias coverage application */
#if 0
if (span->coverage) {
GLuint i;
for (i = 0; i < span->end; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]);
}
}
#endif
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
multi_write_rgba_span( ctx, span->end, span->x, span->y, (const GLchan (*)[4]) rgba, span->mask );
}
else {
/* normal: write to exactly one buffer */
if (ctx->Color.ColorLogicOpEnabled) {
_mesa_logicop_rgba_span( ctx, span->end, span->x, span->y, rgba, span->mask );
}
else if (ctx->Color.BlendEnabled) {
_mesa_blend_span( ctx, span->end, span->x, span->y, rgba, span->mask );
}
if (colorMask == 0x0) {
return;
}
else if (colorMask != 0xffffffff) {
_mesa_mask_rgba_span( ctx, span->end, span->x, span->y, rgba );
}
(*swrast->Driver.WriteRGBASpan)( ctx, span->end, span->x, span->y, (const GLchan (*)[4])rgba,
span->write_all ? NULL : span->mask );
if (swrast->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_span( ctx, span->end, span->x, span->y, (const GLchan (*)[4]) rgba,
span->write_all ? NULL : span->mask );
}
}
}
/*
* Write a horizontal span of textured pixels to the frame buffer.
* The color of each pixel is different.

View File

@@ -1,4 +1,4 @@
/* $Id: s_span.h,v 1.9 2002/01/10 16:54:29 brianp Exp $ */
/* $Id: s_span.h,v 1.10 2002/01/16 16:00:04 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -61,6 +61,10 @@ extern void
_mesa_write_monocolor_span( GLcontext *ctx, struct sw_span *span,
const GLchan color[4], GLenum primitive );
extern void
_mesa_write_texture_span( GLcontext *ctx, struct sw_span *span,
const GLfloat fog[], GLenum primitive );
extern void
_mesa_rasterize_span(GLcontext *ctx, struct sw_span *span);

View File

@@ -1,4 +1,4 @@
/* $Id: s_triangle.c,v 1.46 2002/01/09 00:27:49 brianp Exp $ */
/* $Id: s_triangle.c,v 1.47 2002/01/16 16:00:04 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -959,15 +959,8 @@ static void general_textured_triangle( GLcontext *ctx,
span.tex[0][2] += span.texStep[0][2]; \
span.tex[0][3] += span.texStep[0][3]; \
} \
_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 */ \
UNDEFARRAY(tSpan); \
UNDEFARRAY(uSpan);
_mesa_write_texture_span( ctx, &span, fogSpan, \
GL_POLYGON );
#include "s_tritemp.h"
}