1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef S_SPAN_H
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define S_SPAN_H
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/config.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_chan.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_context;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_renderbuffer;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \defgroup SpanFlags
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special bitflags to describe span data.
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In general, the point/line/triangle functions interpolate/emit the
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attributes specified by swrast->_ActiveAttribs (i.e. FRAT_BIT_* values).
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Some things don't fit into that, though, so we have these flags.
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_RGBA       0x01  /**< interpMask and arrayMask */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_Z          0x02  /**< interpMask and arrayMask */
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_FLAT       0x04  /**< interpMask: flat shading? */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_XY         0x08  /**< array.x[], y[] valid? */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_MASK       0x10  /**< was array.mask[] filled in by caller? */
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_LAMBDA     0x20  /**< array.lambda[] valid? */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPAN_COVERAGE   0x40  /**< array.coverage[] valid? */
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sw_span_arrays
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \brief Arrays of fragment values.
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These will either be computed from the span x/xStep values or
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * filled in by glDraw/CopyPixels, etc.
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These arrays are separated out of sw_span to conserve memory.
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct sw_span_arrays
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Per-fragment attributes (indexed by FRAG_ATTRIB_* tokens) */
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX someday look at transposing first two indexes for better memory
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * access pattern.
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat attribs[FRAG_ATTRIB_MAX][SWRAST_MAX_WIDTH][4];
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** This mask indicates which fragments are alive or culled */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte mask[SWRAST_MAX_WIDTH];
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum ChanType; /**< Color channel type, GL_UNSIGNED_BYTE, GL_FLOAT */
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Attribute arrays that don't fit into attribs[] array above */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*@{*/
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte rgba8[SWRAST_MAX_WIDTH][4];
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLushort rgba16[SWRAST_MAX_WIDTH][4];
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLchan (*rgba)[4];  /** either == rgba8 or rgba16 */
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint   x[SWRAST_MAX_WIDTH];  /**< fragment X coords */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint   y[SWRAST_MAX_WIDTH];  /**< fragment Y coords */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint  z[SWRAST_MAX_WIDTH];  /**< fragment Z coords */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint  index[SWRAST_MAX_WIDTH];  /**< Color indexes */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat lambda[MAX_TEXTURE_COORD_UNITS][SWRAST_MAX_WIDTH]; /**< Texture LOD */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat coverage[SWRAST_MAX_WIDTH];  /**< Fragment coverage for AA/smoothing */
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*@}*/
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} SWspanarrays;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The SWspan structure describes the colors, Z, fogcoord, texcoords,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * etc for either a horizontal run or an array of independent pixels.
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We can either specify a base/step to indicate interpolated values, or
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fill in explicit arrays of values.  The interpMask and arrayMask bitfields
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * indicate which attributes are active interpolants or arrays, respectively.
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It would be interesting to experiment with multiprocessor rasterization
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with this structure.  The triangle rasterizer could simply emit a
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stream of these structures which would be consumed by one or more
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * span-processing threads which could run in parallel.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct sw_span
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Coord of first fragment in horizontal span/run */
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint x, y;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Number of fragments in the span */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint end;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** for clipping left edge of spans */
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint leftClip;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** This flag indicates that mask[] array is effectively filled with ones */
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean writeAll;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** either GL_POLYGON, GL_LINE, GL_POLYGON, GL_BITMAP */
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum primitive;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** 0 = front-facing span, 1 = back-facing span (for two-sided stencil) */
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint facing;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This bitmask (of  \link SpanFlags SPAN_* flags\endlink) indicates
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * which of the attrStart/StepX/StepY variables are relevant.
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield interpMask;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Fragment attribute interpolants */
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat attrStart[FRAG_ATTRIB_MAX][4];   /**< initial value */
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat attrStepX[FRAG_ATTRIB_MAX][4];   /**< dvalue/dx */
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat attrStepY[FRAG_ATTRIB_MAX][4];   /**< dvalue/dy */
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX the rest of these will go away eventually... */
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* For horizontal spans, step is the partial derivative wrt X.
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * For lines, step is the delta from one fragment to the next.
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed red, redStep;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed green, greenStep;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed blue, blueStep;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed alpha, alphaStep;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed index, indexStep;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed z, zStep;    /**< XXX z should probably be GLuint */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfixed intTex[2], intTexStep[2];  /**< (s,t) for unit[0] only */
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * which of the fragment arrays in the span_arrays struct are relevant.
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield arrayMask;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Mask of FRAG_BIT_x bits */
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 arrayAttribs;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * We store the arrays of fragment values in a separate struct so
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * that we can allocate sw_span structs on the stack without using
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a lot of memory.  The span_arrays struct is about 1.4MB while the
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sw_span struct is only about 512 bytes.
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWspanarrays *array;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} SWspan;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INIT_SPAN(S, PRIMITIVE)			\
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {						\
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).primitive = (PRIMITIVE);			\
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).interpMask = 0x0;			\
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).arrayMask = 0x0;				\
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).arrayAttribs = 0x0;			\
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).end = 0;					\
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).leftClip = 0;				\
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).facing = 0;				\
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (S).array = SWRAST_CONTEXT(ctx)->SpanArrays;	\
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_span_default_attribs(struct gl_context *ctx, SWspan *span);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_span_interpolate_z( const struct gl_context *ctx, SWspan *span );
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLfloat
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_compute_lambda(GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLfloat dqdx, GLfloat dqdy, GLfloat texW, GLfloat texH,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLfloat s, GLfloat t, GLfloat q, GLfloat invQ);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_write_rgba_span( struct gl_context *ctx, SWspan *span);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_read_rgba_span(struct gl_context *ctx, struct gl_renderbuffer *rb,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint n, GLint x, GLint y, GLvoid *rgba);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_put_row(struct gl_context *ctx, struct gl_renderbuffer *rb,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                GLenum datatype,
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                GLuint count, GLint x, GLint y,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                const void *values, const GLubyte *mask);
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_get_dest_rgba(struct gl_context *ctx, struct gl_renderbuffer *rb,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      SWspan *span);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
218