move span-related types/tokens into s_span.h
This commit is contained in:
@@ -45,205 +45,7 @@
|
|||||||
|
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
#include "swrast.h"
|
#include "swrast.h"
|
||||||
|
#include "s_span.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* \defgroup SpanFlags SPAN_XXX-flags
|
|
||||||
* Bitmasks to indicate which sw_span_arrays need to be computed
|
|
||||||
* (sw_span::interpMask) or have already been filled in (sw_span::arrayMask)
|
|
||||||
*/
|
|
||||||
/*@{*/
|
|
||||||
#define SPAN_RGBA 0x001
|
|
||||||
#define SPAN_SPEC 0x002
|
|
||||||
#define SPAN_INDEX 0x004
|
|
||||||
#define SPAN_Z 0x008
|
|
||||||
#define SPAN_W 0x010
|
|
||||||
#define SPAN_FOG 0x020
|
|
||||||
#define SPAN_TEXTURE 0x040
|
|
||||||
#define SPAN_INT_TEXTURE 0x080
|
|
||||||
#define SPAN_LAMBDA 0x100
|
|
||||||
#define SPAN_COVERAGE 0x200
|
|
||||||
#define SPAN_FLAT 0x400 /**< flat shading? */
|
|
||||||
#define SPAN_XY 0x800
|
|
||||||
#define SPAN_MASK 0x1000
|
|
||||||
#define SPAN_VARYING 0x2000
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* alternate arrangement for code below */
|
|
||||||
struct arrays2 {
|
|
||||||
union {
|
|
||||||
GLubyte sz1[MAX_WIDTH][4]; /* primary color */
|
|
||||||
GLushort sz2[MAX_WIDTH][4];
|
|
||||||
GLfloat sz4[MAX_WIDTH][4];
|
|
||||||
} rgba;
|
|
||||||
union {
|
|
||||||
GLubyte sz1[MAX_WIDTH][4]; /* specular color and temp storage */
|
|
||||||
GLushort sz2[MAX_WIDTH][4];
|
|
||||||
GLfloat sz4[MAX_WIDTH][4];
|
|
||||||
} spec;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \sw_span_arrays
|
|
||||||
* \brief Arrays of fragment values.
|
|
||||||
*
|
|
||||||
* These will either be computed from the span x/xStep values or
|
|
||||||
* filled in by glDraw/CopyPixels, etc.
|
|
||||||
* These arrays are separated out of sw_span to conserve memory.
|
|
||||||
*/
|
|
||||||
typedef struct sw_span_arrays {
|
|
||||||
GLenum ChanType; /**< Color channel type, GL_UNSIGNED_BYTE, GL_FLOAT */
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
GLubyte rgba[MAX_WIDTH][4]; /**< primary color */
|
|
||||||
GLubyte spec[MAX_WIDTH][4]; /**< specular color and temp storage */
|
|
||||||
} sz1;
|
|
||||||
struct {
|
|
||||||
GLushort rgba[MAX_WIDTH][4];
|
|
||||||
GLushort spec[MAX_WIDTH][4];
|
|
||||||
} sz2;
|
|
||||||
struct {
|
|
||||||
GLfloat rgba[MAX_WIDTH][4];
|
|
||||||
GLfloat spec[MAX_WIDTH][4];
|
|
||||||
} sz4;
|
|
||||||
} color;
|
|
||||||
/** XXX these are temporary fields, pointing into above color arrays */
|
|
||||||
GLchan (*rgba)[4];
|
|
||||||
GLchan (*spec)[4];
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* XXX rearrange and unify these arrays to so that we can
|
|
||||||
* index all fragment inputs with the FRAG_ATTRIB_* values:
|
|
||||||
*/
|
|
||||||
GLfloat attribs[FRAG_ATTRIB_MAX][MAX_WIDTH][4];
|
|
||||||
/*OR*/
|
|
||||||
typedef GLfloat (*array4f)[4];
|
|
||||||
array4f attribs[FRAG_ATTRIB_MAX];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GLint x[MAX_WIDTH]; /**< fragment X coords */
|
|
||||||
GLint y[MAX_WIDTH]; /**< fragment Y coords */
|
|
||||||
GLuint z[MAX_WIDTH]; /**< fragment Z coords */
|
|
||||||
GLuint index[MAX_WIDTH]; /**< Color indexes */
|
|
||||||
GLfloat fog[MAX_WIDTH];
|
|
||||||
GLfloat texcoords[MAX_TEXTURE_COORD_UNITS][MAX_WIDTH][4];
|
|
||||||
GLfloat lambda[MAX_TEXTURE_COORD_UNITS][MAX_WIDTH];
|
|
||||||
GLfloat coverage[MAX_WIDTH]; /**< Fragment coverage for AA/smoothing */
|
|
||||||
GLfloat varying[MAX_VARYING][MAX_WIDTH][4]; /**< For shaders */
|
|
||||||
|
|
||||||
/** This mask indicates which fragments are alive or culled */
|
|
||||||
GLubyte mask[MAX_WIDTH];
|
|
||||||
} SWspanarrays;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SWspan structure describes the colors, Z, fogcoord, texcoords,
|
|
||||||
* etc for either a horizontal run or an array of independent pixels.
|
|
||||||
* We can either specify a base/step to indicate interpolated values, or
|
|
||||||
* fill in explicit arrays of values. The interpMask and arrayMask bitfields
|
|
||||||
* indicate which attributes are active interpolants or arrays, respectively.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
typedef struct sw_span {
|
|
||||||
GLint x, y;
|
|
||||||
|
|
||||||
/** Only need to process pixels between start <= i < end */
|
|
||||||
/** At this time, start is always zero. */
|
|
||||||
GLuint start, end;
|
|
||||||
|
|
||||||
/** This flag indicates that mask[] array is effectively filled with ones */
|
|
||||||
GLboolean writeAll;
|
|
||||||
|
|
||||||
/** either GL_POLYGON, GL_LINE, GL_POLYGON, GL_BITMAP */
|
|
||||||
GLenum primitive;
|
|
||||||
|
|
||||||
/** 0 = front-facing span, 1 = back-facing span (for two-sided stencil) */
|
|
||||||
GLuint facing;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates
|
|
||||||
* which of the x/xStep variables are relevant.
|
|
||||||
*/
|
|
||||||
GLbitfield interpMask;
|
|
||||||
|
|
||||||
/* For horizontal spans, step is the partial derivative wrt X.
|
|
||||||
* For lines, step is the delta from one fragment to the next.
|
|
||||||
*/
|
|
||||||
#if CHAN_TYPE == GL_FLOAT
|
|
||||||
GLfloat red, redStep;
|
|
||||||
GLfloat green, greenStep;
|
|
||||||
GLfloat blue, blueStep;
|
|
||||||
GLfloat alpha, alphaStep;
|
|
||||||
GLfloat specRed, specRedStep;
|
|
||||||
GLfloat specGreen, specGreenStep;
|
|
||||||
GLfloat specBlue, specBlueStep;
|
|
||||||
#else /* CHAN_TYPE == GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT */
|
|
||||||
GLfixed red, redStep;
|
|
||||||
GLfixed green, greenStep;
|
|
||||||
GLfixed blue, blueStep;
|
|
||||||
GLfixed alpha, alphaStep;
|
|
||||||
GLfixed specRed, specRedStep;
|
|
||||||
GLfixed specGreen, specGreenStep;
|
|
||||||
GLfixed specBlue, specBlueStep;
|
|
||||||
#endif
|
|
||||||
GLfixed index, indexStep;
|
|
||||||
GLfixed z, zStep; /* XXX z should probably be GLuint */
|
|
||||||
GLfloat fog, fogStep;
|
|
||||||
GLfloat tex[MAX_TEXTURE_COORD_UNITS][4]; /* s, t, r, q */
|
|
||||||
GLfloat texStepX[MAX_TEXTURE_COORD_UNITS][4];
|
|
||||||
GLfloat texStepY[MAX_TEXTURE_COORD_UNITS][4];
|
|
||||||
GLfixed intTex[2], intTexStep[2]; /* s, t only */
|
|
||||||
GLfloat var[MAX_VARYING][4];
|
|
||||||
GLfloat varStepX[MAX_VARYING][4];
|
|
||||||
GLfloat varStepY[MAX_VARYING][4];
|
|
||||||
|
|
||||||
/* partial derivatives wrt X and Y. */
|
|
||||||
GLfloat dzdx, dzdy;
|
|
||||||
GLfloat w, dwdx, dwdy;
|
|
||||||
GLfloat drdx, drdy;
|
|
||||||
GLfloat dgdx, dgdy;
|
|
||||||
GLfloat dbdx, dbdy;
|
|
||||||
GLfloat dadx, dady;
|
|
||||||
GLfloat dsrdx, dsrdy;
|
|
||||||
GLfloat dsgdx, dsgdy;
|
|
||||||
GLfloat dsbdx, dsbdy;
|
|
||||||
GLfloat dfogdx, dfogdy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates
|
|
||||||
* which of the fragment arrays in the span_arrays struct are relevant.
|
|
||||||
*/
|
|
||||||
GLbitfield arrayMask;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 1.4MB while the
|
|
||||||
* sw_span struct is only about 512 bytes.
|
|
||||||
*/
|
|
||||||
SWspanarrays *array;
|
|
||||||
} SWspan;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#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).facing = 0; \
|
|
||||||
(S).array = SWRAST_CONTEXT(ctx)->SpanArrays; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (*texture_sample_func)(GLcontext *ctx,
|
typedef void (*texture_sample_func)(GLcontext *ctx,
|
||||||
@@ -270,7 +72,8 @@ typedef void (*validate_texture_image_func)(GLcontext *ctx,
|
|||||||
GLuint face, GLuint level);
|
GLuint face, GLuint level);
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup Bitmasks
|
/**
|
||||||
|
* \defgroup Bitmasks
|
||||||
* Bitmasks to indicate which rasterization options are enabled
|
* Bitmasks to indicate which rasterization options are enabled
|
||||||
* (RasterMask)
|
* (RasterMask)
|
||||||
*/
|
*/
|
||||||
|
@@ -31,6 +31,207 @@
|
|||||||
#include "swrast.h"
|
#include "swrast.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup SpanFlags SPAN_*-flags
|
||||||
|
* Bitflags used for interpMask and arrayMask fields below to indicate
|
||||||
|
* which interpolant values and fragment arrays are in use, respectively.
|
||||||
|
*/
|
||||||
|
/*@{*/
|
||||||
|
#define SPAN_RGBA 0x001
|
||||||
|
#define SPAN_SPEC 0x002
|
||||||
|
#define SPAN_INDEX 0x004
|
||||||
|
#define SPAN_Z 0x008
|
||||||
|
#define SPAN_W 0x010
|
||||||
|
#define SPAN_FOG 0x020
|
||||||
|
#define SPAN_TEXTURE 0x040
|
||||||
|
#define SPAN_INT_TEXTURE 0x080
|
||||||
|
#define SPAN_LAMBDA 0x100
|
||||||
|
#define SPAN_COVERAGE 0x200
|
||||||
|
#define SPAN_FLAT 0x400 /**< flat shading? */
|
||||||
|
#define SPAN_XY 0x800
|
||||||
|
#define SPAN_MASK 0x1000
|
||||||
|
#define SPAN_VARYING 0x2000
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* alternate arrangement for code below */
|
||||||
|
struct arrays2 {
|
||||||
|
union {
|
||||||
|
GLubyte sz1[MAX_WIDTH][4]; /* primary color */
|
||||||
|
GLushort sz2[MAX_WIDTH][4];
|
||||||
|
GLfloat sz4[MAX_WIDTH][4];
|
||||||
|
} rgba;
|
||||||
|
union {
|
||||||
|
GLubyte sz1[MAX_WIDTH][4]; /* specular color and temp storage */
|
||||||
|
GLushort sz2[MAX_WIDTH][4];
|
||||||
|
GLfloat sz4[MAX_WIDTH][4];
|
||||||
|
} spec;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \sw_span_arrays
|
||||||
|
* \brief Arrays of fragment values.
|
||||||
|
*
|
||||||
|
* These will either be computed from the span x/xStep values or
|
||||||
|
* filled in by glDraw/CopyPixels, etc.
|
||||||
|
* These arrays are separated out of sw_span to conserve memory.
|
||||||
|
*/
|
||||||
|
typedef struct sw_span_arrays {
|
||||||
|
GLenum ChanType; /**< Color channel type, GL_UNSIGNED_BYTE, GL_FLOAT */
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
GLubyte rgba[MAX_WIDTH][4]; /**< primary color */
|
||||||
|
GLubyte spec[MAX_WIDTH][4]; /**< specular color and temp storage */
|
||||||
|
} sz1;
|
||||||
|
struct {
|
||||||
|
GLushort rgba[MAX_WIDTH][4];
|
||||||
|
GLushort spec[MAX_WIDTH][4];
|
||||||
|
} sz2;
|
||||||
|
struct {
|
||||||
|
GLfloat rgba[MAX_WIDTH][4];
|
||||||
|
GLfloat spec[MAX_WIDTH][4];
|
||||||
|
} sz4;
|
||||||
|
} color;
|
||||||
|
/** XXX these are temporary fields, pointing into above color arrays */
|
||||||
|
GLchan (*rgba)[4];
|
||||||
|
GLchan (*spec)[4];
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* XXX rearrange and unify these arrays to so that we can
|
||||||
|
* index all fragment inputs with the FRAG_ATTRIB_* values:
|
||||||
|
*/
|
||||||
|
GLfloat attribs[FRAG_ATTRIB_MAX][MAX_WIDTH][4];
|
||||||
|
/*OR*/
|
||||||
|
typedef GLfloat (*array4f)[4];
|
||||||
|
array4f attribs[FRAG_ATTRIB_MAX];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GLint x[MAX_WIDTH]; /**< fragment X coords */
|
||||||
|
GLint y[MAX_WIDTH]; /**< fragment Y coords */
|
||||||
|
GLuint z[MAX_WIDTH]; /**< fragment Z coords */
|
||||||
|
GLuint index[MAX_WIDTH]; /**< Color indexes */
|
||||||
|
GLfloat fog[MAX_WIDTH];
|
||||||
|
GLfloat texcoords[MAX_TEXTURE_COORD_UNITS][MAX_WIDTH][4];
|
||||||
|
GLfloat lambda[MAX_TEXTURE_COORD_UNITS][MAX_WIDTH];
|
||||||
|
GLfloat coverage[MAX_WIDTH]; /**< Fragment coverage for AA/smoothing */
|
||||||
|
GLfloat varying[MAX_VARYING][MAX_WIDTH][4]; /**< For shaders */
|
||||||
|
|
||||||
|
/** This mask indicates which fragments are alive or culled */
|
||||||
|
GLubyte mask[MAX_WIDTH];
|
||||||
|
} SWspanarrays;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SWspan structure describes the colors, Z, fogcoord, texcoords,
|
||||||
|
* etc for either a horizontal run or an array of independent pixels.
|
||||||
|
* We can either specify a base/step to indicate interpolated values, or
|
||||||
|
* fill in explicit arrays of values. The interpMask and arrayMask bitfields
|
||||||
|
* indicate which attributes are active interpolants or arrays, respectively.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
typedef struct sw_span {
|
||||||
|
GLint x, y;
|
||||||
|
|
||||||
|
/** Only need to process pixels between start <= i < end */
|
||||||
|
/** At this time, start is always zero. */
|
||||||
|
GLuint start, end;
|
||||||
|
|
||||||
|
/** This flag indicates that mask[] array is effectively filled with ones */
|
||||||
|
GLboolean writeAll;
|
||||||
|
|
||||||
|
/** either GL_POLYGON, GL_LINE, GL_POLYGON, GL_BITMAP */
|
||||||
|
GLenum primitive;
|
||||||
|
|
||||||
|
/** 0 = front-facing span, 1 = back-facing span (for two-sided stencil) */
|
||||||
|
GLuint facing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates
|
||||||
|
* which of the x/xStep variables are relevant.
|
||||||
|
*/
|
||||||
|
GLbitfield interpMask;
|
||||||
|
|
||||||
|
/* For horizontal spans, step is the partial derivative wrt X.
|
||||||
|
* For lines, step is the delta from one fragment to the next.
|
||||||
|
*/
|
||||||
|
#if CHAN_TYPE == GL_FLOAT
|
||||||
|
GLfloat red, redStep;
|
||||||
|
GLfloat green, greenStep;
|
||||||
|
GLfloat blue, blueStep;
|
||||||
|
GLfloat alpha, alphaStep;
|
||||||
|
GLfloat specRed, specRedStep;
|
||||||
|
GLfloat specGreen, specGreenStep;
|
||||||
|
GLfloat specBlue, specBlueStep;
|
||||||
|
#else /* CHAN_TYPE == GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT */
|
||||||
|
GLfixed red, redStep;
|
||||||
|
GLfixed green, greenStep;
|
||||||
|
GLfixed blue, blueStep;
|
||||||
|
GLfixed alpha, alphaStep;
|
||||||
|
GLfixed specRed, specRedStep;
|
||||||
|
GLfixed specGreen, specGreenStep;
|
||||||
|
GLfixed specBlue, specBlueStep;
|
||||||
|
#endif
|
||||||
|
GLfixed index, indexStep;
|
||||||
|
GLfixed z, zStep; /* XXX z should probably be GLuint */
|
||||||
|
GLfloat fog, fogStep;
|
||||||
|
GLfloat tex[MAX_TEXTURE_COORD_UNITS][4]; /* s, t, r, q */
|
||||||
|
GLfloat texStepX[MAX_TEXTURE_COORD_UNITS][4];
|
||||||
|
GLfloat texStepY[MAX_TEXTURE_COORD_UNITS][4];
|
||||||
|
GLfixed intTex[2], intTexStep[2]; /* s, t only */
|
||||||
|
GLfloat var[MAX_VARYING][4];
|
||||||
|
GLfloat varStepX[MAX_VARYING][4];
|
||||||
|
GLfloat varStepY[MAX_VARYING][4];
|
||||||
|
|
||||||
|
/* partial derivatives wrt X and Y. */
|
||||||
|
GLfloat dzdx, dzdy;
|
||||||
|
GLfloat w, dwdx, dwdy;
|
||||||
|
GLfloat drdx, drdy;
|
||||||
|
GLfloat dgdx, dgdy;
|
||||||
|
GLfloat dbdx, dbdy;
|
||||||
|
GLfloat dadx, dady;
|
||||||
|
GLfloat dsrdx, dsrdy;
|
||||||
|
GLfloat dsgdx, dsgdy;
|
||||||
|
GLfloat dsbdx, dsbdy;
|
||||||
|
GLfloat dfogdx, dfogdy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates
|
||||||
|
* which of the fragment arrays in the span_arrays struct are relevant.
|
||||||
|
*/
|
||||||
|
GLbitfield arrayMask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 1.4MB while the
|
||||||
|
* sw_span struct is only about 512 bytes.
|
||||||
|
*/
|
||||||
|
SWspanarrays *array;
|
||||||
|
} SWspan;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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).facing = 0; \
|
||||||
|
(S).array = SWRAST_CONTEXT(ctx)->SpanArrays; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
_swrast_span_default_z( GLcontext *ctx, SWspan *span );
|
_swrast_span_default_z( GLcontext *ctx, SWspan *span );
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user