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