Updated comments, fixed indentation, etc.
-/* $Id: s_copypix.c,v 1.30 2002/01/28 03:42:28 brianp Exp $ */
+/* $Id: s_copypix.c,v 1.31 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLchan *tmpImage,*p;
GLboolean quick_draw;
- GLint sy, dy, stepy;
- GLint i, j;
+ GLint sy, dy, stepy, j;
GLboolean changeBuffer;
GLchan *saveReadAlpha;
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
-/* $Id: s_pixeltex.c,v 1.5 2002/01/27 18:32:03 brianp Exp $ */
+/* $Id: s_pixeltex.c,v 1.6 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
{
if (ctx->Texture._ReallyEnabled & ~TEXTURE0_ANY) {
/* multitexture! */
- GLchan rgbaOut[MAX_WIDTH][4];
+ GLchan primary_rgba[MAX_WIDTH][4];
GLuint unit;
- MEMCPY(rgbaOut, span->color.rgba, 4 * span->end * sizeof(GLchan));
+ MEMCPY(primary_rgba, span->color.rgba, 4 * span->end * sizeof(GLchan));
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
pixeltexgen(ctx, span->end,
(const GLchan (*)[4]) span->color.rgba,
span->texcoords[unit]);
- _swrast_texture_fragments(ctx, unit, span, rgbaOut);
+ _swrast_texture_fragments(ctx, unit, span->end,
+ span->texcoords[unit],
+ span->lambda[unit],
+ (CONST GLchan (*)[4]) primary_rgba,
+ span->color.rgba);
}
}
-
- MEMCPY(span->color.rgba, rgbaOut, 4 * span->end * sizeof(GLchan));
}
else {
/* single texture, unit 0 */
pixeltexgen(ctx, span->end,
(const GLchan (*)[4]) span->color.rgba,
span->texcoords[0]);
- _swrast_texture_fragments(ctx, 0, span, span->color.rgba);
+ _swrast_texture_fragments(ctx, 0, span->end,
+ span->texcoords[0], span->lambda[0],
+ (CONST GLchan (*)[4]) span->color.rgba,
+ (GLchan (*)[4]) span->color.rgba);
}
}
-/* $Id: s_span.c,v 1.26 2002/01/28 03:42:28 brianp Exp $ */
+/* $Id: s_span.c,v 1.27 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
}
/* Fog */
+ /* XXX try to simplify the fog code! */
if (ctx->Fog.Enabled) {
if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog)
_mesa_fog_ci_pixels_with_array( ctx, span, span->fogArray,
return;
}
- /* Per-pixel fog */
+ /* Fog */
+ /* XXX try to simplify the fog code! */
if (ctx->Fog.Enabled) {
if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog)
_mesa_fog_rgba_pixels_with_array(ctx, span, span->fogArray,
add_colors( span->end, span->color.rgba, span->specArray );
}
- /* Per-pixel fog */
+ /* Fog */
+ /* XXX try to simplify the fog code! */
if (ctx->Fog.Enabled) {
-#if 0
- if ((span->interpMask & SPAN_FOG) && (span->arrayMask & SPAN_FOG) == 0)
- interpolate_fog(ctx, span);
-#endif
if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog)
_mesa_fog_rgba_pixels_with_array( ctx, span, span->fogArray,
span->color.rgba);
-/* $Id: s_texture.c,v 1.47 2002/01/28 00:07:33 brianp Exp $ */
+/* $Id: s_texture.c,v 1.48 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
* Apply a unit of texture mapping to the incoming fragments.
*/
void
-_old_swrast_texture_fragments( GLcontext *ctx, GLuint texUnit, GLuint n,
+_swrast_texture_fragments( GLcontext *ctx, GLuint texUnit, GLuint n,
GLfloat texcoords[][4], GLfloat lambda[],
CONST GLchan primary_rgba[][4],
GLchan rgba[][4] )
}
-/*
- * Apply a unit of texture mapping to the incoming fragments.
- */
-void
-_swrast_texture_fragments( GLcontext *ctx, GLuint texUnit,
- struct sw_span *span,
- GLchan rgbaOut[][4] )
-{
- const GLuint mask = TEXTURE0_ANY << (texUnit * 4);
-
- if (ctx->Texture._ReallyEnabled & mask) {
- const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
- GLfloat *lambda;
-
- lambda = (span->arrayMask & SPAN_LAMBDA) ? span->lambda[texUnit] : NULL;
-
- if (textureUnit->_Current) { /* XXX need this? */
- const struct gl_texture_object *curObj = textureUnit->_Current;
- GLchan texel[PB_SIZE][4];
-
- if (textureUnit->LodBias != 0.0F) {
- /* apply LOD bias, but don't clamp yet */
- GLuint i;
- for (i=0;i<span->end;i++) {
- lambda[i] += textureUnit->LodBias;
- }
- }
-
- if ((curObj->MinLod != -1000.0 || curObj->MaxLod != 1000.0)
- && lambda) {
- /* apply LOD clamping to lambda */
- const GLfloat min = curObj->MinLod;
- const GLfloat max = curObj->MaxLod;
- GLuint i;
- for (i=0;i<span->end;i++) {
- GLfloat l = lambda[i];
- lambda[i] = CLAMP(l, min, max);
- }
- }
-
- /* Sample the texture. */
- if (curObj->Image[curObj->BaseLevel]->Format == GL_DEPTH_COMPONENT) {
- /* depth texture */
- sample_depth_texture(ctx, textureUnit, span->end,
- span->texcoords[texUnit], texel);
- }
- else {
- /* color texture */
- SWRAST_CONTEXT(ctx)->TextureSample[texUnit]( ctx, texUnit,
- textureUnit->_Current,
- span->end,
- span->texcoords[texUnit],
- lambda, texel );
- }
- apply_texture( ctx, textureUnit, span->end,
- (CONST GLchan (*)[4]) span->color.rgba,
- (CONST GLchan (*)[4]) texel,
- rgbaOut );
- }
- }
-}
-
-
/*
* Apply multiple texture stages (or just unit 0) to the span.
* At some point in the future we'll probably modify this so that
/* loop over texture units, modifying the span->color.rgba values */
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
- _old_swrast_texture_fragments( ctx, unit, span->end,
+ _swrast_texture_fragments( ctx, unit, span->end,
span->texcoords[unit],
(span->arrayMask & SPAN_LAMBDA) ?
span->lambda[unit] : NULL,
/* Just unit 0 enabled */
ASSERT(ctx->Texture._ReallyEnabled & TEXTURE0_ANY);
- _old_swrast_texture_fragments( ctx, 0, span->end,
+ _swrast_texture_fragments( ctx, 0, span->end,
span->texcoords[0],
(span->arrayMask & SPAN_LAMBDA) ?
span->lambda[0] : NULL,
-/* $Id: s_texture.h,v 1.10 2002/01/28 00:07:33 brianp Exp $ */
+/* $Id: s_texture.h,v 1.11 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
GLuint texUnit,
const struct gl_texture_object *tObj );
-
-extern void
-_swrast_texture_fragments( GLcontext *ctx, GLuint texSet,
- struct sw_span *span,
- GLchan rgba[][4] );
-
extern void
-_old_swrast_texture_fragments( GLcontext *ctx, GLuint texSet, GLuint n,
+_swrast_texture_fragments( GLcontext *ctx, GLuint texSet, GLuint n,
GLfloat texcoords[][4], GLfloat lambda[],
CONST GLchan primary_rgba[][4],
GLchan rgba[][4] );
-/* $Id: s_triangle.c,v 1.51 2002/01/28 03:42:28 brianp Exp $ */
+/* $Id: s_triangle.c,v 1.52 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
span.index = IntToFixed(v2->index); \
span.indexStep = 0;
-#define RENDER_SPAN( span ) \
- _mesa_write_index_span(ctx, &span, GL_POLYGON );
+#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, &span, GL_POLYGON )
#include "s_tritemp.h"
}
#define INTERP_FOG 1
#define INTERP_INDEX 1
-#define RENDER_SPAN( span ) \
- _mesa_write_index_span(ctx, &span, GL_POLYGON);
+#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, &span, GL_POLYGON)
#include "s_tritemp.h"
}
span.blueStep = 0; \
span.alphaStep = 0;
-#define RENDER_SPAN( span ) \
- _mesa_write_rgba_span(ctx, &span, GL_POLYGON );
+#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, &span, GL_POLYGON )
#include "s_tritemp.h"
}
#define INTERP_RGB 1
#define INTERP_ALPHA 1
-#define RENDER_SPAN( span ) \
- ASSERT(span.interpMask & SPAN_RGBA); \
+#define RENDER_SPAN( span ) \
+ ASSERT(span.interpMask & SPAN_RGBA); \
_mesa_write_rgba_span(ctx, &span, GL_POLYGON);
#include "s_tritemp.h"
#define INTERP_ALPHA 1
#define INTERP_TEX 1
-#define SETUP_CODE \
- const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current; \
- const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];\
- span.texWidth[0] = (GLfloat) texImage->Width; \
- span.texHeight[0] = (GLfloat) texImage->Height; \
- (void) fixedToDepthShift;
-
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span, GL_POLYGON);
#include "s_tritemp.h"
#define INTERP_TEX 1
#define INTERP_LAMBDA 1
-#define SETUP_CODE \
- const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current; \
- const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];\
- span.texWidth[0] = (GLfloat) texImage->Width; \
- span.texHeight[0] = (GLfloat) texImage->Height; \
- (void) fixedToDepthShift;
-
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span, GL_POLYGON);
#include "s_tritemp.h"
#define INTERP_MULTITEX 1
#define INTERP_LAMBDA 1
-#define SETUP_CODE \
- GLuint u; \
- for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { \
- if (ctx->Texture.Unit[u]._ReallyEnabled) { \
- const struct gl_texture_object *texObj; \
- const struct gl_texture_image *texImage; \
- texObj = ctx->Texture.Unit[u]._Current; \
- texImage = texObj->Image[texObj->BaseLevel]; \
- span.texWidth[u] = (GLfloat) texImage->Width; \
- span.texHeight[u] = (GLfloat) texImage->Height; \
- } \
- } \
- (void) fixedToDepthShift;
-
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span, GL_POLYGON);
#include "s_tritemp.h"
-/* $Id: s_tritemp.h,v 1.32 2002/01/28 03:42:28 brianp Exp $ */
+/* $Id: s_tritemp.h,v 1.33 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
}
# ifdef INTERP_LAMBDA
{
- GLfloat dudx = span.texStep[0][0] * span.texWidth[0];
- GLfloat dudy = dsdy * span.texWidth[0];
- GLfloat dvdx = span.texStep[0][1] * span.texHeight[0];
- GLfloat dvdy = dtdy * span.texHeight[0];
+ const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;
+ const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];
+ const GLfloat texWidth = (GLfloat) texImage->Width;
+ const GLfloat texHeight = (GLfloat) texImage->Height;
+ GLfloat dudx = span.texStep[0][0] * texWidth;
+ GLfloat dudy = dsdy * texWidth;
+ GLfloat dvdx = span.texStep[0][1] * texHeight;
+ GLfloat dvdy = dtdy * texHeight;
GLfloat r1 = dudx * dudx + dudy * dudy;
GLfloat r2 = dvdx * dvdx + dvdy * dvdy;
span.rho[0] = r1 + r2; /* was rho2 = MAX2(r1,r2) */
dvdy[u] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
# ifdef INTERP_LAMBDA
{
- GLfloat dudx = span.texStep[u][0] * span.texWidth[u];
- GLfloat dudy = dsdy[u] * span.texWidth[u];
- GLfloat dvdx = span.texStep[u][1] * span.texHeight[u];
- GLfloat dvdy = dtdy[u] * span.texHeight[u];
+ const struct gl_texture_object *obj
+ = ctx->Texture.Unit[u]._Current;
+ const struct gl_texture_image *texImage
+ = obj->Image[obj->BaseLevel];
+ const GLfloat texWidth = (GLfloat) texImage->Width;
+ const GLfloat texHeight = (GLfloat) texImage->Height;
+ GLfloat dudx = span.texStep[u][0] * texWidth;
+ GLfloat dudy = dsdy[u] * texWidth;
+ GLfloat dvdx = span.texStep[u][1] * texHeight;
+ GLfloat dvdy = dtdy[u] * texHeight;
GLfloat r1 = dudx * dudx + dudy * dudy;
GLfloat r2 = dvdx * dvdx + dvdy * dvdy;
span.rho[u] = r1 + r2; /* was rho2 = MAX2(r1,r2) */
-/* $Id: swrast.h,v 1.18 2002/01/28 03:42:28 brianp Exp $ */
+/* $Id: swrast.h,v 1.19 2002/01/28 04:25:56 brianp Exp $ */
/*
* Mesa 3-D graphics library
/*
- * The sw_span structure is used by the triangle template code in
- * s_tritemp.h. It describes how colors, Z, texcoords, etc are to be
- * interpolated across each scanline of triangle.
- * With this structure it's easy to hand-off span rasterization to a
- * subroutine instead of doing it all inline like we used to do.
+ * The sw_span structure describes the colors, Z, fogcoord, texcoords,
+ * etc for a horizontal run of pixels. We can either specify a base/step
+ * to indicate interpolated values, or fill in arrays of values.
+ * The interpMask and arrayMask bitfields indicate which are active.
+ *
+ * With this structure it's easy to hand-off span rasterization to
+ * subroutines instead of doing it all inline in the triangle functions
+ * like we used to do.
* It also cleans up the local variable namespace a great deal.
*
* It would be interesting to experiment with multiprocessor rasterization
*/
-/* When the sw_span struct is initialized, these flags indicates
- * which values are needed for rendering the triangle.
- */
+/* Values for interpMask and arrayMask */
#define SPAN_RGBA 0x001
#define SPAN_SPEC 0x002
#define SPAN_INDEX 0x004
/* This flag indicates that only a part of the span is visible */
GLboolean writeAll;
- /* This bitmask (bitwise-or of SPAN_* flags) indicates which of the
- * x/xStep variables are relevant.
+ /**
+ * This bitmask (of SPAN_* flags) indicates which of the x/xStep
+ * variables are relevant.
*/
GLuint interpMask;
GLfloat fog, fogStep;
GLfloat tex[MAX_TEXTURE_UNITS][4], texStep[MAX_TEXTURE_UNITS][4];
GLfixed intTex[2], intTexStep[2];
- /* Needed for texture lambda (LOD) computation */
- GLfloat rho[MAX_TEXTURE_UNITS];
- GLfloat texWidth[MAX_TEXTURE_UNITS], texHeight[MAX_TEXTURE_UNITS];
+ GLfloat rho[MAX_TEXTURE_UNITS]; /* for texture lambda/lod computation */
- /* This bitmask (bitwise-or of SPAN_* flags) indicates which of the
- * fragment arrays are relevant.
+ /**
+ * This bitmask (of SPAN_* flags) indicates which of the fragment arrays
+ * are relevant.
*/
GLuint arrayMask;
/**
* Arrays of fragment values. These will either be computed from the
- * x/xStep values above or loadd from glDrawPixels, etc.
+ * x/xStep values above or filled in by glDraw/CopyPixels, etc.
*/
union {
GLchan rgb[MAX_WIDTH][3];
GLchan specArray[MAX_WIDTH][4];
GLdepth zArray[MAX_WIDTH];
GLfloat fogArray[MAX_WIDTH];
- /* Texture (s,t,r). 4th component only used for pixel texture */
GLfloat texcoords[MAX_TEXTURE_UNITS][MAX_WIDTH][4];
GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH];
GLfloat coverage[MAX_WIDTH];
* Imaging fallbacks (a better solution should be found, perhaps
* moving all the imaging fallback code to a new module)
*/
-void
+extern void
_swrast_CopyConvolutionFilter2D(GLcontext *ctx, GLenum target,
GLenum internalFormat,
GLint x, GLint y, GLsizei width,
GLsizei height);
-void
+extern void
_swrast_CopyConvolutionFilter1D(GLcontext *ctx, GLenum target,
GLenum internalFormat,
GLint x, GLint y, GLsizei width);
-void
+extern void
_swrast_CopyColorSubTable( GLcontext *ctx,GLenum target, GLsizei start,
GLint x, GLint y, GLsizei width);
-void
+extern void
_swrast_CopyColorTable( GLcontext *ctx,
GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width);
*/
extern void
_swrast_copy_teximage1d(GLcontext *ctx, GLenum target, GLint level,
- GLenum internalFormat,
- GLint x, GLint y, GLsizei width, GLint border);
+ GLenum internalFormat,
+ GLint x, GLint y, GLsizei width, GLint border);
extern void
_swrast_copy_teximage2d(GLcontext *ctx, GLenum target, GLint level,
- GLenum internalFormat,
- GLint x, GLint y, GLsizei width, GLsizei height,
- GLint border);
+ GLenum internalFormat,
+ GLint x, GLint y, GLsizei width, GLsizei height,
+ GLint border);
extern void
_swrast_copy_texsubimage1d(GLcontext *ctx, GLenum target, GLint level,
- GLint xoffset, GLint x, GLint y, GLsizei width);
+ GLint xoffset, GLint x, GLint y, GLsizei width);
extern void
_swrast_copy_texsubimage2d(GLcontext *ctx,
- GLenum target, GLint level,
- GLint xoffset, GLint yoffset,
- GLint x, GLint y, GLsizei width, GLsizei height);
+ GLenum target, GLint level,
+ GLint xoffset, GLint yoffset,
+ GLint x, GLint y, GLsizei width, GLsizei height);
extern void
_swrast_copy_texsubimage3d(GLcontext *ctx,
- GLenum target, GLint level,
- GLint xoffset, GLint yoffset, GLint zoffset,
- GLint x, GLint y, GLsizei width, GLsizei height);
+ GLenum target, GLint level,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLint x, GLint y, GLsizei width, GLsizei height);