Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1901 | serge | 1 | /* |
2 | * Mesa 3-D graphics library |
||
3 | * Version: 6.5.3 |
||
4 | * |
||
5 | * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. |
||
6 | * |
||
7 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
8 | * copy of this software and associated documentation files (the "Software"), |
||
9 | * to deal in the Software without restriction, including without limitation |
||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
11 | * and/or sell copies of the Software, and to permit persons to whom the |
||
12 | * Software is furnished to do so, subject to the following conditions: |
||
13 | * |
||
14 | * The above copyright notice and this permission notice shall be included |
||
15 | * in all copies or substantial portions of the Software. |
||
16 | * |
||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
18 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
20 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
21 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
22 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
23 | */ |
||
24 | |||
25 | |||
26 | /** |
||
27 | * \file swrast/s_context.h |
||
28 | * \brief Software rasterization context and private types. |
||
29 | * \author Keith Whitwell |
||
30 | */ |
||
31 | |||
32 | /** |
||
33 | * \mainpage swrast module |
||
34 | * |
||
35 | * This module, software rasterization, contains the software fallback |
||
36 | * routines for drawing points, lines, triangles, bitmaps and images. |
||
37 | * All rendering boils down to writing spans (arrays) of pixels with |
||
38 | * particular colors. The span-writing routines must be implemented |
||
39 | * by the device driver. |
||
40 | */ |
||
41 | |||
42 | |||
43 | #ifndef S_CONTEXT_H |
||
44 | #define S_CONTEXT_H |
||
45 | |||
46 | #include "main/compiler.h" |
||
47 | #include "main/mtypes.h" |
||
48 | #include "program/prog_execute.h" |
||
49 | #include "swrast.h" |
||
50 | #include "s_span.h" |
||
51 | |||
52 | |||
53 | typedef void (*texture_sample_func)(struct gl_context *ctx, |
||
54 | const struct gl_texture_object *tObj, |
||
55 | GLuint n, const GLfloat texcoords[][4], |
||
56 | const GLfloat lambda[], GLfloat rgba[][4]); |
||
57 | |||
58 | typedef void (_ASMAPIP blend_func)( struct gl_context *ctx, GLuint n, |
||
59 | const GLubyte mask[], |
||
60 | GLvoid *src, const GLvoid *dst, |
||
61 | GLenum chanType); |
||
62 | |||
63 | typedef void (*swrast_point_func)( struct gl_context *ctx, const SWvertex *); |
||
64 | |||
65 | typedef void (*swrast_line_func)( struct gl_context *ctx, |
||
66 | const SWvertex *, const SWvertex *); |
||
67 | |||
68 | typedef void (*swrast_tri_func)( struct gl_context *ctx, const SWvertex *, |
||
69 | const SWvertex *, const SWvertex *); |
||
70 | |||
71 | |||
72 | typedef void (*validate_texture_image_func)(struct gl_context *ctx, |
||
73 | struct gl_texture_object *texObj, |
||
74 | GLuint face, GLuint level); |
||
75 | |||
76 | |||
77 | /** |
||
78 | * \defgroup Bitmasks |
||
79 | * Bitmasks to indicate which rasterization options are enabled |
||
80 | * (RasterMask) |
||
81 | */ |
||
82 | /*@{*/ |
||
83 | #define ALPHATEST_BIT 0x001 /**< Alpha-test pixels */ |
||
84 | #define BLEND_BIT 0x002 /**< Blend pixels */ |
||
85 | #define DEPTH_BIT 0x004 /**< Depth-test pixels */ |
||
86 | #define FOG_BIT 0x008 /**< Fog pixels */ |
||
87 | #define LOGIC_OP_BIT 0x010 /**< Apply logic op in software */ |
||
88 | #define CLIP_BIT 0x020 /**< Scissor or window clip pixels */ |
||
89 | #define STENCIL_BIT 0x040 /**< Stencil pixels */ |
||
90 | #define MASKING_BIT 0x080 /**< Do glColorMask or glIndexMask */ |
||
91 | #define MULTI_DRAW_BIT 0x400 /**< Write to more than one color- */ |
||
92 | /**< buffer or no buffers. */ |
||
93 | #define OCCLUSION_BIT 0x800 /**< GL_HP_occlusion_test enabled */ |
||
94 | #define TEXTURE_BIT 0x1000 /**< Texturing really enabled */ |
||
95 | #define FRAGPROG_BIT 0x2000 /**< Fragment program enabled */ |
||
96 | #define ATIFRAGSHADER_BIT 0x4000 /**< ATI Fragment shader enabled */ |
||
97 | #define CLAMPING_BIT 0x8000 /**< Clamp colors to [0,1] */ |
||
98 | /*@}*/ |
||
99 | |||
100 | #define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS| \ |
||
101 | _NEW_SCISSOR| \ |
||
102 | _NEW_COLOR| \ |
||
103 | _NEW_DEPTH| \ |
||
104 | _NEW_FOG| \ |
||
105 | _NEW_PROGRAM| \ |
||
106 | _NEW_STENCIL| \ |
||
107 | _NEW_TEXTURE| \ |
||
108 | _NEW_VIEWPORT| \ |
||
109 | _NEW_DEPTH) |
||
110 | |||
111 | |||
112 | /** |
||
113 | * \struct SWcontext |
||
114 | * \brief Per-context state that's private to the software rasterizer module. |
||
115 | */ |
||
116 | typedef struct |
||
117 | { |
||
118 | /** Driver interface: |
||
119 | */ |
||
120 | struct swrast_device_driver Driver; |
||
121 | |||
122 | /** Configuration mechanisms to make software rasterizer match |
||
123 | * characteristics of the hardware rasterizer (if present): |
||
124 | */ |
||
125 | GLboolean AllowVertexFog; |
||
126 | GLboolean AllowPixelFog; |
||
127 | |||
128 | /** Derived values, invalidated on statechanges, updated from |
||
129 | * _swrast_validate_derived(): |
||
130 | */ |
||
131 | GLbitfield _RasterMask; |
||
132 | GLfloat _BackfaceSign; /** +1 or -1 */ |
||
133 | GLfloat _BackfaceCullSign; /** +1, 0, or -1 */ |
||
134 | GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ |
||
135 | GLboolean _TextureCombinePrimary; |
||
136 | GLboolean _FogEnabled; |
||
137 | GLboolean _DeferredTexture; |
||
138 | GLenum _FogMode; /* either GL_FOG_MODE or fragment program's fog mode */ |
||
139 | |||
140 | /** List/array of the fragment attributes to interpolate */ |
||
141 | GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; |
||
142 | /** Same info, but as a bitmask */ |
||
143 | GLbitfield _ActiveAttribMask; |
||
144 | /** Number of fragment attributes to interpolate */ |
||
145 | GLuint _NumActiveAttribs; |
||
146 | /** Indicates how each attrib is to be interpolated (lines/tris) */ |
||
147 | GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ |
||
148 | |||
149 | /* Accum buffer temporaries. |
||
150 | */ |
||
151 | GLboolean _IntegerAccumMode; /**< Storing unscaled integers? */ |
||
152 | GLfloat _IntegerAccumScaler; /**< Implicit scale factor */ |
||
153 | |||
154 | /* Working values: |
||
155 | */ |
||
156 | GLuint StippleCounter; /**< Line stipple counter */ |
||
157 | GLuint PointLineFacing; |
||
158 | GLbitfield NewState; |
||
159 | GLuint StateChanges; |
||
160 | GLenum Primitive; /* current primitive being drawn (ala glBegin) */ |
||
161 | GLboolean SpecularVertexAdd; /**< Add specular/secondary color per vertex */ |
||
162 | |||
163 | void (*InvalidateState)( struct gl_context *ctx, GLbitfield new_state ); |
||
164 | |||
165 | /** |
||
166 | * When the NewState mask intersects these masks, we invalidate the |
||
167 | * Point/Line/Triangle function pointers below. |
||
168 | */ |
||
169 | /*@{*/ |
||
170 | GLbitfield InvalidatePointMask; |
||
171 | GLbitfield InvalidateLineMask; |
||
172 | GLbitfield InvalidateTriangleMask; |
||
173 | /*@}*/ |
||
174 | |||
175 | /** |
||
176 | * Device drivers plug in functions for these callbacks. |
||
177 | * Will be called when the GL state change mask intersects the above masks. |
||
178 | */ |
||
179 | /*@{*/ |
||
180 | void (*choose_point)( struct gl_context * ); |
||
181 | void (*choose_line)( struct gl_context * ); |
||
182 | void (*choose_triangle)( struct gl_context * ); |
||
183 | /*@}*/ |
||
184 | |||
185 | /** |
||
186 | * Current point, line and triangle drawing functions. |
||
187 | */ |
||
188 | /*@{*/ |
||
189 | swrast_point_func Point; |
||
190 | swrast_line_func Line; |
||
191 | swrast_tri_func Triangle; |
||
192 | /*@}*/ |
||
193 | |||
194 | /** |
||
195 | * Placeholders for when separate specular (or secondary color) is |
||
196 | * enabled but texturing is not. |
||
197 | */ |
||
198 | /*@{*/ |
||
199 | swrast_point_func SpecPoint; |
||
200 | swrast_line_func SpecLine; |
||
201 | swrast_tri_func SpecTriangle; |
||
202 | /*@}*/ |
||
203 | |||
204 | /** |
||
205 | * Typically, we'll allocate a sw_span structure as a local variable |
||
206 | * and set its 'array' pointer to point to this object. The reason is |
||
207 | * this object is big and causes problems when allocated on the stack |
||
208 | * on some systems. |
||
209 | */ |
||
210 | SWspanarrays *SpanArrays; |
||
211 | SWspanarrays *ZoomedArrays; /**< For pixel zooming */ |
||
212 | |||
213 | /** |
||
214 | * Used to buffer N GL_POINTS, instead of rendering one by one. |
||
215 | */ |
||
216 | SWspan PointSpan; |
||
217 | |||
218 | /** Internal hooks, kept up to date by the same mechanism as above. |
||
219 | */ |
||
220 | blend_func BlendFunc; |
||
221 | texture_sample_func TextureSample[MAX_TEXTURE_IMAGE_UNITS]; |
||
222 | |||
223 | /** Buffer for saving the sampled texture colors. |
||
224 | * Needed for GL_ARB_texture_env_crossbar implementation. |
||
225 | */ |
||
226 | GLfloat *TexelBuffer; |
||
227 | |||
228 | validate_texture_image_func ValidateTextureImage; |
||
229 | |||
230 | /** State used during execution of fragment programs */ |
||
231 | struct gl_program_machine FragProgMachine; |
||
232 | |||
233 | } SWcontext; |
||
234 | |||
235 | |||
236 | extern void |
||
237 | _swrast_validate_derived( struct gl_context *ctx ); |
||
238 | |||
239 | extern void |
||
240 | _swrast_update_texture_samplers(struct gl_context *ctx); |
||
241 | |||
242 | |||
243 | /** Return SWcontext for the given struct gl_context */ |
||
244 | static INLINE SWcontext * |
||
245 | SWRAST_CONTEXT(struct gl_context *ctx) |
||
246 | { |
||
247 | return (SWcontext *) ctx->swrast_context; |
||
248 | } |
||
249 | |||
250 | /** const version of above */ |
||
251 | static INLINE const SWcontext * |
||
252 | CONST_SWRAST_CONTEXT(const struct gl_context *ctx) |
||
253 | { |
||
254 | return (const SWcontext *) ctx->swrast_context; |
||
255 | } |
||
256 | |||
257 | |||
258 | /** |
||
259 | * Called prior to framebuffer reading/writing. |
||
260 | * For drivers that rely on swrast for fallback rendering, this is the |
||
261 | * driver's opportunity to map renderbuffers and textures. |
||
262 | */ |
||
263 | static INLINE void |
||
264 | swrast_render_start(struct gl_context *ctx) |
||
265 | { |
||
266 | SWcontext *swrast = SWRAST_CONTEXT(ctx); |
||
267 | if (swrast->Driver.SpanRenderStart) |
||
268 | swrast->Driver.SpanRenderStart(ctx); |
||
269 | } |
||
270 | |||
271 | |||
272 | /** Called after framebuffer reading/writing */ |
||
273 | static INLINE void |
||
274 | swrast_render_finish(struct gl_context *ctx) |
||
275 | { |
||
276 | SWcontext *swrast = SWRAST_CONTEXT(ctx); |
||
277 | if (swrast->Driver.SpanRenderFinish) |
||
278 | swrast->Driver.SpanRenderFinish(ctx); |
||
279 | } |
||
280 | |||
281 | |||
282 | |||
283 | /** |
||
284 | * Size of an RGBA pixel, in bytes, for given datatype. |
||
285 | */ |
||
286 | #define RGBA_PIXEL_SIZE(TYPE) \ |
||
287 | ((TYPE == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) : \ |
||
288 | ((TYPE == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort) \ |
||
289 | : 4 * sizeof(GLfloat))) |
||
290 | |||
291 | |||
292 | |||
293 | /* |
||
294 | * Fixed point arithmetic macros |
||
295 | */ |
||
296 | #ifndef FIXED_FRAC_BITS |
||
297 | #define FIXED_FRAC_BITS 11 |
||
298 | #endif |
||
299 | |||
300 | #define FIXED_SHIFT FIXED_FRAC_BITS |
||
301 | #define FIXED_ONE (1 << FIXED_SHIFT) |
||
302 | #define FIXED_HALF (1 << (FIXED_SHIFT-1)) |
||
303 | #define FIXED_FRAC_MASK (FIXED_ONE - 1) |
||
304 | #define FIXED_INT_MASK (~FIXED_FRAC_MASK) |
||
305 | #define FIXED_EPSILON 1 |
||
306 | #define FIXED_SCALE ((float) FIXED_ONE) |
||
307 | #define FIXED_DBL_SCALE ((double) FIXED_ONE) |
||
308 | #define FloatToFixed(X) (IROUND((X) * FIXED_SCALE)) |
||
309 | #define FixedToDouble(X) ((X) * (1.0 / FIXED_DBL_SCALE)) |
||
310 | #define IntToFixed(I) ((I) << FIXED_SHIFT) |
||
311 | #define FixedToInt(X) ((X) >> FIXED_SHIFT) |
||
312 | #define FixedToUns(X) (((unsigned int)(X)) >> FIXED_SHIFT) |
||
313 | #define FixedCeil(X) (((X) + FIXED_ONE - FIXED_EPSILON) & FIXED_INT_MASK) |
||
314 | #define FixedFloor(X) ((X) & FIXED_INT_MASK) |
||
315 | #define FixedToFloat(X) ((X) * (1.0F / FIXED_SCALE)) |
||
316 | #define PosFloatToFixed(X) FloatToFixed(X) |
||
317 | #define SignedFloatToFixed(X) FloatToFixed(X) |
||
318 | |||
319 | |||
320 | |||
321 | /* |
||
322 | * XXX these macros are just bandages for now in order to make |
||
323 | * CHAN_BITS==32 compile cleanly. |
||
324 | * These should probably go elsewhere at some point. |
||
325 | */ |
||
326 | #if CHAN_TYPE == GL_FLOAT |
||
327 | #define ChanToFixed(X) (X) |
||
328 | #define FixedToChan(X) (X) |
||
329 | #else |
||
330 | #define ChanToFixed(X) IntToFixed(X) |
||
331 | #define FixedToChan(X) FixedToInt(X) |
||
332 | #endif |
||
333 | |||
334 | |||
335 | /** |
||
336 | * For looping over fragment attributes in the pointe, line |
||
337 | * triangle rasterizers. |
||
338 | */ |
||
339 | #define ATTRIB_LOOP_BEGIN \ |
||
340 | { \ |
||
341 | GLuint a; \ |
||
342 | for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ |
||
343 | const GLuint attr = swrast->_ActiveAttribs[a]; |
||
344 | |||
345 | #define ATTRIB_LOOP_END } } |
||
346 | |||
347 | |||
348 | |||
349 | #endif>><>><>><>>>>>>>>>>>>>>>>>>>>> |