struct sw_span is again allocated on the stack, but the arrays of span

data are broken out into a new struct span_arrays which is allocated
per-context (to avoid huge stack allocations - a problem on Windows).
This lets us use span.redStep instead of span->redStep (for example) to
hopefully get slightly better performance in the triangle functions.
This commit is contained in:
Brian Paul 2002-08-07 00:45:07 +00:00
parent 2353e96c32
commit 77df88727c
25 changed files with 1252 additions and 1157 deletions

View file

@ -1,4 +1,4 @@
/* $Id: osmesa.c,v 1.86 2002/07/09 01:22:51 brianp Exp $ */
/* $Id: osmesa.c,v 1.87 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -1886,20 +1886,20 @@ static void smooth_rgba_z_triangle( GLcontext *ctx,
#define INTERP_ALPHA 1
#define RENDER_SPAN( span ) \
GLuint i; \
GLchan *img = PIXELADDR4(span->x, span->y); \
for (i = 0; i < span->end; i++, img += 4) { \
const GLdepth z = FixedToDepth(span->z); \
GLchan *img = PIXELADDR4(span.x, span.y); \
for (i = 0; i < span.end; i++, img += 4) { \
const GLdepth z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PACK_RGBA(img, FixedToChan(span->red), \
FixedToChan(span->green), FixedToChan(span->blue), \
FixedToChan(span->alpha)); \
PACK_RGBA(img, FixedToChan(span.red), \
FixedToChan(span.green), FixedToChan(span.blue), \
FixedToChan(span.alpha)); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->alpha += span->alphaStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.alpha += span.alphaStep; \
span.z += span.zStep; \
}
#ifdef WIN32
@ -1930,14 +1930,14 @@ static void flat_rgba_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLuint *img = (GLuint *) PIXELADDR4(span->x, span->y); \
for (i = 0; i < span->end; i++) { \
const GLdepth z = FixedToDepth(span->z); \
GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \
for (i = 0; i < span.end; i++) { \
const GLdepth z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
img[i] = pixel; \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#ifdef WIN32

View file

@ -1,10 +1,10 @@
/* $Id: xm_tri.c,v 1.26 2002/06/25 15:25:17 brianp Exp $ */
/* $Id: xm_tri.c,v 1.27 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
* Version: 3.5
* Version: 4.1
*
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@ -68,21 +68,21 @@ static void smooth_TRUECOLOR_z_triangle( GLcontext *ctx,
#define INTERP_RGB 1
#define RENDER_SPAN( span ) \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
GLuint i; \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
unsigned long p; \
PACK_TRUECOLOR(p, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
PACK_TRUECOLOR(p, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
XMesaPutPixel(img, x, y, p); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -108,17 +108,17 @@ static void smooth_8A8B8G8R_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = PACK_8B8G8R(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
pRow[i] = PACK_8B8G8R(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -143,17 +143,17 @@ static void smooth_8R8G8B_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = PACK_8R8G8B(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
pRow[i] = PACK_8R8G8B(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -178,19 +178,19 @@ static void smooth_8R8G8B24_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PIXEL_TYPE *ptr = pRow + i; \
ptr->r = FixedToInt(span->red); \
ptr->g = FixedToInt(span->green); \
ptr->b = FixedToInt(span->blue); \
ptr->r = FixedToInt(span.red); \
ptr->g = FixedToInt(span.green); \
ptr->b = FixedToInt(span.blue); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -213,20 +213,20 @@ static void smooth_TRUEDITHER_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
unsigned long p; \
PACK_TRUEDITHER(p, x, y, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
PACK_TRUEDITHER(p, x, y, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
XMesaPutPixel(img, x, y, p); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -251,17 +251,17 @@ static void smooth_5R6G5B_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = PACK_5R6G5B(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
pRow[i] = PACK_5R6G5B(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -286,18 +286,18 @@ static void smooth_DITHER_5R6G5B_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -322,19 +322,19 @@ static void smooth_DITHER8_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
XDITHER_SETUP(y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span->red),\
FixedToInt(span->green), FixedToInt(span->blue) ); \
pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span.red),\
FixedToInt(span.green), FixedToInt(span.blue) ); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -357,20 +357,20 @@ static void smooth_DITHER_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
XDITHER_SETUP(y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
unsigned long p = XDITHER(x, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
unsigned long p = XDITHER(x, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
XMesaPutPixel(img, x, y, p); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -396,17 +396,17 @@ static void smooth_LOOKUP8_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
LOOKUP_SETUP; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = LOOKUP(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
pRow[i] = LOOKUP(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -432,18 +432,18 @@ static void smooth_HPCR_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = DITHER_HPCR(x, y, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue) ); \
pRow[i] = DITHER_HPCR(x, y, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue) ); \
zRow[i] = z; \
} \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span->z += span->zStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -468,14 +468,14 @@ static void flat_TRUECOLOR_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
XMesaPutPixel(img, x, y, pixel); \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -501,13 +501,13 @@ static void flat_8A8B8G8R_z_triangle( GLcontext *ctx,
v2->color[1], v2->color[2] );
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = (PIXEL_TYPE) p; \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -533,13 +533,13 @@ static void flat_8R8G8B_z_triangle( GLcontext *ctx,
v2->color[1], v2->color[2] );
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = (PIXEL_TYPE) p; \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -563,8 +563,8 @@ static void flat_8R8G8B24_z_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PIXEL_TYPE *ptr = pRow + i; \
ptr->r = color[RCOMP]; \
@ -572,7 +572,7 @@ static void flat_8R8G8B24_z_triangle( GLcontext *ctx,
ptr->b = color[BCOMP]; \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -593,9 +593,9 @@ static void flat_TRUEDITHER_z_triangle( GLcontext *ctx,
#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
unsigned long p; \
PACK_TRUEDITHER(p, x, y, v2->color[0], \
@ -603,7 +603,7 @@ static void flat_TRUEDITHER_z_triangle( GLcontext *ctx,
XMesaPutPixel(img, x, y, p); \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -629,13 +629,13 @@ static void flat_5R6G5B_z_triangle( GLcontext *ctx,
v2->color[1], v2->color[2] );
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = (PIXEL_TYPE) p; \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -659,15 +659,15 @@ static void flat_DITHER_5R6G5B_z_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP], \
color[GCOMP], color[BCOMP]); \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -693,15 +693,15 @@ static void flat_DITHER8_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, y)); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = (PIXEL_TYPE) FLAT_DITHER(x); \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -725,16 +725,16 @@ static void flat_DITHER_z_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
FLAT_DITHER_ROW_SETUP(y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
unsigned long p = FLAT_DITHER(x); \
XMesaPutPixel(img, x, y, p); \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -761,14 +761,14 @@ static void flat_HPCR_z_triangle( GLcontext *ctx,
GLubyte b = v2->color[2];
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = (PIXEL_TYPE) DITHER_HPCR(x, y, r, g, b); \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -797,13 +797,13 @@ static void flat_LOOKUP8_z_triangle( GLcontext *ctx,
GLubyte p = LOOKUP(r,g,b);
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span->z); \
for (i = 0; i < span.end; i++) { \
const DEPTH_TYPE z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
pRow[i] = p; \
zRow[i] = z; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "swrast/s_tritemp.h"
@ -824,15 +824,15 @@ static void smooth_TRUECOLOR_triangle( GLcontext *ctx,
#define INTERP_RGB 1
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
unsigned long p; \
PACK_TRUECOLOR(p, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
PACK_TRUECOLOR(p, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
XMesaPutPixel(img, x, y, p); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -854,12 +854,12 @@ static void smooth_8A8B8G8R_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
pRow[i] = PACK_8B8G8R(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue) ); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
for (i = 0; i < span.end; i++) { \
pRow[i] = PACK_8B8G8R(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue) ); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
} \
#include "swrast/s_tritemp.h"
@ -881,12 +881,12 @@ static void smooth_8R8G8B_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
pRow[i] = PACK_8R8G8B(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue) ); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
for (i = 0; i < span.end; i++) { \
pRow[i] = PACK_8R8G8B(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue) ); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -909,13 +909,13 @@ static void smooth_8R8G8B24_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
PIXEL_TYPE *pixel = pRow; \
for (i = 0; i < span->end; i++, pixel++) { \
pixel->r = FixedToInt(span->red); \
pixel->g = FixedToInt(span->green); \
pixel->b = FixedToInt(span->blue); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
for (i = 0; i < span.end; i++, pixel++) { \
pixel->r = FixedToInt(span.red); \
pixel->g = FixedToInt(span.green); \
pixel->b = FixedToInt(span.blue); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -935,15 +935,15 @@ static void smooth_TRUEDITHER_triangle( GLcontext *ctx,
#define INTERP_RGB 1
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
unsigned long p; \
PACK_TRUEDITHER(p, x, y, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
PACK_TRUEDITHER(p, x, y, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
XMesaPutPixel(img, x, y, p ); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -965,12 +965,12 @@ static void smooth_5R6G5B_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
pRow[i] = (PIXEL_TYPE) PACK_5R6G5B(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
for (i = 0; i < span.end; i++) { \
pRow[i] = (PIXEL_TYPE) PACK_5R6G5B(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -992,13 +992,13 @@ static void smooth_DITHER_5R6G5B_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -1020,14 +1020,14 @@ static void smooth_DITHER8_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
XDITHER_SETUP(y); \
for (i = 0; i < span->end; i++, x++) { \
pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue) ); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
for (i = 0; i < span.end; i++, x++) { \
pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue) ); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -1044,19 +1044,18 @@ static void smooth_DITHER_triangle( GLcontext *ctx,
{
XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
XMesaImage *img = xmesa->xm_buffer->backimage;
#define INTERP_RGB 1
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
XDITHER_SETUP(y); \
for (i = 0; i < span->end; i++, x++) { \
unsigned long p = XDITHER(x, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue) ); \
for (i = 0; i < span.end; i++, x++) { \
unsigned long p = XDITHER(x, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue) ); \
XMesaPutPixel(img, x, y, p); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -1072,7 +1071,6 @@ static void smooth_LOOKUP8_triangle( GLcontext *ctx,
const SWvertex *v2 )
{
XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
#define INTERP_RGB 1
#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
#define PIXEL_TYPE GLubyte
@ -1080,12 +1078,12 @@ static void smooth_LOOKUP8_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
LOOKUP_SETUP; \
for (i = 0; i < span->end; i++) { \
pRow[i] = LOOKUP(FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue));\
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
for (i = 0; i < span.end; i++) { \
pRow[i] = LOOKUP(FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue));\
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -1102,20 +1100,19 @@ static void smooth_HPCR_triangle( GLcontext *ctx,
const SWvertex *v2 )
{
XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
#define INTERP_RGB 1
#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
#define PIXEL_TYPE GLubyte
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
pRow[i] = DITHER_HPCR(x, y, FixedToInt(span->red), \
FixedToInt(span->green), FixedToInt(span->blue)); \
span->red += span->redStep; \
span->green += span->greenStep; \
span->blue += span->blueStep; \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
pRow[i] = DITHER_HPCR(x, y, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue)); \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
}
#include "swrast/s_tritemp.h"
@ -1138,8 +1135,8 @@ static void flat_TRUECOLOR_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
XMesaPutPixel(img, x, y, pixel); \
}
@ -1164,7 +1161,7 @@ static void flat_8A8B8G8R_triangle( GLcontext *ctx,
v2->color[1], v2->color[2] );
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
for (i = 0; i < span.end; i++) { \
pRow[i] = (PIXEL_TYPE) p; \
}
@ -1189,7 +1186,7 @@ static void flat_8R8G8B_triangle( GLcontext *ctx,
v2->color[1], v2->color[2] );
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
for (i = 0; i < span.end; i++) { \
pRow[i] = (PIXEL_TYPE) p; \
}
@ -1213,7 +1210,7 @@ static void flat_8R8G8B24_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
PIXEL_TYPE *pixel = pRow; \
for (i = 0; i < span->end; i++, pixel++) { \
for (i = 0; i < span.end; i++, pixel++) { \
pixel->r = color[RCOMP]; \
pixel->g = color[GCOMP]; \
pixel->b = color[BCOMP]; \
@ -1232,11 +1229,10 @@ static void flat_TRUEDITHER_triangle( GLcontext *ctx,
{
XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
XMesaImage *img = xmesa->xm_buffer->backimage;
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
unsigned long p; \
PACK_TRUEDITHER(p, x, y, v2->color[0], \
v2->color[1], v2->color[2] ); \
@ -1260,12 +1256,12 @@ static void flat_5R6G5B_triangle( GLcontext *ctx,
#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
#define PIXEL_TYPE GLushort
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define SETUP_CODE \
#define SETUP_CODE \
unsigned long p = PACK_5R6G5B( v2->color[0], \
v2->color[1], v2->color[2] );
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
for (i = 0; i < span.end; i++) { \
pRow[i] = (PIXEL_TYPE) p; \
}
@ -1288,8 +1284,8 @@ static void flat_DITHER_5R6G5B_triangle( GLcontext *ctx,
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP], \
color[GCOMP], color[BCOMP]); \
}
@ -1315,9 +1311,9 @@ static void flat_DITHER8_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, y)); \
for (i = 0; i < span->end; i++, x++) { \
for (i = 0; i < span.end; i++, x++) { \
pRow[i] = (PIXEL_TYPE) FLAT_DITHER(x); \
}
@ -1340,9 +1336,9 @@ static void flat_DITHER_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
FLAT_DITHER_ROW_SETUP(y); \
for (i = 0; i < span->end; i++, x++) { \
for (i = 0; i < span.end; i++, x++) { \
unsigned long p = FLAT_DITHER(x); \
XMesaPutPixel(img, x, y, p ); \
}
@ -1363,14 +1359,14 @@ static void flat_HPCR_triangle( GLcontext *ctx,
#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
#define PIXEL_TYPE GLubyte
#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
#define SETUP_CODE \
#define SETUP_CODE \
GLubyte r = v2->color[0]; \
GLubyte g = v2->color[1]; \
GLubyte b = v2->color[2];
#define RENDER_SPAN( span ) \
#define RENDER_SPAN( span ) \
GLuint i; \
GLint x = span->x, y = FLIP(xmesa->xm_buffer, span->y); \
for (i = 0; i < span->end; i++, x++) { \
GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \
for (i = 0; i < span.end; i++, x++) { \
pRow[i] = (PIXEL_TYPE) DITHER_HPCR(x, y, r, g, b); \
}
@ -1398,7 +1394,7 @@ static void flat_LOOKUP8_triangle( GLcontext *ctx,
GLubyte p = LOOKUP(r,g,b);
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; i++) { \
for (i = 0; i < span.end; i++) { \
pRow[i] = (PIXEL_TYPE) p; \
}

View file

@ -1,4 +1,4 @@
/* $Id: s_aaline.c,v 1.15 2002/06/15 03:03:10 brianp Exp $ */
/* $Id: s_aaline.c,v 1.16 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -76,7 +76,7 @@ struct LineInfo
GLfloat lambda[MAX_TEXTURE_UNITS];
GLfloat texWidth[MAX_TEXTURE_UNITS], texHeight[MAX_TEXTURE_UNITS];
struct sw_span *span;
struct sw_span span;
};

View file

@ -1,4 +1,4 @@
/* $Id: s_aalinetemp.h,v 1.20 2002/04/19 14:05:50 brianp Exp $ */
/* $Id: s_aalinetemp.h,v 1.21 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -39,47 +39,47 @@ NAME(plot)(GLcontext *ctx, struct LineInfo *line, int ix, int iy)
const GLfloat fx = (GLfloat) ix;
const GLfloat fy = (GLfloat) iy;
const GLfloat coverage = compute_coveragef(line, ix, iy);
const GLuint i = line->span->end;
const GLuint i = line->span.end;
if (coverage == 0.0)
return;
line->span->end++;
line->span->coverage[i] = coverage;
line->span->xArray[i] = ix;
line->span->yArray[i] = iy;
line->span.end++;
line->span.array->coverage[i] = coverage;
line->span.array->x[i] = ix;
line->span.array->y[i] = iy;
/*
* Compute Z, color, texture coords, fog for the fragment by
* solving the plane equations at (ix,iy).
*/
#ifdef DO_Z
line->span->zArray[i] = (GLdepth) solve_plane(fx, fy, line->zPlane);
line->span.array->z[i] = (GLdepth) solve_plane(fx, fy, line->zPlane);
#endif
#ifdef DO_FOG
line->span->fogArray[i] = solve_plane(fx, fy, line->fPlane);
line->span.array->fog[i] = solve_plane(fx, fy, line->fPlane);
#endif
#ifdef DO_RGBA
line->span->color.rgba[i][RCOMP] = solve_plane_chan(fx, fy, line->rPlane);
line->span->color.rgba[i][GCOMP] = solve_plane_chan(fx, fy, line->gPlane);
line->span->color.rgba[i][BCOMP] = solve_plane_chan(fx, fy, line->bPlane);
line->span->color.rgba[i][ACOMP] = solve_plane_chan(fx, fy, line->aPlane);
line->span.array->rgba[i][RCOMP] = solve_plane_chan(fx, fy, line->rPlane);
line->span.array->rgba[i][GCOMP] = solve_plane_chan(fx, fy, line->gPlane);
line->span.array->rgba[i][BCOMP] = solve_plane_chan(fx, fy, line->bPlane);
line->span.array->rgba[i][ACOMP] = solve_plane_chan(fx, fy, line->aPlane);
#endif
#ifdef DO_INDEX
line->span->color.index[i] = (GLint) solve_plane(fx, fy, line->iPlane);
line->span.array->index[i] = (GLint) solve_plane(fx, fy, line->iPlane);
#endif
#ifdef DO_SPEC
line->span->specArray[i][RCOMP] = solve_plane_chan(fx, fy, line->srPlane);
line->span->specArray[i][GCOMP] = solve_plane_chan(fx, fy, line->sgPlane);
line->span->specArray[i][BCOMP] = solve_plane_chan(fx, fy, line->sbPlane);
line->span.array->spec[i][RCOMP] = solve_plane_chan(fx, fy, line->srPlane);
line->span.array->spec[i][GCOMP] = solve_plane_chan(fx, fy, line->sgPlane);
line->span.array->spec[i][BCOMP] = solve_plane_chan(fx, fy, line->sbPlane);
#endif
#ifdef DO_TEX
{
const GLfloat invQ = solve_plane_recip(fx, fy, line->vPlane[0]);
line->span->texcoords[0][i][0] = solve_plane(fx, fy, line->sPlane[0]) * invQ;
line->span->texcoords[0][i][1] = solve_plane(fx, fy, line->tPlane[0]) * invQ;
line->span->texcoords[0][i][2] = solve_plane(fx, fy, line->uPlane[0]) * invQ;
line->span->lambda[0][i] = compute_lambda(line->sPlane[0], line->tPlane[0], invQ,
line->span.array->texcoords[0][i][0] = solve_plane(fx, fy, line->sPlane[0]) * invQ;
line->span.array->texcoords[0][i][1] = solve_plane(fx, fy, line->tPlane[0]) * invQ;
line->span.array->texcoords[0][i][2] = solve_plane(fx, fy, line->uPlane[0]) * invQ;
line->span.array->lambda[0][i] = compute_lambda(line->sPlane[0], line->tPlane[0], invQ,
line->texWidth[0], line->texHeight[0]);
}
#elif defined(DO_MULTITEX)
@ -88,10 +88,10 @@ NAME(plot)(GLcontext *ctx, struct LineInfo *line, int ix, int iy)
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
const GLfloat invQ = solve_plane_recip(fx, fy, line->vPlane[unit]);
line->span->texcoords[unit][i][0] = solve_plane(fx, fy, line->sPlane[unit]) * invQ;
line->span->texcoords[unit][i][1] = solve_plane(fx, fy, line->tPlane[unit]) * invQ;
line->span->texcoords[unit][i][2] = solve_plane(fx, fy, line->uPlane[unit]) * invQ;
line->span->lambda[unit][i] = compute_lambda(line->sPlane[unit],
line->span.array->texcoords[unit][i][0] = solve_plane(fx, fy, line->sPlane[unit]) * invQ;
line->span.array->texcoords[unit][i][1] = solve_plane(fx, fy, line->tPlane[unit]) * invQ;
line->span.array->texcoords[unit][i][2] = solve_plane(fx, fy, line->uPlane[unit]) * invQ;
line->span.array->lambda[unit][i] = compute_lambda(line->sPlane[unit],
line->tPlane[unit], invQ,
line->texWidth[unit], line->texHeight[unit]);
}
@ -99,15 +99,15 @@ NAME(plot)(GLcontext *ctx, struct LineInfo *line, int ix, int iy)
}
#endif
if (line->span->end == MAX_WIDTH) {
if (line->span.end == MAX_WIDTH) {
#if defined(DO_TEX) || defined(DO_MULTITEX)
_mesa_write_texture_span(ctx, line->span);
_mesa_write_texture_span(ctx, &(line->span));
#elif defined(DO_RGBA)
_mesa_write_rgba_span(ctx, line->span);
_mesa_write_rgba_span(ctx, &(line->span));
#else
_mesa_write_index_span(ctx, line->span);
_mesa_write_index_span(ctx, &(line->span));
#endif
line->span->end = 0; /* reset counter */
line->span.end = 0; /* reset counter */
}
}
@ -138,24 +138,23 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
if (line.len == 0.0 || IS_INF_OR_NAN(line.len))
return;
line.span = swrast->span;
INIT_SPAN(line.span, GL_LINE, 0, 0, SPAN_XY | SPAN_COVERAGE);
line.xAdj = line.dx / line.len * line.halfWidth;
line.yAdj = line.dy / line.len * line.halfWidth;
#ifdef DO_Z
line.span->arrayMask |= SPAN_Z;
line.span.arrayMask |= SPAN_Z;
compute_plane(line.x0, line.y0, line.x1, line.y1,
v0->win[2], v1->win[2], line.zPlane);
#endif
#ifdef DO_FOG
line.span->arrayMask |= SPAN_FOG;
line.span.arrayMask |= SPAN_FOG;
compute_plane(line.x0, line.y0, line.x1, line.y1,
v0->fog, v1->fog, line.fPlane);
#endif
#ifdef DO_RGBA
line.span->arrayMask |= SPAN_RGBA;
line.span.arrayMask |= SPAN_RGBA;
if (ctx->Light.ShadeModel == GL_SMOOTH) {
compute_plane(line.x0, line.y0, line.x1, line.y1,
v0->color[RCOMP], v1->color[RCOMP], line.rPlane);
@ -174,7 +173,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
}
#endif
#ifdef DO_SPEC
line.span->arrayMask |= SPAN_SPEC;
line.span.arrayMask |= SPAN_SPEC;
if (ctx->Light.ShadeModel == GL_SMOOTH) {
compute_plane(line.x0, line.y0, line.x1, line.y1,
v0->specular[RCOMP], v1->specular[RCOMP], line.srPlane);
@ -190,7 +189,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
}
#endif
#ifdef DO_INDEX
line.span->arrayMask |= SPAN_INDEX;
line.span.arrayMask |= SPAN_INDEX;
if (ctx->Light.ShadeModel == GL_SMOOTH) {
compute_plane(line.x0, line.y0, line.x1, line.y1,
(GLfloat) v0->index, (GLfloat) v1->index, line.iPlane);
@ -213,7 +212,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
const GLfloat r1 = v1->texcoord[0][2] * invW0;
const GLfloat q0 = v0->texcoord[0][3] * invW0;
const GLfloat q1 = v1->texcoord[0][3] * invW0;
line.span->arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
line.span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
compute_plane(line.x0, line.y0, line.x1, line.y1, s0, s1, line.sPlane[0]);
compute_plane(line.x0, line.y0, line.x1, line.y1, t0, t1, line.tPlane[0]);
compute_plane(line.x0, line.y0, line.x1, line.y1, r0, r1, line.uPlane[0]);
@ -224,7 +223,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
#elif defined(DO_MULTITEX)
{
GLuint u;
line.span->arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
line.span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
if (ctx->Texture.Unit[u]._ReallyEnabled) {
const struct gl_texture_object *obj = ctx->Texture.Unit[u]._Current;
@ -295,11 +294,11 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
}
#if defined(DO_TEX) || defined(DO_MULTITEX)
_mesa_write_texture_span(ctx, line.span);
_mesa_write_texture_span(ctx, &(line.span));
#elif defined(DO_RGBA)
_mesa_write_rgba_span(ctx, line.span);
_mesa_write_rgba_span(ctx, &(line.span));
#else
_mesa_write_index_span(ctx, line.span);
_mesa_write_index_span(ctx, &(line.span));
#endif
}

View file

@ -1,4 +1,4 @@
/* $Id: s_aatritemp.h,v 1.29 2002/04/19 14:05:50 brianp Exp $ */
/* $Id: s_aatritemp.h,v 1.30 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -53,7 +53,7 @@
GLboolean ltor;
GLfloat majDx, majDy; /* major (i.e. long) edge dx and dy */
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
#ifdef DO_Z
GLfloat zPlane[4];
@ -140,11 +140,11 @@
*/
#ifdef DO_Z
compute_plane(p0, p1, p2, p0[2], p1[2], p2[2], zPlane);
span->arrayMask |= SPAN_Z;
span.arrayMask |= SPAN_Z;
#endif
#ifdef DO_FOG
compute_plane(p0, p1, p2, v0->fog, v1->fog, v2->fog, fogPlane);
span->arrayMask |= SPAN_FOG;
span.arrayMask |= SPAN_FOG;
#endif
#ifdef DO_RGBA
if (ctx->Light.ShadeModel == GL_SMOOTH) {
@ -159,7 +159,7 @@
constant_plane(v2->color[BCOMP], bPlane);
constant_plane(v2->color[ACOMP], aPlane);
}
span->arrayMask |= SPAN_RGBA;
span.arrayMask |= SPAN_RGBA;
#endif
#ifdef DO_INDEX
if (ctx->Light.ShadeModel == GL_SMOOTH) {
@ -169,7 +169,7 @@
else {
constant_plane((GLfloat) v2->index, iPlane);
}
span->arrayMask |= SPAN_INDEX;
span.arrayMask |= SPAN_INDEX;
#endif
#ifdef DO_SPEC
if (ctx->Light.ShadeModel == GL_SMOOTH) {
@ -182,7 +182,7 @@
constant_plane(v2->specular[GCOMP], sgPlane);
constant_plane(v2->specular[BCOMP], sbPlane);
}
span->arrayMask |= SPAN_SPEC;
span.arrayMask |= SPAN_SPEC;
#endif
#ifdef DO_TEX
{
@ -210,7 +210,7 @@
texWidth = (GLfloat) texImage->Width;
texHeight = (GLfloat) texImage->Height;
}
span->arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
#elif defined(DO_MULTITEX)
{
GLuint u;
@ -242,7 +242,7 @@
}
}
}
span->arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
#endif
/* Begin bottom-to-top scan over the triangle.
@ -284,38 +284,39 @@
while (coverage > 0.0F) {
/* (cx,cy) = center of fragment */
const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
struct span_arrays *array = span.array;
#ifdef DO_INDEX
span->coverage[count] = (GLfloat) compute_coveragei(pMin, pMid, pMax, ix, iy);
array->coverage[count] = (GLfloat) compute_coveragei(pMin, pMid, pMax, ix, iy);
#else
span->coverage[count] = coverage;
array->coverage[count] = coverage;
#endif
#ifdef DO_Z
span->zArray[count] = (GLdepth) solve_plane(cx, cy, zPlane);
array->z[count] = (GLdepth) solve_plane(cx, cy, zPlane);
#endif
#ifdef DO_FOG
span->fogArray[count] = solve_plane(cx, cy, fogPlane);
array->fog[count] = solve_plane(cx, cy, fogPlane);
#endif
#ifdef DO_RGBA
span->color.rgba[count][RCOMP] = solve_plane_chan(cx, cy, rPlane);
span->color.rgba[count][GCOMP] = solve_plane_chan(cx, cy, gPlane);
span->color.rgba[count][BCOMP] = solve_plane_chan(cx, cy, bPlane);
span->color.rgba[count][ACOMP] = solve_plane_chan(cx, cy, aPlane);
array->rgba[count][RCOMP] = solve_plane_chan(cx, cy, rPlane);
array->rgba[count][GCOMP] = solve_plane_chan(cx, cy, gPlane);
array->rgba[count][BCOMP] = solve_plane_chan(cx, cy, bPlane);
array->rgba[count][ACOMP] = solve_plane_chan(cx, cy, aPlane);
#endif
#ifdef DO_INDEX
span->color.index[count] = (GLint) solve_plane(cx, cy, iPlane);
array->index[count] = (GLint) solve_plane(cx, cy, iPlane);
#endif
#ifdef DO_SPEC
span->specArray[count][RCOMP] = solve_plane_chan(cx, cy, srPlane);
span->specArray[count][GCOMP] = solve_plane_chan(cx, cy, sgPlane);
span->specArray[count][BCOMP] = solve_plane_chan(cx, cy, sbPlane);
array->spec[count][RCOMP] = solve_plane_chan(cx, cy, srPlane);
array->spec[count][GCOMP] = solve_plane_chan(cx, cy, sgPlane);
array->spec[count][BCOMP] = solve_plane_chan(cx, cy, sbPlane);
#endif
#ifdef DO_TEX
{
const GLfloat invQ = solve_plane_recip(cx, cy, vPlane);
span->texcoords[0][count][0] = solve_plane(cx, cy, sPlane) * invQ;
span->texcoords[0][count][1] = solve_plane(cx, cy, tPlane) * invQ;
span->texcoords[0][count][2] = solve_plane(cx, cy, uPlane) * invQ;
span->lambda[0][count] = compute_lambda(sPlane, tPlane, vPlane,
array->texcoords[0][count][0] = solve_plane(cx, cy, sPlane) * invQ;
array->texcoords[0][count][1] = solve_plane(cx, cy, tPlane) * invQ;
array->texcoords[0][count][2] = solve_plane(cx, cy, uPlane) * invQ;
array->lambda[0][count] = compute_lambda(sPlane, tPlane, vPlane,
cx, cy, invQ,
texWidth, texHeight);
}
@ -325,10 +326,10 @@
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
GLfloat invQ = solve_plane_recip(cx, cy, vPlane[unit]);
span->texcoords[unit][count][0] = solve_plane(cx, cy, sPlane[unit]) * invQ;
span->texcoords[unit][count][1] = solve_plane(cx, cy, tPlane[unit]) * invQ;
span->texcoords[unit][count][2] = solve_plane(cx, cy, uPlane[unit]) * invQ;
span->lambda[unit][count] = compute_lambda(sPlane[unit],
array->texcoords[unit][count][0] = solve_plane(cx, cy, sPlane[unit]) * invQ;
array->texcoords[unit][count][1] = solve_plane(cx, cy, tPlane[unit]) * invQ;
array->texcoords[unit][count][2] = solve_plane(cx, cy, uPlane[unit]) * invQ;
array->lambda[unit][count] = compute_lambda(sPlane[unit],
tPlane[unit], vPlane[unit], cx, cy, invQ,
texWidth[unit], texHeight[unit]);
}
@ -343,16 +344,16 @@
if (ix <= startX)
continue;
span->x = startX;
span->y = iy;
span->end = (GLuint) ix - (GLuint) startX;
ASSERT(span->interpMask == 0);
span.x = startX;
span.y = iy;
span.end = (GLuint) ix - (GLuint) startX;
ASSERT(span.interpMask == 0);
#if defined(DO_MULTITEX) || defined(DO_TEX)
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
#elif defined(DO_RGBA)
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
#elif defined(DO_INDEX)
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
#endif
}
}
@ -389,38 +390,39 @@
while (coverage > 0.0F) {
/* (cx,cy) = center of fragment */
const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
struct span_arrays *array = span.array;
#ifdef DO_INDEX
span->coverage[ix] = (GLfloat) compute_coveragei(pMin, pMax, pMid, ix, iy);
array->coverage[ix] = (GLfloat) compute_coveragei(pMin, pMax, pMid, ix, iy);
#else
span->coverage[ix] = coverage;
array->coverage[ix] = coverage;
#endif
#ifdef DO_Z
span->zArray[ix] = (GLdepth) solve_plane(cx, cy, zPlane);
array->z[ix] = (GLdepth) solve_plane(cx, cy, zPlane);
#endif
#ifdef DO_FOG
span->fogArray[ix] = solve_plane(cx, cy, fogPlane);
array->fog[ix] = solve_plane(cx, cy, fogPlane);
#endif
#ifdef DO_RGBA
span->color.rgba[ix][RCOMP] = solve_plane_chan(cx, cy, rPlane);
span->color.rgba[ix][GCOMP] = solve_plane_chan(cx, cy, gPlane);
span->color.rgba[ix][BCOMP] = solve_plane_chan(cx, cy, bPlane);
span->color.rgba[ix][ACOMP] = solve_plane_chan(cx, cy, aPlane);
array->rgba[ix][RCOMP] = solve_plane_chan(cx, cy, rPlane);
array->rgba[ix][GCOMP] = solve_plane_chan(cx, cy, gPlane);
array->rgba[ix][BCOMP] = solve_plane_chan(cx, cy, bPlane);
array->rgba[ix][ACOMP] = solve_plane_chan(cx, cy, aPlane);
#endif
#ifdef DO_INDEX
span->color.index[ix] = (GLint) solve_plane(cx, cy, iPlane);
array->index[ix] = (GLint) solve_plane(cx, cy, iPlane);
#endif
#ifdef DO_SPEC
span->specArray[ix][RCOMP] = solve_plane_chan(cx, cy, srPlane);
span->specArray[ix][GCOMP] = solve_plane_chan(cx, cy, sgPlane);
span->specArray[ix][BCOMP] = solve_plane_chan(cx, cy, sbPlane);
array->spec[ix][RCOMP] = solve_plane_chan(cx, cy, srPlane);
array->spec[ix][GCOMP] = solve_plane_chan(cx, cy, sgPlane);
array->spec[ix][BCOMP] = solve_plane_chan(cx, cy, sbPlane);
#endif
#ifdef DO_TEX
{
const GLfloat invQ = solve_plane_recip(cx, cy, vPlane);
span->texcoords[0][ix][0] = solve_plane(cx, cy, sPlane) * invQ;
span->texcoords[0][ix][1] = solve_plane(cx, cy, tPlane) * invQ;
span->texcoords[0][ix][2] = solve_plane(cx, cy, uPlane) * invQ;
span->lambda[0][ix] = compute_lambda(sPlane, tPlane, vPlane,
array->texcoords[0][ix][0] = solve_plane(cx, cy, sPlane) * invQ;
array->texcoords[0][ix][1] = solve_plane(cx, cy, tPlane) * invQ;
array->texcoords[0][ix][2] = solve_plane(cx, cy, uPlane) * invQ;
array->lambda[0][ix] = compute_lambda(sPlane, tPlane, vPlane,
cx, cy, invQ, texWidth, texHeight);
}
#elif defined(DO_MULTITEX)
@ -429,10 +431,10 @@
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
GLfloat invQ = solve_plane_recip(cx, cy, vPlane[unit]);
span->texcoords[unit][ix][0] = solve_plane(cx, cy, sPlane[unit]) * invQ;
span->texcoords[unit][ix][1] = solve_plane(cx, cy, tPlane[unit]) * invQ;
span->texcoords[unit][ix][2] = solve_plane(cx, cy, uPlane[unit]) * invQ;
span->lambda[unit][ix] = compute_lambda(sPlane[unit],
array->texcoords[unit][ix][0] = solve_plane(cx, cy, sPlane[unit]) * invQ;
array->texcoords[unit][ix][1] = solve_plane(cx, cy, tPlane[unit]) * invQ;
array->texcoords[unit][ix][2] = solve_plane(cx, cy, uPlane[unit]) * invQ;
array->lambda[unit][ix] = compute_lambda(sPlane[unit],
tPlane[unit],
vPlane[unit],
cx, cy, invQ,
@ -457,60 +459,62 @@
/* shift all values to the left */
/* XXX this is temporary */
{
struct span_arrays *array = span.array;
GLint j;
for (j = 0; j < (GLint) n; j++) {
#ifdef DO_RGBA
COPY_4V(span->color.rgba[j], span->color.rgba[j + left]);
COPY_4V(array->rgba[j], array->rgba[j + left]);
#endif
#ifdef DO_SPEC
COPY_4V(span->specArray[j], span->specArray[j + left]);
COPY_4V(array->spec[j], array->spec[j + left]);
#endif
#ifdef DO_INDEX
span->color.index[j] = span->color.index[j + left];
array->index[j] = array->index[j + left];
#endif
#ifdef DO_Z
span->zArray[j] = span->zArray[j + left];
array->z[j] = array->z[j + left];
#endif
#ifdef DO_FOG
span->fogArray[j] = span->fogArray[j + left];
array->fog[j] = array->fog[j + left];
#endif
#ifdef DO_TEX
COPY_4V(span->texcoords[0][j], span->texcoords[0][j + left]);
COPY_4V(array->texcoords[0][j], array->texcoords[0][j + left]);
#endif
#if defined(DO_MULTITEX) || defined(DO_TEX)
span->lambda[0][j] = span->lambda[0][j + left];
array->lambda[0][j] = array->lambda[0][j + left];
#endif
span->coverage[j] = span->coverage[j + left];
array->coverage[j] = array->coverage[j + left];
}
}
#ifdef DO_MULTITEX
/* shift texcoords */
{
struct span_arrays *array = span.array;
GLuint unit;
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
GLint j;
for (j = 0; j < (GLint) n; j++) {
span->texcoords[unit][j][0] = span->texcoords[unit][j + left][0];
span->texcoords[unit][j][1] = span->texcoords[unit][j + left][1];
span->texcoords[unit][j][2] = span->texcoords[unit][j + left][2];
span->lambda[unit][j] = span->lambda[unit][j + left];
array->texcoords[unit][j][0] = array->texcoords[unit][j + left][0];
array->texcoords[unit][j][1] = array->texcoords[unit][j + left][1];
array->texcoords[unit][j][2] = array->texcoords[unit][j + left][2];
array->lambda[unit][j] = array->lambda[unit][j + left];
}
}
}
}
#endif
span->x = left;
span->y = iy;
span->end = n;
ASSERT(span->interpMask == 0);
span.x = left;
span.y = iy;
span.end = n;
ASSERT(span.interpMask == 0);
#if defined(DO_MULTITEX) || defined(DO_TEX)
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
#elif defined(DO_RGBA)
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
#elif defined(DO_INDEX)
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
#endif
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_alpha.c,v 1.10 2002/04/19 14:05:50 brianp Exp $ */
/* $Id: s_alpha.c,v 1.11 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -49,10 +49,10 @@
GLint
_mesa_alpha_test( const GLcontext *ctx, struct sw_span *span )
{
const GLchan (*rgba)[4] = (const GLchan (*)[4]) span->color.rgba;
const GLchan (*rgba)[4] = (const GLchan (*)[4]) span->array->rgba;
const GLchan ref = ctx->Color.AlphaRef;
const GLuint n = span->end;
GLubyte *mask = span->mask;
GLubyte *mask = span->array->mask;
GLuint i;
if (span->arrayMask & SPAN_RGBA) {

View file

@ -1,4 +1,4 @@
/* $Id: s_bitmap.c,v 1.18 2002/04/19 14:05:50 brianp Exp $ */
/* $Id: s_bitmap.c,v 1.19 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -53,7 +53,7 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLint row, col;
GLuint count = 0;
struct sw_span *span = swrast->span;
struct sw_span span;
ASSERT(ctx->RenderMode == GL_RENDER);
ASSERT(bitmap);
@ -66,25 +66,25 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
INIT_SPAN(span, GL_BITMAP, width, 0, SPAN_XY);
if (ctx->Visual.rgbMode) {
span->interpMask |= SPAN_RGBA;
span->red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF);
span->green = FloatToFixed(ctx->Current.RasterColor[1] * CHAN_MAXF);
span->blue = FloatToFixed(ctx->Current.RasterColor[2] * CHAN_MAXF);
span->alpha = FloatToFixed(ctx->Current.RasterColor[3] * CHAN_MAXF);
span->redStep = span->greenStep = span->blueStep = span->alphaStep = 0;
span.interpMask |= SPAN_RGBA;
span.red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF);
span.green = FloatToFixed(ctx->Current.RasterColor[1] * CHAN_MAXF);
span.blue = FloatToFixed(ctx->Current.RasterColor[2] * CHAN_MAXF);
span.alpha = FloatToFixed(ctx->Current.RasterColor[3] * CHAN_MAXF);
span.redStep = span.greenStep = span.blueStep = span.alphaStep = 0;
}
else {
span->interpMask |= SPAN_INDEX;
span->index = ChanToFixed(ctx->Current.RasterIndex);
span->indexStep = 0;
span.interpMask |= SPAN_INDEX;
span.index = ChanToFixed(ctx->Current.RasterIndex);
span.indexStep = 0;
}
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
for (row = 0; row < height; row++, span->y++) {
for (row = 0; row < height; row++, span.y++) {
const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack,
bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
@ -93,8 +93,8 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
for (col = 0; col < width; col++) {
if (*src & mask) {
span->xArray[count] = px + col;
span->yArray[count] = py + row;
span.array->x[count] = px + col;
span.array->y[count] = py + row;
count++;
}
if (mask == 128U) {
@ -115,8 +115,8 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
for (col = 0; col < width; col++) {
if (*src & mask) {
span->xArray[count] = px + col;
span->yArray[count] = py + row;
span.array->x[count] = px + col;
span.array->y[count] = py + row;
count++;
}
if (mask == 1U) {
@ -135,12 +135,12 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
if (count + width >= MAX_WIDTH || row + 1 == height) {
/* flush the span */
span->end = count;
span.end = count;
if (ctx->Visual.rgbMode)
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
else
_mesa_write_index_span(ctx, span);
span->end = 0;
_mesa_write_index_span(ctx, &span);
span.end = 0;
count = 0;
}
}
@ -155,7 +155,6 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
* fragments, initializing the mask array to indicate which fragmens to
* draw or skip.
*/
void
_swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
GLsizei width, GLsizei height,
@ -164,7 +163,7 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLint row, col;
struct sw_span *span = swrast->span;
struct sw_span span;
ASSERT(ctx->RenderMode == GL_RENDER);
ASSERT(bitmap);
@ -175,30 +174,31 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
_swrast_validate_derived( ctx );
INIT_SPAN(span, GL_BITMAP, width, 0, SPAN_MASK);
/*span->arrayMask |= SPAN_MASK;*/ /* we'll init span->mask[] */
span->x = px;
span->y = py;
/*span->end = width;*/
/*span.arrayMask |= SPAN_MASK;*/ /* we'll init span.mask[] */
span.x = px;
span.y = py;
/*span.end = width;*/
if (ctx->Visual.rgbMode) {
span->interpMask |= SPAN_RGBA;
span->red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF);
span->green = FloatToFixed(ctx->Current.RasterColor[1] * CHAN_MAXF);
span->blue = FloatToFixed(ctx->Current.RasterColor[2] * CHAN_MAXF);
span->alpha = FloatToFixed(ctx->Current.RasterColor[3] * CHAN_MAXF);
span->redStep = span->greenStep = span->blueStep = span->alphaStep = 0;
span.interpMask |= SPAN_RGBA;
span.red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF);
span.green = FloatToFixed(ctx->Current.RasterColor[1] * CHAN_MAXF);
span.blue = FloatToFixed(ctx->Current.RasterColor[2] * CHAN_MAXF);
span.alpha = FloatToFixed(ctx->Current.RasterColor[3] * CHAN_MAXF);
span.redStep = span.greenStep = span.blueStep = span.alphaStep = 0;
}
else {
span->interpMask |= SPAN_INDEX;
span->index = ChanToFixed(ctx->Current.RasterIndex);
span->indexStep = 0;
span.interpMask |= SPAN_INDEX;
span.index = ChanToFixed(ctx->Current.RasterIndex);
span.indexStep = 0;
}
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
for (row=0; row<height; row++, span->y++) {
for (row=0; row<height; row++, span.y++) {
const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack,
bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
@ -206,7 +206,7 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
/* Lsb first */
GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
for (col=0; col<width; col++) {
span->mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
span.array->mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
if (mask == 128U) {
src++;
mask = 1U;
@ -217,9 +217,9 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
}
if (ctx->Visual.rgbMode)
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
/* get ready for next row */
if (mask != 1)
@ -229,7 +229,7 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
/* Msb first */
GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
for (col=0; col<width; col++) {
span->mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
span.array->mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
if (mask == 1U) {
src++;
mask = 128U;
@ -240,9 +240,9 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
}
if (ctx->Visual.rgbMode)
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
/* get ready for next row */
if (mask != 128)

View file

@ -1,4 +1,4 @@
/* $Id: s_blend.c,v 1.23 2002/06/30 15:57:45 brianp Exp $ */
/* $Id: s_blend.c,v 1.24 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -765,11 +765,12 @@ _mesa_blend_span( GLcontext *ctx, const struct sw_span *span,
if (span->arrayMask & SPAN_XY) {
/* array of x/y pixel coords */
(*swrast->Driver.ReadRGBAPixels)( ctx, span->end,
span->xArray, span->yArray,
framebuffer, span->mask );
span->array->x, span->array->y,
framebuffer, span->array->mask );
if (swrast->_RasterMask & ALPHABUF_BIT) {
_mesa_read_alpha_pixels( ctx, span->end, span->xArray, span->yArray,
framebuffer, span->mask );
_mesa_read_alpha_pixels( ctx, span->end,
span->array->x, span->array->y,
framebuffer, span->array->mask );
}
}
else {
@ -778,6 +779,6 @@ _mesa_blend_span( GLcontext *ctx, const struct sw_span *span,
span->x, span->y, framebuffer );
}
SWRAST_CONTEXT(ctx)->BlendFunc( ctx, span->end, span->mask, rgba,
SWRAST_CONTEXT(ctx)->BlendFunc( ctx, span->end, span->array->mask, rgba,
(const GLchan (*)[4]) framebuffer );
}

View file

@ -1,4 +1,4 @@
/* $Id: s_context.c,v 1.36 2002/07/09 01:22:52 brianp Exp $ */
/* $Id: s_context.c,v 1.37 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -513,10 +513,10 @@ _swrast_CreateContext( GLcontext *ctx )
for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++)
swrast->TextureSample[i] = _swrast_validate_texture_sample;
swrast->span = (struct sw_span *) MALLOC(sizeof(struct sw_span));
if (!swrast->span) {
FREE(swrast);
return GL_FALSE;
swrast->span_data = MALLOC_STRUCT(span_arrays);
if (!swrast->span_data) {
FREE(swrast);
return GL_FALSE;
}
assert(ctx->Const.MaxTextureUnits > 0);
@ -525,7 +525,7 @@ _swrast_CreateContext( GLcontext *ctx )
swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureUnits *
MAX_WIDTH * 4 * sizeof(GLchan));
if (!swrast->TexelBuffer) {
FREE(swrast->span);
FREE(swrast->span_data);
FREE(swrast);
return GL_FALSE;
}
@ -544,7 +544,7 @@ _swrast_DestroyContext( GLcontext *ctx )
_mesa_debug(ctx, "_swrast_DestroyContext\n");
}
FREE( swrast->span );
FREE( swrast->span_data );
FREE( swrast->TexelBuffer );
FREE( swrast );

View file

@ -1,4 +1,4 @@
/* $Id: s_context.h,v 1.18 2002/05/02 00:59:20 brianp Exp $ */
/* $Id: s_context.h,v 1.19 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -170,7 +170,13 @@ typedef struct
swrast_tri_func SpecTriangle;
/*@}*/
struct sw_span *span;
/**
* Typically, we'll allocate a sw_span structure as a local variable
* and set its 'array' pointer to point to this object. The reason is
* this object is big and causes problems when allocated on the stack
* on some systems.
*/
struct span_arrays *span_data;
/** Internal hooks, kept uptodate by the same mechanism as above.
*/

View file

@ -1,4 +1,4 @@
/* $Id: s_copypix.c,v 1.39 2002/07/09 01:22:52 brianp Exp $ */
/* $Id: s_copypix.c,v 1.40 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -106,14 +106,14 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
const GLuint transferOps = ctx->_ImageTransferState;
GLfloat *dest, *tmpImage, *convImage;
struct sw_span *span = swrast->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_RGBA);
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
if (SWRAST_CONTEXT(ctx)->_RasterMask == 0
@ -239,15 +239,15 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
GLint g = (GLint) (src[i * 4 + GCOMP] * CHAN_MAXF);
GLint b = (GLint) (src[i * 4 + BCOMP] * CHAN_MAXF);
GLint a = (GLint) (src[i * 4 + ACOMP] * CHAN_MAXF);
span->color.rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
span->color.rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
span->color.rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
span->color.rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
span.array->rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
span.array->rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
span.array->rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
span.array->rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
}
if (ctx->Pixel.PixelTextureEnabled && ctx->Texture._EnabledUnits) {
span->end = width;
_swrast_pixel_texture(ctx, span);
span.end = width;
_swrast_pixel_texture(ctx, &span);
}
/* write row to framebuffer */
@ -255,21 +255,21 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
dy = desty + row;
if (quick_draw && dy >= 0 && dy < (GLint) ctx->DrawBuffer->Height) {
(*swrast->Driver.WriteRGBASpan)( ctx, width, destx, dy,
(const GLchan (*)[4])span->color.rgba, NULL );
(const GLchan (*)[4])span.array->rgba, NULL );
}
else if (zoom) {
span->x = destx;
span->y = dy;
span->end = width;
_mesa_write_zoomed_rgba_span(ctx, span,
(CONST GLchan (*)[4])span->color.rgba,
span.x = destx;
span.y = dy;
span.end = width;
_mesa_write_zoomed_rgba_span(ctx, &span,
(CONST GLchan (*)[4])span.array->rgba,
desty);
}
else {
span->x = destx;
span->y = dy;
span->end = width;
_mesa_write_rgba_span(ctx, span);
span.x = destx;
span.y = dy;
span.end = width;
_mesa_write_rgba_span(ctx, &span);
}
}
@ -292,7 +292,7 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
GLint overlapping;
const GLuint transferOps = ctx->_ImageTransferState;
struct sw_span *span = swrast->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_RGBA);
@ -319,9 +319,9 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
ctx->Pixel.ZoomX, ctx->Pixel.ZoomY);
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
if (SWRAST_CONTEXT(ctx)->_RasterMask == 0
&& !zoom
@ -370,7 +370,7 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
/* Get source pixels */
if (overlapping) {
/* get from buffered image */
MEMCPY(span->color.rgba, p, width * sizeof(GLchan) * 4);
MEMCPY(span.array->rgba, p, width * sizeof(GLchan) * 4);
p += width * 4;
}
else {
@ -378,7 +378,7 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
if (changeBuffer)
_swrast_use_read_buffer(ctx);
_mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, srcx, sy,
span->color.rgba );
span.array->rgba );
if (changeBuffer)
_swrast_use_draw_buffer(ctx);
}
@ -391,10 +391,10 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
/* convert chan to float */
for (k = 0; k < width; k++) {
rgbaFloat[k][RCOMP] = (GLfloat) span->color.rgba[k][RCOMP] * scale;
rgbaFloat[k][GCOMP] = (GLfloat) span->color.rgba[k][GCOMP] * scale;
rgbaFloat[k][BCOMP] = (GLfloat) span->color.rgba[k][BCOMP] * scale;
rgbaFloat[k][ACOMP] = (GLfloat) span->color.rgba[k][ACOMP] * scale;
rgbaFloat[k][RCOMP] = (GLfloat) span.array->rgba[k][RCOMP] * scale;
rgbaFloat[k][GCOMP] = (GLfloat) span.array->rgba[k][GCOMP] * scale;
rgbaFloat[k][BCOMP] = (GLfloat) span.array->rgba[k][BCOMP] * scale;
rgbaFloat[k][ACOMP] = (GLfloat) span.array->rgba[k][ACOMP] * scale;
}
/* scale & bias */
if (transferOps & IMAGE_SCALE_BIAS_BIT) {
@ -454,36 +454,36 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
GLint g = (GLint) (rgbaFloat[k][GCOMP] * CHAN_MAXF);
GLint b = (GLint) (rgbaFloat[k][BCOMP] * CHAN_MAXF);
GLint a = (GLint) (rgbaFloat[k][ACOMP] * CHAN_MAXF);
span->color.rgba[k][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
span->color.rgba[k][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
span->color.rgba[k][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
span->color.rgba[k][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
span.array->rgba[k][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
span.array->rgba[k][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
span.array->rgba[k][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
span.array->rgba[k][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
}
UNDEFARRAY(rgbaFloat); /* mac 32k limitation */
}
if (ctx->Pixel.PixelTextureEnabled && ctx->Texture._EnabledUnits) {
span->end = width;
_swrast_pixel_texture(ctx, span);
span.end = width;
_swrast_pixel_texture(ctx, &span);
}
if (quick_draw && dy >= 0 && dy < (GLint) ctx->DrawBuffer->Height) {
(*swrast->Driver.WriteRGBASpan)( ctx, width, destx, dy,
(const GLchan (*)[4])span->color.rgba, NULL );
(const GLchan (*)[4])span.array->rgba, NULL );
}
else if (zoom) {
span->x = destx;
span->y = dy;
span->end = width;
_mesa_write_zoomed_rgba_span(ctx, span,
(CONST GLchan (*)[4]) span->color.rgba,
span.x = destx;
span.y = dy;
span.end = width;
_mesa_write_zoomed_rgba_span(ctx, &span,
(CONST GLchan (*)[4]) span.array->rgba,
desty);
}
else {
span->x = destx;
span->y = dy;
span->end = width;
_mesa_write_rgba_span(ctx, span);
span.x = destx;
span.y = dy;
span.end = width;
_mesa_write_rgba_span(ctx, &span);
}
}
@ -496,7 +496,6 @@ static void copy_ci_pixels( GLcontext *ctx,
GLint srcx, GLint srcy, GLint width, GLint height,
GLint destx, GLint desty )
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLuint *tmpImage,*p;
GLint sy, dy, stepy;
GLint j;
@ -504,7 +503,7 @@ static void copy_ci_pixels( GLcontext *ctx,
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
const GLboolean shift_or_offset = ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset;
GLint overlapping;
struct sw_span *span = swrast->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_INDEX);
@ -526,9 +525,9 @@ static void copy_ci_pixels( GLcontext *ctx,
ctx->Pixel.ZoomX, ctx->Pixel.ZoomY);
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
/* If read and draw buffer are different we must do buffer switching */
changeBuffer = ctx->Pixel.ReadBuffer != ctx->Color.DrawBuffer
@ -564,32 +563,32 @@ static void copy_ci_pixels( GLcontext *ctx,
for (j = 0; j < height; j++, sy += stepy, dy += stepy) {
if (overlapping) {
MEMCPY(span->color.index, p, width * sizeof(GLuint));
MEMCPY(span.array->index, p, width * sizeof(GLuint));
p += width;
}
else {
if (changeBuffer)
_swrast_use_read_buffer(ctx);
_mesa_read_index_span( ctx, ctx->ReadBuffer, width, srcx, sy,
span->color.index );
span.array->index );
if (changeBuffer)
_swrast_use_draw_buffer(ctx);
}
if (shift_or_offset) {
_mesa_shift_and_offset_ci( ctx, width, span->color.index );
_mesa_shift_and_offset_ci( ctx, width, span.array->index );
}
if (ctx->Pixel.MapColorFlag) {
_mesa_map_ci( ctx, width, span->color.index );
_mesa_map_ci( ctx, width, span.array->index );
}
span->x = destx;
span->y = dy;
span->end = width;
span.x = destx;
span.y = dy;
span.end = width;
if (zoom)
_mesa_write_zoomed_index_span(ctx, span, desty);
_mesa_write_zoomed_index_span(ctx, &span, desty);
else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
if (overlapping)
@ -611,7 +610,7 @@ static void copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
GLint i, j;
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
GLint overlapping;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_Z);
@ -637,9 +636,9 @@ static void copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
overlapping = regions_overlap(srcx, srcy, destx, desty, width, height,
ctx->Pixel.ZoomX, ctx->Pixel.ZoomY);
_mesa_span_default_color(ctx, span);
_mesa_span_default_color(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
if (overlapping) {
GLint ssy = sy;
@ -671,25 +670,25 @@ static void copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
for (i = 0; i < width; i++) {
GLfloat d = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
span->zArray[i] = (GLdepth) (CLAMP(d, 0.0F, 1.0F) * ctx->DepthMax);
span.array->z[i] = (GLdepth) (CLAMP(d, 0.0F, 1.0F) * ctx->DepthMax);
}
span->x = destx;
span->y = dy;
span->end = width;
span.x = destx;
span.y = dy;
span.end = width;
if (ctx->Visual.rgbMode) {
if (zoom)
_mesa_write_zoomed_rgba_span( ctx, span,
(const GLchan (*)[4])span->color.rgba,
_mesa_write_zoomed_rgba_span( ctx, &span,
(const GLchan (*)[4])span.array->rgba,
desty );
else
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
}
else {
if (zoom)
_mesa_write_zoomed_index_span( ctx, span, desty );
_mesa_write_zoomed_index_span( ctx, &span, desty );
else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_depth.c,v 1.22 2002/04/19 00:38:27 brianp Exp $ */
/* $Id: s_depth.c,v 1.23 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -549,9 +549,11 @@ depth_test_span( GLcontext *ctx, struct sw_span *span)
GLdepth zbuffer[MAX_WIDTH];
GLuint passed;
(*swrast->Driver.ReadDepthSpan)(ctx, n, x, y, zbuffer);
passed = depth_test_span32(ctx, n, zbuffer, span->zArray, span->mask);
passed = depth_test_span32(ctx, n, zbuffer, span->array->z,
span->array->mask);
ASSERT(swrast->Driver.WriteDepthSpan);
(*swrast->Driver.WriteDepthSpan)(ctx, n, x, y, zbuffer, span->mask);
(*swrast->Driver.WriteDepthSpan)(ctx, n, x, y, zbuffer,
span->array->mask);
if (passed < n)
span->writeAll = GL_FALSE;
return passed;
@ -561,11 +563,11 @@ depth_test_span( GLcontext *ctx, struct sw_span *span)
/* software depth buffer */
if (ctx->Visual.depthBits <= 16) {
GLushort *zptr = (GLushort *) Z_ADDRESS16(ctx, x, y);
passed = depth_test_span16(ctx, n, zptr, span->zArray, span->mask);
passed = depth_test_span16(ctx, n, zptr, span->array->z, span->array->mask);
}
else {
GLuint *zptr = (GLuint *) Z_ADDRESS32(ctx, x, y);
passed = depth_test_span32(ctx, n, zptr, span->zArray, span->mask);
passed = depth_test_span32(ctx, n, zptr, span->array->z, span->array->mask);
}
#if 1
if (passed < span->end) {
@ -1321,10 +1323,10 @@ depth_test_pixels( GLcontext *ctx, struct sw_span *span )
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
const GLuint n = span->end;
const GLint *x = span->xArray;
const GLint *y = span->yArray;
const GLdepth *z = span->zArray;
GLubyte *mask = span->mask;
const GLint *x = span->array->x;
const GLint *y = span->array->y;
const GLdepth *z = span->array->z;
GLubyte *mask = span->array->mask;
if (swrast->Driver.ReadDepthPixels) {
/* read depth values from hardware Z buffer */

View file

@ -1,4 +1,4 @@
/* $Id: s_drawpix.c,v 1.35 2002/06/15 03:03:11 brianp Exp $ */
/* $Id: s_drawpix.c,v 1.36 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -102,7 +102,7 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
const struct gl_pixelstore_attrib *unpack = &ctx->Unpack;
struct sw_span *span = swrast->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_RGBA);
@ -111,9 +111,9 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
}
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
if ((SWRAST_CONTEXT(ctx)->_RasterMask & ~CLIP_BIT) == 0
&& ctx->Texture._EnabledUnits == 0
@ -237,10 +237,10 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
/* with zooming */
GLint row;
for (row=0; row<drawHeight; row++) {
span->x = destX;
span->y = destY;
span->end = drawWidth;
_mesa_write_zoomed_rgba_span(ctx, span,
span.x = destX;
span.y = destY;
span.end = drawWidth;
_mesa_write_zoomed_rgba_span(ctx, &span,
(CONST GLchan (*)[4]) src, zoomY0);
src += rowLength * 4;
destY++;
@ -277,10 +277,10 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
/* with zooming */
GLint row;
for (row=0; row<drawHeight; row++) {
span->x = destX;
span->y = destY;
span->end = drawWidth;
_mesa_write_zoomed_rgb_span(ctx, span,
span.x = destX;
span.y = destY;
span.end = drawWidth;
_mesa_write_zoomed_rgb_span(ctx, &span,
(CONST GLchan (*)[3]) src, zoomY0);
src += rowLength * 3;
destY++;
@ -301,12 +301,12 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
for (row=0; row<drawHeight; row++) {
GLint i;
for (i=0;i<drawWidth;i++) {
span->color.rgb[i][0] = src[i];
span->color.rgb[i][1] = src[i];
span->color.rgb[i][2] = src[i];
span.array->rgb[i][0] = src[i];
span.array->rgb[i][1] = src[i];
span.array->rgb[i][2] = src[i];
}
(*swrast->Driver.WriteRGBSpan)(ctx, drawWidth, destX, destY,
(CONST GLchan (*)[3]) span->color.rgb, NULL);
(CONST GLchan (*)[3]) span.array->rgb, NULL);
src += rowLength;
destY++;
}
@ -318,13 +318,13 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
for (row=0; row<drawHeight; row++) {
GLint i;
for (i=0;i<drawWidth;i++) {
span->color.rgb[i][0] = src[i];
span->color.rgb[i][1] = src[i];
span->color.rgb[i][2] = src[i];
span.array->rgb[i][0] = src[i];
span.array->rgb[i][1] = src[i];
span.array->rgb[i][2] = src[i];
}
destY--;
(*swrast->Driver.WriteRGBSpan)(ctx, drawWidth, destX, destY,
(CONST GLchan (*)[3]) span->color.rgb, NULL);
(CONST GLchan (*)[3]) span.array->rgb, NULL);
src += rowLength;
}
}
@ -335,15 +335,15 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
for (row=0; row<drawHeight; row++) {
GLint i;
for (i=0;i<drawWidth;i++) {
span->color.rgb[i][0] = src[i];
span->color.rgb[i][1] = src[i];
span->color.rgb[i][2] = src[i];
span.array->rgb[i][0] = src[i];
span.array->rgb[i][1] = src[i];
span.array->rgb[i][2] = src[i];
}
span->x = destX;
span->y = destY;
span->end = drawWidth;
_mesa_write_zoomed_rgb_span(ctx, span,
(CONST GLchan (*)[3]) span->color.rgb, zoomY0);
span.x = destX;
span.y = destY;
span.end = drawWidth;
_mesa_write_zoomed_rgb_span(ctx, &span,
(CONST GLchan (*)[3]) span.array->rgb, zoomY0);
src += rowLength;
destY++;
}
@ -364,13 +364,13 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
GLint i;
GLchan *ptr = src;
for (i=0;i<drawWidth;i++) {
span->color.rgba[i][0] = *ptr;
span->color.rgba[i][1] = *ptr;
span->color.rgba[i][2] = *ptr++;
span->color.rgba[i][3] = *ptr++;
span.array->rgba[i][0] = *ptr;
span.array->rgba[i][1] = *ptr;
span.array->rgba[i][2] = *ptr++;
span.array->rgba[i][3] = *ptr++;
}
(*swrast->Driver.WriteRGBASpan)(ctx, drawWidth, destX, destY,
(CONST GLchan (*)[4]) span->color.rgba, NULL);
(CONST GLchan (*)[4]) span.array->rgba, NULL);
src += rowLength*2;
destY++;
}
@ -383,14 +383,14 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
GLint i;
GLchan *ptr = src;
for (i=0;i<drawWidth;i++) {
span->color.rgba[i][0] = *ptr;
span->color.rgba[i][1] = *ptr;
span->color.rgba[i][2] = *ptr++;
span->color.rgba[i][3] = *ptr++;
span.array->rgba[i][0] = *ptr;
span.array->rgba[i][1] = *ptr;
span.array->rgba[i][2] = *ptr++;
span.array->rgba[i][3] = *ptr++;
}
destY--;
(*swrast->Driver.WriteRGBASpan)(ctx, drawWidth, destX, destY,
(CONST GLchan (*)[4]) span->color.rgba, NULL);
(CONST GLchan (*)[4]) span.array->rgba, NULL);
src += rowLength*2;
}
}
@ -402,16 +402,16 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
GLchan *ptr = src;
GLint i;
for (i=0;i<drawWidth;i++) {
span->color.rgba[i][0] = *ptr;
span->color.rgba[i][1] = *ptr;
span->color.rgba[i][2] = *ptr++;
span->color.rgba[i][3] = *ptr++;
span.array->rgba[i][0] = *ptr;
span.array->rgba[i][1] = *ptr;
span.array->rgba[i][2] = *ptr++;
span.array->rgba[i][3] = *ptr++;
}
span->x = destX;
span->y = destY;
span->end = drawWidth;
_mesa_write_zoomed_rgba_span(ctx, span,
(CONST GLchan (*)[4]) span->color.rgba, zoomY0);
span.x = destX;
span.y = destY;
span.end = drawWidth;
_mesa_write_zoomed_rgba_span(ctx, &span,
(CONST GLchan (*)[4]) span.array->rgba, zoomY0);
src += rowLength*2;
destY++;
}
@ -428,9 +428,9 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
GLint row;
for (row=0; row<drawHeight; row++) {
ASSERT(drawWidth < MAX_WIDTH);
_mesa_map_ci8_to_rgba(ctx, drawWidth, src, span->color.rgba);
_mesa_map_ci8_to_rgba(ctx, drawWidth, src, span.array->rgba);
(*swrast->Driver.WriteRGBASpan)(ctx, drawWidth, destX, destY,
(const GLchan (*)[4]) span->color.rgba, NULL);
(const GLchan (*)[4]) span.array->rgba, NULL);
src += rowLength;
destY++;
}
@ -441,10 +441,10 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
GLint row;
for (row=0; row<drawHeight; row++) {
ASSERT(drawWidth < MAX_WIDTH);
_mesa_map_ci8_to_rgba(ctx, drawWidth, src, span->color.rgba);
_mesa_map_ci8_to_rgba(ctx, drawWidth, src, span.array->rgba);
destY--;
(*swrast->Driver.WriteRGBASpan)(ctx, drawWidth, destX, destY,
(CONST GLchan (*)[4]) span->color.rgba, NULL);
(CONST GLchan (*)[4]) span.array->rgba, NULL);
src += rowLength;
}
return GL_TRUE;
@ -454,12 +454,12 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
GLint row;
for (row=0; row<drawHeight; row++) {
ASSERT(drawWidth < MAX_WIDTH);
_mesa_map_ci8_to_rgba(ctx, drawWidth, src, span->color.rgba);
span->x = destX;
span->y = destY;
span->end = drawWidth;
_mesa_write_zoomed_rgba_span(ctx, span,
(CONST GLchan (*)[4]) span->color.rgba, zoomY0);
_mesa_map_ci8_to_rgba(ctx, drawWidth, src, span.array->rgba);
span.x = destX;
span.y = destY;
span.end = drawWidth;
_mesa_write_zoomed_rgba_span(ctx, &span,
(CONST GLchan (*)[4]) span.array->rgba, zoomY0);
src += rowLength;
destY++;
}
@ -508,14 +508,14 @@ draw_index_pixels( GLcontext *ctx, GLint x, GLint y,
const GLboolean zoom = ctx->Pixel.ZoomX!=1.0 || ctx->Pixel.ZoomY!=1.0;
const GLint desty = y;
GLint row, drawWidth = (width > MAX_WIDTH) ? MAX_WIDTH : width;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, drawWidth, 0, SPAN_INDEX);
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
/*
* General solution
@ -524,16 +524,16 @@ draw_index_pixels( GLcontext *ctx, GLint x, GLint y,
const GLvoid *source = _mesa_image_address(&ctx->Unpack,
pixels, width, height, GL_COLOR_INDEX, type, 0, row, 0);
_mesa_unpack_index_span(ctx, drawWidth, GL_UNSIGNED_INT,
span->color.index,
span.array->index,
type, source, &ctx->Unpack,
ctx->_ImageTransferState);
span->x = x;
span->y = y;
span->end = drawWidth;
span.x = x;
span.y = y;
span.end = drawWidth;
if (zoom)
_mesa_write_zoomed_index_span(ctx, span, desty);
_mesa_write_zoomed_index_span(ctx, &span, desty);
else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
}
@ -610,7 +610,7 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
const GLboolean zoom = ctx->Pixel.ZoomX!=1.0 || ctx->Pixel.ZoomY!=1.0;
const GLint desty = y;
GLint drawWidth = (width > MAX_WIDTH) ? MAX_WIDTH : width;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, drawWidth, 0, SPAN_Z);
@ -625,52 +625,52 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
return;
}
_mesa_span_default_color(ctx, span);
_mesa_span_default_color(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
if (ctx->Texture._ReallyEnabled)
_mesa_span_default_texcoords(ctx, span);
_mesa_span_default_texcoords(ctx, &span);
if (type==GL_UNSIGNED_SHORT && ctx->Visual.depthBits == 16
&& !bias_or_scale && !zoom && ctx->Visual.rgbMode) {
/* Special case: directly write 16-bit depth values */
GLint row;
span->x = x;
span->y = y;
span->end = drawWidth;
for (row = 0; row < height; row++, span->y++) {
span.x = x;
span.y = y;
span.end = drawWidth;
for (row = 0; row < height; row++, span.y++) {
const GLushort *zptr = (const GLushort *)
_mesa_image_address(&ctx->Unpack, pixels, width, height,
GL_DEPTH_COMPONENT, type, 0, row, 0);
GLint i;
for (i = 0; i < drawWidth; i++)
span->zArray[i] = zptr[i];
_mesa_write_rgba_span(ctx, span);
span.array->z[i] = zptr[i];
_mesa_write_rgba_span(ctx, &span);
}
}
else if (type==GL_UNSIGNED_INT && ctx->Visual.depthBits == 32
&& !bias_or_scale && !zoom && ctx->Visual.rgbMode) {
/* Special case: directly write 32-bit depth values */
GLint row;
span->x = x;
span->y = y;
span->end = drawWidth;
for (row = 0; row < height; row++, span->y++) {
span.x = x;
span.y = y;
span.end = drawWidth;
for (row = 0; row < height; row++, span.y++) {
const GLuint *zptr = (const GLuint *)
_mesa_image_address(&ctx->Unpack, pixels, width, height,
GL_DEPTH_COMPONENT, type, 0, row, 0);
MEMCPY(span->zArray, zptr, drawWidth * sizeof(GLdepth));
_mesa_write_rgba_span(ctx, span);
MEMCPY(span.array->z, zptr, drawWidth * sizeof(GLdepth));
_mesa_write_rgba_span(ctx, &span);
}
}
else {
/* General case */
GLint row;
span->x = x;
span->y = y;
span->end = drawWidth;
for (row = 0; row < height; row++, span->y++) {
span.x = x;
span.y = y;
span.end = drawWidth;
for (row = 0; row < height; row++, span.y++) {
GLfloat fspan[MAX_WIDTH];
const GLvoid *src = _mesa_image_address(&ctx->Unpack,
pixels, width, height, GL_DEPTH_COMPONENT, type, 0, row, 0);
@ -681,21 +681,24 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
const GLfloat zs = ctx->DepthMaxF;
GLint i;
for (i = 0; i < drawWidth; i++) {
span->zArray[i] = (GLdepth) (fspan[i] * zs + 0.5F);
span.array->z[i] = (GLdepth) (fspan[i] * zs + 0.5F);
}
}
if (ctx->Visual.rgbMode) {
if (zoom)
_mesa_write_zoomed_rgba_span(ctx, span,
(const GLchan (*)[4]) span->color.rgba, desty);
if (zoom) {
abort();
_mesa_write_zoomed_rgba_span(ctx, &span,
(const GLchan (*)[4]) span.array->rgba, desty);
}
else
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
}
else {
abort();
if (zoom)
_mesa_write_zoomed_index_span(ctx, span, desty);
_mesa_write_zoomed_index_span(ctx, &span, desty);
else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
}
}
@ -717,7 +720,7 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
GLboolean quickDraw;
GLfloat *convImage = NULL;
GLuint transferOps = ctx->_ImageTransferState;
struct sw_span *span = swrast->span;
struct sw_span span;
INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_RGBA);
@ -731,11 +734,11 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
return;
if (ctx->Depth.Test)
_mesa_span_default_z(ctx, span);
_mesa_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
_mesa_span_default_fog(ctx, span);
_mesa_span_default_fog(ctx, &span);
if (ctx->Texture._ReallyEnabled)
_mesa_span_default_texcoords(ctx, span);
_mesa_span_default_texcoords(ctx, &span);
if (SWRAST_CONTEXT(ctx)->_RasterMask == 0 && !zoom && x >= 0 && y >= 0
&& x + width <= (GLint) ctx->DrawBuffer->Width
@ -805,11 +808,13 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
GLint row;
if (width > MAX_WIDTH)
width = MAX_WIDTH;
for (row = 0; row < height; row++, y++) {
const GLvoid *source = _mesa_image_address(unpack,
pixels, width, height, format, type, 0, row, 0);
_mesa_unpack_chan_color_span(ctx, width, GL_RGBA,
(GLchan *) span->color.rgba,
(GLchan *) span.array->rgba,
format, type, source, unpack,
transferOps);
@ -818,26 +823,26 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
continue;
if (ctx->Pixel.PixelTextureEnabled && ctx->Texture._EnabledUnits) {
span->end = width;
_swrast_pixel_texture(ctx, span);
span.end = width;
_swrast_pixel_texture(ctx, &span);
}
if (quickDraw) {
(*swrast->Driver.WriteRGBASpan)(ctx, width, x, y,
(CONST GLchan (*)[4]) span->color.rgba, NULL);
(CONST GLchan (*)[4]) span.array->rgba, NULL);
}
else if (zoom) {
span->x = x;
span->y = y;
span->end = width;
_mesa_write_zoomed_rgba_span(ctx, span,
(CONST GLchan (*)[4]) span->color.rgba, desty);
span.x = x;
span.y = y;
span.end = width;
_mesa_write_zoomed_rgba_span(ctx, &span,
(CONST GLchan (*)[4]) span.array->rgba, desty);
}
else {
span->x = x;
span->y = y;
span->end = width;
_mesa_write_rgba_span(ctx, span);
span.x = x;
span.y = y;
span.end = width;
_mesa_write_rgba_span(ctx, &span);
}
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_fog.c,v 1.22 2002/02/17 17:30:58 brianp Exp $ */
/* $Id: s_fog.c,v 1.23 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -134,9 +134,11 @@ compute_fog_factors_from_z( const GLcontext *ctx,
for (i=0;i<n;i++) {
GLfloat ndcz = ((GLfloat) z[i] - tz) * szInv;
GLfloat eyez = (ndcz - p14) / p10;
GLfloat f;
if (eyez < 0.0)
eyez = -eyez;
fogFact[i] = (fogEnd - eyez) * fogScale;
f = (fogEnd - eyez) * fogScale;
fogFact[i] = CLAMP(f, 0.0F, 1.0F);
}
}
else {
@ -144,9 +146,11 @@ compute_fog_factors_from_z( const GLcontext *ctx,
for (i=0;i<n;i++) {
GLfloat ndcz = ((GLfloat) z[i] - tz) * szInv;
GLfloat eyez = p14 / (ndcz + p10);
GLfloat f;
if (eyez < 0.0)
eyez = -eyez;
fogFact[i] = (fogEnd - eyez) * fogScale;
f = (fogEnd - eyez) * fogScale;
fogFact[i] = CLAMP(f, 0.0F, 1.0F);
}
}
}
@ -214,7 +218,7 @@ compute_fog_factors_from_z( const GLcontext *ctx,
/**
* Apply fog to a span of RGBA pixels.
* The fog factors are either in the span->fogArray or stored as base/step.
* The fog factors are either in the span->array->fog or stored as base/step.
* These are fog _factors_, not fog coords. Fog coords were converted to
* fog factors per vertex.
*/
@ -223,7 +227,7 @@ _mesa_fog_rgba_span( const GLcontext *ctx, struct sw_span *span )
{
const SWcontext *swrast = SWRAST_CONTEXT(ctx);
const GLuint n = span->end;
GLchan (*rgba)[4] = (GLchan (*)[4]) span->color.rgba;
GLchan (*rgba)[4] = (GLchan (*)[4]) span->array->rgba;
GLchan rFog, gFog, bFog;
ASSERT(ctx->Fog.Enabled);
@ -238,14 +242,15 @@ _mesa_fog_rgba_span( const GLcontext *ctx, struct sw_span *span )
/* compute fog factor from each fragment's Z value */
if ((span->interpMask & SPAN_Z) && (span->arrayMask & SPAN_Z) == 0)
_mesa_span_interpolate_z(ctx, span);
compute_fog_factors_from_z(ctx, n, span->zArray, span->fogArray);
compute_fog_factors_from_z(ctx, n, span->array->z, span->array->fog);
span->arrayMask |= SPAN_FOG;
}
if (span->arrayMask & SPAN_FOG) {
/* use fog array in span */
GLuint i;
for (i = 0; i < n; i++) {
const GLfloat fog = span->fogArray[i];
const GLfloat fog = span->array->fog[i];
const GLfloat oneMinusFog = 1.0F - fog;
rgba[i][RCOMP] = (GLchan) (fog * rgba[i][RCOMP] + oneMinusFog * rFog);
rgba[i][GCOMP] = (GLchan) (fog * rgba[i][GCOMP] + oneMinusFog * gFog);
@ -253,6 +258,7 @@ _mesa_fog_rgba_span( const GLcontext *ctx, struct sw_span *span )
}
}
else {
/* interpolate fog factors */
GLfloat fog = span->fog, dFog = span->fogStep;
GLuint i;
for (i = 0; i < n; i++) {
@ -274,7 +280,7 @@ _mesa_fog_ci_span( const GLcontext *ctx, struct sw_span *span )
{
const SWcontext *swrast = SWRAST_CONTEXT(ctx);
const GLuint n = span->end;
GLuint *index = span->color.index;
GLuint *index = span->array->index;
ASSERT(ctx->Fog.Enabled);
ASSERT(span->arrayMask & SPAN_INDEX);
@ -284,7 +290,7 @@ _mesa_fog_ci_span( const GLcontext *ctx, struct sw_span *span )
/* compute fog factor from each fragment's Z value */
if ((span->interpMask & SPAN_Z) && (span->arrayMask & SPAN_Z) == 0)
_mesa_span_interpolate_z(ctx, span);
compute_fog_factors_from_z(ctx, n, span->zArray, span->fogArray);
compute_fog_factors_from_z(ctx, n, span->array->z, span->array->fog);
span->arrayMask |= SPAN_FOG;
}
@ -292,7 +298,7 @@ _mesa_fog_ci_span( const GLcontext *ctx, struct sw_span *span )
const GLuint idx = (GLuint) ctx->Fog.Index;
GLuint i;
for (i = 0; i < n; i++) {
const GLfloat f = CLAMP(span->fogArray[i], 0.0F, 1.0F);
const GLfloat f = CLAMP(span->array->fog[i], 0.0F, 1.0F);
index[i] = (GLuint) ((GLfloat) index[i] + (1.0F - f) * idx);
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_lines.c,v 1.30 2002/06/15 03:03:11 brianp Exp $ */
/* $Id: s_lines.c,v 1.31 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -77,16 +77,17 @@ draw_wide_line( GLcontext *ctx, struct sw_span *span, GLboolean xMajor )
start = width / 2 - 1;
if (xMajor) {
GLint *y = span->array->y;
GLuint i;
GLint w;
for (w = 0; w < width; w++) {
if (w == 0) {
for (i = 0; i < span->end; i++)
span->yArray[i] -= start;
y[i] -= start;
}
else {
for (i = 0; i < span->end; i++)
span->yArray[i]++;
y[i]++;
}
if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
_mesa_write_texture_span(ctx, span);
@ -97,16 +98,17 @@ draw_wide_line( GLcontext *ctx, struct sw_span *span, GLboolean xMajor )
}
}
else {
GLint *x = span->array->x;
GLuint i;
GLint w;
for (w = 0; w < width; w++) {
if (w == 0) {
for (i = 0; i < span->end; i++)
span->xArray[i] -= start;
x[i] -= start;
}
else {
for (i = 0; i < span->end; i++)
span->xArray[i]++;
x[i]++;
}
if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
_mesa_write_texture_span(ctx, span);
@ -130,27 +132,30 @@ static void flat_ci_line( GLcontext *ctx,
const SWvertex *vert0,
const SWvertex *vert1 )
{
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
GLint *x, *y;
struct sw_span span;
ASSERT(ctx->Light.ShadeModel == GL_FLAT);
ASSERT(!ctx->Line.StippleFlag);
ASSERT(ctx->Line.Width == 1.0F);
INIT_SPAN(span, GL_LINE, 0, SPAN_INDEX, SPAN_XY);
span->index = IntToFixed(vert1->index);
span->indexStep = 0;
span.index = IntToFixed(vert1->index);
span.indexStep = 0;
x = span.array->x;
y = span.array->y;
#define INTERP_XY 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
span.end++; \
}
#include "s_linetemp.h"
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
@ -159,33 +164,36 @@ static void flat_rgba_line( GLcontext *ctx,
const SWvertex *vert0,
const SWvertex *vert1 )
{
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
ASSERT(ctx->Light.ShadeModel == GL_FLAT);
ASSERT(!ctx->Line.StippleFlag);
ASSERT(ctx->Line.Width == 1.0F);
INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA, SPAN_XY);
span->red = ChanToFixed(vert1->color[0]);
span->green = ChanToFixed(vert1->color[1]);
span->blue = ChanToFixed(vert1->color[2]);
span->alpha = ChanToFixed(vert1->color[3]);
span->redStep = 0;
span->greenStep = 0;
span->blueStep = 0;
span->alphaStep = 0;
span.red = ChanToFixed(vert1->color[0]);
span.green = ChanToFixed(vert1->color[1]);
span.blue = ChanToFixed(vert1->color[2]);
span.alpha = ChanToFixed(vert1->color[3]);
span.redStep = 0;
span.greenStep = 0;
span.blueStep = 0;
span.alphaStep = 0;
x = span.array->x;
y = span.array->y;
#define INTERP_XY 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
span.end++; \
}
#include "s_linetemp.h"
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
}
@ -194,27 +202,32 @@ static void smooth_ci_line( GLcontext *ctx,
const SWvertex *vert0,
const SWvertex *vert1 )
{
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
GLuint *index;
ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
ASSERT(!ctx->Line.StippleFlag);
ASSERT(ctx->Line.Width == 1.0F);
INIT_SPAN(span, GL_LINE, 0, 0, SPAN_XY | SPAN_INDEX);
x = span.array->x;
y = span.array->y;
index = span.array->index;
#define INTERP_XY 1
#define INTERP_INDEX 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->color.index[span->end] = I; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
index[span.end] = I; \
span.end++; \
}
#include "s_linetemp.h"
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
@ -223,31 +236,36 @@ static void smooth_rgba_line( GLcontext *ctx,
const SWvertex *vert0,
const SWvertex *vert1 )
{
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
GLchan (*rgba)[4];
ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
ASSERT(!ctx->Line.StippleFlag);
ASSERT(ctx->Line.Width == 1.0F);
INIT_SPAN(span, GL_LINE, 0, 0, SPAN_XY | SPAN_RGBA);
x = span.array->x;
y = span.array->y;
rgba = span.array->rgba;
#define INTERP_XY 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->color.rgba[span->end][RCOMP] = FixedToInt(r0); \
span->color.rgba[span->end][GCOMP] = FixedToInt(g0); \
span->color.rgba[span->end][BCOMP] = FixedToInt(b0); \
span->color.rgba[span->end][ACOMP] = FixedToInt(a0); \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
rgba[span.end][RCOMP] = FixedToInt(r0); \
rgba[span.end][GCOMP] = FixedToInt(g0); \
rgba[span.end][BCOMP] = FixedToInt(b0); \
rgba[span.end][ACOMP] = FixedToInt(a0); \
span.end++; \
}
#include "s_linetemp.h"
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
}
@ -257,39 +275,48 @@ static void general_smooth_ci_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
GLdepth *z;
GLfloat *fog;
GLuint *index;
ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
INIT_SPAN(span, GL_LINE, 0, 0,
SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_INDEX);
x = span.array->x;
y = span.array->y;
z = span.array->z;
fog = span.array->fog;
index = span.array->index;
#define SET_XMAJOR 1
#define INTERP_XY 1
#define INTERP_Z 1
#define INTERP_FOG 1
#define INTERP_INDEX 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span->color.index[span->end] = I; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
z[span.end] = Z; \
fog[span.end] = fog0; \
index[span.end] = I; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
}
@ -300,39 +327,46 @@ static void general_flat_ci_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
GLdepth *z;
GLfloat *fog;
ASSERT(ctx->Light.ShadeModel == GL_FLAT);
INIT_SPAN(span, GL_LINE, 0, SPAN_INDEX,
SPAN_XY | SPAN_Z | SPAN_FOG);
span->index = IntToFixed(vert1->index);
span->indexStep = 0;
span.index = IntToFixed(vert1->index);
span.indexStep = 0;
x = span.array->x;
y = span.array->y;
z = span.array->z;
fog = span.array->fog;
#define SET_XMAJOR 1
#define INTERP_XY 1
#define INTERP_Z 1
#define INTERP_FOG 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
z[span.end] = Z; \
fog[span.end] = fog0; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
}
}
@ -343,12 +377,21 @@ static void general_smooth_rgba_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
GLdepth *z;
GLchan (*rgba)[4];
GLfloat *fog;
ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
INIT_SPAN(span, GL_LINE, 0, 0,
SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA);
x = span.array->x;
y = span.array->y;
z = span.array->z;
rgba = span.array->rgba;
fog = span.array->fog;
#define SET_XMAJOR 1
#define INTERP_XY 1
@ -356,30 +399,30 @@ static void general_smooth_rgba_line( GLcontext *ctx,
#define INTERP_FOG 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->color.rgba[span->end][RCOMP] = FixedToInt(r0); \
span->color.rgba[span->end][GCOMP] = FixedToInt(g0); \
span->color.rgba[span->end][BCOMP] = FixedToInt(b0); \
span->color.rgba[span->end][ACOMP] = FixedToInt(a0); \
span->fogArray[span->end] = fog0; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
z[span.end] = Z; \
rgba[span.end][RCOMP] = FixedToInt(r0); \
rgba[span.end][GCOMP] = FixedToInt(g0); \
rgba[span.end][BCOMP] = FixedToInt(b0); \
rgba[span.end][ACOMP] = FixedToInt(a0); \
fog[span.end] = fog0; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
}
}
@ -389,45 +432,52 @@ static void general_flat_rgba_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLint *x, *y;
GLdepth *z;
GLfloat *fog;
ASSERT(ctx->Light.ShadeModel == GL_FLAT);
INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA,
SPAN_XY | SPAN_Z | SPAN_FOG);
span->red = ChanToFixed(vert1->color[0]);
span->green = ChanToFixed(vert1->color[1]);
span->blue = ChanToFixed(vert1->color[2]);
span->alpha = ChanToFixed(vert1->color[3]);
span->redStep = 0;
span->greenStep = 0;
span->blueStep = 0;
span->alphaStep = 0;
span.red = ChanToFixed(vert1->color[0]);
span.green = ChanToFixed(vert1->color[1]);
span.blue = ChanToFixed(vert1->color[2]);
span.alpha = ChanToFixed(vert1->color[3]);
span.redStep = 0;
span.greenStep = 0;
span.blueStep = 0;
span.alphaStep = 0;
x = span.array->x;
y = span.array->y;
z = span.array->z;
fog = span.array->fog;
#define SET_XMAJOR 1
#define INTERP_XY 1
#define INTERP_Z 1
#define INTERP_FOG 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span->end++; \
#define PLOT(X,Y) \
{ \
x[span.end] = X; \
y[span.end] = Y; \
z[span.end] = Z; \
fog[span.end] = fog0; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
}
}
@ -438,26 +488,26 @@ static void flat_textured_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
ASSERT(ctx->Light.ShadeModel == GL_FLAT);
INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA | SPAN_SPEC,
SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
span->red = ChanToFixed(vert1->color[0]);
span->green = ChanToFixed(vert1->color[1]);
span->blue = ChanToFixed(vert1->color[2]);
span->alpha = ChanToFixed(vert1->color[3]);
span->redStep = 0;
span->greenStep = 0;
span->blueStep = 0;
span->alphaStep = 0;
span->specRed = ChanToFixed(vert1->specular[0]);
span->specGreen = ChanToFixed(vert1->specular[1]);
span->specBlue = ChanToFixed(vert1->specular[2]);
span->specRedStep = 0;
span->specGreenStep = 0;
span->specBlueStep = 0;
span.red = ChanToFixed(vert1->color[0]);
span.green = ChanToFixed(vert1->color[1]);
span.blue = ChanToFixed(vert1->color[2]);
span.alpha = ChanToFixed(vert1->color[3]);
span.redStep = 0;
span.greenStep = 0;
span.blueStep = 0;
span.alphaStep = 0;
span.specRed = ChanToFixed(vert1->specular[0]);
span.specGreen = ChanToFixed(vert1->specular[1]);
span.specBlue = ChanToFixed(vert1->specular[2]);
span.specRedStep = 0;
span.specGreenStep = 0;
span.specBlueStep = 0;
#define SET_XMAJOR 1
#define INTERP_XY 1
@ -466,28 +516,28 @@ static void flat_textured_line( GLcontext *ctx,
#define INTERP_TEX 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span->texcoords[0][span->end][0] = fragTexcoord[0]; \
span->texcoords[0][span->end][1] = fragTexcoord[1]; \
span->texcoords[0][span->end][2] = fragTexcoord[2]; \
span->lambda[0][span->end] = 0.0; \
span->end++; \
span.array->x[span.end] = X; \
span.array->y[span.end] = Y; \
span.array->z[span.end] = Z; \
span.array->fog[span.end] = fog0; \
span.array->texcoords[0][span.end][0] = fragTexcoord[0]; \
span.array->texcoords[0][span.end][1] = fragTexcoord[1]; \
span.array->texcoords[0][span.end][2] = fragTexcoord[2]; \
span.array->lambda[0][span.end] = 0.0; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
}
}
@ -499,7 +549,7 @@ static void smooth_textured_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
@ -515,32 +565,32 @@ static void smooth_textured_line( GLcontext *ctx,
#define INTERP_TEX 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span->color.rgba[span->end][RCOMP] = FixedToInt(r0); \
span->color.rgba[span->end][GCOMP] = FixedToInt(g0); \
span->color.rgba[span->end][BCOMP] = FixedToInt(b0); \
span->color.rgba[span->end][ACOMP] = FixedToInt(a0); \
span->texcoords[0][span->end][0] = fragTexcoord[0]; \
span->texcoords[0][span->end][1] = fragTexcoord[1]; \
span->texcoords[0][span->end][2] = fragTexcoord[2]; \
span->lambda[0][span->end] = 0.0; \
span->end++; \
span.array->x[span.end] = X; \
span.array->y[span.end] = Y; \
span.array->z[span.end] = Z; \
span.array->fog[span.end] = fog0; \
span.array->rgba[span.end][RCOMP] = FixedToInt(r0); \
span.array->rgba[span.end][GCOMP] = FixedToInt(g0); \
span.array->rgba[span.end][BCOMP] = FixedToInt(b0); \
span.array->rgba[span.end][ACOMP] = FixedToInt(a0); \
span.array->texcoords[0][span.end][0] = fragTexcoord[0]; \
span.array->texcoords[0][span.end][1] = fragTexcoord[1]; \
span.array->texcoords[0][span.end][2] = fragTexcoord[2]; \
span.array->lambda[0][span.end] = 0.0; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
}
}
@ -553,7 +603,7 @@ static void smooth_multitextured_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLuint u;
ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
@ -571,39 +621,39 @@ static void smooth_multitextured_line( GLcontext *ctx,
#define INTERP_MULTITEX 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span->color.rgba[span->end][RCOMP] = FixedToInt(r0); \
span->color.rgba[span->end][GCOMP] = FixedToInt(g0); \
span->color.rgba[span->end][BCOMP] = FixedToInt(b0); \
span->color.rgba[span->end][ACOMP] = FixedToInt(a0); \
span->specArray[span->end][RCOMP] = FixedToInt(sr0); \
span->specArray[span->end][GCOMP] = FixedToInt(sb0); \
span->specArray[span->end][BCOMP] = FixedToInt(sb0); \
span.array->x[span.end] = X; \
span.array->y[span.end] = Y; \
span.array->z[span.end] = Z; \
span.array->fog[span.end] = fog0; \
span.array->rgba[span.end][RCOMP] = FixedToInt(r0); \
span.array->rgba[span.end][GCOMP] = FixedToInt(g0); \
span.array->rgba[span.end][BCOMP] = FixedToInt(b0); \
span.array->rgba[span.end][ACOMP] = FixedToInt(a0); \
span.array->spec[span.end][RCOMP] = FixedToInt(sr0); \
span.array->spec[span.end][GCOMP] = FixedToInt(sg0); \
span.array->spec[span.end][BCOMP] = FixedToInt(sb0); \
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { \
if (ctx->Texture.Unit[u]._ReallyEnabled) { \
span->texcoords[u][span->end][0] = fragTexcoord[u][0]; \
span->texcoords[u][span->end][1] = fragTexcoord[u][1]; \
span->texcoords[u][span->end][2] = fragTexcoord[u][2]; \
span->lambda[u][span->end] = 0.0; \
span.array->texcoords[u][span.end][0] = fragTexcoord[u][0]; \
span.array->texcoords[u][span.end][1] = fragTexcoord[u][1]; \
span.array->texcoords[u][span.end][2] = fragTexcoord[u][2]; \
span.array->lambda[u][span.end] = 0.0; \
} \
} \
span->end++; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
}
}
@ -616,27 +666,27 @@ static void flat_multitextured_line( GLcontext *ctx,
const SWvertex *vert1 )
{
GLboolean xMajor = GL_FALSE;
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
GLuint u;
ASSERT(ctx->Light.ShadeModel == GL_FLAT);
INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA | SPAN_SPEC,
SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
span->red = ChanToFixed(vert1->color[0]);
span->green = ChanToFixed(vert1->color[1]);
span->blue = ChanToFixed(vert1->color[2]);
span->alpha = ChanToFixed(vert1->color[3]);
span->redStep = 0;
span->greenStep = 0;
span->blueStep = 0;
span->alphaStep = 0;
span->specRed = ChanToFixed(vert1->specular[0]);
span->specGreen = ChanToFixed(vert1->specular[1]);
span->specBlue = ChanToFixed(vert1->specular[2]);
span->specRedStep = 0;
span->specGreenStep = 0;
span->specBlueStep = 0;
span.red = ChanToFixed(vert1->color[0]);
span.green = ChanToFixed(vert1->color[1]);
span.blue = ChanToFixed(vert1->color[2]);
span.alpha = ChanToFixed(vert1->color[3]);
span.redStep = 0;
span.greenStep = 0;
span.blueStep = 0;
span.alphaStep = 0;
span.specRed = ChanToFixed(vert1->specular[0]);
span.specGreen = ChanToFixed(vert1->specular[1]);
span.specBlue = ChanToFixed(vert1->specular[2]);
span.specRedStep = 0;
span.specGreenStep = 0;
span.specBlueStep = 0;
#define SET_XMAJOR 1
#define INTERP_XY 1
@ -645,32 +695,32 @@ static void flat_multitextured_line( GLcontext *ctx,
#define INTERP_MULTITEX 1
#define PLOT(X,Y) \
{ \
span->xArray[span->end] = X; \
span->yArray[span->end] = Y; \
span->zArray[span->end] = Z; \
span->fogArray[span->end] = fog0; \
span.array->x[span.end] = X; \
span.array->y[span.end] = Y; \
span.array->z[span.end] = Z; \
span.array->fog[span.end] = fog0; \
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { \
if (ctx->Texture.Unit[u]._ReallyEnabled) { \
span->texcoords[u][span->end][0] = fragTexcoord[u][0]; \
span->texcoords[u][span->end][1] = fragTexcoord[u][1]; \
span->texcoords[u][span->end][2] = fragTexcoord[u][2]; \
span->lambda[u][span->end] = 0.0; \
span.array->texcoords[u][span.end][0] = fragTexcoord[u][0]; \
span.array->texcoords[u][span.end][1] = fragTexcoord[u][1]; \
span.array->texcoords[u][span.end][2] = fragTexcoord[u][2]; \
span.array->lambda[u][span.end] = 0.0; \
} \
} \
span->end++; \
span.end++; \
}
#include "s_linetemp.h"
if (ctx->Line.StippleFlag) {
span->arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span->end, span->mask);
span.arrayMask |= SPAN_MASK;
compute_stipple_mask(ctx, span.end, span.array->mask);
}
if (ctx->Line.Width > 1.0) {
draw_wide_line(ctx, span, xMajor);
draw_wide_line(ctx, &span, xMajor);
}
else {
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_logic.c,v 1.10 2002/02/02 21:40:33 brianp Exp $ */
/* $Id: s_logic.c,v 1.11 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -175,14 +175,15 @@ _mesa_logicop_ci_span( GLcontext *ctx, const struct sw_span *span,
/* Read dest values from frame buffer */
if (span->arrayMask & SPAN_XY) {
(*swrast->Driver.ReadCI32Pixels)( ctx, span->end, span->xArray,
span->yArray, dest, span->mask );
(*swrast->Driver.ReadCI32Pixels)( ctx, span->end,
span->array->x, span->array->y,
dest, span->array->mask );
}
else {
(*swrast->Driver.ReadCI32Span)( ctx, span->end, span->x, span->y, dest );
}
index_logicop( ctx, span->end, index, dest, span->mask );
index_logicop( ctx, span->end, index, dest, span->array->mask );
}
@ -472,11 +473,12 @@ _mesa_logicop_rgba_span( GLcontext *ctx, const struct sw_span *span,
if (span->arrayMask & SPAN_XY) {
(*swrast->Driver.ReadRGBAPixels)(ctx, span->end,
span->xArray, span->yArray,
dest, span->mask);
span->array->x, span->array->y,
dest, span->array->mask);
if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
_mesa_read_alpha_pixels(ctx, span->end, span->xArray, span->yArray,
dest, span->mask);
_mesa_read_alpha_pixels(ctx, span->end,
span->array->x, span->array->y,
dest, span->array->mask);
}
}
else {
@ -485,11 +487,11 @@ _mesa_logicop_rgba_span( GLcontext *ctx, const struct sw_span *span,
}
if (sizeof(GLchan) * 4 == sizeof(GLuint)) {
rgba_logicop_ui(ctx, span->end, span->mask,
rgba_logicop_ui(ctx, span->end, span->array->mask,
(GLuint *) rgba, (const GLuint *) dest);
}
else {
rgba_logicop_chan(ctx, 4 * span->end, span->mask,
rgba_logicop_chan(ctx, 4 * span->end, span->array->mask,
(GLchan *) rgba, (const GLchan *) dest);
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_masking.c,v 1.7 2002/02/02 21:40:33 brianp Exp $ */
/* $Id: s_masking.c,v 1.8 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -65,11 +65,11 @@ _mesa_mask_rgba_span( GLcontext *ctx, const struct sw_span *span,
ASSERT(span->arrayMask & SPAN_RGBA);
if (span->arrayMask & SPAN_XY) {
(*swrast->Driver.ReadRGBAPixels)(ctx, n, span->xArray, span->yArray,
dest, span->mask);
(*swrast->Driver.ReadRGBAPixels)(ctx, n, span->array->x, span->array->y,
dest, span->array->mask);
if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
_mesa_read_alpha_pixels(ctx, n, span->xArray, span->yArray,
dest, span->mask );
_mesa_read_alpha_pixels(ctx, n, span->array->x, span->array->y,
dest, span->array->mask);
}
}
else {
@ -150,8 +150,9 @@ _mesa_mask_index_span( GLcontext *ctx, const struct sw_span *span,
if (span->arrayMask & SPAN_XY) {
(*swrast->Driver.ReadCI32Pixels)(ctx, span->end, span->xArray,
span->yArray, fbindexes, span->mask);
(*swrast->Driver.ReadCI32Pixels)(ctx, span->end, span->array->x,
span->array->y, fbindexes,
span->array->mask);
for (i = 0; i < span->end; i++) {
index[i] = (index[i] & msrc) | (fbindexes[i] & mdest);

View file

@ -1,4 +1,4 @@
/* $Id: s_pixeltex.c,v 1.9 2002/05/02 00:59:20 brianp Exp $ */
/* $Id: s_pixeltex.c,v 1.10 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -99,13 +99,13 @@ _swrast_pixel_texture(GLcontext *ctx, struct sw_span *span)
/* convert colors into texture coordinates */
pixeltexgen( ctx, span->end,
(const GLchan (*)[4]) span->color.rgba,
span->texcoords[0] );
(const GLchan (*)[4]) span->array->rgba,
span->array->texcoords[0] );
/* copy the new texture units for all enabled units */
for (unit = 1; unit < ctx->Const.MaxTextureUnits; unit++) {
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
MEMCPY( span->texcoords[unit], span->texcoords[0],
MEMCPY( span->array->texcoords[unit], span->array->texcoords[0],
span->end * 4 * sizeof(GLfloat) );
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_pointtemp.h,v 1.17 2002/06/15 03:03:11 brianp Exp $ */
/* $Id: s_pointtemp.h,v 1.18 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -77,7 +77,7 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
const GLchan alpha = vert->color[3];
#endif
struct sw_span *span = SWRAST_CONTEXT(ctx)->span;
struct sw_span span;
/* Cull primitives with malformed coordinates.
*/
@ -88,58 +88,58 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
}
INIT_SPAN(span, GL_POINT, 0, SPAN_FOG, SPAN_XY | SPAN_Z);
span->fog = vert->fog;
span->fogStep = 0.0;
span.fog = vert->fog;
span.fogStep = 0.0;
#if (FLAGS & RGBA)
#if (FLAGS & SMOOTH)
/* because we need per-fragment alpha values */
span->arrayMask |= SPAN_RGBA;
span.arrayMask |= SPAN_RGBA;
#else
/* same RGBA for all fragments */
span->interpMask |= SPAN_RGBA;
span->red = ChanToFixed(vert->color[0]);
span->green = ChanToFixed(vert->color[1]);
span->blue = ChanToFixed(vert->color[2]);
span->alpha = ChanToFixed(vert->color[3]);
span->redStep = span->greenStep = span->blueStep = span->alphaStep = 0;
span.interpMask |= SPAN_RGBA;
span.red = ChanToFixed(vert->color[0]);
span.green = ChanToFixed(vert->color[1]);
span.blue = ChanToFixed(vert->color[2]);
span.alpha = ChanToFixed(vert->color[3]);
span.redStep = span.greenStep = span.blueStep = span.alphaStep = 0;
#endif /*SMOOTH*/
#endif /*RGBA*/
#if FLAGS & SPECULAR
span->interpMask |= SPAN_SPEC;
span->specRed = ChanToFixed(vert->specular[0]);
span->specGreen = ChanToFixed(vert->specular[1]);
span->specBlue = ChanToFixed(vert->specular[2]);
span->specRedStep = span->specGreenStep = span->specBlueStep = 0;
span.interpMask |= SPAN_SPEC;
span.specRed = ChanToFixed(vert->specular[0]);
span.specGreen = ChanToFixed(vert->specular[1]);
span.specBlue = ChanToFixed(vert->specular[2]);
span.specRedStep = span.specGreenStep = span.specBlueStep = 0;
#endif
#if FLAGS & INDEX
span->interpMask |= SPAN_INDEX;
span->index = IntToFixed(vert->index);
span->indexStep = 0;
span.interpMask |= SPAN_INDEX;
span.index = IntToFixed(vert->index);
span.indexStep = 0;
#endif
#if FLAGS & TEXTURE
/* but not used for sprite mode */
span->interpMask |= SPAN_TEXTURE;
span.interpMask |= SPAN_TEXTURE;
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
if (ctx->Texture.Unit[u]._ReallyEnabled) {
const GLfloat q = vert->texcoord[u][3];
const GLfloat invQ = (q == 0.0 || q == 1.0) ? 1.0 : (1.0 / q);
span->tex[u][0] = vert->texcoord[u][0] * invQ;
span->tex[u][1] = vert->texcoord[u][1] * invQ;
span->tex[u][2] = vert->texcoord[u][2] * invQ;
span->tex[u][3] = q;
span->texStepX[u][0] = span->texStepY[u][0] = 0.0;
span->texStepX[u][1] = span->texStepY[u][1] = 0.0;
span->texStepX[u][2] = span->texStepY[u][2] = 0.0;
span->texStepX[u][3] = span->texStepY[u][3] = 0.0;
span.tex[u][0] = vert->texcoord[u][0] * invQ;
span.tex[u][1] = vert->texcoord[u][1] * invQ;
span.tex[u][2] = vert->texcoord[u][2] * invQ;
span.tex[u][3] = q;
span.texStepX[u][0] = span.texStepY[u][0] = 0.0;
span.texStepX[u][1] = span.texStepY[u][1] = 0.0;
span.texStepX[u][2] = span.texStepY[u][2] = 0.0;
span.texStepX[u][3] = span.texStepY[u][3] = 0.0;
}
}
#endif
#if FLAGS & SMOOTH
span->arrayMask |= SPAN_COVERAGE;
span.arrayMask |= SPAN_COVERAGE;
#endif
#if FLAGS & SPRITE
span->arrayMask |= SPAN_TEXTURE;
span.arrayMask |= SPAN_TEXTURE;
#endif
#if FLAGS & ATTENUATE
@ -209,55 +209,55 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
if (dist2 < rmax2) {
if (dist2 >= rmin2) {
/* compute partial coverage */
span->coverage[count] = 1.0F - (dist2 - rmin2) * cscale;
span.array->coverage[count] = 1.0F - (dist2 - rmin2) * cscale;
#if FLAGS & INDEX
span->coverage[count] *= 15.0; /* coverage in [0,15] */
span.array->coverage[count] *= 15.0; /* coverage in [0,15] */
#endif
}
else {
/* full coverage */
span->coverage[count] = 1.0F;
span.array->coverage[count] = 1.0F;
}
span->xArray[count] = x;
span->yArray[count] = y;
span->zArray[count] = z;
span.array->x[count] = x;
span.array->y[count] = y;
span.array->z[count] = z;
#if FLAGS & RGBA
span->color.rgba[count][RCOMP] = red;
span->color.rgba[count][GCOMP] = green;
span->color.rgba[count][BCOMP] = blue;
span.array->rgba[count][RCOMP] = red;
span.array->rgba[count][GCOMP] = green;
span.array->rgba[count][BCOMP] = blue;
#if FLAGS & ATTENUATE
span->color.rgba[count][ACOMP] = (GLchan) (alpha * alphaAtten);
span.array->rgba[count][ACOMP] = (GLchan) (alpha * alphaAtten);
#else
span->color.rgba[count][ACOMP] = alpha;
span.array->rgba[count][ACOMP] = alpha;
#endif /*ATTENUATE*/
#endif /*RGBA*/
count++;
} /*if*/
#else /*SMOOTH*/
/* not smooth (square points) */
span->xArray[count] = x;
span->yArray[count] = y;
span->zArray[count] = z;
span.array->x[count] = x;
span.array->y[count] = y;
span.array->z[count] = z;
#if FLAGS & SPRITE
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
if (ctx->Texture.Unit[u]._ReallyEnabled) {
if (ctx->Point.CoordReplace[u]) {
GLfloat s = 0.5F + (x + 0.5F - vert->win[0]) / size;
GLfloat t = 0.5F - (y + 0.5F - vert->win[1]) / size;
span->texcoords[u][count][0] = s;
span->texcoords[u][count][1] = t;
span->texcoords[u][count][3] = 1.0F;
span.array->texcoords[u][count][0] = s;
span.array->texcoords[u][count][1] = t;
span.array->texcoords[u][count][3] = 1.0F;
if (ctx->Point.SpriteRMode == GL_ZERO)
span->texcoords[u][count][2] = 0.0F;
span.array->texcoords[u][count][2] = 0.0F;
else if (ctx->Point.SpriteRMode == GL_S)
span->texcoords[u][count][2] = vert->texcoord[u][0];
span.array->texcoords[u][count][2] = vert->texcoord[u][0];
else /* GL_R */
span->texcoords[u][count][2] = vert->texcoord[u][2];
span.array->texcoords[u][count][2] = vert->texcoord[u][2];
}
else {
COPY_4V(span->texcoords[u][count], vert->texcoord[u]);
COPY_4V(span.array->texcoords[u][count], vert->texcoord[u]);
}
}
}
@ -266,32 +266,32 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
#endif /*SMOOTH*/
} /*for x*/
} /*for y*/
span->end = count;
span.end = count;
}
#else /* LARGE | ATTENUATE | SMOOTH | SPRITE */
{
/* size == 1 */
span->xArray[0] = (GLint) vert->win[0];
span->yArray[0] = (GLint) vert->win[1];
span->zArray[0] = (GLint) vert->win[2];
span->end = 1;
span.array->x[0] = (GLint) vert->win[0];
span.array->y[0] = (GLint) vert->win[1];
span.array->z[0] = (GLint) vert->win[2];
span.end = 1;
}
#endif /* LARGE || ATTENUATE || SMOOTH */
ASSERT(span->end > 0);
ASSERT(span.end > 0);
#if FLAGS & (TEXTURE | SPRITE)
if (ctx->Texture._EnabledUnits)
_mesa_write_texture_span(ctx, span);
_mesa_write_texture_span(ctx, &span);
else
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
#elif FLAGS & RGBA
_mesa_write_rgba_span(ctx, span);
_mesa_write_rgba_span(ctx, &span);
#else
_mesa_write_index_span(ctx, span);
_mesa_write_index_span(ctx, &span);
#endif
}

View file

@ -1,4 +1,4 @@
/* $Id: s_span.c,v 1.45 2002/07/09 01:22:52 brianp Exp $ */
/* $Id: s_span.c,v 1.46 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -154,7 +154,7 @@ interpolate_colors(GLcontext *ctx, struct sw_span *span)
const GLint db = span->blueStep;
const GLint da = span->alphaStep;
const GLuint n = span->end;
GLchan (*rgba)[4] = span->color.rgba;
GLchan (*rgba)[4] = span->array->rgba;
GLuint i;
ASSERT((span->interpMask & SPAN_RGBA) &&
@ -168,7 +168,7 @@ interpolate_colors(GLcontext *ctx, struct sw_span *span)
color[BCOMP] = FixedToChan(b);
color[ACOMP] = FixedToChan(a);
for (i = 0; i < n; i++) {
COPY_CHAN4(span->color.rgba[i], color);
COPY_CHAN4(span->array->rgba[i], color);
}
}
else {
@ -195,7 +195,7 @@ interpolate_indexes(GLcontext *ctx, struct sw_span *span)
GLfixed index = span->index;
const GLint indexStep = span->indexStep;
const GLuint n = span->end;
GLuint *indexes = span->color.index;
GLuint *indexes = span->array->index;
GLuint i;
ASSERT((span->interpMask & SPAN_INDEX) &&
!(span->arrayMask & SPAN_INDEX));
@ -218,7 +218,7 @@ interpolate_indexes(GLcontext *ctx, struct sw_span *span)
}
/* Fill in the span.specArray array from the interpolation values */
/* Fill in the span.->array->spec array from the interpolation values */
static void
interpolate_specular(GLcontext *ctx, struct sw_span *span)
{
@ -229,9 +229,9 @@ interpolate_specular(GLcontext *ctx, struct sw_span *span)
const GLchan b = FixedToChan(span->specBlue);
GLuint i;
for (i = 0; i < span->end; i++) {
span->specArray[i][RCOMP] = r;
span->specArray[i][GCOMP] = g;
span->specArray[i][BCOMP] = b;
span->array->spec[i][RCOMP] = r;
span->array->spec[i][GCOMP] = g;
span->array->spec[i][BCOMP] = b;
}
}
else {
@ -247,9 +247,9 @@ interpolate_specular(GLcontext *ctx, struct sw_span *span)
#endif
GLuint i;
for (i = 0; i < span->end; i++) {
span->specArray[i][RCOMP] = FixedToChan(r);
span->specArray[i][GCOMP] = FixedToChan(g);
span->specArray[i][BCOMP] = FixedToChan(b);
span->array->spec[i][RCOMP] = FixedToChan(r);
span->array->spec[i][GCOMP] = FixedToChan(g);
span->array->spec[i][BCOMP] = FixedToChan(b);
r += span->specRedStep;
g += span->specGreenStep;
b += span->specBlueStep;
@ -271,16 +271,18 @@ _mesa_span_interpolate_z( const GLcontext *ctx, struct sw_span *span )
if (ctx->Visual.depthBits <= 16) {
GLfixed zval = span->z;
for (i = 0; i < n; i++) {
span->zArray[i] = FixedToInt(zval);
GLdepth *z = span->array->z;
for (i = 0; i < n; i++) {
z[i] = FixedToInt(zval);
zval += span->zStep;
}
}
else {
/* Deep Z buffer, no fixed->int shift */
GLfixed zval = span->z;
GLdepth *z = span->array->z;
for (i = 0; i < n; i++) {
span->zArray[i] = zval;
z[i] = zval;
zval += span->zStep;
}
}
@ -355,6 +357,8 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
const struct gl_texture_image *img = obj->Image[obj->BaseLevel];
GLboolean needLambda = (obj->MinFilter != obj->MagFilter);
if (needLambda) {
GLfloat (*texcoord)[4] = span->array->texcoords[u];
GLfloat *lambda = span->array->lambda[u];
const GLfloat texW = (GLfloat) img->WidthScale;
const GLfloat texH = (GLfloat) img->HeightScale;
const GLfloat dsdx = span->texStepX[u][0];
@ -371,12 +375,12 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
GLuint i;
for (i = 0; i < span->end; i++) {
const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);
span->texcoords[u][i][0] = s * invQ;
span->texcoords[u][i][1] = t * invQ;
span->texcoords[u][i][2] = r * invQ;
span->lambda[u][i] = compute_lambda(dsdx, dsdy, dtdx, dtdy,
dqdx, dqdy, texW, texH,
s, t, q, invQ);
texcoord[i][0] = s * invQ;
texcoord[i][1] = t * invQ;
texcoord[i][2] = r * invQ;
lambda[i] = compute_lambda(dsdx, dsdy, dtdx, dtdy,
dqdx, dqdy, texW, texH,
s, t, q, invQ);
s += dsdx;
t += dtdx;
r += drdx;
@ -385,6 +389,8 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
span->arrayMask |= SPAN_LAMBDA;
}
else {
GLfloat (*texcoord)[4] = span->array->texcoords[u];
GLfloat *lambda = span->array->lambda[u];
const GLfloat dsdx = span->texStepX[u][0];
const GLfloat dtdx = span->texStepX[u][1];
const GLfloat drdx = span->texStepX[u][2];
@ -398,10 +404,10 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
/* Ortho projection or polygon's parallel to window X axis */
const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);
for (i = 0; i < span->end; i++) {
span->texcoords[u][i][0] = s * invQ;
span->texcoords[u][i][1] = t * invQ;
span->texcoords[u][i][2] = r * invQ;
span->lambda[u][i] = 0.0;
texcoord[i][0] = s * invQ;
texcoord[i][1] = t * invQ;
texcoord[i][2] = r * invQ;
lambda[i] = 0.0;
s += dsdx;
t += dtdx;
r += drdx;
@ -410,10 +416,10 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
else {
for (i = 0; i < span->end; i++) {
const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);
span->texcoords[u][i][0] = s * invQ;
span->texcoords[u][i][1] = t * invQ;
span->texcoords[u][i][2] = r * invQ;
span->lambda[u][i] = 0.0;
texcoord[i][0] = s * invQ;
texcoord[i][1] = t * invQ;
texcoord[i][2] = r * invQ;
lambda[i] = 0.0;
s += dsdx;
t += dtdx;
r += drdx;
@ -432,6 +438,8 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
span->arrayMask |= SPAN_TEXTURE;
if (needLambda) {
/* just texture unit 0, with lambda */
GLfloat (*texcoord)[4] = span->array->texcoords[0];
GLfloat *lambda = span->array->lambda[0];
const GLfloat texW = (GLfloat) img->WidthScale;
const GLfloat texH = (GLfloat) img->HeightScale;
const GLfloat dsdx = span->texStepX[0][0];
@ -448,12 +456,12 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
GLuint i;
for (i = 0; i < span->end; i++) {
const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);
span->lambda[0][i] = compute_lambda(dsdx, dsdy, dtdx, dtdy,
dqdx, dqdy, texW, texH,
s, t, q, invQ);
span->texcoords[0][i][0] = s * invQ;
span->texcoords[0][i][1] = t * invQ;
span->texcoords[0][i][2] = r * invQ;
lambda[i] = compute_lambda(dsdx, dsdy, dtdx, dtdy,
dqdx, dqdy, texW, texH,
s, t, q, invQ);
texcoord[i][0] = s * invQ;
texcoord[i][1] = t * invQ;
texcoord[i][2] = r * invQ;
s += dsdx;
t += dtdx;
r += drdx;
@ -463,6 +471,7 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
}
else {
/* just texture 0, without lambda */
GLfloat (*texcoord)[4] = span->array->texcoords[0];
const GLfloat dsdx = span->texStepX[0][0];
const GLfloat dtdx = span->texStepX[0][1];
const GLfloat drdx = span->texStepX[0][2];
@ -476,9 +485,9 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
/* Ortho projection or polygon's parallel to window X axis */
const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);
for (i = 0; i < span->end; i++) {
span->texcoords[0][i][0] = s * invQ;
span->texcoords[0][i][1] = t * invQ;
span->texcoords[0][i][2] = r * invQ;
texcoord[i][0] = s * invQ;
texcoord[i][1] = t * invQ;
texcoord[i][2] = r * invQ;
s += dsdx;
t += dtdx;
r += drdx;
@ -487,9 +496,9 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)
else {
for (i = 0; i < span->end; i++) {
const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);
span->texcoords[0][i][0] = s * invQ;
span->texcoords[0][i][1] = t * invQ;
span->texcoords[0][i][2] = r * invQ;
texcoord[i][0] = s * invQ;
texcoord[i][1] = t * invQ;
texcoord[i][2] = r * invQ;
s += dsdx;
t += dtdx;
r += drdx;
@ -509,6 +518,7 @@ stipple_polygon_span( GLcontext *ctx, struct sw_span *span )
{
const GLuint highbit = 0x80000000;
const GLuint stipple = ctx->PolygonStipple[span->y % 32];
GLubyte *mask = span->array->mask;
GLuint i, m;
ASSERT(ctx->Polygon.StippleFlag);
@ -518,7 +528,7 @@ stipple_polygon_span( GLcontext *ctx, struct sw_span *span )
for (i = 0; i < span->end; i++) {
if ((m & stipple) == 0) {
span->mask[i] = 0;
mask[i] = 0;
}
m = m >> 1;
if (m == 0) {
@ -546,10 +556,10 @@ clip_span( GLcontext *ctx, struct sw_span *span )
if (span->arrayMask & SPAN_XY) {
/* arrays of x/y pixel coords */
const GLint *x = span->xArray;
const GLint *y = span->yArray;
const GLint *x = span->array->x;
const GLint *y = span->array->y;
const GLint n = span->end;
GLubyte *mask = span->mask;
GLubyte *mask = span->array->mask;
GLint i;
if (span->arrayMask & SPAN_MASK) {
/* note: using & intead of && to reduce branches */
@ -583,7 +593,7 @@ clip_span( GLcontext *ctx, struct sw_span *span )
if (x < xmin) {
ASSERT(x + n > xmin);
span->writeAll = GL_FALSE;
BZERO(span->mask, (xmin - x) * sizeof(GLubyte));
BZERO(span->array->mask, (xmin - x) * sizeof(GLubyte));
}
/* Clip to right */
@ -623,7 +633,7 @@ multi_write_index_span( GLcontext *ctx, struct sw_span *span )
(*swrast->Driver.SetBuffer)(ctx, ctx->DrawBuffer, GL_BACK_RIGHT);
/* make copy of incoming indexes */
MEMCPY( indexTmp, span->color.index, span->end * sizeof(GLuint) );
MEMCPY( indexTmp, span->array->index, span->end * sizeof(GLuint) );
if (ctx->Color.IndexLogicOpEnabled) {
_mesa_logicop_ci_span(ctx, span, indexTmp);
@ -636,13 +646,13 @@ multi_write_index_span( GLcontext *ctx, struct sw_span *span )
if (span->arrayMask & SPAN_XY) {
/* array of pixel coords */
(*swrast->Driver.WriteCI32Pixels)(ctx, span->end,
span->xArray, span->yArray,
indexTmp, span->mask);
span->array->x, span->array->y,
indexTmp, span->array->mask);
}
else {
/* horizontal run of pixels */
(*swrast->Driver.WriteCI32Span)(ctx, span->end, span->x, span->y,
indexTmp, span->mask);
indexTmp, span->array->mask);
}
}
}
@ -693,7 +703,7 @@ multi_write_rgba_span( GLcontext *ctx, struct sw_span *span )
}
/* make copy of incoming colors */
MEMCPY( rgbaTmp, span->color.rgba, 4 * span->end * sizeof(GLchan) );
MEMCPY( rgbaTmp, span->array->rgba, 4 * span->end * sizeof(GLchan) );
if (ctx->Color.ColorLogicOpEnabled) {
_mesa_logicop_rgba_span(ctx, span, rgbaTmp);
@ -709,25 +719,25 @@ multi_write_rgba_span( GLcontext *ctx, struct sw_span *span )
if (span->arrayMask & SPAN_XY) {
/* array of pixel coords */
(*swrast->Driver.WriteRGBAPixels)(ctx, span->end,
span->xArray, span->yArray,
span->array->x, span->array->y,
(const GLchan (*)[4]) rgbaTmp,
span->mask);
span->array->mask);
if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_pixels(ctx, span->end,
span->xArray, span->yArray,
span->array->x, span->array->y,
(const GLchan (*)[4]) rgbaTmp,
span->mask);
span->array->mask);
}
}
else {
/* horizontal run of pixels */
(*swrast->Driver.WriteRGBASpan)(ctx, span->end, span->x, span->y,
(const GLchan (*)[4]) rgbaTmp,
span->mask);
span->array->mask);
if (swrast->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_span(ctx, span->end, span->x, span->y,
(const GLchan (*)[4]) rgbaTmp,
span->mask);
span->array->mask);
}
}
}
@ -762,7 +772,7 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
span->writeAll = GL_FALSE;
}
else {
MEMSET(span->mask, 1, span->end);
MEMSET(span->array->mask, 1, span->end);
span->writeAll = GL_TRUE;
}
@ -777,11 +787,11 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
if (span->arrayMask & SPAN_XY) {
GLuint i;
for (i = 0; i < span->end; i++) {
if (span->mask[i]) {
assert(span->xArray[i] >= ctx->DrawBuffer->_Xmin);
assert(span->xArray[i] < ctx->DrawBuffer->_Xmax);
assert(span->yArray[i] >= ctx->DrawBuffer->_Ymin);
assert(span->yArray[i] < ctx->DrawBuffer->_Ymax);
if (span->array->mask[i]) {
assert(span->array->x[i] >= ctx->DrawBuffer->_Xmin);
assert(span->array->x[i] < ctx->DrawBuffer->_Xmax);
assert(span->array->y[i] >= ctx->DrawBuffer->_Ymin);
assert(span->array->y[i] < ctx->DrawBuffer->_Ymax);
}
}
}
@ -837,10 +847,11 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
/* Antialias coverage application */
if (span->arrayMask & SPAN_COVERAGE) {
GLuint i;
GLuint *index = span->color.index;
GLuint *index = span->array->index;
GLfloat *coverage = span->array->coverage;
for (i = 0; i < span->end; i++) {
ASSERT(span->coverage[i] < 16);
index[i] = (index[i] & ~0xf) | ((GLuint) (span->coverage[i]));
ASSERT(coverage[i] < 16);
index[i] = (index[i] & ~0xf) | ((GLuint) coverage[i]);
}
}
@ -851,11 +862,11 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
else {
/* normal situation: draw to exactly one buffer */
if (ctx->Color.IndexLogicOpEnabled) {
_mesa_logicop_ci_span(ctx, span, span->color.index);
_mesa_logicop_ci_span(ctx, span, span->array->index);
}
if (ctx->Color.IndexMask != 0xffffffff) {
_mesa_mask_index_span(ctx, span, span->color.index);
_mesa_mask_index_span(ctx, span, span->array->index);
}
/* write pixels */
@ -864,14 +875,14 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
if ((span->interpMask & SPAN_INDEX) && span->indexStep == 0) {
/* all pixels have same color index */
(*swrast->Driver.WriteMonoCIPixels)(ctx, span->end,
span->xArray, span->yArray,
span->array->x, span->array->y,
FixedToInt(span->index),
span->mask);
span->array->mask);
}
else {
(*swrast->Driver.WriteCI32Pixels)(ctx, span->end, span->xArray,
span->yArray, span->color.index,
span->mask );
(*swrast->Driver.WriteCI32Pixels)(ctx, span->end, span->array->x,
span->array->y, span->array->index,
span->array->mask );
}
}
else {
@ -880,11 +891,12 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
/* all pixels have same color index */
(*swrast->Driver.WriteMonoCISpan)(ctx, span->end, span->x, span->y,
FixedToInt(span->index),
span->mask);
span->array->mask);
}
else {
(*swrast->Driver.WriteCI32Span)(ctx, span->end, span->x, span->y,
span->color.index, span->mask);
span->array->index,
span->array->mask);
}
}
}
@ -920,16 +932,12 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
ASSERT((span->interpMask | span->arrayMask) & SPAN_Z);
#endif
/*
printf("%s() interp 0x%x array 0x%x p=0x%x\n", __FUNCTION__, span->interpMask, span->arrayMask, span->primitive);
*/
if (span->arrayMask & SPAN_MASK) {
/* mask was initialized by caller, probably glBitmap */
span->writeAll = GL_FALSE;
}
else {
MEMSET(span->mask, 1, span->end);
MEMSET(span->array->mask, 1, span->end);
span->writeAll = GL_TRUE;
}
@ -949,11 +957,11 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
if (span->arrayMask & SPAN_XY) {
GLuint i;
for (i = 0; i < span->end; i++) {
if (span->mask[i]) {
assert(span->xArray[i] >= ctx->DrawBuffer->_Xmin);
assert(span->xArray[i] < ctx->DrawBuffer->_Xmax);
assert(span->yArray[i] >= ctx->DrawBuffer->_Ymin);
assert(span->yArray[i] < ctx->DrawBuffer->_Ymax);
if (span->array->mask[i]) {
assert(span->array->x[i] >= ctx->DrawBuffer->_Xmin);
assert(span->array->x[i] < ctx->DrawBuffer->_Xmax);
assert(span->array->y[i] >= ctx->DrawBuffer->_Ymin);
assert(span->array->y[i] < ctx->DrawBuffer->_Ymax);
}
}
}
@ -1022,10 +1030,11 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
/* Antialias coverage application */
if (span->arrayMask & SPAN_COVERAGE) {
GLchan (*rgba)[4] = span->color.rgba;
GLchan (*rgba)[4] = span->array->rgba;
GLfloat *coverage = span->array->coverage;
GLuint i;
for (i = 0; i < span->end; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]);
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]);
}
monoColor = GL_FALSE;
}
@ -1036,17 +1045,17 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
else {
/* normal: write to exactly one buffer */
if (ctx->Color.ColorLogicOpEnabled) {
_mesa_logicop_rgba_span(ctx, span, span->color.rgba);
_mesa_logicop_rgba_span(ctx, span, span->array->rgba);
monoColor = GL_FALSE;
}
else if (ctx->Color.BlendEnabled) {
_mesa_blend_span(ctx, span, span->color.rgba);
_mesa_blend_span(ctx, span, span->array->rgba);
monoColor = GL_FALSE;
}
/* Color component masking */
if (colorMask != 0xffffffff) {
_mesa_mask_rgba_span(ctx, span, span->color.rgba);
_mesa_mask_rgba_span(ctx, span, span->array->rgba);
monoColor = GL_FALSE;
}
@ -1054,13 +1063,13 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
if (span->arrayMask & SPAN_XY) {
/* array of pixel coords */
/* XXX test for mono color */
(*swrast->Driver.WriteRGBAPixels)(ctx, span->end, span->xArray,
span->yArray, (const GLchan (*)[4]) span->color.rgba, span->mask);
(*swrast->Driver.WriteRGBAPixels)(ctx, span->end, span->array->x,
span->array->y, (const GLchan (*)[4]) span->array->rgba, span->array->mask);
if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_pixels(ctx, span->end,
span->xArray, span->yArray,
(const GLchan (*)[4]) span->color.rgba,
span->mask);
span->array->x, span->array->y,
(const GLchan (*)[4]) span->array->rgba,
span->array->mask);
}
}
else {
@ -1073,18 +1082,18 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
color[BCOMP] = FixedToChan(span->blue);
color[ACOMP] = FixedToChan(span->alpha);
(*swrast->Driver.WriteMonoRGBASpan)(ctx, span->end, span->x,
span->y, color, span->mask);
span->y, color, span->array->mask);
/* XXX software alpha buffer writes! */
}
else {
/* each pixel is a different color */
(*swrast->Driver.WriteRGBASpan)(ctx, span->end, span->x, span->y,
(const GLchan (*)[4]) span->color.rgba,
span->writeAll ? ((const GLubyte *) NULL) : span->mask);
(const GLchan (*)[4]) span->array->rgba,
span->writeAll ? ((const GLubyte *) NULL) : span->array->mask);
if (swrast->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_span(ctx, span->end, span->x, span->y,
(const GLchan (*)[4]) span->color.rgba,
span->writeAll ? ((const GLubyte *) NULL) : span->mask);
(const GLchan (*)[4]) span->array->rgba,
span->writeAll ? ((const GLubyte *) NULL) : span->array->mask);
}
}
}
@ -1148,7 +1157,7 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span)
span->writeAll = GL_FALSE;
}
else {
MEMSET(span->mask, 1, span->end);
MEMSET(span->array->mask, 1, span->end);
span->writeAll = GL_TRUE;
}
@ -1163,11 +1172,11 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span)
if (span->arrayMask & SPAN_XY) {
GLuint i;
for (i = 0; i < span->end; i++) {
if (span->mask[i]) {
assert(span->xArray[i] >= ctx->DrawBuffer->_Xmin);
assert(span->xArray[i] < ctx->DrawBuffer->_Xmax);
assert(span->yArray[i] >= ctx->DrawBuffer->_Ymin);
assert(span->yArray[i] < ctx->DrawBuffer->_Ymax);
if (span->array->mask[i]) {
assert(span->array->x[i] >= ctx->DrawBuffer->_Xmin);
assert(span->array->x[i] < ctx->DrawBuffer->_Xmax);
assert(span->array->y[i] >= ctx->DrawBuffer->_Ymin);
assert(span->array->y[i] < ctx->DrawBuffer->_Ymax);
}
}
}
@ -1255,7 +1264,7 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span)
interpolate_specular(ctx, span);
}
ASSERT(span->arrayMask & SPAN_SPEC);
add_colors( span->end, span->color.rgba, span->specArray );
add_colors( span->end, span->array->rgba, span->array->spec );
}
/* Fog */
@ -1265,10 +1274,11 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span)
/* Antialias coverage application */
if (span->arrayMask & SPAN_COVERAGE) {
GLchan (*rgba)[4] = span->color.rgba;
GLchan (*rgba)[4] = span->array->rgba;
GLfloat *coverage = span->array->coverage;
GLuint i;
for (i = 0; i < span->end; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]);
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]);
}
}
@ -1278,37 +1288,37 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span)
else {
/* normal: write to exactly one buffer */
if (ctx->Color.ColorLogicOpEnabled) {
_mesa_logicop_rgba_span(ctx, span, span->color.rgba);
_mesa_logicop_rgba_span(ctx, span, span->array->rgba);
}
else if (ctx->Color.BlendEnabled) {
_mesa_blend_span(ctx, span, span->color.rgba);
_mesa_blend_span(ctx, span, span->array->rgba);
}
if (colorMask != 0xffffffff) {
_mesa_mask_rgba_span(ctx, span, span->color.rgba);
_mesa_mask_rgba_span(ctx, span, span->array->rgba);
}
if (span->arrayMask & SPAN_XY) {
/* array of pixel coords */
(*swrast->Driver.WriteRGBAPixels)(ctx, span->end, span->xArray,
span->yArray, (const GLchan (*)[4]) span->color.rgba, span->mask);
(*swrast->Driver.WriteRGBAPixels)(ctx, span->end, span->array->x,
span->array->y, (const GLchan (*)[4]) span->array->rgba, span->array->mask);
if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_pixels(ctx, span->end,
span->xArray, span->yArray,
(const GLchan (*)[4]) span->color.rgba,
span->mask);
span->array->x, span->array->y,
(const GLchan (*)[4]) span->array->rgba,
span->array->mask);
}
}
else {
/* horizontal run of pixels */
(*swrast->Driver.WriteRGBASpan)(ctx, span->end, span->x, span->y,
(const GLchan (*)[4]) span->color.rgba,
span->writeAll ? NULL : span->mask);
(const GLchan (*)[4]) span->array->rgba,
span->writeAll ? NULL : span->array->mask);
if (swrast->_RasterMask & ALPHABUF_BIT) {
_mesa_write_alpha_span(ctx, span->end, span->x, span->y,
(const GLchan (*)[4]) span->color.rgba,
span->writeAll ? NULL : span->mask);
(const GLchan (*)[4]) span->array->rgba,
span->writeAll ? NULL : span->array->mask);
}
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_stencil.c,v 1.24 2002/04/20 17:54:55 brianp Exp $ */
/* $Id: s_stencil.c,v 1.25 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -420,7 +420,7 @@ stencil_and_ztest_span(GLcontext *ctx, struct sw_span *span)
const GLuint n = span->end;
const GLint x = span->x;
const GLint y = span->y;
GLubyte *mask = span->mask;
GLubyte *mask = span->array->mask;
ASSERT((span->arrayMask & SPAN_XY) == 0);
ASSERT(ctx->Stencil.Enabled);
@ -893,9 +893,9 @@ static GLboolean
stencil_and_ztest_pixels( GLcontext *ctx, struct sw_span *span )
{
const GLuint n = span->end;
const GLint *x = span->xArray;
const GLint *y = span->yArray;
GLubyte *mask = span->mask;
const GLint *x = span->array->x;
const GLint *y = span->array->y;
GLubyte *mask = span->array->mask;
SWcontext *swrast = SWRAST_CONTEXT(ctx);
ASSERT(span->arrayMask & SPAN_XY);

View file

@ -1,4 +1,4 @@
/* $Id: s_texture.c,v 1.64 2002/06/26 14:56:20 brianp Exp $ */
/* $Id: s_texture.c,v 1.65 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -3604,7 +3604,7 @@ _swrast_texture_span( GLcontext *ctx, struct sw_span *span )
* Save copy of the incoming fragment colors (the GL_PRIMARY_COLOR)
*/
if (swrast->_AnyTextureCombine)
MEMCPY(primary_rgba, span->color.rgba, 4 * span->end * sizeof(GLchan));
MEMCPY(primary_rgba, span->array->rgba, 4 * span->end * sizeof(GLchan));
/*
* Must do all texture sampling before combining in order to
@ -3614,7 +3614,7 @@ _swrast_texture_span( GLcontext *ctx, struct sw_span *span )
if (ctx->Texture.Unit[unit]._ReallyEnabled) {
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
const struct gl_texture_object *curObj = texUnit->_Current;
GLfloat *lambda = span->lambda[unit];
GLfloat *lambda = span->array->lambda[unit];
GLchan (*texels)[4] = (GLchan (*)[4])
(swrast->TexelBuffer + unit * (span->end * 4 * sizeof(GLchan)));
@ -3642,7 +3642,7 @@ _swrast_texture_span( GLcontext *ctx, struct sw_span *span )
/* Sample the texture (span->end fragments) */
swrast->TextureSample[unit]( ctx, unit, texUnit->_Current,
span->end, span->texcoords[unit],
span->end, span->array->texcoords[unit],
lambda, texels );
}
}
@ -3659,14 +3659,14 @@ _swrast_texture_span( GLcontext *ctx, struct sw_span *span )
texture_combine( ctx, unit, span->end,
(CONST GLchan (*)[4]) primary_rgba,
swrast->TexelBuffer,
span->color.rgba );
span->array->rgba );
}
else if (texUnit->EnvMode == GL_COMBINE4_NV) {
/* GL_NV_texture_env_combine4 */
texture_combine4( ctx, unit, span->end,
(CONST GLchan (*)[4]) primary_rgba,
swrast->TexelBuffer,
span->color.rgba );
span->array->rgba );
}
else {
/* conventional texture blend */
@ -3675,7 +3675,7 @@ _swrast_texture_span( GLcontext *ctx, struct sw_span *span )
(span->end * 4 * sizeof(GLchan)));
texture_apply( ctx, texUnit, span->end,
(CONST GLchan (*)[4]) primary_rgba, texels,
span->color.rgba );
span->array->rgba );
}
}
}

