1848b8605Smrg/* 2848b8605Smrg * Mesa 3-D graphics library 3848b8605Smrg * 4848b8605Smrg * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5848b8605Smrg * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 6848b8605Smrg * 7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8848b8605Smrg * copy of this software and associated documentation files (the "Software"), 9848b8605Smrg * to deal in the Software without restriction, including without limitation 10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 12848b8605Smrg * Software is furnished to do so, subject to the following conditions: 13848b8605Smrg * 14848b8605Smrg * The above copyright notice and this permission notice shall be included 15848b8605Smrg * in all copies or substantial portions of the Software. 16848b8605Smrg * 17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE. 24848b8605Smrg */ 25848b8605Smrg 26848b8605Smrg 27848b8605Smrg#ifndef S_SPAN_H 28848b8605Smrg#define S_SPAN_H 29848b8605Smrg 30848b8605Smrg 31848b8605Smrg#include "main/config.h" 32848b8605Smrg#include "main/glheader.h" 33848b8605Smrg#include "main/mtypes.h" 34848b8605Smrg#include "swrast/s_chan.h" 35848b8605Smrg#include "swrast/swrast.h" 36848b8605Smrg 37848b8605Smrg 38848b8605Smrgstruct gl_context; 39848b8605Smrgstruct gl_renderbuffer; 40848b8605Smrg 41848b8605Smrg 42848b8605Smrg/** 43848b8605Smrg * \defgroup SpanFlags 44848b8605Smrg * Special bitflags to describe span data. 45848b8605Smrg * 46848b8605Smrg * In general, the point/line/triangle functions interpolate/emit the 47848b8605Smrg * attributes specified by swrast->_ActiveAttribs (i.e. FRAT_BIT_* values). 48848b8605Smrg * Some things don't fit into that, though, so we have these flags. 49848b8605Smrg */ 50848b8605Smrg/*@{*/ 51848b8605Smrg#define SPAN_RGBA 0x01 /**< interpMask and arrayMask */ 52848b8605Smrg#define SPAN_Z 0x02 /**< interpMask and arrayMask */ 53848b8605Smrg#define SPAN_FLAT 0x04 /**< interpMask: flat shading? */ 54848b8605Smrg#define SPAN_XY 0x08 /**< array.x[], y[] valid? */ 55848b8605Smrg#define SPAN_MASK 0x10 /**< was array.mask[] filled in by caller? */ 56848b8605Smrg#define SPAN_LAMBDA 0x20 /**< array.lambda[] valid? */ 57848b8605Smrg#define SPAN_COVERAGE 0x40 /**< array.coverage[] valid? */ 58848b8605Smrg/*@}*/ 59848b8605Smrg 60848b8605Smrg 61848b8605Smrg/** 62848b8605Smrg * \sw_span_arrays 63848b8605Smrg * \brief Arrays of fragment values. 64848b8605Smrg * 65848b8605Smrg * These will either be computed from the span x/xStep values or 66848b8605Smrg * filled in by glDraw/CopyPixels, etc. 67848b8605Smrg * These arrays are separated out of sw_span to conserve memory. 68848b8605Smrg */ 69848b8605Smrgtypedef struct sw_span_arrays 70848b8605Smrg{ 71848b8605Smrg /** Per-fragment attributes (indexed by VARYING_SLOT_* tokens) */ 72848b8605Smrg /* XXX someday look at transposing first two indexes for better memory 73848b8605Smrg * access pattern. 74848b8605Smrg */ 75848b8605Smrg GLfloat attribs[VARYING_SLOT_MAX][SWRAST_MAX_WIDTH][4]; 76848b8605Smrg 77848b8605Smrg /** This mask indicates which fragments are alive or culled */ 78848b8605Smrg GLubyte mask[SWRAST_MAX_WIDTH]; 79848b8605Smrg 80848b8605Smrg GLenum ChanType; /**< Color channel type, GL_UNSIGNED_BYTE, GL_FLOAT */ 81848b8605Smrg 82848b8605Smrg /** Attribute arrays that don't fit into attribs[] array above */ 83848b8605Smrg /*@{*/ 84848b8605Smrg GLubyte rgba8[SWRAST_MAX_WIDTH][4]; 85848b8605Smrg GLushort rgba16[SWRAST_MAX_WIDTH][4]; 86848b8605Smrg GLchan (*rgba)[4]; /** either == rgba8 or rgba16 */ 87848b8605Smrg GLint x[SWRAST_MAX_WIDTH]; /**< fragment X coords */ 88848b8605Smrg GLint y[SWRAST_MAX_WIDTH]; /**< fragment Y coords */ 89848b8605Smrg GLuint z[SWRAST_MAX_WIDTH]; /**< fragment Z coords */ 90848b8605Smrg GLuint index[SWRAST_MAX_WIDTH]; /**< Color indexes */ 91848b8605Smrg GLfloat lambda[MAX_TEXTURE_COORD_UNITS][SWRAST_MAX_WIDTH]; /**< Texture LOD */ 92848b8605Smrg GLfloat coverage[SWRAST_MAX_WIDTH]; /**< Fragment coverage for AA/smoothing */ 93848b8605Smrg /*@}*/ 94848b8605Smrg} SWspanarrays; 95848b8605Smrg 96848b8605Smrg 97848b8605Smrg/** 98848b8605Smrg * The SWspan structure describes the colors, Z, fogcoord, texcoords, 99848b8605Smrg * etc for either a horizontal run or an array of independent pixels. 100848b8605Smrg * We can either specify a base/step to indicate interpolated values, or 101848b8605Smrg * fill in explicit arrays of values. The interpMask and arrayMask bitfields 102848b8605Smrg * indicate which attributes are active interpolants or arrays, respectively. 103848b8605Smrg * 104848b8605Smrg * It would be interesting to experiment with multiprocessor rasterization 105848b8605Smrg * with this structure. The triangle rasterizer could simply emit a 106848b8605Smrg * stream of these structures which would be consumed by one or more 107848b8605Smrg * span-processing threads which could run in parallel. 108848b8605Smrg */ 109848b8605Smrgtypedef struct sw_span 110848b8605Smrg{ 111848b8605Smrg /** Coord of first fragment in horizontal span/run */ 112848b8605Smrg GLint x, y; 113848b8605Smrg 114848b8605Smrg /** Number of fragments in the span */ 115848b8605Smrg GLuint end; 116848b8605Smrg 117848b8605Smrg /** for clipping left edge of spans */ 118848b8605Smrg GLuint leftClip; 119848b8605Smrg 120848b8605Smrg /** This flag indicates that mask[] array is effectively filled with ones */ 121848b8605Smrg GLboolean writeAll; 122848b8605Smrg 123848b8605Smrg /** either GL_POLYGON, GL_LINE, GL_POLYGON, GL_BITMAP */ 124848b8605Smrg GLenum primitive; 125848b8605Smrg 126848b8605Smrg /** 0 = front-facing span, 1 = back-facing span (for two-sided stencil) */ 127848b8605Smrg GLuint facing; 128848b8605Smrg 129848b8605Smrg /** 130848b8605Smrg * This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates 131848b8605Smrg * which of the attrStart/StepX/StepY variables are relevant. 132848b8605Smrg */ 133848b8605Smrg GLbitfield interpMask; 134848b8605Smrg 135848b8605Smrg /** Fragment attribute interpolants */ 136848b8605Smrg GLfloat attrStart[VARYING_SLOT_MAX][4]; /**< initial value */ 137848b8605Smrg GLfloat attrStepX[VARYING_SLOT_MAX][4]; /**< dvalue/dx */ 138848b8605Smrg GLfloat attrStepY[VARYING_SLOT_MAX][4]; /**< dvalue/dy */ 139848b8605Smrg 140848b8605Smrg /* XXX the rest of these will go away eventually... */ 141848b8605Smrg 142848b8605Smrg /* For horizontal spans, step is the partial derivative wrt X. 143848b8605Smrg * For lines, step is the delta from one fragment to the next. 144848b8605Smrg */ 145848b8605Smrg GLfixed red, redStep; 146848b8605Smrg GLfixed green, greenStep; 147848b8605Smrg GLfixed blue, blueStep; 148848b8605Smrg GLfixed alpha, alphaStep; 149848b8605Smrg GLfixed index, indexStep; 150848b8605Smrg GLfixed z, zStep; /**< XXX z should probably be GLuint */ 151848b8605Smrg GLfixed intTex[2], intTexStep[2]; /**< (s,t) for unit[0] only */ 152848b8605Smrg 153848b8605Smrg /** 154848b8605Smrg * This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates 155848b8605Smrg * which of the fragment arrays in the span_arrays struct are relevant. 156848b8605Smrg */ 157848b8605Smrg GLbitfield arrayMask; 158848b8605Smrg 159848b8605Smrg /** Mask of VARYING_BIT_x bits */ 160848b8605Smrg GLbitfield64 arrayAttribs; 161848b8605Smrg 162848b8605Smrg /** 163848b8605Smrg * We store the arrays of fragment values in a separate struct so 164848b8605Smrg * that we can allocate sw_span structs on the stack without using 165848b8605Smrg * a lot of memory. The span_arrays struct is about 1.4MB while the 166848b8605Smrg * sw_span struct is only about 512 bytes. 167848b8605Smrg */ 168848b8605Smrg SWspanarrays *array; 169848b8605Smrg} SWspan; 170848b8605Smrg 171848b8605Smrg 172848b8605Smrg 173848b8605Smrg#define INIT_SPAN(S, PRIMITIVE) \ 174848b8605Smrgdo { \ 175848b8605Smrg (S).primitive = (PRIMITIVE); \ 176848b8605Smrg (S).interpMask = 0x0; \ 177848b8605Smrg (S).arrayMask = 0x0; \ 178848b8605Smrg (S).arrayAttribs = 0x0; \ 179848b8605Smrg (S).end = 0; \ 180848b8605Smrg (S).leftClip = 0; \ 181848b8605Smrg (S).facing = 0; \ 182848b8605Smrg (S).array = SWRAST_CONTEXT(ctx)->SpanArrays; \ 183848b8605Smrg} while (0) 184848b8605Smrg 185848b8605Smrg 186848b8605Smrg 187848b8605Smrgextern void 188848b8605Smrg_swrast_span_default_attribs(struct gl_context *ctx, SWspan *span); 189848b8605Smrg 190848b8605Smrgextern void 191848b8605Smrg_swrast_span_interpolate_z( const struct gl_context *ctx, SWspan *span ); 192848b8605Smrg 193848b8605Smrgextern GLfloat 194848b8605Smrg_swrast_compute_lambda(GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy, 195848b8605Smrg GLfloat dqdx, GLfloat dqdy, GLfloat texW, GLfloat texH, 196848b8605Smrg GLfloat s, GLfloat t, GLfloat q, GLfloat invQ); 197848b8605Smrg 198848b8605Smrg 199848b8605Smrgextern void 200848b8605Smrg_swrast_write_rgba_span( struct gl_context *ctx, SWspan *span); 201848b8605Smrg 202848b8605Smrg 203848b8605Smrgextern void 204848b8605Smrg_swrast_read_rgba_span(struct gl_context *ctx, struct gl_renderbuffer *rb, 205848b8605Smrg GLuint n, GLint x, GLint y, GLvoid *rgba); 206848b8605Smrg 207848b8605Smrgextern void 208848b8605Smrg_swrast_put_row(struct gl_context *ctx, struct gl_renderbuffer *rb, 209848b8605Smrg GLenum datatype, 210848b8605Smrg GLuint count, GLint x, GLint y, 211848b8605Smrg const void *values, const GLubyte *mask); 212848b8605Smrg 213848b8605Smrgextern void * 214848b8605Smrg_swrast_get_dest_rgba(struct gl_context *ctx, struct gl_renderbuffer *rb, 215848b8605Smrg SWspan *span); 216848b8605Smrg 217848b8605Smrg#endif 218