blob: cd4c66671589777e9a37ce1a70edf2af63ae0c24 [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001/*
2 * Mesa 3-D graphics library
Brian Paul3a212032002-11-19 15:25:00 +00003 * Version: 5.1
jtgafb833d1999-08-19 00:55:39 +00004 *
Brian Paulbc42c192002-01-05 21:53:20 +00005 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00006 *
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
Brian Paulfbd8f211999-11-11 01:22:25 +000026#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000027#include "imports.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000028#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000029#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000030#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000032#include "dlist.h"
33#include "eval.h"
34#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000035#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000036#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000037#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000038#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000039#include "hash.h"
40#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "macros.h"
jtgafb833d1999-08-19 00:55:39 +000042#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000043#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000044#include "teximage.h"
45#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000046#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000047#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000048#include "varray.h"
Brian Paul3a212032002-11-19 15:25:00 +000049#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +000050#include "nvprogram.h"
51#include "nvvertprog.h"
52#endif
53#if FEATURE_NV_fragment_program
54#include "nvfragprog.h"
Brian Paul3a212032002-11-19 15:25:00 +000055#endif
Gareth Hughesd4eb6652001-03-12 01:32:20 +000056#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000057#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000058#include "math/m_matrix.h"
59#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000060#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000061
jtgafb833d1999-08-19 00:55:39 +000062
Brian Paul3b18a362000-09-26 15:27:20 +000063#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000064#include "Trace/tr_context.h"
65#include "Trace/tr_wrapper.h"
66#endif
67
davem69775355a2001-06-05 23:54:00 +000068#ifdef USE_SPARC_ASM
69#include "SPARC/sparc.h"
70#endif
jtgafb833d1999-08-19 00:55:39 +000071
Keith Whitwell23caf202000-11-16 21:05:34 +000072#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000073int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000074#endif
75
76#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000077int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000078#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000079
Brian Paul86b84272001-12-14 02:50:01 +000080
Brian Paul27558a12003-03-01 01:50:20 +000081/* ubyte -> float conversion */
82GLfloat _mesa_ubyte_to_float_color_tab[256];
83
Brian Paul9a33a112002-06-13 04:28:29 +000084static void
85free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
86
Brian Paul86b84272001-12-14 02:50:01 +000087
Brian Paulb1394fa2000-09-26 20:53:53 +000088/**********************************************************************/
89/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
90/**********************************************************************/
91
Brian Paul9a33a112002-06-13 04:28:29 +000092/* Called by window system/device driver (via gc->exports.destroyCurrent())
93 * when the rendering context is to be destroyed.
94 */
95GLboolean
96_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000097{
98 if (gc) {
99 _mesa_free_context_data(gc);
Brian Paul3c634522002-10-24 23:57:19 +0000100 _mesa_free(gc);
Brian Paulb1394fa2000-09-26 20:53:53 +0000101 }
102 return GL_TRUE;
103}
104
Brian Paul9a33a112002-06-13 04:28:29 +0000105/* Called by window system/device driver (via gc->exports.loseCurrent())
106 * when the rendering context is made non-current.
107 */
108GLboolean
109_mesa_loseCurrent(__GLcontext *gc)
110{
111 /* XXX unbind context from thread */
112 return GL_TRUE;
113}
114
115/* Called by window system/device driver (via gc->exports.makeCurrent())
116 * when the rendering context is made current.
117 */
118GLboolean
119_mesa_makeCurrent(__GLcontext *gc)
120{
121 /* XXX bind context to thread */
122 return GL_TRUE;
123}
124
125/* Called by window system/device driver - yadda, yadda, yadda.
126 * See above comments.
127 */
128GLboolean
129_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
130{
131 if (gc && gcShare && gc->Shared && gcShare->Shared) {
132 gc->Shared->RefCount--;
133 if (gc->Shared->RefCount == 0) {
134 free_shared_state(gc, gc->Shared);
135 }
136 gc->Shared = gcShare->Shared;
137 gc->Shared->RefCount++;
138 return GL_TRUE;
139 }
140 else {
141 return GL_FALSE;
142 }
143}
144
145GLboolean
146_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
147{
148 if (dst && src) {
149 _mesa_copy_context( src, dst, mask );
150 return GL_TRUE;
151 }
152 else {
153 return GL_FALSE;
154 }
155}
156
157GLboolean
158_mesa_forceCurrent(__GLcontext *gc)
159{
160 return GL_TRUE;
161}
162
163GLboolean
164_mesa_notifyResize(__GLcontext *gc)
165{
166 GLint x, y;
167 GLuint width, height;
168 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
169 if (!d || !d->getDrawableSize)
170 return GL_FALSE;
171 d->getDrawableSize( d, &x, &y, &width, &height );
172 /* update viewport, resize software buffers, etc. */
173 return GL_TRUE;
174}
175
176void
177_mesa_notifyDestroy(__GLcontext *gc)
178{
Brian Paul60b6e4f2002-10-14 17:08:17 +0000179 /* Called when the context's window/buffer is going to be destroyed. */
180 /* Unbind from it. */
Brian Paul9a33a112002-06-13 04:28:29 +0000181}
182
183/* Called by window system just before swapping buffers.
184 * We have to finish any pending rendering.
185 */
186void
187_mesa_notifySwapBuffers(__GLcontext *gc)
188{
189 FLUSH_VERTICES( gc, 0 );
190}
191
192struct __GLdispatchStateRec *
193_mesa_dispatchExec(__GLcontext *gc)
194{
195 return NULL;
196}
197
198void
199_mesa_beginDispatchOverride(__GLcontext *gc)
200{
201}
202
203void
204_mesa_endDispatchOverride(__GLcontext *gc)
205{
206}
207
208/* Setup the exports. The window system will call these functions
209 * when it needs Mesa to do something.
210 * NOTE: Device drivers should override these functions! For example,
211 * the Xlib driver should plug in the XMesa*-style functions into this
212 * structure. The XMesa-style functions should then call the _mesa_*
213 * version of these functions. This is an approximation to OO design
214 * (inheritance and virtual functions).
215 */
216static void
217_mesa_init_default_exports(__GLexports *exports)
218{
219 exports->destroyContext = _mesa_destroyContext;
220 exports->loseCurrent = _mesa_loseCurrent;
221 exports->makeCurrent = _mesa_makeCurrent;
222 exports->shareContext = _mesa_shareContext;
223 exports->copyContext = _mesa_copyContext;
224 exports->forceCurrent = _mesa_forceCurrent;
225 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000226 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000227 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
228 exports->dispatchExec = _mesa_dispatchExec;
229 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
230 exports->endDispatchOverride = _mesa_endDispatchOverride;
231}
232
233
Brian Paulb1394fa2000-09-26 20:53:53 +0000234
235/* exported OpenGL SI interface */
236__GLcontext *
237__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
238{
239 GLcontext *ctx;
240
Brian Paul4753d602002-06-15 02:38:15 +0000241 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000242 if (ctx == NULL) {
243 return NULL;
244 }
Brian Paul60b6e4f2002-10-14 17:08:17 +0000245
Brian Paul3c634522002-10-24 23:57:19 +0000246 _mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000247 ctx->imports = *imports;
Brian Paulb1394fa2000-09-26 20:53:53 +0000248
249 return ctx;
250}
251
252
253/* exported OpenGL SI interface */
254void
255__glCoreNopDispatch(void)
256{
257#if 0
258 /* SI */
259 __gl_dispatch = __glNopDispatchState;
260#else
261 /* Mesa */
262 _glapi_set_dispatch(NULL);
263#endif
264}
265
266
jtgafb833d1999-08-19 00:55:39 +0000267/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000268/***** GL Visual allocation/destruction *****/
269/**********************************************************************/
270
271
272/*
273 * Allocate a new GLvisual object.
274 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000275 * dbFlag - double buffering?
276 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000277 * depthBits - requested bits per depth buffer value
278 * Any value in [0, 32] is acceptable but the actual
279 * depth type will be GLushort or GLuint as needed.
280 * stencilBits - requested minimum bits per stencil buffer value
281 * accumBits - requested minimum bits per accum buffer component
282 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
283 * red/green/blue/alphaBits - number of bits per color component
284 * in frame buffer for RGB(A) mode.
285 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000286 * Return: pointer to new GLvisual or NULL if requested parameters can't
287 * be met.
288 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000289GLvisual *
290_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000291 GLboolean dbFlag,
292 GLboolean stereoFlag,
293 GLint redBits,
294 GLint greenBits,
295 GLint blueBits,
296 GLint alphaBits,
297 GLint indexBits,
298 GLint depthBits,
299 GLint stencilBits,
300 GLint accumRedBits,
301 GLint accumGreenBits,
302 GLint accumBlueBits,
303 GLint accumAlphaBits,
304 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000305{
Brian Paul178a1c52000-04-22 01:05:00 +0000306 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
307 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000308 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000309 redBits, greenBits, blueBits, alphaBits,
310 indexBits, depthBits, stencilBits,
311 accumRedBits, accumGreenBits,
312 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000313 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000314 FREE(vis);
315 return NULL;
316 }
317 }
318 return vis;
319}
320
321
322/*
323 * Initialize the fields of the given GLvisual.
324 * Input: see _mesa_create_visual() above.
325 * Return: GL_TRUE = success
326 * GL_FALSE = failure.
327 */
328GLboolean
329_mesa_initialize_visual( GLvisual *vis,
330 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000331 GLboolean dbFlag,
332 GLboolean stereoFlag,
333 GLint redBits,
334 GLint greenBits,
335 GLint blueBits,
336 GLint alphaBits,
337 GLint indexBits,
338 GLint depthBits,
339 GLint stencilBits,
340 GLint accumRedBits,
341 GLint accumGreenBits,
342 GLint accumBlueBits,
343 GLint accumAlphaBits,
344 GLint numSamples )
345{
Brian Paulb6bcae52001-01-23 23:39:36 +0000346 (void) numSamples;
347
Brian Paul178a1c52000-04-22 01:05:00 +0000348 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000349
Brian Pauled30dfa2000-03-03 17:47:39 +0000350 /* This is to catch bad values from device drivers not updated for
351 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
352 * bad value now (a 1-bit depth buffer!?!).
353 */
354 assert(depthBits == 0 || depthBits > 1);
355
356 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000357 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000358 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000359 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000360 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000361 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000362 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000363 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000364 }
365 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000366 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000367 }
368 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000369 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000370 }
371 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000372 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000373 }
374
Brian Paulb6bcae52001-01-23 23:39:36 +0000375 vis->rgbMode = rgbFlag;
376 vis->doubleBufferMode = dbFlag;
377 vis->stereoMode = stereoFlag;
Brian Paul153f1542002-10-29 15:04:35 +0000378
Brian Paulb6bcae52001-01-23 23:39:36 +0000379 vis->redBits = redBits;
380 vis->greenBits = greenBits;
381 vis->blueBits = blueBits;
382 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000383
Brian Paulb6bcae52001-01-23 23:39:36 +0000384 vis->indexBits = indexBits;
385 vis->depthBits = depthBits;
386 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
387 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
388 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
389 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
390 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000391
Brian Paul153f1542002-10-29 15:04:35 +0000392 vis->haveAccumBuffer = accumRedBits > 0;
393 vis->haveDepthBuffer = depthBits > 0;
394 vis->haveStencilBuffer = stencilBits > 0;
395
396 vis->numAuxBuffers = 0;
397 vis->level = 0;
398 vis->pixmapMode = 0;
399
Brian Paul178a1c52000-04-22 01:05:00 +0000400 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000401}
402
403
Brian Paulb371e0d2000-03-31 01:05:51 +0000404void
405_mesa_destroy_visual( GLvisual *vis )
406{
407 FREE(vis);
408}
409
410
Brian Paul4d053dd2000-01-14 04:45:47 +0000411/**********************************************************************/
412/***** GL Framebuffer allocation/destruction *****/
413/**********************************************************************/
414
415
416/*
417 * Create a new framebuffer. A GLframebuffer is a struct which
418 * encapsulates the depth, stencil and accum buffers and related
419 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000420 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000421 * softwareDepth - create/use a software depth buffer?
422 * softwareStencil - create/use a software stencil buffer?
423 * softwareAccum - create/use a software accum buffer?
424 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000425 * Return: pointer to new GLframebuffer struct or NULL if error.
426 */
Brian Paul178a1c52000-04-22 01:05:00 +0000427GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000428_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000429 GLboolean softwareDepth,
430 GLboolean softwareStencil,
431 GLboolean softwareAccum,
432 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000433{
Brian Paul178a1c52000-04-22 01:05:00 +0000434 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
435 assert(visual);
436 if (buffer) {
437 _mesa_initialize_framebuffer(buffer, visual,
438 softwareDepth, softwareStencil,
439 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000440 }
Brian Paul178a1c52000-04-22 01:05:00 +0000441 return buffer;
442}
443
444
445/*
446 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000447 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000448 */
449void
450_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000451 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000452 GLboolean softwareDepth,
453 GLboolean softwareStencil,
454 GLboolean softwareAccum,
455 GLboolean softwareAlpha )
456{
457 assert(buffer);
458 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000459
Brian Paul6ec6b842002-10-30 19:49:29 +0000460 _mesa_bzero(buffer, sizeof(GLframebuffer));
Brian Paul85d81602002-06-17 23:36:31 +0000461
Brian Paul4d053dd2000-01-14 04:45:47 +0000462 /* sanity checks */
463 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000464 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000465 }
466 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000467 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000468 }
469 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000470 assert(visual->rgbMode);
471 assert(visual->accumRedBits > 0);
472 assert(visual->accumGreenBits > 0);
473 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000474 }
475 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000476 assert(visual->rgbMode);
477 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000478 }
479
Brian Paul75978bd2001-04-27 21:17:20 +0000480 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000481 buffer->UseSoftwareDepthBuffer = softwareDepth;
482 buffer->UseSoftwareStencilBuffer = softwareStencil;
483 buffer->UseSoftwareAccumBuffer = softwareAccum;
484 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000485}
486
487
Brian Paul4d053dd2000-01-14 04:45:47 +0000488/*
489 * Free a framebuffer struct and its buffers.
490 */
Brian Paul178a1c52000-04-22 01:05:00 +0000491void
Brian Paulb1394fa2000-09-26 20:53:53 +0000492_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000493{
494 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000495 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000496 FREE(buffer);
497 }
498}
499
500
Brian Paul75978bd2001-04-27 21:17:20 +0000501/*
502 * Free the data hanging off of <buffer>, but not <buffer> itself.
503 */
504void
505_mesa_free_framebuffer_data( GLframebuffer *buffer )
506{
507 if (!buffer)
508 return;
509
Brian Paul87506682003-05-27 15:20:43 +0000510 if (buffer->UseSoftwareDepthBuffer && buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000511 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000512 buffer->DepthBuffer = NULL;
513 }
Brian Paul87506682003-05-27 15:20:43 +0000514 if (buffer->UseSoftwareAccumBuffer && buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000515 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000516 buffer->Accum = NULL;
517 }
Brian Paul87506682003-05-27 15:20:43 +0000518 if (buffer->UseSoftwareStencilBuffer && buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000519 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000520 buffer->Stencil = NULL;
521 }
Brian Paul87506682003-05-27 15:20:43 +0000522 if (buffer->UseSoftwareAlphaBuffers){
523 if (buffer->FrontLeftAlpha) {
524 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
525 buffer->FrontLeftAlpha = NULL;
526 }
527 if (buffer->BackLeftAlpha) {
528 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
529 buffer->BackLeftAlpha = NULL;
530 }
531 if (buffer->FrontRightAlpha) {
532 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
533 buffer->FrontRightAlpha = NULL;
534 }
535 if (buffer->BackRightAlpha) {
536 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
537 buffer->BackRightAlpha = NULL;
538 }
Brian Paul75978bd2001-04-27 21:17:20 +0000539 }
540}
541
542
Brian Paul4d053dd2000-01-14 04:45:47 +0000543
544/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000545/***** Context allocation, initialization, destroying *****/
546/**********************************************************************/
547
548
Brian Paul9560f052000-01-31 23:11:39 +0000549_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
550
551
jtgafb833d1999-08-19 00:55:39 +0000552/*
553 * This function just calls all the various one-time-init functions in Mesa.
554 */
Brian Paul178a1c52000-04-22 01:05:00 +0000555static void
Brian Paul4753d602002-06-15 02:38:15 +0000556one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000557{
558 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000559 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000560 if (!alreadyCalled) {
Brian Paul27558a12003-03-01 01:50:20 +0000561 GLuint i;
562
Brian Paul4d053dd2000-01-14 04:45:47 +0000563 /* do some implementation tests */
564 assert( sizeof(GLbyte) == 1 );
565 assert( sizeof(GLshort) >= 2 );
566 assert( sizeof(GLint) >= 4 );
567 assert( sizeof(GLubyte) == 1 );
568 assert( sizeof(GLushort) >= 2 );
569 assert( sizeof(GLuint) >= 4 );
570
Brian Paul08836342001-03-03 20:33:27 +0000571 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000572
Keith Whitwell23caf202000-11-16 21:05:34 +0000573 _math_init();
Brian Paul27558a12003-03-01 01:50:20 +0000574
575 for (i = 0; i < 256; i++) {
576 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
577 }
Brian Paul68ee4bc2000-01-28 19:02:22 +0000578
davem69775355a2001-06-05 23:54:00 +0000579#ifdef USE_SPARC_ASM
580 _mesa_init_sparc_glapi_relocs();
581#endif
Brian Paul3c634522002-10-24 23:57:19 +0000582 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000583 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000584#ifndef GLX_DIRECT_RENDERING
585 /* libGL from before 2002/06/28 don't have this function. Someday,
586 * when newer libGL libs are common, remove the #ifdef test. This
587 * only serves to print warnings when calling undefined GL functions.
588 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000589 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000590#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000591 }
592 else {
593 _glapi_noop_enable_warnings(GL_FALSE);
594 }
595
jtgafb833d1999-08-19 00:55:39 +0000596#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000597 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000598#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000599
600 alreadyCalled = GL_TRUE;
601 }
Brian Paul9560f052000-01-31 23:11:39 +0000602 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000603}
604
605
Brian Paul86b84272001-12-14 02:50:01 +0000606static void
607init_matrix_stack( struct matrix_stack *stack,
608 GLuint maxDepth, GLuint dirtyFlag )
609{
610 GLuint i;
611
612 stack->Depth = 0;
613 stack->MaxDepth = maxDepth;
614 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000615 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000616 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000617 for (i = 0; i < maxDepth; i++) {
618 _math_matrix_ctr(&stack->Stack[i]);
619 _math_matrix_alloc_inv(&stack->Stack[i]);
620 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000621 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000622}
623
624
625static void
626free_matrix_stack( struct matrix_stack *stack )
627{
628 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000629 for (i = 0; i < stack->MaxDepth; i++) {
630 _math_matrix_dtr(&stack->Stack[i]);
631 }
Brian Paulc4afba32002-02-05 23:21:45 +0000632 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000633 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000634}
635
Brian Paul4d053dd2000-01-14 04:45:47 +0000636
jtgafb833d1999-08-19 00:55:39 +0000637/*
638 * Allocate and initialize a shared context state structure.
639 */
Brian Paula3f13702003-04-01 16:41:50 +0000640static GLboolean
641alloc_shared_state( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000642{
Brian Paula3f13702003-04-01 16:41:50 +0000643 struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000644 if (!ss)
Brian Paula3f13702003-04-01 16:41:50 +0000645 return GL_FALSE;
646
647 ctx->Shared = ss;
jtgafb833d1999-08-19 00:55:39 +0000648
Brian Paule4b684c2000-09-12 21:07:40 +0000649 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000650
Brian Paule4b684c2000-09-12 21:07:40 +0000651 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000652 ss->TexObjects = _mesa_NewHashTable();
Brian Paul451f3102003-04-17 01:48:19 +0000653#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
Brian Paul610d5992003-01-14 04:55:45 +0000654 ss->Programs = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000655#endif
jtgafb833d1999-08-19 00:55:39 +0000656
Brian Paul451f3102003-04-17 01:48:19 +0000657#if FEATURE_ARB_vertex_program
658 ss->DefaultVertexProgram = _mesa_alloc_program(ctx, GL_VERTEX_PROGRAM_ARB, 0);
659 if (!ss->DefaultVertexProgram)
660 goto cleanup;
661#endif
662#if FEATURE_ARB_fragment_program
663 ss->DefaultFragmentProgram = _mesa_alloc_program(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
664 if (!ss->DefaultFragmentProgram)
665 goto cleanup;
666#endif
667
Brian Paula3f13702003-04-01 16:41:50 +0000668 ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
669 if (!ss->Default1D)
670 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000671
Brian Paula3f13702003-04-01 16:41:50 +0000672 ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
673 if (!ss->Default2D)
674 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +0000675
Brian Paula3f13702003-04-01 16:41:50 +0000676 ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
677 if (!ss->Default3D)
678 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000679
Brian Paula3f13702003-04-01 16:41:50 +0000680 ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
681 if (!ss->DefaultCubeMap)
682 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000683
Brian Paula3f13702003-04-01 16:41:50 +0000684 ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
685 if (!ss->DefaultRect)
686 goto cleanup;
Brian Paul413d6a22000-05-26 14:44:59 +0000687
Brian Paula3f13702003-04-01 16:41:50 +0000688#if 0
689 _mesa_save_texture_object(ctx, ss->Default1D);
690 _mesa_save_texture_object(ctx, ss->Default2D);
691 _mesa_save_texture_object(ctx, ss->Default3D);
692 _mesa_save_texture_object(ctx, ss->DefaultCubeMap);
693 _mesa_save_texture_object(ctx, ss->DefaultRect);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000694#endif
Brian Paula3f13702003-04-01 16:41:50 +0000695
696 /* Effectively bind the default textures to all texture units */
697 ss->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
698 ss->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
699 ss->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
700 ss->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
701 ss->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
702
703 return GL_TRUE;
704
705 cleanup:
706 /* Ran out of memory at some point. Free everything and return NULL */
707 if (ss->DisplayList)
708 _mesa_DeleteHashTable(ss->DisplayList);
709 if (ss->TexObjects)
710 _mesa_DeleteHashTable(ss->TexObjects);
711#if FEATURE_NV_vertex_program
712 if (ss->Programs)
713 _mesa_DeleteHashTable(ss->Programs);
714#endif
Brian Paul451f3102003-04-17 01:48:19 +0000715#if FEATURE_ARB_vertex_program
716 if (ss->DefaultVertexProgram)
717 _mesa_delete_program(ctx, ss->DefaultVertexProgram);
718#endif
719#if FEATURE_ARB_fragment_program
720 if (ss->DefaultFragmentProgram)
721 _mesa_delete_program(ctx, ss->DefaultFragmentProgram);
722#endif
Brian Paula3f13702003-04-01 16:41:50 +0000723 if (ss->Default1D)
724 (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
725 if (ss->Default2D)
726 (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
727 if (ss->Default3D)
728 (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
729 if (ss->DefaultCubeMap)
730 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
731 if (ss->DefaultRect)
732 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
733 if (ss)
734 _mesa_free(ss);
735 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000736}
737
738
739/*
740 * Deallocate a shared state context and all children structures.
741 */
Brian Paul178a1c52000-04-22 01:05:00 +0000742static void
743free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000744{
745 /* Free display lists */
746 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000747 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000748 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000749 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000750 }
751 else {
752 break;
753 }
754 }
Brian Paulbb797902000-01-24 16:19:54 +0000755 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000756
757 /* Free texture objects */
Brian Paula3f13702003-04-01 16:41:50 +0000758 ASSERT(ctx->Driver.DeleteTexture);
759 while (1) {
760 GLuint texName = _mesa_HashFirstEntry(ss->TexObjects);
761 if (texName) {
762 struct gl_texture_object *texObj = (struct gl_texture_object *)
763 _mesa_HashLookup(ss->TexObjects, texName);
764 ASSERT(texObj);
765 (*ctx->Driver.DeleteTexture)(ctx, texObj);
766 _mesa_HashRemove(ss->TexObjects, texName);
767 }
768 else {
769 break;
770 }
jtgafb833d1999-08-19 00:55:39 +0000771 }
Brian Paulbb797902000-01-24 16:19:54 +0000772 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000773
Brian Paul8dfc5b92002-10-16 17:57:51 +0000774#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000775 /* Free vertex programs */
776 while (1) {
Brian Paul610d5992003-01-14 04:55:45 +0000777 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
Brian Paul30f51ae2001-12-18 04:06:44 +0000778 if (prog) {
Brian Paul451f3102003-04-17 01:48:19 +0000779 struct program *p = (struct program *) _mesa_HashLookup(ss->Programs,
780 prog);
781 ASSERT(p);
782 _mesa_delete_program(ctx, p);
783 _mesa_HashRemove(ss->Programs, prog);
Brian Paul30f51ae2001-12-18 04:06:44 +0000784 }
785 else {
786 break;
787 }
788 }
Brian Paul610d5992003-01-14 04:55:45 +0000789 _mesa_DeleteHashTable(ss->Programs);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000790#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000791
Keith Whitwelle15fd852002-12-12 13:03:15 +0000792 _glthread_DESTROY_MUTEX(ss->Mutex);
793
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000794 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000795}
796
797
798
jtgafb833d1999-08-19 00:55:39 +0000799/*
800 * Initialize the nth light. Note that the defaults for light 0 are
801 * different than the other lights.
802 */
Brian Paul178a1c52000-04-22 01:05:00 +0000803static void
804init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000805{
806 make_empty_list( l );
807
808 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
809 if (n==0) {
810 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
811 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
812 }
813 else {
814 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
815 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
816 }
817 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
818 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
819 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000820 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000821 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000822 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000823 l->ConstantAttenuation = 1.0;
824 l->LinearAttenuation = 0.0;
825 l->QuadraticAttenuation = 0.0;
826 l->Enabled = GL_FALSE;
827}
828
829
830
Brian Paul178a1c52000-04-22 01:05:00 +0000831static void
832init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000833{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000834 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000835 lm->LocalViewer = GL_FALSE;
836 lm->TwoSide = GL_FALSE;
837 lm->ColorControl = GL_SINGLE_COLOR;
838}
839
840
Brian Paul178a1c52000-04-22 01:05:00 +0000841static void
842init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000843{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000844 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
845 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
846 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
847 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000848 m->Shininess = 0.0;
849 m->AmbientIndex = 0;
850 m->DiffuseIndex = 1;
851 m->SpecularIndex = 1;
852}
853
854
855
Brian Paul178a1c52000-04-22 01:05:00 +0000856static void
857init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000858{
859 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
860
861 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000862 texUnit->CombineModeRGB = GL_MODULATE;
863 texUnit->CombineModeA = GL_MODULATE;
864 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
865 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
866 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
867 texUnit->CombineSourceA[0] = GL_TEXTURE;
868 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
869 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
870 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
871 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
872 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
873 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
874 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
875 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
876 texUnit->CombineScaleShiftRGB = 0;
877 texUnit->CombineScaleShiftA = 0;
878
jtgafb833d1999-08-19 00:55:39 +0000879 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
880 texUnit->TexGenEnabled = 0;
881 texUnit->GenModeS = GL_EYE_LINEAR;
882 texUnit->GenModeT = GL_EYE_LINEAR;
883 texUnit->GenModeR = GL_EYE_LINEAR;
884 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000885 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
886 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
887 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
888 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000889
jtgafb833d1999-08-19 00:55:39 +0000890 /* Yes, these plane coefficients are correct! */
891 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
892 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
893 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
894 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
895 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
896 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
897 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
898 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
899
Brian Paula8523782000-11-19 23:10:25 +0000900 texUnit->Current1D = ctx->Shared->Default1D;
901 texUnit->Current2D = ctx->Shared->Default2D;
902 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000903 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000904 texUnit->CurrentRect = ctx->Shared->DefaultRect;
Brian Paul45b47d02003-01-26 14:37:15 +0000905
906 /* GL_SGI_texture_color_table */
907 texUnit->ColorTableEnabled = GL_FALSE;
908 _mesa_init_colortable(&texUnit->ColorTable);
909 _mesa_init_colortable(&texUnit->ProxyColorTable);
jtgafb833d1999-08-19 00:55:39 +0000910}
911
912
jtgafb833d1999-08-19 00:55:39 +0000913
Brian Paul4d053dd2000-01-14 04:45:47 +0000914
jtgafb833d1999-08-19 00:55:39 +0000915/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000916static void
917init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000918{
919 map->Order = 1;
920 map->u1 = 0.0;
921 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000922 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000923 if (map->Points) {
924 GLint i;
925 for (i=0;i<n;i++)
926 map->Points[i] = initial[i];
927 }
jtgafb833d1999-08-19 00:55:39 +0000928}
929
930
931/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000932static void
933init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000934{
935 map->Uorder = 1;
936 map->Vorder = 1;
937 map->u1 = 0.0;
938 map->u2 = 1.0;
939 map->v1 = 0.0;
940 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000941 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000942 if (map->Points) {
943 GLint i;
944 for (i=0;i<n;i++)
945 map->Points[i] = initial[i];
946 }
jtgafb833d1999-08-19 00:55:39 +0000947}
948
949
jtgafb833d1999-08-19 00:55:39 +0000950/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000951 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000952 */
Brian Paul178a1c52000-04-22 01:05:00 +0000953static void
954init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000955{
Brian Paul30f51ae2001-12-18 04:06:44 +0000956 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000957
Brian Paul4d053dd2000-01-14 04:45:47 +0000958 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000959
Brian Paulcd1cefa2001-06-13 14:56:14 +0000960 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
961 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
962
Brian Paul539cce52000-02-03 19:40:07 +0000963 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000964 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000965 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
966 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000967 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000968 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Brian Paul610d5992003-01-14 04:55:45 +0000969 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
970 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000971 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000972 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000973 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000974 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
975 ctx->Const.MinPointSize = MIN_POINT_SIZE;
976 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
977 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
978 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000979 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000980 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
981 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
982 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
983 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000984 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000985 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000986 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000987 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
988 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000989 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
990 ctx->Const.MaxLights = MAX_LIGHTS;
Ian Romanick882caa12003-05-30 21:37:14 +0000991 ctx->Const.MaxSpotExponent = 128.0;
992 ctx->Const.MaxShininess = 128.0;
Brian Pauld0492cf2003-04-11 01:20:06 +0000993#if FEATURE_ARB_vertex_program
Brian Pauld0492cf2003-04-11 01:20:06 +0000994 ctx->Const.MaxVertexProgramInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;
Brian Paul451f3102003-04-17 01:48:19 +0000995 ctx->Const.MaxVertexProgramAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
996 ctx->Const.MaxVertexProgramTemps = MAX_NV_VERTEX_PROGRAM_TEMPS;
997 ctx->Const.MaxVertexProgramLocalParams = MAX_NV_VERTEX_PROGRAM_PARAMS;
998 ctx->Const.MaxVertexProgramEnvParams = MAX_NV_VERTEX_PROGRAM_PARAMS;/*XXX*/
999 ctx->Const.MaxVertexProgramAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
Brian Pauld0492cf2003-04-11 01:20:06 +00001000#endif
1001#if FEATURE_ARB_fragment_program
Brian Pauld0492cf2003-04-11 01:20:06 +00001002 ctx->Const.MaxFragmentProgramInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;
Brian Paul451f3102003-04-17 01:48:19 +00001003 ctx->Const.MaxFragmentProgramAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
1004 ctx->Const.MaxFragmentProgramTemps = MAX_NV_FRAGMENT_PROGRAM_TEMPS;
1005 ctx->Const.MaxFragmentProgramLocalParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
1006 ctx->Const.MaxFragmentProgramEnvParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;/*XXX*/
1007 ctx->Const.MaxFragmentProgramAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
1008 ctx->Const.MaxFragmentProgramAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;
1009 ctx->Const.MaxFragmentProgramTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
1010 ctx->Const.MaxFragmentProgramTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
Brian Pauld0492cf2003-04-11 01:20:06 +00001011#endif
Brian Pauledd67742003-04-18 18:02:43 +00001012 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
1013 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
Brian Pauld0492cf2003-04-11 01:20:06 +00001014
Brian Paul92f97852003-05-01 22:44:02 +00001015 ASSERT(ctx->Const.MaxTextureUnits == MAX2(ctx->Const.MaxTextureImageUnits, ctx->Const.MaxTextureCoordUnits));
jtgafb833d1999-08-19 00:55:39 +00001016
Brian Paul30f51ae2001-12-18 04:06:44 +00001017 /* Initialize matrix stacks */
1018 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
1019 _NEW_MODELVIEW);
1020 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
1021 _NEW_PROJECTION);
1022 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
1023 _NEW_COLOR_MATRIX);
Brian Paul610d5992003-01-14 04:55:45 +00001024 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001025 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
1026 _NEW_TEXTURE_MATRIX);
1027 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
Brian Pauledd67742003-04-18 18:02:43 +00001028 init_matrix_stack(&ctx->ProgramMatrixStack[i],
1029 MAX_PROGRAM_MATRIX_STACK_DEPTH, _NEW_TRACK_MATRIX);
Brian Paul30f51ae2001-12-18 04:06:44 +00001030 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +00001031
Brian Paul30f51ae2001-12-18 04:06:44 +00001032 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +00001033 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
1034
Brian Paul4d053dd2000-01-14 04:45:47 +00001035 /* Accumulate buffer group */
1036 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +00001037
Brian Paul4d053dd2000-01-14 04:45:47 +00001038 /* Color buffer group */
1039 ctx->Color.IndexMask = 0xffffffff;
1040 ctx->Color.ColorMask[0] = 0xff;
1041 ctx->Color.ColorMask[1] = 0xff;
1042 ctx->Color.ColorMask[2] = 0xff;
1043 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +00001044 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +00001045 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001046 ctx->Color.DrawBuffer = GL_FRONT;
1047 ctx->Color.AlphaEnabled = GL_FALSE;
1048 ctx->Color.AlphaFunc = GL_ALWAYS;
1049 ctx->Color.AlphaRef = 0;
1050 ctx->Color.BlendEnabled = GL_FALSE;
1051 ctx->Color.BlendSrcRGB = GL_ONE;
1052 ctx->Color.BlendDstRGB = GL_ZERO;
1053 ctx->Color.BlendSrcA = GL_ONE;
1054 ctx->Color.BlendDstA = GL_ZERO;
1055 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +00001056 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
1057 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
1058 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001059 ctx->Color.LogicOp = GL_COPY;
1060 ctx->Color.DitherFlag = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001061
Brian Paul4d053dd2000-01-14 04:45:47 +00001062 /* Current group */
Brian Pauldd26d022003-04-01 22:20:42 +00001063 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
1064 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
1065 }
1066 /* special cases: */
1067 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 1.0 );
1068 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
Brian Paul86b84272001-12-14 02:50:01 +00001069 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001070 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +00001071 ctx->Current.EdgeFlag = GL_TRUE;
1072
Brian Paul4d053dd2000-01-14 04:45:47 +00001073 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
1074 ctx->Current.RasterDistance = 0.0;
1075 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
Brian Pauldd26d022003-04-01 22:20:42 +00001076 ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 0.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001077 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001078 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001079 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001080 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001081
jtgafb833d1999-08-19 00:55:39 +00001082
Brian Paul4d053dd2000-01-14 04:45:47 +00001083 /* Depth buffer group */
1084 ctx->Depth.Test = GL_FALSE;
1085 ctx->Depth.Clear = 1.0;
1086 ctx->Depth.Func = GL_LESS;
1087 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001088 ctx->Depth.OcclusionTest = GL_FALSE;
Brian Paulb0b9b792003-04-21 14:53:40 +00001089 ctx->Depth.BoundsTest = GL_FALSE;
1090 ctx->Depth.BoundsMin = 0.0F;
1091 ctx->Depth.BoundsMax = 1.0F;
jtgafb833d1999-08-19 00:55:39 +00001092
Brian Paul4d053dd2000-01-14 04:45:47 +00001093 /* Evaluators group */
1094 ctx->Eval.Map1Color4 = GL_FALSE;
1095 ctx->Eval.Map1Index = GL_FALSE;
1096 ctx->Eval.Map1Normal = GL_FALSE;
1097 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1098 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1099 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1100 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1101 ctx->Eval.Map1Vertex3 = GL_FALSE;
1102 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001103 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001104 ctx->Eval.Map2Color4 = GL_FALSE;
1105 ctx->Eval.Map2Index = GL_FALSE;
1106 ctx->Eval.Map2Normal = GL_FALSE;
1107 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1108 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1109 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1110 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1111 ctx->Eval.Map2Vertex3 = GL_FALSE;
1112 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001113 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001114 ctx->Eval.AutoNormal = GL_FALSE;
1115 ctx->Eval.MapGrid1un = 1;
1116 ctx->Eval.MapGrid1u1 = 0.0;
1117 ctx->Eval.MapGrid1u2 = 1.0;
1118 ctx->Eval.MapGrid2un = 1;
1119 ctx->Eval.MapGrid2vn = 1;
1120 ctx->Eval.MapGrid2u1 = 0.0;
1121 ctx->Eval.MapGrid2u2 = 1.0;
1122 ctx->Eval.MapGrid2v1 = 0.0;
1123 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001124
Brian Paul4d053dd2000-01-14 04:45:47 +00001125 /* Evaluator data */
1126 {
1127 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1128 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1129 static GLfloat index[1] = { 1.0 };
1130 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1131 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001132 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001133
Brian Paul4d053dd2000-01-14 04:45:47 +00001134 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1135 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1136 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1137 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1138 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1139 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1140 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1141 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1142 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001143 for (i = 0; i < 16; i++)
1144 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001145
Brian Paul4d053dd2000-01-14 04:45:47 +00001146 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1147 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1148 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1149 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1150 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1151 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1152 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1153 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1154 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001155 for (i = 0; i < 16; i++)
1156 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001157 }
jtgafb833d1999-08-19 00:55:39 +00001158
Brian Paul4d053dd2000-01-14 04:45:47 +00001159 /* Fog group */
1160 ctx->Fog.Enabled = GL_FALSE;
1161 ctx->Fog.Mode = GL_EXP;
1162 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1163 ctx->Fog.Index = 0.0;
1164 ctx->Fog.Density = 1.0;
1165 ctx->Fog.Start = 0.0;
1166 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001167 ctx->Fog.ColorSumEnabled = GL_FALSE;
1168 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001169
Brian Paul4d053dd2000-01-14 04:45:47 +00001170 /* Hint group */
1171 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1172 ctx->Hint.PointSmooth = GL_DONT_CARE;
1173 ctx->Hint.LineSmooth = GL_DONT_CARE;
1174 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1175 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001176 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1177 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001178 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001179
Brian Paul0771d152000-04-07 00:19:41 +00001180 /* Histogram group */
1181 ctx->Histogram.Width = 0;
1182 ctx->Histogram.Format = GL_RGBA;
1183 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001184 ctx->Histogram.RedSize = 0;
1185 ctx->Histogram.GreenSize = 0;
1186 ctx->Histogram.BlueSize = 0;
1187 ctx->Histogram.AlphaSize = 0;
1188 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001189 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1190 ctx->Histogram.Count[i][0] = 0;
1191 ctx->Histogram.Count[i][1] = 0;
1192 ctx->Histogram.Count[i][2] = 0;
1193 ctx->Histogram.Count[i][3] = 0;
1194 }
1195
1196 /* Min/Max group */
1197 ctx->MinMax.Format = GL_RGBA;
1198 ctx->MinMax.Sink = GL_FALSE;
1199 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1200 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1201 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1202 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1203
Brian Paul4d053dd2000-01-14 04:45:47 +00001204 /* Extensions */
Brian Paulde4f4602003-07-03 02:15:06 +00001205 _mesa_init_extensions( ctx );
jtgafb833d1999-08-19 00:55:39 +00001206
Brian Paul4d053dd2000-01-14 04:45:47 +00001207 /* Lighting group */
1208 for (i=0;i<MAX_LIGHTS;i++) {
1209 init_light( &ctx->Light.Light[i], i );
1210 }
1211 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001212
Brian Paul4d053dd2000-01-14 04:45:47 +00001213 init_lightmodel( &ctx->Light.Model );
1214 init_material( &ctx->Light.Material[0] );
1215 init_material( &ctx->Light.Material[1] );
1216 ctx->Light.ShadeModel = GL_SMOOTH;
1217 ctx->Light.Enabled = GL_FALSE;
1218 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1219 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001220 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1221 GL_FRONT_AND_BACK,
1222 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001223
Brian Paul4d053dd2000-01-14 04:45:47 +00001224 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001225
Brian Paul4d053dd2000-01-14 04:45:47 +00001226 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001227 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1228 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001229 for (i = 0 ; i < 10 ; i++) {
1230 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1231 s->shininess = -1;
1232 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001233 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001234 }
Brian Paul77d61af2000-06-28 04:20:21 +00001235
jtgafb833d1999-08-19 00:55:39 +00001236
Brian Paul4d053dd2000-01-14 04:45:47 +00001237 /* Line group */
1238 ctx->Line.SmoothFlag = GL_FALSE;
1239 ctx->Line.StippleFlag = GL_FALSE;
1240 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001241 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001242 ctx->Line.StipplePattern = 0xffff;
1243 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001244
Brian Paul4d053dd2000-01-14 04:45:47 +00001245 /* Display List group */
1246 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001247
Brian Paul736fcbe2001-05-29 15:23:48 +00001248 /* Multisample */
1249 ctx->Multisample.Enabled = GL_FALSE;
1250 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1251 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1252 ctx->Multisample.SampleCoverage = GL_FALSE;
1253 ctx->Multisample.SampleCoverageValue = 1.0;
1254 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1255
Brian Paul4d053dd2000-01-14 04:45:47 +00001256 /* Pixel group */
1257 ctx->Pixel.RedBias = 0.0;
1258 ctx->Pixel.RedScale = 1.0;
1259 ctx->Pixel.GreenBias = 0.0;
1260 ctx->Pixel.GreenScale = 1.0;
1261 ctx->Pixel.BlueBias = 0.0;
1262 ctx->Pixel.BlueScale = 1.0;
1263 ctx->Pixel.AlphaBias = 0.0;
1264 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001265 ctx->Pixel.DepthBias = 0.0;
1266 ctx->Pixel.DepthScale = 1.0;
1267 ctx->Pixel.IndexOffset = 0;
1268 ctx->Pixel.IndexShift = 0;
1269 ctx->Pixel.ZoomX = 1.0;
1270 ctx->Pixel.ZoomY = 1.0;
1271 ctx->Pixel.MapColorFlag = GL_FALSE;
1272 ctx->Pixel.MapStencilFlag = GL_FALSE;
1273 ctx->Pixel.MapStoSsize = 1;
1274 ctx->Pixel.MapItoIsize = 1;
1275 ctx->Pixel.MapItoRsize = 1;
1276 ctx->Pixel.MapItoGsize = 1;
1277 ctx->Pixel.MapItoBsize = 1;
1278 ctx->Pixel.MapItoAsize = 1;
1279 ctx->Pixel.MapRtoRsize = 1;
1280 ctx->Pixel.MapGtoGsize = 1;
1281 ctx->Pixel.MapBtoBsize = 1;
1282 ctx->Pixel.MapAtoAsize = 1;
1283 ctx->Pixel.MapStoS[0] = 0;
1284 ctx->Pixel.MapItoI[0] = 0;
1285 ctx->Pixel.MapItoR[0] = 0.0;
1286 ctx->Pixel.MapItoG[0] = 0.0;
1287 ctx->Pixel.MapItoB[0] = 0.0;
1288 ctx->Pixel.MapItoA[0] = 0.0;
1289 ctx->Pixel.MapItoR8[0] = 0;
1290 ctx->Pixel.MapItoG8[0] = 0;
1291 ctx->Pixel.MapItoB8[0] = 0;
1292 ctx->Pixel.MapItoA8[0] = 0;
1293 ctx->Pixel.MapRtoR[0] = 0.0;
1294 ctx->Pixel.MapGtoG[0] = 0.0;
1295 ctx->Pixel.MapBtoB[0] = 0.0;
1296 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001297 ctx->Pixel.HistogramEnabled = GL_FALSE;
1298 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1299 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1300 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1301 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001302 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1303 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1304 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1305 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001306 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1307 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1308 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1309 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001310 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1311 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1312 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001313 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1314 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1315 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1316 for (i = 0; i < 3; i++) {
1317 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1318 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1319 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1320 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1321 }
Brian Paul67adba12000-12-09 20:35:54 +00001322 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1323 ctx->Convolution1D.Filter[i] = 0.0;
1324 ctx->Convolution2D.Filter[i] = 0.0;
1325 ctx->Separable2D.Filter[i] = 0.0;
1326 }
Brian Paul82b02f02000-05-07 20:37:40 +00001327 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1328 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001329 /* GL_SGI_texture_color_table */
1330 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1331 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001332
Brian Paul4d053dd2000-01-14 04:45:47 +00001333 /* Point group */
1334 ctx->Point.SmoothFlag = GL_FALSE;
1335 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001336 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001337 ctx->Point.Params[0] = 1.0;
1338 ctx->Point.Params[1] = 0.0;
1339 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001340 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001341 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001342 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001343 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001344 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1345 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001346 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001347 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1348 }
jtgafb833d1999-08-19 00:55:39 +00001349
Brian Paul4d053dd2000-01-14 04:45:47 +00001350 /* Polygon group */
1351 ctx->Polygon.CullFlag = GL_FALSE;
1352 ctx->Polygon.CullFaceMode = GL_BACK;
1353 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001354 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001355 ctx->Polygon.FrontMode = GL_FILL;
1356 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001357 ctx->Polygon.SmoothFlag = GL_FALSE;
1358 ctx->Polygon.StippleFlag = GL_FALSE;
1359 ctx->Polygon.OffsetFactor = 0.0F;
1360 ctx->Polygon.OffsetUnits = 0.0F;
1361 ctx->Polygon.OffsetPoint = GL_FALSE;
1362 ctx->Polygon.OffsetLine = GL_FALSE;
1363 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001364
Brian Paul4d053dd2000-01-14 04:45:47 +00001365 /* Polygon Stipple group */
1366 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001367
Brian Paul4d053dd2000-01-14 04:45:47 +00001368 /* Scissor group */
1369 ctx->Scissor.Enabled = GL_FALSE;
1370 ctx->Scissor.X = 0;
1371 ctx->Scissor.Y = 0;
1372 ctx->Scissor.Width = 0;
1373 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001374
Brian Paul4d053dd2000-01-14 04:45:47 +00001375 /* Stencil group */
1376 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001377 ctx->Stencil.TestTwoSide = GL_FALSE;
1378 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1379 ctx->Stencil.Function[0] = GL_ALWAYS;
1380 ctx->Stencil.Function[1] = GL_ALWAYS;
1381 ctx->Stencil.FailFunc[0] = GL_KEEP;
1382 ctx->Stencil.FailFunc[1] = GL_KEEP;
1383 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1384 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1385 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1386 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1387 ctx->Stencil.Ref[0] = 0;
1388 ctx->Stencil.Ref[1] = 0;
1389 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1390 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1391 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1392 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001393 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001394
Brian Paul4d053dd2000-01-14 04:45:47 +00001395 /* Texture group */
1396 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001397 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001398 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1399 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001400 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001401 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001402
Brian Paul4d053dd2000-01-14 04:45:47 +00001403 /* Transformation group */
1404 ctx->Transform.MatrixMode = GL_MODELVIEW;
1405 ctx->Transform.Normalize = GL_FALSE;
1406 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001407 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001408 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001409 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1410 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001411 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001412
Brian Paul4d053dd2000-01-14 04:45:47 +00001413 /* Viewport group */
1414 ctx->Viewport.X = 0;
1415 ctx->Viewport.Y = 0;
1416 ctx->Viewport.Width = 0;
1417 ctx->Viewport.Height = 0;
1418 ctx->Viewport.Near = 0.0;
1419 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001420 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001421
1422#define Sz 10
1423#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001424 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1425 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001426#undef Sz
1427#undef Tz
1428
Keith Whitwell14940c42000-11-05 18:40:57 +00001429 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1430 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001431
Brian Paul4d053dd2000-01-14 04:45:47 +00001432 /* Vertex arrays */
1433 ctx->Array.Vertex.Size = 4;
1434 ctx->Array.Vertex.Type = GL_FLOAT;
1435 ctx->Array.Vertex.Stride = 0;
1436 ctx->Array.Vertex.StrideB = 0;
1437 ctx->Array.Vertex.Ptr = NULL;
1438 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001439 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001440 ctx->Array.Normal.Type = GL_FLOAT;
1441 ctx->Array.Normal.Stride = 0;
1442 ctx->Array.Normal.StrideB = 0;
1443 ctx->Array.Normal.Ptr = NULL;
1444 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001445 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001446 ctx->Array.Color.Size = 4;
1447 ctx->Array.Color.Type = GL_FLOAT;
1448 ctx->Array.Color.Stride = 0;
1449 ctx->Array.Color.StrideB = 0;
1450 ctx->Array.Color.Ptr = NULL;
1451 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001452 ctx->Array.Color.Flags = CA_CLIENT_DATA;
Brian Paulb852f042003-04-01 18:57:36 +00001453 ctx->Array.SecondaryColor.Size = 3;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001454 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1455 ctx->Array.SecondaryColor.Stride = 0;
1456 ctx->Array.SecondaryColor.StrideB = 0;
1457 ctx->Array.SecondaryColor.Ptr = NULL;
1458 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1459 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1460 ctx->Array.FogCoord.Size = 1;
1461 ctx->Array.FogCoord.Type = GL_FLOAT;
1462 ctx->Array.FogCoord.Stride = 0;
1463 ctx->Array.FogCoord.StrideB = 0;
1464 ctx->Array.FogCoord.Ptr = NULL;
1465 ctx->Array.FogCoord.Enabled = GL_FALSE;
1466 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001467 ctx->Array.Index.Type = GL_FLOAT;
1468 ctx->Array.Index.Stride = 0;
1469 ctx->Array.Index.StrideB = 0;
1470 ctx->Array.Index.Ptr = NULL;
1471 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001472 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001473 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001474 ctx->Array.TexCoord[i].Size = 4;
1475 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1476 ctx->Array.TexCoord[i].Stride = 0;
1477 ctx->Array.TexCoord[i].StrideB = 0;
1478 ctx->Array.TexCoord[i].Ptr = NULL;
1479 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001480 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001481 }
1482 ctx->Array.TexCoordInterleaveFactor = 1;
1483 ctx->Array.EdgeFlag.Stride = 0;
1484 ctx->Array.EdgeFlag.StrideB = 0;
1485 ctx->Array.EdgeFlag.Ptr = NULL;
1486 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001487 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001488 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1489
1490 /* Pixel transfer */
1491 ctx->Pack.Alignment = 4;
1492 ctx->Pack.RowLength = 0;
1493 ctx->Pack.ImageHeight = 0;
1494 ctx->Pack.SkipPixels = 0;
1495 ctx->Pack.SkipRows = 0;
1496 ctx->Pack.SkipImages = 0;
1497 ctx->Pack.SwapBytes = GL_FALSE;
1498 ctx->Pack.LsbFirst = GL_FALSE;
1499 ctx->Unpack.Alignment = 4;
1500 ctx->Unpack.RowLength = 0;
1501 ctx->Unpack.ImageHeight = 0;
1502 ctx->Unpack.SkipPixels = 0;
1503 ctx->Unpack.SkipRows = 0;
1504 ctx->Unpack.SkipImages = 0;
1505 ctx->Unpack.SwapBytes = GL_FALSE;
1506 ctx->Unpack.LsbFirst = GL_FALSE;
1507
1508 /* Feedback */
1509 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1510 ctx->Feedback.Buffer = NULL;
1511 ctx->Feedback.BufferSize = 0;
1512 ctx->Feedback.Count = 0;
1513
1514 /* Selection/picking */
1515 ctx->Select.Buffer = NULL;
1516 ctx->Select.BufferSize = 0;
1517 ctx->Select.BufferCount = 0;
1518 ctx->Select.Hits = 0;
1519 ctx->Select.NameStackDepth = 0;
1520
Brian Paul4d053dd2000-01-14 04:45:47 +00001521 /* Renderer and client attribute stacks */
1522 ctx->AttribStackDepth = 0;
1523 ctx->ClientAttribStackDepth = 0;
1524
Brian Paul13811372000-04-12 00:27:37 +00001525 /* Display list */
1526 ctx->CallDepth = 0;
1527 ctx->ExecuteFlag = GL_TRUE;
1528 ctx->CompileFlag = GL_FALSE;
1529 ctx->CurrentListPtr = NULL;
1530 ctx->CurrentBlock = NULL;
1531 ctx->CurrentListNum = 0;
1532 ctx->CurrentPos = 0;
1533
1534 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001535 _mesa_init_colortable(&ctx->ColorTable);
1536 _mesa_init_colortable(&ctx->ProxyColorTable);
1537 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1538 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1539 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1540 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001541
Brian Paul610d5992003-01-14 04:55:45 +00001542 /* Vertex/fragment programs */
1543 ctx->Program.ErrorPos = -1;
1544 ctx->Program.ErrorString = _mesa_strdup("");
Brian Paulf1163a32003-06-01 15:39:58 +00001545#if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001546 ctx->VertexProgram.Enabled = GL_FALSE;
1547 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1548 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001549 ctx->VertexProgram.Current = NULL;
Brian Paulf1163a32003-06-01 15:39:58 +00001550 ctx->VertexProgram.Current = (struct vertex_program *) ctx->Shared->DefaultVertexProgram;
1551 assert(ctx->VertexProgram.Current);
1552 ctx->VertexProgram.Current->Base.RefCount++;
Brian Paul86b84272001-12-14 02:50:01 +00001553 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1554 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1555 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1556 }
Brian Paul610d5992003-01-14 04:55:45 +00001557#endif
Brian Paulf1163a32003-06-01 15:39:58 +00001558#if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program
Brian Paul610d5992003-01-14 04:55:45 +00001559 ctx->FragmentProgram.Enabled = GL_FALSE;
Brian Paulf1163a32003-06-01 15:39:58 +00001560 ctx->FragmentProgram.Current = (struct fragment_program *) ctx->Shared->DefaultFragmentProgram;
1561 assert(ctx->FragmentProgram.Current);
1562 ctx->FragmentProgram.Current->Base.RefCount++;
Brian Paul610d5992003-01-14 04:55:45 +00001563#endif
Brian Paul86b84272001-12-14 02:50:01 +00001564
Brian Paulb17a7222003-06-13 02:37:27 +00001565#if FEATURE_ARB_occlusion_query
1566 ctx->Occlusion.QueryObjects = _mesa_NewHashTable();
1567#endif
1568
Brian Paul4d053dd2000-01-14 04:45:47 +00001569 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001570 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001571 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001572 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001573
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001574 ctx->_NeedNormals = 0;
1575 ctx->_NeedEyeCoords = 0;
1576 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001577
Brian Paul4d053dd2000-01-14 04:45:47 +00001578 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1579
1580 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001581 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001582 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001583 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001584
1585 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001586 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001587 ctx->FirstTimeCurrent = GL_TRUE;
1588
1589 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001590 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001591 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001592 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001593 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001594 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001595 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001596 }
1597}
1598
1599
1600
1601
Brian Paula3f13702003-04-01 16:41:50 +00001602/**
1603 * Allocate the proxy textures for the given context.
1604 * \param ctx the context to allocate proxies for.
1605 * \return GL_TRUE if success, GL_FALSE if failure.
jtgafb833d1999-08-19 00:55:39 +00001606 */
Brian Paul178a1c52000-04-22 01:05:00 +00001607static GLboolean
1608alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001609{
Brian Paula3f13702003-04-01 16:41:50 +00001610 ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
1611 if (!ctx->Texture.Proxy1D)
1612 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001613
Brian Paula3f13702003-04-01 16:41:50 +00001614 ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
1615 if (!ctx->Texture.Proxy2D)
1616 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001617
Brian Paula3f13702003-04-01 16:41:50 +00001618 ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
1619 if (!ctx->Texture.Proxy3D)
1620 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001621
Brian Paula3f13702003-04-01 16:41:50 +00001622 ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
1623 if (!ctx->Texture.ProxyCubeMap)
1624 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +00001625
Brian Paula3f13702003-04-01 16:41:50 +00001626 ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
1627 if (!ctx->Texture.ProxyRect)
1628 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001629
Brian Paula3f13702003-04-01 16:41:50 +00001630 return GL_TRUE;
Brian Paul8afe7de2002-06-15 03:03:06 +00001631
Brian Paula3f13702003-04-01 16:41:50 +00001632 cleanup:
1633 if (ctx->Texture.Proxy1D)
1634 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
1635 if (ctx->Texture.Proxy2D)
1636 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
1637 if (ctx->Texture.Proxy3D)
1638 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
1639 if (ctx->Texture.ProxyCubeMap)
1640 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
1641 if (ctx->Texture.ProxyRect)
1642 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
1643 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001644}
1645
1646
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001647static void add_debug_flags( const char *debug )
1648{
1649#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001650 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001651 MESA_VERBOSE |= VERBOSE_VARRAY;
1652
Brian Paul3c634522002-10-24 23:57:19 +00001653 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001654 MESA_VERBOSE |= VERBOSE_TEXTURE;
1655
Brian Paul3c634522002-10-24 23:57:19 +00001656 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001657 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1658
Brian Paul3c634522002-10-24 23:57:19 +00001659 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001660 MESA_VERBOSE |= VERBOSE_PIPELINE;
1661
Brian Paul3c634522002-10-24 23:57:19 +00001662 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001663 MESA_VERBOSE |= VERBOSE_DRIVER;
1664
Brian Paul3c634522002-10-24 23:57:19 +00001665 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001666 MESA_VERBOSE |= VERBOSE_STATE;
1667
Brian Paul3c634522002-10-24 23:57:19 +00001668 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001669 MESA_VERBOSE |= VERBOSE_API;
1670
Brian Paul3c634522002-10-24 23:57:19 +00001671 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001672 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1673
Brian Paul3c634522002-10-24 23:57:19 +00001674 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001675 MESA_VERBOSE |= VERBOSE_LIGHTING;
1676
1677 /* Debug flag:
1678 */
Brian Paul3c634522002-10-24 23:57:19 +00001679 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001680 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1681#endif
1682}
1683
1684
Brian Paulde4f4602003-07-03 02:15:06 +00001685/**
Brian Paul8aee2a32000-08-29 18:57:58 +00001686 * Initialize a GLcontext struct. This includes allocating all the
1687 * other structs and arrays which hang off of the context by pointers.
Brian Paulde4f4602003-07-03 02:15:06 +00001688 * \note the direct parameter is ignored (obsolete).
jtgafb833d1999-08-19 00:55:39 +00001689 */
Brian Paul178a1c52000-04-22 01:05:00 +00001690GLboolean
1691_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001692 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001693 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001694 void *driver_ctx,
1695 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001696{
Brian Paul5fb84d22000-05-24 15:04:45 +00001697 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001698 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001699
Brian Paul3c634522002-10-24 23:57:19 +00001700 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001701
Brian Paul3c634522002-10-24 23:57:19 +00001702 /* If the driver wants core Mesa to use special imports, it'll have to
1703 * override these defaults.
1704 */
1705 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001706
Brian Paul9a33a112002-06-13 04:28:29 +00001707 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001708 _mesa_init_default_exports( &(ctx->exports) );
1709
1710 /* misc one-time initializations */
1711 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001712
Brian Paul3c634522002-10-24 23:57:19 +00001713 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001714 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001715 ctx->DrawBuffer = NULL;
1716 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001717
Brian Paula3f13702003-04-01 16:41:50 +00001718 /* Set these pointers to defaults now in case they're not set since
1719 * we need them while creating the default textures.
1720 */
1721 if (!ctx->Driver.NewTextureObject)
1722 ctx->Driver.NewTextureObject = _mesa_new_texture_object;
1723 if (!ctx->Driver.DeleteTexture)
1724 ctx->Driver.DeleteTexture = _mesa_delete_texture_object;
1725 if (!ctx->Driver.NewTextureImage)
1726 ctx->Driver.NewTextureImage = _mesa_new_texture_image;
1727
jtgafb833d1999-08-19 00:55:39 +00001728 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001729 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001730 ctx->Shared = share_list->Shared;
1731 }
1732 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001733 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001734 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001735 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001736 }
1737 }
Brian Paul9560f052000-01-31 23:11:39 +00001738 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001739 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001740 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001741
Brian Paul4d053dd2000-01-14 04:45:47 +00001742 init_attrib_groups( ctx );
1743
Brian Paulb6bcae52001-01-23 23:39:36 +00001744 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001745 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001746 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001747 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001748 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001749 }
1750 else {
1751 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001752 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001753 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001754 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001755 }
1756
jtgafb833d1999-08-19 00:55:39 +00001757 if (!alloc_proxy_textures(ctx)) {
1758 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001759 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001760 }
jtgafb833d1999-08-19 00:55:39 +00001761
Brian Paul8ad10762002-10-11 17:41:03 +00001762 /*
1763 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1764 * Basically, we should add all extension functions above offset 577.
1765 * This enables older libGL libraries to work with newer drivers that
1766 * have newer extensions.
1767 */
1768 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1769 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1770 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1771 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1772 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1773 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1774 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1775 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1776 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1777 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1778 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1779 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1780 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1781 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1782 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1783 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1784 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1785 /* new extension functions */
1786 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1787 _glapi_add_entrypoint("glBindProgramNV", 579);
1788 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1789 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1790 _glapi_add_entrypoint("glGenProgramsNV", 582);
1791 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1792 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1793 _glapi_add_entrypoint("glGetProgramivNV", 585);
1794 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1795 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1796 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1797 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1798 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1799 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1800 _glapi_add_entrypoint("glIsProgramNV", 592);
1801 _glapi_add_entrypoint("glLoadProgramNV", 593);
1802 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1803 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1804 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1805 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1806 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1807 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1808 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1809 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1810 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1811 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1812 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1813 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1814 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1815 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1816 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1817 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1818 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1819 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1820 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1821 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1822 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1823 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1824 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1825 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1826 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1827 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1828 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1829 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1830 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1831 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1832 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1833 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1834 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1835 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1836 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1837 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1838 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1839 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1840 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1841 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1842 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1843 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1844 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1845 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1846 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1847 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1848 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1849 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1850 _glapi_add_entrypoint("glPointParameteriNV", 642);
1851 _glapi_add_entrypoint("glPointParameterivNV", 643);
1852 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1853 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1854 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1855 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1856 _glapi_add_entrypoint("glGenFencesNV", 648);
1857 _glapi_add_entrypoint("glIsFenceNV", 649);
1858 _glapi_add_entrypoint("glTestFenceNV", 650);
1859 _glapi_add_entrypoint("glGetFenceivNV", 651);
1860 _glapi_add_entrypoint("glFinishFenceNV", 652);
1861 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paula3f13702003-04-01 16:41:50 +00001862 /* XXX add NV_fragment_program and ARB_vertex_program functions */
Brian Paulf59afc92000-05-23 23:23:00 +00001863
Brian Paul5fb84d22000-05-24 15:04:45 +00001864 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1865 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1866 * Mesa we do this to accomodate different versions of libGL and various
1867 * DRI drivers.
1868 */
1869 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1870 sizeof(struct _glapi_table) / sizeof(void *));
1871
Brian Paulfbd8f211999-11-11 01:22:25 +00001872 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001873 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1874 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001875 if (!ctx->Exec || !ctx->Save) {
1876 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001877 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001878 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001879 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001880 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1881 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001882 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001883
Keith Whitwellad2ac212000-11-24 10:25:05 +00001884 ctx->ExecPrefersFloat = GL_FALSE;
1885 ctx->SavePrefersFloat = GL_FALSE;
1886
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001887 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001888 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001889 ctx->TnlModule.Current = NULL;
1890 ctx->TnlModule.SwapCount = 0;
1891
Brian Paulb6bcae52001-01-23 23:39:36 +00001892 /* Z buffer stuff */
1893 if (ctx->Visual.depthBits == 0) {
1894 /* Special case. Even if we don't have a depth buffer we need
1895 * good values for DepthMax for Z vertex transformation purposes
1896 * and for per-fragment fog computation.
1897 */
1898 ctx->DepthMax = 1 << 16;
1899 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1900 }
1901 else if (ctx->Visual.depthBits < 32) {
1902 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1903 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1904 }
1905 else {
1906 /* Special case since shift values greater than or equal to the
1907 * number of bits in the left hand expression's type are undefined.
1908 */
1909 ctx->DepthMax = 0xffffffff;
1910 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1911 }
Brian Paulbc920f02001-05-07 16:32:51 +00001912 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001913
Brian Paul3c634522002-10-24 23:57:19 +00001914 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001915 if (c)
1916 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001917
Brian Paul3c634522002-10-24 23:57:19 +00001918 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001919 if (c)
1920 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001921
Brian Paul4d053dd2000-01-14 04:45:47 +00001922 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001923}
1924
jtgafb833d1999-08-19 00:55:39 +00001925
1926
Brian Paulde4f4602003-07-03 02:15:06 +00001927/**
Brian Paul4d053dd2000-01-14 04:45:47 +00001928 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001929 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001930 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001931 * driver_ctx - pointer to device driver's context state struct
Brian Paulde4f4602003-07-03 02:15:06 +00001932 * direct - obsolete, ignored
Brian Paulb1394fa2000-09-26 20:53:53 +00001933 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001934 */
Brian Paul178a1c52000-04-22 01:05:00 +00001935GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001936_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001937 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001938 void *driver_ctx,
1939 GLboolean direct )
1940
Brian Paul4d053dd2000-01-14 04:45:47 +00001941{
Brian Paul4753d602002-06-15 02:38:15 +00001942 GLcontext *ctx;
1943
1944 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001945 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001946
Brian Paul3c634522002-10-24 23:57:19 +00001947 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001948 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001949 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001950
Brian Paul3c634522002-10-24 23:57:19 +00001951 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001952 return ctx;
1953 }
1954 else {
Brian Paul3c634522002-10-24 23:57:19 +00001955 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001956 return NULL;
1957 }
1958}
1959
1960
1961
1962/*
1963 * Free the data associated with the given context.
1964 * But don't free() the GLcontext struct itself!
1965 */
Brian Paul178a1c52000-04-22 01:05:00 +00001966void
Brian Paulb1394fa2000-09-26 20:53:53 +00001967_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001968{
Brian Paul4d053dd2000-01-14 04:45:47 +00001969 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001970 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001971
1972 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001973 if (ctx == _mesa_get_current_context()) {
1974 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001975 }
1976
Brian Paul30f51ae2001-12-18 04:06:44 +00001977 /*
1978 * Free transformation matrix stacks
1979 */
1980 free_matrix_stack(&ctx->ModelviewMatrixStack);
1981 free_matrix_stack(&ctx->ProjectionMatrixStack);
1982 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001983 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001984 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1985 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1986 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1987 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001988 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1989
Brian Paul30f51ae2001-12-18 04:06:44 +00001990
Brian Paul8dfc5b92002-10-16 17:57:51 +00001991#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001992 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001993 ctx->VertexProgram.Current->Base.RefCount--;
1994 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
Brian Paul451f3102003-04-17 01:48:19 +00001995 _mesa_delete_program(ctx, &(ctx->VertexProgram.Current->Base));
Brian Paul610d5992003-01-14 04:55:45 +00001996 }
1997#endif
1998#if FEATURE_NV_fragment_program
1999 if (ctx->FragmentProgram.Current) {
2000 ctx->FragmentProgram.Current->Base.RefCount--;
2001 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
Brian Paul451f3102003-04-17 01:48:19 +00002002 _mesa_delete_program(ctx, &(ctx->FragmentProgram.Current->Base));
Brian Paulfd284452001-07-19 15:54:34 +00002003 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00002004#endif
Brian Paulfd284452001-07-19 15:54:34 +00002005
Brian Paul30f51ae2001-12-18 04:06:44 +00002006 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00002007 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00002008 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00002009 assert(ctx->Shared->RefCount >= 0);
2010 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
2011 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00002012 /* free shared state */
2013 free_shared_state( ctx, ctx->Shared );
2014 }
2015
Brian Paul30f51ae2001-12-18 04:06:44 +00002016 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00002017 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00002018 FREE( s );
2019 }
Keith Whitwell14940c42000-11-05 18:40:57 +00002020 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00002021
2022 /* Free proxy texture objects */
Brian Paula3f13702003-04-01 16:41:50 +00002023 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
2024 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
2025 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
2026 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
2027 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00002028
Brian Paul45b47d02003-01-26 14:37:15 +00002029 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
2030 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
2031
Brian Paul4d053dd2000-01-14 04:45:47 +00002032 /* Free evaluator data */
2033 if (ctx->EvalMap.Map1Vertex3.Points)
2034 FREE( ctx->EvalMap.Map1Vertex3.Points );
2035 if (ctx->EvalMap.Map1Vertex4.Points)
2036 FREE( ctx->EvalMap.Map1Vertex4.Points );
2037 if (ctx->EvalMap.Map1Index.Points)
2038 FREE( ctx->EvalMap.Map1Index.Points );
2039 if (ctx->EvalMap.Map1Color4.Points)
2040 FREE( ctx->EvalMap.Map1Color4.Points );
2041 if (ctx->EvalMap.Map1Normal.Points)
2042 FREE( ctx->EvalMap.Map1Normal.Points );
2043 if (ctx->EvalMap.Map1Texture1.Points)
2044 FREE( ctx->EvalMap.Map1Texture1.Points );
2045 if (ctx->EvalMap.Map1Texture2.Points)
2046 FREE( ctx->EvalMap.Map1Texture2.Points );
2047 if (ctx->EvalMap.Map1Texture3.Points)
2048 FREE( ctx->EvalMap.Map1Texture3.Points );
2049 if (ctx->EvalMap.Map1Texture4.Points)
2050 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002051 for (i = 0; i < 16; i++)
2052 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002053
2054 if (ctx->EvalMap.Map2Vertex3.Points)
2055 FREE( ctx->EvalMap.Map2Vertex3.Points );
2056 if (ctx->EvalMap.Map2Vertex4.Points)
2057 FREE( ctx->EvalMap.Map2Vertex4.Points );
2058 if (ctx->EvalMap.Map2Index.Points)
2059 FREE( ctx->EvalMap.Map2Index.Points );
2060 if (ctx->EvalMap.Map2Color4.Points)
2061 FREE( ctx->EvalMap.Map2Color4.Points );
2062 if (ctx->EvalMap.Map2Normal.Points)
2063 FREE( ctx->EvalMap.Map2Normal.Points );
2064 if (ctx->EvalMap.Map2Texture1.Points)
2065 FREE( ctx->EvalMap.Map2Texture1.Points );
2066 if (ctx->EvalMap.Map2Texture2.Points)
2067 FREE( ctx->EvalMap.Map2Texture2.Points );
2068 if (ctx->EvalMap.Map2Texture3.Points)
2069 FREE( ctx->EvalMap.Map2Texture3.Points );
2070 if (ctx->EvalMap.Map2Texture4.Points)
2071 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002072 for (i = 0; i < 16; i++)
2073 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002074
Brian Paul4bdcfe52000-04-17 17:57:04 +00002075 _mesa_free_colortable_data( &ctx->ColorTable );
2076 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2077 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2078 _mesa_free_colortable_data( &ctx->Texture.Palette );
2079
Brian Paulfd284452001-07-19 15:54:34 +00002080 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2081
Brian Paulde4f4602003-07-03 02:15:06 +00002082 if (ctx->Extensions.String)
2083 FREE((void *) ctx->Extensions.String);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002084
2085 FREE(ctx->Exec);
2086 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002087}
2088
2089
2090
2091/*
2092 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002093 */
Brian Paul178a1c52000-04-22 01:05:00 +00002094void
Brian Paulb1394fa2000-09-26 20:53:53 +00002095_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002096{
2097 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002098 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002099 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002100 }
2101}
2102
2103
2104
2105/*
jtgafb833d1999-08-19 00:55:39 +00002106 * Copy attribute groups from one context to another.
2107 * Input: src - source context
2108 * dst - destination context
2109 * mask - bitwise OR of GL_*_BIT flags
2110 */
Brian Paul178a1c52000-04-22 01:05:00 +00002111void
Brian Paulb1394fa2000-09-26 20:53:53 +00002112_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002113{
2114 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002115 /* OK to memcpy */
2116 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002117 }
2118 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002119 /* OK to memcpy */
2120 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002121 }
2122 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002123 /* OK to memcpy */
2124 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002125 }
2126 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002127 /* OK to memcpy */
2128 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002129 }
2130 if (mask & GL_ENABLE_BIT) {
2131 /* no op */
2132 }
2133 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002134 /* OK to memcpy */
2135 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002136 }
2137 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002138 /* OK to memcpy */
2139 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002140 }
2141 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002142 /* OK to memcpy */
2143 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002144 }
2145 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002146 GLuint i;
2147 /* begin with memcpy */
2148 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2149 /* fixup linked lists to prevent pointer insanity */
2150 make_empty_list( &(dst->Light.EnabledList) );
2151 for (i = 0; i < MAX_LIGHTS; i++) {
2152 if (dst->Light.Light[i].Enabled) {
2153 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2154 }
2155 }
jtgafb833d1999-08-19 00:55:39 +00002156 }
2157 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002158 /* OK to memcpy */
2159 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002160 }
2161 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002162 /* OK to memcpy */
2163 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002164 }
2165 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002166 /* OK to memcpy */
2167 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002168 }
2169 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002170 /* OK to memcpy */
2171 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002172 }
2173 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002174 /* OK to memcpy */
2175 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002176 }
2177 if (mask & GL_POLYGON_STIPPLE_BIT) {
2178 /* Use loop instead of MEMCPY due to problem with Portland Group's
2179 * C compiler. Reported by John Stone.
2180 */
Brian Paul85d81602002-06-17 23:36:31 +00002181 GLuint i;
2182 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002183 dst->PolygonStipple[i] = src->PolygonStipple[i];
2184 }
2185 }
2186 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002187 /* OK to memcpy */
2188 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002189 }
2190 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002191 /* OK to memcpy */
2192 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002193 }
2194 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002195 /* Cannot memcpy because of pointers */
2196 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002197 }
2198 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002199 /* OK to memcpy */
2200 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002201 }
2202 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002203 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2204 dst->Viewport.X = src->Viewport.X;
2205 dst->Viewport.Y = src->Viewport.Y;
2206 dst->Viewport.Width = src->Viewport.Width;
2207 dst->Viewport.Height = src->Viewport.Height;
2208 dst->Viewport.Near = src->Viewport.Near;
2209 dst->Viewport.Far = src->Viewport.Far;
2210 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002211 }
Brian Paul85d81602002-06-17 23:36:31 +00002212
Keith Whitwella96308c2000-10-30 13:31:59 +00002213 /* XXX FIXME: Call callbacks?
2214 */
2215 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002216}
2217
2218
Brian Paul00037781999-12-17 14:52:35 +00002219
Keith Whitwell23caf202000-11-16 21:05:34 +00002220static void print_info( void )
2221{
Brian Paul4e9676f2002-06-29 19:48:15 +00002222 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002223 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002224 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002225 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002226 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002227 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002228 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002229 (char *) _mesa_GetString(GL_EXTENSIONS));
2230#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002231 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002232#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002233 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002234#endif
2235#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002236 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002237#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002238 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002239#endif
davem69e4f84b42001-06-05 03:58:20 +00002240#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002241 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002242#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002243 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002244#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002245}
2246
2247
Brian Paulb1d53d92003-06-11 18:48:19 +00002248/**
2249 * Check if the given context can render into the given framebuffer
2250 * by checking visual attributes.
2251 * \return GL_TRUE if compatible, GL_FALSE otherwise.
2252 */
2253static GLboolean
2254check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
2255{
2256 const GLvisual *ctxvis = &ctx->Visual;
2257 const GLvisual *bufvis = &buffer->Visual;
2258
2259 if (ctxvis == bufvis)
2260 return GL_TRUE;
2261
2262 if (ctxvis->rgbMode != bufvis->rgbMode)
2263 return GL_FALSE;
2264 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
2265 return GL_FALSE;
2266 if (ctxvis->stereoMode && !bufvis->stereoMode)
2267 return GL_FALSE;
2268 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
2269 return GL_FALSE;
2270 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
2271 return GL_FALSE;
2272 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
2273 return GL_FALSE;
2274 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
2275 return GL_FALSE;
2276 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
2277 return GL_FALSE;
2278 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
2279 return GL_FALSE;
2280 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
2281 return GL_FALSE;
2282 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
2283 return GL_FALSE;
2284
2285 return GL_TRUE;
2286}
2287
2288
Brian Paul00037781999-12-17 14:52:35 +00002289/*
Brian Paul9a33a112002-06-13 04:28:29 +00002290 * Set the current context, binding the given frame buffer to the context.
2291 */
2292void
2293_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2294{
2295 _mesa_make_current2( newCtx, buffer, buffer );
2296}
2297
2298
2299/*
Brian Paul00037781999-12-17 14:52:35 +00002300 * Bind the given context to the given draw-buffer and read-buffer
2301 * and make it the current context for this thread.
2302 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002303void
2304_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2305 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002306{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002307 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002308 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002309
Brian Paulbe3602d2001-02-28 00:27:48 +00002310 /* Check that the context's and framebuffer's visuals are compatible.
Brian Paulbe3602d2001-02-28 00:27:48 +00002311 */
Brian Paulb1d53d92003-06-11 18:48:19 +00002312 if (newCtx && drawBuffer && newCtx->DrawBuffer != drawBuffer) {
2313 if (!check_compatible(newCtx, drawBuffer))
2314 return;
2315 }
2316 if (newCtx && readBuffer && newCtx->ReadBuffer != readBuffer) {
2317 if (!check_compatible(newCtx, readBuffer))
2318 return;
Brian Paulbe3602d2001-02-28 00:27:48 +00002319 }
2320
Brian Paul00037781999-12-17 14:52:35 +00002321 /* We call this function periodically (just here for now) in
2322 * order to detect when multithreading has begun.
2323 */
2324 _glapi_check_multithread();
2325
Brian Paulf9b97d92000-01-28 20:17:42 +00002326 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002327 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002328
2329
2330 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002331 _glapi_set_dispatch(NULL); /* none current */
2332 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002333 else {
2334 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002335
Keith Whitwell23caf202000-11-16 21:05:34 +00002336 if (drawBuffer && readBuffer) {
2337 /* TODO: check if newCtx and buffer's visual match??? */
2338 newCtx->DrawBuffer = drawBuffer;
2339 newCtx->ReadBuffer = readBuffer;
2340 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002341
2342 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2343 /* get initial window size */
2344 GLuint bufWidth, bufHeight;
2345
2346 /* ask device driver for size of output buffer */
2347 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2348
2349 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2350 return; /* size is as expected */
2351
2352 drawBuffer->Width = bufWidth;
2353 drawBuffer->Height = bufHeight;
2354
2355 newCtx->Driver.ResizeBuffers( drawBuffer );
2356 }
2357
2358 if (readBuffer != drawBuffer &&
2359 readBuffer->Width == 0 && readBuffer->Height == 0) {
2360 /* get initial window size */
2361 GLuint bufWidth, bufHeight;
2362
2363 /* ask device driver for size of output buffer */
2364 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2365
2366 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2367 return; /* size is as expected */
2368
2369 readBuffer->Width = bufWidth;
2370 readBuffer->Height = bufHeight;
2371
2372 newCtx->Driver.ResizeBuffers( readBuffer );
2373 }
Brian Paul00037781999-12-17 14:52:35 +00002374 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002375
Brian Paul8816c702002-06-16 01:10:41 +00002376 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002377 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002378 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2379
2380 /* We can use this to help debug user's problems. Tell them to set
2381 * the MESA_INFO env variable before running their app. Then the
2382 * first time each context is made current we'll print some useful
2383 * information.
2384 */
2385 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002386 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002387 print_info();
2388 }
2389 newCtx->FirstTimeCurrent = GL_FALSE;
2390 }
Brian Paul00037781999-12-17 14:52:35 +00002391 }
2392}
2393
2394
2395
2396/*
2397 * Return current context handle for the calling thread.
2398 * This isn't the fastest way to get the current context.
2399 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2400 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002401GLcontext *
2402_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002403{
Brian Paulf9b97d92000-01-28 20:17:42 +00002404 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002405}
2406
2407
Brian Paulfbd8f211999-11-11 01:22:25 +00002408/*
2409 * Return pointer to this context's current API dispatch table.
2410 * It'll either be the immediate-mode execute dispatcher or the
2411 * display list compile dispatcher.
2412 */
2413struct _glapi_table *
2414_mesa_get_dispatch(GLcontext *ctx)
2415{
2416 return ctx->CurrentDispatch;
2417}
2418
2419
2420
jtgafb833d1999-08-19 00:55:39 +00002421/**********************************************************************/
2422/***** Miscellaneous functions *****/
2423/**********************************************************************/
2424
2425
2426/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002427 * Record the given error code and call the driver's Error function if defined.
2428 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002429 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002430void
Brian Paul4e9676f2002-06-29 19:48:15 +00002431_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002432{
Brian Paul18a285a2002-03-16 00:53:15 +00002433 if (!ctx)
2434 return;
2435
Brian Paul7eb06032000-07-14 04:13:40 +00002436 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002437 ctx->ErrorValue = error;
2438 }
2439
2440 /* Call device driver's error handler, if any. This is used on the Mac. */
2441 if (ctx->Driver.Error) {
2442 (*ctx->Driver.Error)( ctx );
2443 }
2444}
2445
2446
Brian Paulfa9df402000-02-02 19:16:46 +00002447void
2448_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002449{
Brian Paulfa9df402000-02-02 19:16:46 +00002450 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002451 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002452 if (ctx->Driver.Finish) {
2453 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002454 }
2455}
2456
2457
2458
Brian Paulfa9df402000-02-02 19:16:46 +00002459void
2460_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002461{
Brian Paulfa9df402000-02-02 19:16:46 +00002462 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002463 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002464 if (ctx->Driver.Flush) {
2465 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002466 }
jtgafb833d1999-08-19 00:55:39 +00002467}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002468
2469
2470
Keith Whitwellcab974c2000-12-26 05:09:27 +00002471const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002472 "GL_POINTS",
2473 "GL_LINES",
2474 "GL_LINE_LOOP",
2475 "GL_LINE_STRIP",
2476 "GL_TRIANGLES",
2477 "GL_TRIANGLE_STRIP",
2478 "GL_TRIANGLE_FAN",
2479 "GL_QUADS",
2480 "GL_QUAD_STRIP",
2481 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002482 "outside begin/end",
2483 "inside unkown primitive",
2484 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002485};