1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 36a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul * Version: 7.5 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 56a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 66a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"), 10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation 11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 13e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions: 145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included 16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software. 175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 27e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifndef S_SPAN_H 28e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SPAN_H 29e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 313e2ea145b16f6c2894121df7b4a802d8bbbe6d46Vinson Lee#include "main/config.h" 323e2ea145b16f6c2894121df7b4a802d8bbbe6d46Vinson Lee#include "main/glheader.h" 333e2ea145b16f6c2894121df7b4a802d8bbbe6d46Vinson Lee#include "main/mtypes.h" 344d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#include "swrast/s_chan.h" 3547d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul#include "swrast/swrast.h" 364d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 373e2ea145b16f6c2894121df7b4a802d8bbbe6d46Vinson Lee 383e2ea145b16f6c2894121df7b4a802d8bbbe6d46Vinson Leestruct gl_context; 393e2ea145b16f6c2894121df7b4a802d8bbbe6d46Vinson Leestruct gl_renderbuffer; 40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 423866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/** 43f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian * \defgroup SpanFlags 449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * Special bitflags to describe span data. 45da554309521e8f351eecb30ce197535fb7541f40Brian * 469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * In general, the point/line/triangle functions interpolate/emit the 479e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * attributes specified by swrast->_ActiveAttribs (i.e. FRAT_BIT_* values). 489e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian * Some things don't fit into that, though, so we have these flags. 493866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 503866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/*@{*/ 519e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define SPAN_RGBA 0x01 /**< interpMask and arrayMask */ 52dc14ce9e367984cece79748b177e142ca02fa06dIan Romanick#define SPAN_Z 0x02 /**< interpMask and arrayMask */ 53dc14ce9e367984cece79748b177e142ca02fa06dIan Romanick#define SPAN_FLAT 0x04 /**< interpMask: flat shading? */ 54dc14ce9e367984cece79748b177e142ca02fa06dIan Romanick#define SPAN_XY 0x08 /**< array.x[], y[] valid? */ 55dc14ce9e367984cece79748b177e142ca02fa06dIan Romanick#define SPAN_MASK 0x10 /**< was array.mask[] filled in by caller? */ 56dc14ce9e367984cece79748b177e142ca02fa06dIan Romanick#define SPAN_LAMBDA 0x20 /**< array.lambda[] valid? */ 57dc14ce9e367984cece79748b177e142ca02fa06dIan Romanick#define SPAN_COVERAGE 0x40 /**< array.coverage[] valid? */ 583866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/*@}*/ 593866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 603866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 613866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/** 623866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * \sw_span_arrays 633866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * \brief Arrays of fragment values. 643866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * 653866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * These will either be computed from the span x/xStep values or 663866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * filled in by glDraw/CopyPixels, etc. 673866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * These arrays are separated out of sw_span to conserve memory. 683866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 69f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Briantypedef struct sw_span_arrays 70f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian{ 71f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian /** Per-fragment attributes (indexed by FRAG_ATTRIB_* tokens) */ 72abeca8d17d0728e68ec0c7cb9d9ca91b06b560d0Brian /* XXX someday look at transposing first two indexes for better memory 73abeca8d17d0728e68ec0c7cb9d9ca91b06b560d0Brian * access pattern. 74abeca8d17d0728e68ec0c7cb9d9ca91b06b560d0Brian */ 7547d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLfloat attribs[FRAG_ATTRIB_MAX][SWRAST_MAX_WIDTH][4]; 76f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian 77f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian /** This mask indicates which fragments are alive or culled */ 7847d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLubyte mask[SWRAST_MAX_WIDTH]; 79f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian 803866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLenum ChanType; /**< Color channel type, GL_UNSIGNED_BYTE, GL_FLOAT */ 813866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 829e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /** Attribute arrays that don't fit into attribs[] array above */ 839e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /*@{*/ 8447d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLubyte rgba8[SWRAST_MAX_WIDTH][4]; 8547d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLushort rgba16[SWRAST_MAX_WIDTH][4]; 869e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLchan (*rgba)[4]; /** either == rgba8 or rgba16 */ 8747d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLint x[SWRAST_MAX_WIDTH]; /**< fragment X coords */ 8847d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLint y[SWRAST_MAX_WIDTH]; /**< fragment Y coords */ 8947d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLuint z[SWRAST_MAX_WIDTH]; /**< fragment Z coords */ 9047d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLuint index[SWRAST_MAX_WIDTH]; /**< Color indexes */ 9147d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLfloat lambda[MAX_TEXTURE_COORD_UNITS][SWRAST_MAX_WIDTH]; /**< Texture LOD */ 9247d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul GLfloat coverage[SWRAST_MAX_WIDTH]; /**< Fragment coverage for AA/smoothing */ 939e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /*@}*/ 943866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian} SWspanarrays; 953866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 963866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 973866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/** 983866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * The SWspan structure describes the colors, Z, fogcoord, texcoords, 993866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * etc for either a horizontal run or an array of independent pixels. 1003866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * We can either specify a base/step to indicate interpolated values, or 1013866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * fill in explicit arrays of values. The interpMask and arrayMask bitfields 1023866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * indicate which attributes are active interpolants or arrays, respectively. 1033866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * 1043866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * It would be interesting to experiment with multiprocessor rasterization 1053866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * with this structure. The triangle rasterizer could simply emit a 1063866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * stream of these structures which would be consumed by one or more 1073866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * span-processing threads which could run in parallel. 1083866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 109f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Briantypedef struct sw_span 110f3e507ef9f75dbfc58ccd07b5fe8cfca10d9a9e3Brian{ 1119ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian /** Coord of first fragment in horizontal span/run */ 1123866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLint x, y; 1133866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1144e7fd7ad9604f6b9700a6011338c2bf1381b28daBrian /** Number of fragments in the span */ 1154e7fd7ad9604f6b9700a6011338c2bf1381b28daBrian GLuint end; 1163866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1176a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul /** for clipping left edge of spans */ 1186a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul GLuint leftClip; 1196a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul 1203866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /** This flag indicates that mask[] array is effectively filled with ones */ 1213866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLboolean writeAll; 1223866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1233866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /** either GL_POLYGON, GL_LINE, GL_POLYGON, GL_BITMAP */ 1243866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLenum primitive; 1253866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1263866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /** 0 = front-facing span, 1 = back-facing span (for two-sided stencil) */ 1273866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLuint facing; 1283866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1293866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /** 1303866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates 1319ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian * which of the attrStart/StepX/StepY variables are relevant. 1323866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 1333866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLbitfield interpMask; 1343866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1359ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian /** Fragment attribute interpolants */ 1369ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian GLfloat attrStart[FRAG_ATTRIB_MAX][4]; /**< initial value */ 1379ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian GLfloat attrStepX[FRAG_ATTRIB_MAX][4]; /**< dvalue/dx */ 1389ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian GLfloat attrStepY[FRAG_ATTRIB_MAX][4]; /**< dvalue/dy */ 1399ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian 1409ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian /* XXX the rest of these will go away eventually... */ 1419ab512ad8cf3a12f4f7f8494fa99bc9389f217dbBrian 1423866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /* For horizontal spans, step is the partial derivative wrt X. 1433866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * For lines, step is the delta from one fragment to the next. 1443866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 1453866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLfixed red, redStep; 1463866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLfixed green, greenStep; 1473866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLfixed blue, blueStep; 1483866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLfixed alpha, alphaStep; 1493866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLfixed index, indexStep; 1509e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLfixed z, zStep; /**< XXX z should probably be GLuint */ 1519e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLfixed intTex[2], intTexStep[2]; /**< (s,t) for unit[0] only */ 152462d8f5fafcc5ac69ea89cac1222abadded642e2Brian 1533866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /** 1543866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates 1553866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * which of the fragment arrays in the span_arrays struct are relevant. 1563866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 1573866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian GLbitfield arrayMask; 1583866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1598dffb6bdab25dcacf165851e9d1fdb3beb73099aBrian Paul /** Mask of FRAG_BIT_x bits */ 1608dffb6bdab25dcacf165851e9d1fdb3beb73099aBrian Paul GLbitfield64 arrayAttribs; 1619e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 1623866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian /** 1633866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * We store the arrays of fragment values in a separate struct so 1643866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * that we can allocate sw_span structs on the stack without using 1653866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * a lot of memory. The span_arrays struct is about 1.4MB while the 1663866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * sw_span struct is only about 512 bytes. 1673866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian */ 1683866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian SWspanarrays *array; 1693866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian} SWspan; 1703866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1713866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1723866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 173f4b103dc993491355ec3e3640d9cb060138175c2Brian#define INIT_SPAN(S, PRIMITIVE) \ 174f4b103dc993491355ec3e3640d9cb060138175c2Briando { \ 175f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).primitive = (PRIMITIVE); \ 176f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).interpMask = 0x0; \ 177f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).arrayMask = 0x0; \ 178f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).arrayAttribs = 0x0; \ 179f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).end = 0; \ 1806a3004b9ae58dafd1ce995df78b0f3183827a59dBrian Paul (S).leftClip = 0; \ 181f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).facing = 0; \ 182f4b103dc993491355ec3e3640d9cb060138175c2Brian (S).array = SWRAST_CONTEXT(ctx)->SpanArrays; \ 1833866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian} while (0) 1843866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1853866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1863866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian 1875071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulextern void 188f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_span_default_attribs(struct gl_context *ctx, SWspan *span); 189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1905071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulextern void 191f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_span_interpolate_z( const struct gl_context *ctx, SWspan *span ); 192711e27fda27e4235b20a4cf73c2767c984ab2b81Brian Paul 193350353adcd75f94fda63c787c86961716114e0bfBrian Paulextern GLfloat 19445bc887da226403f2c41077e40ca38b6f60f1359Brian Paul_swrast_compute_lambda(GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy, 195a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul GLfloat dqdx, GLfloat dqdy, GLfloat texW, GLfloat texH, 196a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul GLfloat s, GLfloat t, GLfloat q, GLfloat invQ); 197350353adcd75f94fda63c787c86961716114e0bfBrian Paul 19810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 19910f30eb43835c57c00783390a02d72daf4f78e26Brian Paulextern void 200f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_write_rgba_span( struct gl_context *ctx, SWspan *span); 201b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul 202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2035071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulextern void 204f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_read_rgba_span(struct gl_context *ctx, struct gl_renderbuffer *rb, 205267fb178844d3f17503dd0f921791f3ab059c4e7Brian Paul GLuint n, GLint x, GLint y, GLvoid *rgba); 206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2070ff817f200ef4cb4a5ab0d90eccfc83d0671fb65Brian Paulextern void 2080ff817f200ef4cb4a5ab0d90eccfc83d0671fb65Brian Paul_swrast_put_row(struct gl_context *ctx, struct gl_renderbuffer *rb, 209f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul GLenum datatype, 2100ff817f200ef4cb4a5ab0d90eccfc83d0671fb65Brian Paul GLuint count, GLint x, GLint y, 2110ff817f200ef4cb4a5ab0d90eccfc83d0671fb65Brian Paul const void *values, const GLubyte *mask); 2120ff817f200ef4cb4a5ab0d90eccfc83d0671fb65Brian Paul 213a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paulextern void * 214f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_get_dest_rgba(struct gl_context *ctx, struct gl_renderbuffer *rb, 215cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspan *span); 216a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul 217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 218