View file

@ -1,4 +1,4 @@
/* $Id: s_triangle.c,v 1.60 2002/07/09 01:22:52 brianp Exp $ */
/* $Id: s_triangle.c,v 1.61 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -49,7 +49,9 @@
#include "s_triangle.h"
/*
* Just used for feedback mode.
*/
GLboolean _mesa_cull_triangle( GLcontext *ctx,
const SWvertex *v0,
const SWvertex *v1,
@ -81,11 +83,11 @@ static void flat_ci_triangle( GLcontext *ctx,
#define INTERP_FOG 1
#define SETUP_CODE \
span->interpMask |= SPAN_INDEX; \
span->index = IntToFixed(v2->index); \
span->indexStep = 0;
span.interpMask |= SPAN_INDEX; \
span.index = IntToFixed(v2->index); \
span.indexStep = 0;
#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, span);
#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, &span);
#include "s_tritemp.h"
}
@ -104,7 +106,7 @@ static void smooth_ci_triangle( GLcontext *ctx,
#define INTERP_FOG 1
#define INTERP_INDEX 1
#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, span);
#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, &span);
#include "s_tritemp.h"
}
@ -126,17 +128,17 @@ static void flat_rgba_triangle( GLcontext *ctx,
#define SETUP_CODE \
ASSERT(ctx->Texture._EnabledUnits == 0); \
ASSERT(ctx->Light.ShadeModel==GL_FLAT); \
span->interpMask |= SPAN_RGBA; \
span->red = ChanToFixed(v2->color[0]); \
span->green = ChanToFixed(v2->color[1]); \
span->blue = ChanToFixed(v2->color[2]); \
span->alpha = ChanToFixed(v2->color[3]); \
span->redStep = 0; \
span->greenStep = 0; \
span->blueStep = 0; \
span->alphaStep = 0;
span.interpMask |= SPAN_RGBA; \
span.red = ChanToFixed(v2->color[0]); \
span.green = ChanToFixed(v2->color[1]); \
span.blue = ChanToFixed(v2->color[2]); \
span.alpha = ChanToFixed(v2->color[3]); \
span.redStep = 0; \
span.greenStep = 0; \
span.blueStep = 0; \
span.alphaStep = 0;
#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, span);
#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, &span);
#include "s_tritemp.h"
}
@ -165,7 +167,7 @@ static void smooth_rgba_triangle( GLcontext *ctx,
ASSERT(ctx->Light.ShadeModel==GL_SMOOTH); \
}
#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, span);
#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, &span);
#include "s_tritemp.h"
@ -204,21 +206,21 @@ static void simple_textured_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
span->intTex[0] -= FIXED_HALF; /* off-by-one error? */ \
span->intTex[1] -= FIXED_HALF; \
for (i = 0; i < span->end; i++) { \
GLint s = FixedToInt(span->intTex[0]) & smask; \
GLint t = FixedToInt(span->intTex[1]) & tmask; \
span.intTex[0] -= FIXED_HALF; /* off-by-one error? */ \
span.intTex[1] -= FIXED_HALF; \
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 */ \
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]; \
span.array->rgb[i][RCOMP] = texture[pos]; \
span.array->rgb[i][GCOMP] = texture[pos+1]; \
span.array->rgb[i][BCOMP] = texture[pos+2]; \
span.intTex[0] += span.intTexStep[0]; \
span.intTex[1] += span.intTexStep[1]; \
} \
(*swrast->Driver.WriteRGBSpan)(ctx, span->end, span->x, span->y, \
(CONST GLchan (*)[3]) span->color.rgb,\
(*swrast->Driver.WriteRGBSpan)(ctx, span.end, span.x, span.y, \
(CONST GLchan (*)[3]) span.array->rgb,\
NULL );
#include "s_tritemp.h"
@ -260,31 +262,31 @@ static void simple_z_textured_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
span->intTex[0] -= FIXED_HALF; /* off-by-one error? */ \
span->intTex[1] -= FIXED_HALF; \
for (i = 0; i < span->end; i++) { \
const GLdepth z = FixedToDepth(span->z); \
span.intTex[0] -= FIXED_HALF; /* off-by-one error? */ \
span.intTex[1] -= FIXED_HALF; \
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 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 */ \
span->color.rgb[i][RCOMP] = texture[pos]; \
span->color.rgb[i][GCOMP] = texture[pos+1]; \
span->color.rgb[i][BCOMP] = texture[pos+2]; \
span.array->rgb[i][RCOMP] = texture[pos]; \
span.array->rgb[i][GCOMP] = texture[pos+1]; \
span.array->rgb[i][BCOMP] = texture[pos+2]; \
zRow[i] = z; \
span->mask[i] = 1; \
span.array->mask[i] = 1; \
} \
else { \
span->mask[i] = 0; \
span.array->mask[i] = 0; \
} \
span->intTex[0] += span->intTexStep[0]; \
span->intTex[1] += span->intTexStep[1]; \
span->z += span->zStep; \
span.intTex[0] += span.intTexStep[0]; \
span.intTex[1] += span.intTexStep[1]; \
span.z += span.zStep; \
} \
(*swrast->Driver.WriteRGBSpan)(ctx, span->end, span->x, span->y, \
(CONST GLchan (*)[3]) span->color.rgb,\
span->mask );
(*swrast->Driver.WriteRGBSpan)(ctx, span.end, span.x, span.y, \
(CONST GLchan (*)[3]) span.array->rgb,\
span.array->mask );
#include "s_tritemp.h"
}
@ -452,7 +454,7 @@ affine_span(GLcontext *ctx, struct sw_span *span,
GLuint i;
GLchan *dest = span->color.rgba[0];
GLchan *dest = span->array->rgba[0];
span->intTex[0] -= FIXED_HALF;
span->intTex[1] -= FIXED_HALF;
@ -589,7 +591,7 @@ static void affine_textured_triangle( GLcontext *ctx,
info.format = obj->Image[b]->Format; \
info.filter = obj->MinFilter; \
info.envmode = unit->EnvMode; \
span->arrayMask |= SPAN_RGBA; \
span.arrayMask |= SPAN_RGBA; \
\
if (info.envmode == GL_BLEND) { \
/* potential off-by-one error here? (1.0f -> 2048 -> 0) */ \
@ -624,7 +626,7 @@ static void affine_textured_triangle( GLcontext *ctx,
} \
info.tsize = obj->Image[b]->Height * info.tbytesline;
#define RENDER_SPAN( span ) affine_span(ctx, span, &info);
#define RENDER_SPAN( span ) affine_span(ctx, &span, &info);
#include "s_tritemp.h"
@ -719,7 +721,7 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span,
GLuint i;
GLfloat tex_coord[3], tex_step[3];
GLchan *dest = span->color.rgba[0];
GLchan *dest = span->array->rgba[0];
tex_coord[0] = span->tex[0][0] * (info->smask + 1);
tex_step[0] = span->texStepX[0][0] * (info->smask + 1);
@ -824,7 +826,6 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span,
ASSERT(span->arrayMask & SPAN_RGBA);
_mesa_write_rgba_span(ctx, span);
#undef SPAN_NEAREST
#undef SPAN_LINEAR
}
@ -895,9 +896,9 @@ static void persp_textured_triangle( GLcontext *ctx,
info.tsize = obj->Image[b]->Height * info.tbytesline;
#define RENDER_SPAN( span ) \
span->interpMask &= ~SPAN_RGBA; \
span->arrayMask |= SPAN_RGBA; \
fast_persp_span(ctx, span, &info);
span.interpMask &= ~SPAN_RGBA; \
span.arrayMask |= SPAN_RGBA; \
fast_persp_span(ctx, &span, &info);
#include "s_tritemp.h"
@ -926,7 +927,7 @@ static void general_textured_triangle( GLcontext *ctx,
#define INTERP_ALPHA 1
#define INTERP_TEX 1
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, span);
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span);
#include "s_tritemp.h"
}
@ -953,7 +954,7 @@ multitextured_triangle( GLcontext *ctx,
#define INTERP_SPEC 1
#define INTERP_MULTITEX 1
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, span);
#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span);
#include "s_tritemp.h"
@ -975,13 +976,13 @@ static void occlusion_zless_triangle( GLcontext *ctx,
#define RENDER_SPAN( span ) \
GLuint i; \
for (i = 0; i < span->end; 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; \
} \
span->z += span->zStep; \
span.z += span.zStep; \
}
#include "s_tritemp.h"

View file

@ -1,4 +1,4 @@
/* $Id: s_zoom.c,v 1.16 2002/04/19 14:05:50 brianp Exp $ */
/* $Id: s_zoom.c,v 1.17 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -48,16 +48,19 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
const GLuint maxWidth = MIN2( ctx->DrawBuffer->Width, MAX_WIDTH );
GLchan rgbaSave[MAX_WIDTH][4];
GLuint indexSave[MAX_WIDTH];
struct sw_span zoomed;
const GLchan (*rgba)[4] = (const GLchan (*)[4]) src;
const GLchan (*rgb)[3] = (const GLchan (*)[3]) src;
const GLuint *indexes = (const GLuint *) src;
struct sw_span zoomed;
struct span_arrays zoomed_arrays; /* this is big! */
/* no pixel arrays! */
ASSERT((span->arrayMask & SPAN_XY) == 0);
ASSERT(span->primitive == GL_BITMAP);
INIT_SPAN((&zoomed), GL_BITMAP, 0, 0, 0);
INIT_SPAN(zoomed, GL_BITMAP, 0, 0, 0);
zoomed.array = &zoomed_arrays;
if (format == GL_RGBA || format == GL_RGB) {
zoomed.z = span->z;
zoomed.zStep = span->z;
@ -141,7 +144,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
/* common case */
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
i = span->end - (j + skipCol) - 1;
COPY_CHAN4(zoomed.color.rgba[j], rgba[i]);
COPY_CHAN4(zoomed.array->rgba[j], rgba[i]);
}
}
else {
@ -151,7 +154,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
i = (GLint) ((j + skipCol) * xscale);
if (i < 0)
i = span->end + i - 1;
COPY_CHAN4(zoomed.color.rgba[j], rgba[i]);
COPY_CHAN4(zoomed.array->rgba[j], rgba[i]);
}
}
}
@ -160,10 +163,10 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
/* common case */
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
i = span->end - (j + skipCol) - 1;
zoomed.color.rgba[j][0] = rgb[i][0];
zoomed.color.rgba[j][1] = rgb[i][1];
zoomed.color.rgba[j][2] = rgb[i][2];
zoomed.color.rgba[j][3] = CHAN_MAX;
zoomed.array->rgba[j][0] = rgb[i][0];
zoomed.array->rgba[j][1] = rgb[i][1];
zoomed.array->rgba[j][2] = rgb[i][2];
zoomed.array->rgba[j][3] = CHAN_MAX;
}
}
else {
@ -173,10 +176,10 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
i = (GLint) ((j + skipCol) * xscale);
if (i < 0)
i = span->end + i - 1;
zoomed.color.rgba[j][0] = rgb[i][0];
zoomed.color.rgba[j][1] = rgb[i][1];
zoomed.color.rgba[j][2] = rgb[i][2];
zoomed.color.rgba[j][3] = CHAN_MAX;
zoomed.array->rgba[j][0] = rgb[i][0];
zoomed.array->rgba[j][1] = rgb[i][1];
zoomed.array->rgba[j][2] = rgb[i][2];
zoomed.array->rgba[j][3] = CHAN_MAX;
}
}
}
@ -185,7 +188,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
/* common case */
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
i = span->end - (j + skipCol) - 1;
zoomed.color.index[j] = indexes[i];
zoomed.array->index[j] = indexes[i];
}
}
else {
@ -195,7 +198,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
i = (GLint) ((j + skipCol) * xscale);
if (i < 0)
i = span->end + i - 1;
zoomed.color.index[j] = indexes[i];
zoomed.array->index[j] = indexes[i];
}
}
}
@ -206,25 +209,25 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
* going to call _mesa_write_zoomed_span() more than once.
*/
if (r1 - r0 > 1) {
MEMCPY(rgbaSave, zoomed.color.rgba, zoomed.end * 4 * sizeof(GLchan));
MEMCPY(rgbaSave, zoomed.array->rgba, zoomed.end * 4 * sizeof(GLchan));
}
for (zoomed.y = r0; zoomed.y < r1; zoomed.y++) {
_mesa_write_rgba_span(ctx, &zoomed);
if (r1 - r0 > 1) {
/* restore the colors */
MEMCPY(zoomed.color.rgba, rgbaSave, zoomed.end*4 * sizeof(GLchan));
MEMCPY(zoomed.array->rgba, rgbaSave, zoomed.end*4 * sizeof(GLchan));
}
}
}
else if (format == GL_COLOR_INDEX) {
if (r1 - r0 > 1) {
MEMCPY(indexSave, zoomed.color.index, zoomed.end * sizeof(GLuint));
MEMCPY(indexSave, zoomed.array->index, zoomed.end * sizeof(GLuint));
}
for (zoomed.y = r0; zoomed.y < r1; zoomed.y++) {
_mesa_write_index_span(ctx, &zoomed);
if (r1 - r0 > 1) {
/* restore the colors */
MEMCPY(zoomed.color.index, indexSave, zoomed.end * sizeof(GLuint));
MEMCPY(zoomed.array->index, indexSave, zoomed.end * sizeof(GLuint));
}
}
}
@ -251,7 +254,7 @@ void
_mesa_write_zoomed_index_span( GLcontext *ctx, const struct sw_span *span,
GLint y0 )
{
zoom_span(ctx, span, (const GLvoid *) span->color.index, y0, GL_COLOR_INDEX);
zoom_span(ctx, span, (const GLvoid *) span->array->index, y0, GL_COLOR_INDEX);
}

