New triangle rasterization code. Store per-span initial/step values in the

new triangle_span struct.  Much cleaner code and possibilities for future
optimizations.
This commit is contained in:
Brian Paul 2001-05-14 16:23:04 +00:00
parent 9cf779e7ac
commit 9bf68ad963
5 changed files with 1892 additions and 1805 deletions

View file

@ -1,4 +1,4 @@
/* $Id: osmesa.c,v 1.54 2001/05/10 12:22:32 keithw Exp $ */
/* $Id: osmesa.c,v 1.55 2001/05/14 16:23:04 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -55,6 +55,7 @@
#include "swrast/s_depth.h"
#include "swrast/s_lines.h"
#include "swrast/s_triangle.h"
#include "swrast/s_trispan.h"
#include "tnl/tnl.h"
#include "tnl/t_context.h"
#include "tnl/t_pipeline.h"
@ -1600,21 +1601,24 @@ static void smooth_rgba_z_triangle( GLcontext *ctx,
#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define INNER_LOOP( LEFT, RIGHT, Y ) \
{ \
GLint i, len = RIGHT-LEFT; \
GLchan *img = PIXELADDR4(LEFT, Y); \
for (i = 0; i < len; i++, img += 4) { \
GLdepth z = FixedToDepth(ffz); \
#define RENDER_SPAN( span ) \
GLuint i; \
GLchan *img = PIXELADDR4(span.x, span.y); \
for (i = 0; i < span.count; i++, img += 4) { \
const GLdepth z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PACK_RGBA(img, FixedToInt(ffr), FixedToInt(ffg), \
FixedToInt(ffb), FixedToInt(ffa)); \
PACK_RGBA(img, FixedToInt(span.red), \
FixedToInt(span.green), FixedToInt(span.blue), \
FixedToInt(span.alpha)); \
zRow[i] = z; \
} \
ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; ffa += fdadx;\
ffz += fdzdx; \
} \
}
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.alpha += span.alphaStep; \
span.z += span.zStep; \
}
#ifdef WIN32
#include "..\swrast\s_tritemp.h"
#else
@ -1641,19 +1645,18 @@ static void flat_rgba_z_triangle( GLcontext *ctx,
PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1], \
v0->color[2], v0->color[3]);
#define INNER_LOOP( LEFT, RIGHT, Y ) \
{ \
GLint i, len = RIGHT-LEFT; \
GLuint *img = (GLuint *) PIXELADDR4(LEFT, Y); \
for (i=0;i<len;i++) { \
GLdepth z = FixedToDepth(ffz); \
#define RENDER_SPAN( span ) \
GLuint i; \
GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \
for (i = 0; i < span.count; i++) { \
const GLdepth z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
img[i] = pixel; \
zRow[i] = z; \
} \
ffz += fdzdx; \
} \
}
span.z += span.zStep; \
}
#ifdef WIN32
#include "..\swrast\s_tritemp.h"
#else

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,79 @@
/* $Id: s_trispan.h,v 1.1 2001/05/14 16:23:04 brianp Exp $ */
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 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"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef S_TRISPAN_H
#define S_TRISPAN_H
/*
* The triangle_span structure is used by the triangle template code in
* s_tritemp.h. It describes how colors, Z, texcoords, etc are to be
* interpolated across each scanline of triangle.
* With this structure it's easy to hand-off span rasterization to a
* subroutine instead of doing it all inline like we used to do.
* It also cleans up the local variable namespace a great deal.
*
* It would be interesting to experiment with multiprocessor rasterization
* with this structure. The triangle rasterizer could simply emit a
* stream of these structures which would be consumed by one or more
* span-processing threads which could run in parallel.
*/
#define SPAN_RGBA 0x01
#define SPAN_SPEC 0x02
#define SPAN_INDEX 0x04
#define SPAN_Z 0x08
#define SPAN_FOG 0x10
#define SPAN_TEXTURE 0x20
#define SPAN_INT_TEXTURE 0x40
#define SPAN_LAMBDA 0x80
struct triangle_span {
GLint x, y;
GLuint count;
GLuint activeMask; /* OR of the SPAN_* flags */
GLfixed red, redStep;
GLfixed green, greenStep;
GLfixed blue, blueStep;
GLfixed alpha, alphaStep;
GLfixed specRed, specRedStep;
GLfixed specGreen, specGreenStep;
GLfixed specBlue, specBlueStep;
GLfixed index, indexStep;
GLfixed z, zStep;
GLfloat fog, fogStep;
GLfloat tex[MAX_TEXTURE_UNITS][4], texStep[MAX_TEXTURE_UNITS][4];
GLfixed intTex[2], intTexStep[2];
/* Needed for texture lambda (LOD) computation */
GLfloat rho[MAX_TEXTURE_UNITS];
GLfloat texWidth[MAX_TEXTURE_UNITS], texHeight[MAX_TEXTURE_UNITS];
};
#endif /* S_TRISPAN_H */

File diff suppressed because it is too large Load diff