mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 22:38:05 +02:00
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:
parent
9cf779e7ac
commit
9bf68ad963
5 changed files with 1892 additions and 1805 deletions
|
|
@ -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
79
src/mesa/swrast/s_trispan.h
Normal file
79
src/mesa/swrast/s_trispan.h
Normal 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
Loading…
Add table
Reference in a new issue