View file

@ -1,4 +1,4 @@
/* $Id: swrast.h,v 1.25 2002/07/09 01:22:52 brianp Exp $ */
/* $Id: swrast.h,v 1.26 2002/08/07 00:45:07 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -112,6 +112,28 @@ typedef struct {
#define SPAN_MASK 0x800 /* arrayMask only */
struct span_arrays {
/**
* Arrays of fragment values. These will either be computed from the
* x/xStep values above or filled in by glDraw/CopyPixels, etc.
*/
GLchan rgb[MAX_WIDTH][3];
GLchan rgba[MAX_WIDTH][4];
GLuint index[MAX_WIDTH];
GLchan spec[MAX_WIDTH][4]; /* specular color */
GLint x[MAX_WIDTH]; /**< X/Y used for point/line rendering only */
GLint y[MAX_WIDTH]; /**< X/Y used for point/line rendering only */
GLdepth z[MAX_WIDTH];
GLfloat fog[MAX_WIDTH];
GLfloat texcoords[MAX_TEXTURE_UNITS][MAX_WIDTH][4];
GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH];
GLfloat coverage[MAX_WIDTH];
/** This mask indicates if fragment is alive or culled */
GLubyte mask[MAX_WIDTH];
};
struct sw_span {
GLint x, y;
@ -158,40 +180,28 @@ struct sw_span {
/**
* This bitmask (of SPAN_* flags) indicates which of the fragment arrays
* are relevant.
* in the span_arrays struct are relevant.
*/
GLuint arrayMask;
/**
* Arrays of fragment values. These will either be computed from the
* x/xStep values above or filled in by glDraw/CopyPixels, etc.
* We store the arrays of fragment values in a separate struct so
* that we can allocate sw_span structs on the stack without using
* a lot of memory. The span_arrays struct is about 400KB while the
* sw_span struct is only about 512 bytes.
*/
union {
GLchan rgb[MAX_WIDTH][3];
GLchan rgba[MAX_WIDTH][4];
GLuint index[MAX_WIDTH];
} color;
GLchan specArray[MAX_WIDTH][4];
GLint xArray[MAX_WIDTH]; /**< X/Y used for point/line rendering only */
GLint yArray[MAX_WIDTH]; /**< X/Y used for point/line rendering only */
GLdepth zArray[MAX_WIDTH];
GLfloat fogArray[MAX_WIDTH];
GLfloat texcoords[MAX_TEXTURE_UNITS][MAX_WIDTH][4];
GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH];
GLfloat coverage[MAX_WIDTH];
/** This mask indicates if fragment is alive or culled */
GLubyte mask[MAX_WIDTH];
struct span_arrays *array;
};
#define INIT_SPAN(S, PRIMITIVE, END, INTERP_MASK, ARRAY_MASK) \
do { \
S->primitive = (PRIMITIVE); \
S->interpMask = (INTERP_MASK); \
S->arrayMask = (ARRAY_MASK); \
S->start = 0; \
S->end = (END); \
#define INIT_SPAN(S, PRIMITIVE, END, INTERP_MASK, ARRAY_MASK) \
do { \
(S).primitive = (PRIMITIVE); \
(S).interpMask = (INTERP_MASK); \
(S).arrayMask = (ARRAY_MASK); \
(S).start = 0; \
(S).end = (END); \
(S).array = SWRAST_CONTEXT(ctx)->span_data; \
} while (0)