blob: 9dac955c8a76f74899c7bfa207970b0fe72ac40f [file] [log] [blame]
Brian Paul418ac002003-01-21 21:47:45 +00001/* $Id: context.c,v 1.192 2003/01/21 21:47:45 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paul3a212032002-11-19 15:25:00 +00005 * Version: 5.1
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paulbc42c192002-01-05 21:53:20 +00007 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
Brian Paulfbd8f211999-11-11 01:22:25 +000028#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000029#include "imports.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000030#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000032#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000034#include "dlist.h"
35#include "eval.h"
36#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000037#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000038#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000039#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000040#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "hash.h"
42#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "macros.h"
jtgafb833d1999-08-19 00:55:39 +000044#include "mmath.h"
jtgafb833d1999-08-19 00:55:39 +000045#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000046#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000047#include "teximage.h"
48#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000049#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000050#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000051#include "varray.h"
Brian Paul3a212032002-11-19 15:25:00 +000052#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +000053#include "nvprogram.h"
54#include "nvvertprog.h"
55#endif
56#if FEATURE_NV_fragment_program
57#include "nvfragprog.h"
Brian Paul3a212032002-11-19 15:25:00 +000058#endif
Gareth Hughesd4eb6652001-03-12 01:32:20 +000059#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000060#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000061#include "math/m_matrix.h"
62#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000063#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000064
jtgafb833d1999-08-19 00:55:39 +000065
Brian Paul3b18a362000-09-26 15:27:20 +000066#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000067#include "Trace/tr_context.h"
68#include "Trace/tr_wrapper.h"
69#endif
70
davem69775355a2001-06-05 23:54:00 +000071#ifdef USE_SPARC_ASM
72#include "SPARC/sparc.h"
73#endif
jtgafb833d1999-08-19 00:55:39 +000074
Keith Whitwell23caf202000-11-16 21:05:34 +000075#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000076int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000077#endif
78
79#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000080int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000081#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000082
Brian Paul86b84272001-12-14 02:50:01 +000083
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
510 if (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 }
514 if (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 }
518 if (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 }
522 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000523 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000524 buffer->FrontLeftAlpha = NULL;
525 }
526 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000527 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000528 buffer->BackLeftAlpha = NULL;
529 }
530 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000531 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000532 buffer->FrontRightAlpha = NULL;
533 }
534 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000535 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000536 buffer->BackRightAlpha = NULL;
537 }
538}
539
540
Brian Paul4d053dd2000-01-14 04:45:47 +0000541
542/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000543/***** Context allocation, initialization, destroying *****/
544/**********************************************************************/
545
546
Brian Paul9560f052000-01-31 23:11:39 +0000547_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
548
549
jtgafb833d1999-08-19 00:55:39 +0000550/*
551 * This function just calls all the various one-time-init functions in Mesa.
552 */
Brian Paul178a1c52000-04-22 01:05:00 +0000553static void
Brian Paul4753d602002-06-15 02:38:15 +0000554one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000555{
556 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000557 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000558 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000559 /* do some implementation tests */
560 assert( sizeof(GLbyte) == 1 );
561 assert( sizeof(GLshort) >= 2 );
562 assert( sizeof(GLint) >= 4 );
563 assert( sizeof(GLubyte) == 1 );
564 assert( sizeof(GLushort) >= 2 );
565 assert( sizeof(GLuint) >= 4 );
566
Brian Paul08836342001-03-03 20:33:27 +0000567 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000568
Keith Whitwell23caf202000-11-16 21:05:34 +0000569 _math_init();
Brian Paul69755402001-02-26 23:58:12 +0000570 _mesa_init_math();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000571
davem69775355a2001-06-05 23:54:00 +0000572#ifdef USE_SPARC_ASM
573 _mesa_init_sparc_glapi_relocs();
574#endif
Brian Paul3c634522002-10-24 23:57:19 +0000575 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000576 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000577#ifndef GLX_DIRECT_RENDERING
578 /* libGL from before 2002/06/28 don't have this function. Someday,
579 * when newer libGL libs are common, remove the #ifdef test. This
580 * only serves to print warnings when calling undefined GL functions.
581 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000582 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000583#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000584 }
585 else {
586 _glapi_noop_enable_warnings(GL_FALSE);
587 }
588
jtgafb833d1999-08-19 00:55:39 +0000589#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000590 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000591#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000592
593 alreadyCalled = GL_TRUE;
594 }
Brian Paul9560f052000-01-31 23:11:39 +0000595 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000596}
597
598
Brian Paul86b84272001-12-14 02:50:01 +0000599static void
600init_matrix_stack( struct matrix_stack *stack,
601 GLuint maxDepth, GLuint dirtyFlag )
602{
603 GLuint i;
604
605 stack->Depth = 0;
606 stack->MaxDepth = maxDepth;
607 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000608 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000609 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000610 for (i = 0; i < maxDepth; i++) {
611 _math_matrix_ctr(&stack->Stack[i]);
612 _math_matrix_alloc_inv(&stack->Stack[i]);
613 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000614 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000615}
616
617
618static void
619free_matrix_stack( struct matrix_stack *stack )
620{
621 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000622 for (i = 0; i < stack->MaxDepth; i++) {
623 _math_matrix_dtr(&stack->Stack[i]);
624 }
Brian Paulc4afba32002-02-05 23:21:45 +0000625 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000626 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000627}
628
Brian Paul4d053dd2000-01-14 04:45:47 +0000629
jtgafb833d1999-08-19 00:55:39 +0000630/*
631 * Allocate and initialize a shared context state structure.
632 */
Brian Paul178a1c52000-04-22 01:05:00 +0000633static struct gl_shared_state *
634alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000635{
jtgafb833d1999-08-19 00:55:39 +0000636 struct gl_shared_state *ss;
637 GLboolean outOfMemory;
638
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000639 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000640 if (!ss)
641 return NULL;
642
Brian Paule4b684c2000-09-12 21:07:40 +0000643 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000644
Brian Paule4b684c2000-09-12 21:07:40 +0000645 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000646 ss->TexObjects = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000647#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +0000648 ss->Programs = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000649#endif
jtgafb833d1999-08-19 00:55:39 +0000650
651 /* Default Texture objects */
652 outOfMemory = GL_FALSE;
Brian Paula8523782000-11-19 23:10:25 +0000653
Brian Paul8afe7de2002-06-15 03:03:06 +0000654 ss->Default1D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_1D);
Brian Paula8523782000-11-19 23:10:25 +0000655 if (!ss->Default1D) {
656 outOfMemory = GL_TRUE;
657 }
jtgafb833d1999-08-19 00:55:39 +0000658
Brian Paul8afe7de2002-06-15 03:03:06 +0000659 ss->Default2D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_2D);
Brian Paula8523782000-11-19 23:10:25 +0000660 if (!ss->Default2D) {
661 outOfMemory = GL_TRUE;
662 }
Brian Paula8523782000-11-19 23:10:25 +0000663
Brian Paul8afe7de2002-06-15 03:03:06 +0000664 ss->Default3D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_3D);
Brian Paula8523782000-11-19 23:10:25 +0000665 if (!ss->Default3D) {
666 outOfMemory = GL_TRUE;
667 }
Brian Paula8523782000-11-19 23:10:25 +0000668
Brian Paul8afe7de2002-06-15 03:03:06 +0000669 ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0,
670 GL_TEXTURE_CUBE_MAP_ARB);
Brian Paul413d6a22000-05-26 14:44:59 +0000671 if (!ss->DefaultCubeMap) {
672 outOfMemory = GL_TRUE;
673 }
Brian Paul413d6a22000-05-26 14:44:59 +0000674
Brian Paul8afe7de2002-06-15 03:03:06 +0000675 ss->DefaultRect = _mesa_alloc_texture_object(ss, 0,
676 GL_TEXTURE_RECTANGLE_NV);
677 if (!ss->DefaultRect) {
678 outOfMemory = GL_TRUE;
679 }
680
Brian Paul8dfc5b92002-10-16 17:57:51 +0000681 if (!ss->DisplayList || !ss->TexObjects
682#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +0000683 || !ss->Programs
Brian Paul8dfc5b92002-10-16 17:57:51 +0000684#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000685 || outOfMemory) {
jtgafb833d1999-08-19 00:55:39 +0000686 /* Ran out of memory at some point. Free everything and return NULL */
687 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000688 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000689 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000690 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul610d5992003-01-14 04:55:45 +0000691 if (ss->Programs)
692 _mesa_DeleteHashTable(ss->Programs);
Brian Paula8523782000-11-19 23:10:25 +0000693 if (ss->Default1D)
694 _mesa_free_texture_object(ss, ss->Default1D);
695 if (ss->Default2D)
696 _mesa_free_texture_object(ss, ss->Default2D);
697 if (ss->Default3D)
698 _mesa_free_texture_object(ss, ss->Default3D);
Brian Paul413d6a22000-05-26 14:44:59 +0000699 if (ss->DefaultCubeMap)
Brian Paula8523782000-11-19 23:10:25 +0000700 _mesa_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paul8afe7de2002-06-15 03:03:06 +0000701 if (ss->DefaultRect)
702 _mesa_free_texture_object(ss, ss->DefaultRect);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000703 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000704 return NULL;
705 }
706 else {
707 return ss;
708 }
709}
710
711
712/*
713 * Deallocate a shared state context and all children structures.
714 */
Brian Paul178a1c52000-04-22 01:05:00 +0000715static void
716free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000717{
718 /* Free display lists */
719 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000720 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000721 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000722 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000723 }
724 else {
725 break;
726 }
727 }
Brian Paulbb797902000-01-24 16:19:54 +0000728 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000729
730 /* Free texture objects */
Brian Paul5a2f32b2001-04-25 18:21:05 +0000731 while (ss->TexObjectList) {
jtgafb833d1999-08-19 00:55:39 +0000732 if (ctx->Driver.DeleteTexture)
733 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
734 /* this function removes from linked list too! */
Brian Paula8523782000-11-19 23:10:25 +0000735 _mesa_free_texture_object(ss, ss->TexObjectList);
jtgafb833d1999-08-19 00:55:39 +0000736 }
Brian Paulbb797902000-01-24 16:19:54 +0000737 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000738
Brian Paul8dfc5b92002-10-16 17:57:51 +0000739#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000740 /* Free vertex programs */
741 while (1) {
Brian Paul610d5992003-01-14 04:55:45 +0000742 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
Brian Paul30f51ae2001-12-18 04:06:44 +0000743 if (prog) {
744 _mesa_delete_program(ctx, prog);
745 }
746 else {
747 break;
748 }
749 }
Brian Paul610d5992003-01-14 04:55:45 +0000750 _mesa_DeleteHashTable(ss->Programs);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000751#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000752
Keith Whitwelle15fd852002-12-12 13:03:15 +0000753 _glthread_DESTROY_MUTEX(ss->Mutex);
754
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000755 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000756}
757
758
759
jtgafb833d1999-08-19 00:55:39 +0000760/*
761 * Initialize the nth light. Note that the defaults for light 0 are
762 * different than the other lights.
763 */
Brian Paul178a1c52000-04-22 01:05:00 +0000764static void
765init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000766{
767 make_empty_list( l );
768
769 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
770 if (n==0) {
771 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
772 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
773 }
774 else {
775 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
776 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
777 }
778 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
779 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
780 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000781 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000782 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000783 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000784 l->ConstantAttenuation = 1.0;
785 l->LinearAttenuation = 0.0;
786 l->QuadraticAttenuation = 0.0;
787 l->Enabled = GL_FALSE;
788}
789
790
791
Brian Paul178a1c52000-04-22 01:05:00 +0000792static void
793init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000794{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000795 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000796 lm->LocalViewer = GL_FALSE;
797 lm->TwoSide = GL_FALSE;
798 lm->ColorControl = GL_SINGLE_COLOR;
799}
800
801
Brian Paul178a1c52000-04-22 01:05:00 +0000802static void
803init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000804{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000805 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
806 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
807 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
808 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000809 m->Shininess = 0.0;
810 m->AmbientIndex = 0;
811 m->DiffuseIndex = 1;
812 m->SpecularIndex = 1;
813}
814
815
816
Brian Paul178a1c52000-04-22 01:05:00 +0000817static void
818init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000819{
820 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
821
822 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000823 texUnit->CombineModeRGB = GL_MODULATE;
824 texUnit->CombineModeA = GL_MODULATE;
825 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
826 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
827 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
828 texUnit->CombineSourceA[0] = GL_TEXTURE;
829 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
830 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
831 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
832 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
833 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
834 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
835 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
836 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
837 texUnit->CombineScaleShiftRGB = 0;
838 texUnit->CombineScaleShiftA = 0;
839
jtgafb833d1999-08-19 00:55:39 +0000840 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
841 texUnit->TexGenEnabled = 0;
842 texUnit->GenModeS = GL_EYE_LINEAR;
843 texUnit->GenModeT = GL_EYE_LINEAR;
844 texUnit->GenModeR = GL_EYE_LINEAR;
845 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000846 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
847 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
848 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
849 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000850
jtgafb833d1999-08-19 00:55:39 +0000851 /* Yes, these plane coefficients are correct! */
852 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
853 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
854 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
855 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
856 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
857 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
858 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
859 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
860
Brian Paula8523782000-11-19 23:10:25 +0000861 texUnit->Current1D = ctx->Shared->Default1D;
862 texUnit->Current2D = ctx->Shared->Default2D;
863 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000864 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000865 texUnit->CurrentRect = ctx->Shared->DefaultRect;
jtgafb833d1999-08-19 00:55:39 +0000866}
867
868
jtgafb833d1999-08-19 00:55:39 +0000869
Brian Paul4d053dd2000-01-14 04:45:47 +0000870
jtgafb833d1999-08-19 00:55:39 +0000871/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000872static void
873init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000874{
875 map->Order = 1;
876 map->u1 = 0.0;
877 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000878 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000879 if (map->Points) {
880 GLint i;
881 for (i=0;i<n;i++)
882 map->Points[i] = initial[i];
883 }
jtgafb833d1999-08-19 00:55:39 +0000884}
885
886
887/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000888static void
889init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000890{
891 map->Uorder = 1;
892 map->Vorder = 1;
893 map->u1 = 0.0;
894 map->u2 = 1.0;
895 map->v1 = 0.0;
896 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000897 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000898 if (map->Points) {
899 GLint i;
900 for (i=0;i<n;i++)
901 map->Points[i] = initial[i];
902 }
jtgafb833d1999-08-19 00:55:39 +0000903}
904
905
jtgafb833d1999-08-19 00:55:39 +0000906/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000907 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000908 */
Brian Paul178a1c52000-04-22 01:05:00 +0000909static void
910init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000911{
Brian Paul30f51ae2001-12-18 04:06:44 +0000912 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000913
Brian Paul4d053dd2000-01-14 04:45:47 +0000914 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000915
Brian Paulcd1cefa2001-06-13 14:56:14 +0000916 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
917 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
918
Brian Paul539cce52000-02-03 19:40:07 +0000919 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000920 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000921 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
922 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000923 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000924 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Brian Paul610d5992003-01-14 04:55:45 +0000925 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
926 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000927 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000928 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000929 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000930 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
931 ctx->Const.MinPointSize = MIN_POINT_SIZE;
932 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
933 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
934 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000935 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000936 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
937 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
938 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
939 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000940 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000941 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000942 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000943 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
944 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000945 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
946 ctx->Const.MaxLights = MAX_LIGHTS;
jtgafb833d1999-08-19 00:55:39 +0000947
Brian Paul30f51ae2001-12-18 04:06:44 +0000948 /* Initialize matrix stacks */
949 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
950 _NEW_MODELVIEW);
951 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
952 _NEW_PROJECTION);
953 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
954 _NEW_COLOR_MATRIX);
Brian Paul610d5992003-01-14 04:55:45 +0000955 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +0000956 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
957 _NEW_TEXTURE_MATRIX);
958 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
959 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
960 _NEW_TRACK_MATRIX);
961 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +0000962
Brian Paul30f51ae2001-12-18 04:06:44 +0000963 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +0000964 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
965
Brian Paul4d053dd2000-01-14 04:45:47 +0000966 /* Accumulate buffer group */
967 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000968
Brian Paul4d053dd2000-01-14 04:45:47 +0000969 /* Color buffer group */
970 ctx->Color.IndexMask = 0xffffffff;
971 ctx->Color.ColorMask[0] = 0xff;
972 ctx->Color.ColorMask[1] = 0xff;
973 ctx->Color.ColorMask[2] = 0xff;
974 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000975 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +0000976 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000977 ctx->Color.DrawBuffer = GL_FRONT;
978 ctx->Color.AlphaEnabled = GL_FALSE;
979 ctx->Color.AlphaFunc = GL_ALWAYS;
980 ctx->Color.AlphaRef = 0;
981 ctx->Color.BlendEnabled = GL_FALSE;
982 ctx->Color.BlendSrcRGB = GL_ONE;
983 ctx->Color.BlendDstRGB = GL_ZERO;
984 ctx->Color.BlendSrcA = GL_ONE;
985 ctx->Color.BlendDstA = GL_ZERO;
986 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +0000987 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
988 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
989 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000990 ctx->Color.LogicOp = GL_COPY;
991 ctx->Color.DitherFlag = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +0000992
Brian Paul4d053dd2000-01-14 04:45:47 +0000993 /* Current group */
Brian Paul86b84272001-12-14 02:50:01 +0000994 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
995 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
996 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
997 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
998 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
Brian Paul610d5992003-01-14 04:55:45 +0000999 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul86b84272001-12-14 02:50:01 +00001000 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001001 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +00001002 ctx->Current.EdgeFlag = GL_TRUE;
1003
Brian Paul4d053dd2000-01-14 04:45:47 +00001004 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
1005 ctx->Current.RasterDistance = 0.0;
1006 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
1007 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001008 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001009 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001010 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001011
jtgafb833d1999-08-19 00:55:39 +00001012
Brian Paul4d053dd2000-01-14 04:45:47 +00001013 /* Depth buffer group */
1014 ctx->Depth.Test = GL_FALSE;
1015 ctx->Depth.Clear = 1.0;
1016 ctx->Depth.Func = GL_LESS;
1017 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001018 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001019
Brian Paul4d053dd2000-01-14 04:45:47 +00001020 /* Evaluators group */
1021 ctx->Eval.Map1Color4 = GL_FALSE;
1022 ctx->Eval.Map1Index = GL_FALSE;
1023 ctx->Eval.Map1Normal = GL_FALSE;
1024 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1025 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1026 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1027 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1028 ctx->Eval.Map1Vertex3 = GL_FALSE;
1029 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001030 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001031 ctx->Eval.Map2Color4 = GL_FALSE;
1032 ctx->Eval.Map2Index = GL_FALSE;
1033 ctx->Eval.Map2Normal = GL_FALSE;
1034 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1035 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1036 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1037 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1038 ctx->Eval.Map2Vertex3 = GL_FALSE;
1039 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001040 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001041 ctx->Eval.AutoNormal = GL_FALSE;
1042 ctx->Eval.MapGrid1un = 1;
1043 ctx->Eval.MapGrid1u1 = 0.0;
1044 ctx->Eval.MapGrid1u2 = 1.0;
1045 ctx->Eval.MapGrid2un = 1;
1046 ctx->Eval.MapGrid2vn = 1;
1047 ctx->Eval.MapGrid2u1 = 0.0;
1048 ctx->Eval.MapGrid2u2 = 1.0;
1049 ctx->Eval.MapGrid2v1 = 0.0;
1050 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001051
Brian Paul4d053dd2000-01-14 04:45:47 +00001052 /* Evaluator data */
1053 {
1054 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1055 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1056 static GLfloat index[1] = { 1.0 };
1057 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1058 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001059 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001060
Brian Paul4d053dd2000-01-14 04:45:47 +00001061 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1062 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1063 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1064 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1065 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1066 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1067 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1068 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1069 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001070 for (i = 0; i < 16; i++)
1071 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001072
Brian Paul4d053dd2000-01-14 04:45:47 +00001073 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1074 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1075 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1076 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1077 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1078 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1079 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1080 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1081 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001082 for (i = 0; i < 16; i++)
1083 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001084 }
jtgafb833d1999-08-19 00:55:39 +00001085
Brian Paul4d053dd2000-01-14 04:45:47 +00001086 /* Fog group */
1087 ctx->Fog.Enabled = GL_FALSE;
1088 ctx->Fog.Mode = GL_EXP;
1089 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1090 ctx->Fog.Index = 0.0;
1091 ctx->Fog.Density = 1.0;
1092 ctx->Fog.Start = 0.0;
1093 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001094 ctx->Fog.ColorSumEnabled = GL_FALSE;
1095 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001096
Brian Paul4d053dd2000-01-14 04:45:47 +00001097 /* Hint group */
1098 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1099 ctx->Hint.PointSmooth = GL_DONT_CARE;
1100 ctx->Hint.LineSmooth = GL_DONT_CARE;
1101 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1102 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001103 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1104 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001105 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001106
Brian Paul0771d152000-04-07 00:19:41 +00001107 /* Histogram group */
1108 ctx->Histogram.Width = 0;
1109 ctx->Histogram.Format = GL_RGBA;
1110 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001111 ctx->Histogram.RedSize = 0;
1112 ctx->Histogram.GreenSize = 0;
1113 ctx->Histogram.BlueSize = 0;
1114 ctx->Histogram.AlphaSize = 0;
1115 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001116 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1117 ctx->Histogram.Count[i][0] = 0;
1118 ctx->Histogram.Count[i][1] = 0;
1119 ctx->Histogram.Count[i][2] = 0;
1120 ctx->Histogram.Count[i][3] = 0;
1121 }
1122
1123 /* Min/Max group */
1124 ctx->MinMax.Format = GL_RGBA;
1125 ctx->MinMax.Sink = GL_FALSE;
1126 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1127 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1128 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1129 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1130
Brian Paul4d053dd2000-01-14 04:45:47 +00001131 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001132 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001133
Brian Paul4d053dd2000-01-14 04:45:47 +00001134 /* Lighting group */
1135 for (i=0;i<MAX_LIGHTS;i++) {
1136 init_light( &ctx->Light.Light[i], i );
1137 }
1138 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001139
Brian Paul4d053dd2000-01-14 04:45:47 +00001140 init_lightmodel( &ctx->Light.Model );
1141 init_material( &ctx->Light.Material[0] );
1142 init_material( &ctx->Light.Material[1] );
1143 ctx->Light.ShadeModel = GL_SMOOTH;
1144 ctx->Light.Enabled = GL_FALSE;
1145 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1146 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001147 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1148 GL_FRONT_AND_BACK,
1149 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001150
Brian Paul4d053dd2000-01-14 04:45:47 +00001151 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001152
Brian Paul4d053dd2000-01-14 04:45:47 +00001153 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001154 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1155 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001156 for (i = 0 ; i < 10 ; i++) {
1157 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1158 s->shininess = -1;
1159 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001160 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001161 }
Brian Paul77d61af2000-06-28 04:20:21 +00001162
jtgafb833d1999-08-19 00:55:39 +00001163
Brian Paul4d053dd2000-01-14 04:45:47 +00001164 /* Line group */
1165 ctx->Line.SmoothFlag = GL_FALSE;
1166 ctx->Line.StippleFlag = GL_FALSE;
1167 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001168 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001169 ctx->Line.StipplePattern = 0xffff;
1170 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001171
Brian Paul4d053dd2000-01-14 04:45:47 +00001172 /* Display List group */
1173 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001174
Brian Paul736fcbe2001-05-29 15:23:48 +00001175 /* Multisample */
1176 ctx->Multisample.Enabled = GL_FALSE;
1177 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1178 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1179 ctx->Multisample.SampleCoverage = GL_FALSE;
1180 ctx->Multisample.SampleCoverageValue = 1.0;
1181 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1182
Brian Paul4d053dd2000-01-14 04:45:47 +00001183 /* Pixel group */
1184 ctx->Pixel.RedBias = 0.0;
1185 ctx->Pixel.RedScale = 1.0;
1186 ctx->Pixel.GreenBias = 0.0;
1187 ctx->Pixel.GreenScale = 1.0;
1188 ctx->Pixel.BlueBias = 0.0;
1189 ctx->Pixel.BlueScale = 1.0;
1190 ctx->Pixel.AlphaBias = 0.0;
1191 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001192 ctx->Pixel.DepthBias = 0.0;
1193 ctx->Pixel.DepthScale = 1.0;
1194 ctx->Pixel.IndexOffset = 0;
1195 ctx->Pixel.IndexShift = 0;
1196 ctx->Pixel.ZoomX = 1.0;
1197 ctx->Pixel.ZoomY = 1.0;
1198 ctx->Pixel.MapColorFlag = GL_FALSE;
1199 ctx->Pixel.MapStencilFlag = GL_FALSE;
1200 ctx->Pixel.MapStoSsize = 1;
1201 ctx->Pixel.MapItoIsize = 1;
1202 ctx->Pixel.MapItoRsize = 1;
1203 ctx->Pixel.MapItoGsize = 1;
1204 ctx->Pixel.MapItoBsize = 1;
1205 ctx->Pixel.MapItoAsize = 1;
1206 ctx->Pixel.MapRtoRsize = 1;
1207 ctx->Pixel.MapGtoGsize = 1;
1208 ctx->Pixel.MapBtoBsize = 1;
1209 ctx->Pixel.MapAtoAsize = 1;
1210 ctx->Pixel.MapStoS[0] = 0;
1211 ctx->Pixel.MapItoI[0] = 0;
1212 ctx->Pixel.MapItoR[0] = 0.0;
1213 ctx->Pixel.MapItoG[0] = 0.0;
1214 ctx->Pixel.MapItoB[0] = 0.0;
1215 ctx->Pixel.MapItoA[0] = 0.0;
1216 ctx->Pixel.MapItoR8[0] = 0;
1217 ctx->Pixel.MapItoG8[0] = 0;
1218 ctx->Pixel.MapItoB8[0] = 0;
1219 ctx->Pixel.MapItoA8[0] = 0;
1220 ctx->Pixel.MapRtoR[0] = 0.0;
1221 ctx->Pixel.MapGtoG[0] = 0.0;
1222 ctx->Pixel.MapBtoB[0] = 0.0;
1223 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001224 ctx->Pixel.HistogramEnabled = GL_FALSE;
1225 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1226 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1227 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1228 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001229 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1230 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1231 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1232 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001233 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1234 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1235 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1236 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001237 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1238 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1239 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001240 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1241 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1242 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1243 for (i = 0; i < 3; i++) {
1244 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1245 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1246 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1247 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1248 }
Brian Paul67adba12000-12-09 20:35:54 +00001249 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1250 ctx->Convolution1D.Filter[i] = 0.0;
1251 ctx->Convolution2D.Filter[i] = 0.0;
1252 ctx->Separable2D.Filter[i] = 0.0;
1253 }
Brian Paul82b02f02000-05-07 20:37:40 +00001254 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1255 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001256
Brian Paul4d053dd2000-01-14 04:45:47 +00001257 /* Point group */
1258 ctx->Point.SmoothFlag = GL_FALSE;
1259 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001260 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001261 ctx->Point.Params[0] = 1.0;
1262 ctx->Point.Params[1] = 0.0;
1263 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001264 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001265 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001266 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001267 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001268 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1269 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001270 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001271 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1272 }
jtgafb833d1999-08-19 00:55:39 +00001273
Brian Paul4d053dd2000-01-14 04:45:47 +00001274 /* Polygon group */
1275 ctx->Polygon.CullFlag = GL_FALSE;
1276 ctx->Polygon.CullFaceMode = GL_BACK;
1277 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001278 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001279 ctx->Polygon.FrontMode = GL_FILL;
1280 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001281 ctx->Polygon.SmoothFlag = GL_FALSE;
1282 ctx->Polygon.StippleFlag = GL_FALSE;
1283 ctx->Polygon.OffsetFactor = 0.0F;
1284 ctx->Polygon.OffsetUnits = 0.0F;
1285 ctx->Polygon.OffsetPoint = GL_FALSE;
1286 ctx->Polygon.OffsetLine = GL_FALSE;
1287 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001288
Brian Paul4d053dd2000-01-14 04:45:47 +00001289 /* Polygon Stipple group */
1290 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001291
Brian Paul4d053dd2000-01-14 04:45:47 +00001292 /* Scissor group */
1293 ctx->Scissor.Enabled = GL_FALSE;
1294 ctx->Scissor.X = 0;
1295 ctx->Scissor.Y = 0;
1296 ctx->Scissor.Width = 0;
1297 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001298
Brian Paul4d053dd2000-01-14 04:45:47 +00001299 /* Stencil group */
1300 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001301 ctx->Stencil.TestTwoSide = GL_FALSE;
1302 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1303 ctx->Stencil.Function[0] = GL_ALWAYS;
1304 ctx->Stencil.Function[1] = GL_ALWAYS;
1305 ctx->Stencil.FailFunc[0] = GL_KEEP;
1306 ctx->Stencil.FailFunc[1] = GL_KEEP;
1307 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1308 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1309 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1310 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1311 ctx->Stencil.Ref[0] = 0;
1312 ctx->Stencil.Ref[1] = 0;
1313 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1314 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1315 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1316 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001317 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001318
Brian Paul4d053dd2000-01-14 04:45:47 +00001319 /* Texture group */
1320 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001321 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001322 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1323 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001324 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001325 _mesa_init_colortable(&ctx->Texture.Palette);
Brian Paul418ac002003-01-21 21:47:45 +00001326 ASSIGN_4V(ctx->Texture.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1327 ASSIGN_4V(ctx->Texture.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
1328 ctx->Texture.ColorTableEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001329
Brian Paul4d053dd2000-01-14 04:45:47 +00001330 /* Transformation group */
1331 ctx->Transform.MatrixMode = GL_MODELVIEW;
1332 ctx->Transform.Normalize = GL_FALSE;
1333 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001334 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001335 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001336 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1337 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001338 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001339
Brian Paul4d053dd2000-01-14 04:45:47 +00001340 /* Viewport group */
1341 ctx->Viewport.X = 0;
1342 ctx->Viewport.Y = 0;
1343 ctx->Viewport.Width = 0;
1344 ctx->Viewport.Height = 0;
1345 ctx->Viewport.Near = 0.0;
1346 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001347 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001348
1349#define Sz 10
1350#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001351 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1352 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001353#undef Sz
1354#undef Tz
1355
Keith Whitwell14940c42000-11-05 18:40:57 +00001356 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1357 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001358
Brian Paul4d053dd2000-01-14 04:45:47 +00001359 /* Vertex arrays */
1360 ctx->Array.Vertex.Size = 4;
1361 ctx->Array.Vertex.Type = GL_FLOAT;
1362 ctx->Array.Vertex.Stride = 0;
1363 ctx->Array.Vertex.StrideB = 0;
1364 ctx->Array.Vertex.Ptr = NULL;
1365 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001366 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001367 ctx->Array.Normal.Type = GL_FLOAT;
1368 ctx->Array.Normal.Stride = 0;
1369 ctx->Array.Normal.StrideB = 0;
1370 ctx->Array.Normal.Ptr = NULL;
1371 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001372 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001373 ctx->Array.Color.Size = 4;
1374 ctx->Array.Color.Type = GL_FLOAT;
1375 ctx->Array.Color.Stride = 0;
1376 ctx->Array.Color.StrideB = 0;
1377 ctx->Array.Color.Ptr = NULL;
1378 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001379 ctx->Array.Color.Flags = CA_CLIENT_DATA;
1380 ctx->Array.SecondaryColor.Size = 4;
1381 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1382 ctx->Array.SecondaryColor.Stride = 0;
1383 ctx->Array.SecondaryColor.StrideB = 0;
1384 ctx->Array.SecondaryColor.Ptr = NULL;
1385 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1386 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1387 ctx->Array.FogCoord.Size = 1;
1388 ctx->Array.FogCoord.Type = GL_FLOAT;
1389 ctx->Array.FogCoord.Stride = 0;
1390 ctx->Array.FogCoord.StrideB = 0;
1391 ctx->Array.FogCoord.Ptr = NULL;
1392 ctx->Array.FogCoord.Enabled = GL_FALSE;
1393 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001394 ctx->Array.Index.Type = GL_FLOAT;
1395 ctx->Array.Index.Stride = 0;
1396 ctx->Array.Index.StrideB = 0;
1397 ctx->Array.Index.Ptr = NULL;
1398 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001399 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001400 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001401 ctx->Array.TexCoord[i].Size = 4;
1402 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1403 ctx->Array.TexCoord[i].Stride = 0;
1404 ctx->Array.TexCoord[i].StrideB = 0;
1405 ctx->Array.TexCoord[i].Ptr = NULL;
1406 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001407 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001408 }
1409 ctx->Array.TexCoordInterleaveFactor = 1;
1410 ctx->Array.EdgeFlag.Stride = 0;
1411 ctx->Array.EdgeFlag.StrideB = 0;
1412 ctx->Array.EdgeFlag.Ptr = NULL;
1413 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001414 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001415 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1416
1417 /* Pixel transfer */
1418 ctx->Pack.Alignment = 4;
1419 ctx->Pack.RowLength = 0;
1420 ctx->Pack.ImageHeight = 0;
1421 ctx->Pack.SkipPixels = 0;
1422 ctx->Pack.SkipRows = 0;
1423 ctx->Pack.SkipImages = 0;
1424 ctx->Pack.SwapBytes = GL_FALSE;
1425 ctx->Pack.LsbFirst = GL_FALSE;
1426 ctx->Unpack.Alignment = 4;
1427 ctx->Unpack.RowLength = 0;
1428 ctx->Unpack.ImageHeight = 0;
1429 ctx->Unpack.SkipPixels = 0;
1430 ctx->Unpack.SkipRows = 0;
1431 ctx->Unpack.SkipImages = 0;
1432 ctx->Unpack.SwapBytes = GL_FALSE;
1433 ctx->Unpack.LsbFirst = GL_FALSE;
1434
1435 /* Feedback */
1436 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1437 ctx->Feedback.Buffer = NULL;
1438 ctx->Feedback.BufferSize = 0;
1439 ctx->Feedback.Count = 0;
1440
1441 /* Selection/picking */
1442 ctx->Select.Buffer = NULL;
1443 ctx->Select.BufferSize = 0;
1444 ctx->Select.BufferCount = 0;
1445 ctx->Select.Hits = 0;
1446 ctx->Select.NameStackDepth = 0;
1447
Brian Paul4d053dd2000-01-14 04:45:47 +00001448 /* Renderer and client attribute stacks */
1449 ctx->AttribStackDepth = 0;
1450 ctx->ClientAttribStackDepth = 0;
1451
Brian Paul13811372000-04-12 00:27:37 +00001452 /* Display list */
1453 ctx->CallDepth = 0;
1454 ctx->ExecuteFlag = GL_TRUE;
1455 ctx->CompileFlag = GL_FALSE;
1456 ctx->CurrentListPtr = NULL;
1457 ctx->CurrentBlock = NULL;
1458 ctx->CurrentListNum = 0;
1459 ctx->CurrentPos = 0;
1460
1461 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001462 _mesa_init_colortable(&ctx->ColorTable);
1463 _mesa_init_colortable(&ctx->ProxyColorTable);
1464 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1465 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1466 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1467 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul418ac002003-01-21 21:47:45 +00001468 _mesa_init_colortable(&ctx->TextureColorTable);
1469 _mesa_init_colortable(&ctx->ProxyTextureColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001470
Brian Paul610d5992003-01-14 04:55:45 +00001471 /* Vertex/fragment programs */
1472 ctx->Program.ErrorPos = -1;
1473 ctx->Program.ErrorString = _mesa_strdup("");
1474#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001475 ctx->VertexProgram.Enabled = GL_FALSE;
1476 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1477 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001478 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001479 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1480 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1481 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1482 }
Brian Paul610d5992003-01-14 04:55:45 +00001483#endif
1484#if FEATURE_NV_fragment_program
1485 ctx->FragmentProgram.Enabled = GL_FALSE;
1486 ctx->FragmentProgram.Current = NULL;
1487#endif
Brian Paul86b84272001-12-14 02:50:01 +00001488
Brian Paul4d053dd2000-01-14 04:45:47 +00001489 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001490 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001491 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001492 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001493
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001494 ctx->_NeedNormals = 0;
1495 ctx->_NeedEyeCoords = 0;
1496 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001497
Brian Paul4d053dd2000-01-14 04:45:47 +00001498 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1499
1500 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001501 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001502 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001503 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001504
1505 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001506 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001507 ctx->FirstTimeCurrent = GL_TRUE;
1508
1509 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001510 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001511 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001512 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001513 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001514 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001515 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001516 }
1517}
1518
1519
1520
1521
jtgafb833d1999-08-19 00:55:39 +00001522/*
1523 * Allocate the proxy textures. If we run out of memory part way through
1524 * the allocations clean up and return GL_FALSE.
1525 * Return: GL_TRUE=success, GL_FALSE=failure
1526 */
Brian Paul178a1c52000-04-22 01:05:00 +00001527static GLboolean
1528alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001529{
1530 GLboolean out_of_memory;
1531 GLint i;
1532
Brian Paul8afe7de2002-06-15 03:03:06 +00001533 ctx->Texture.Proxy1D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_1D);
jtgafb833d1999-08-19 00:55:39 +00001534 if (!ctx->Texture.Proxy1D) {
1535 return GL_FALSE;
1536 }
1537
Brian Paul8afe7de2002-06-15 03:03:06 +00001538 ctx->Texture.Proxy2D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_2D);
jtgafb833d1999-08-19 00:55:39 +00001539 if (!ctx->Texture.Proxy2D) {
Brian Paula8523782000-11-19 23:10:25 +00001540 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
jtgafb833d1999-08-19 00:55:39 +00001541 return GL_FALSE;
1542 }
1543
Brian Paul8afe7de2002-06-15 03:03:06 +00001544 ctx->Texture.Proxy3D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_3D);
jtgafb833d1999-08-19 00:55:39 +00001545 if (!ctx->Texture.Proxy3D) {
Brian Paula8523782000-11-19 23:10:25 +00001546 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1547 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1548 return GL_FALSE;
1549 }
1550
Brian Paul8afe7de2002-06-15 03:03:06 +00001551 ctx->Texture.ProxyCubeMap = _mesa_alloc_texture_object(NULL, 0,
1552 GL_TEXTURE_CUBE_MAP_ARB);
Brian Paula8523782000-11-19 23:10:25 +00001553 if (!ctx->Texture.ProxyCubeMap) {
1554 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1555 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1556 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
jtgafb833d1999-08-19 00:55:39 +00001557 return GL_FALSE;
1558 }
1559
Brian Paul8afe7de2002-06-15 03:03:06 +00001560 ctx->Texture.ProxyRect = _mesa_alloc_texture_object(NULL, 0,
1561 GL_TEXTURE_RECTANGLE_NV);
1562 if (!ctx->Texture.ProxyRect) {
1563 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1564 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1565 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
1566 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
1567 return GL_FALSE;
1568 }
1569
jtgafb833d1999-08-19 00:55:39 +00001570 out_of_memory = GL_FALSE;
1571 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001572 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1573 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1574 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
Brian Paul172281d2001-07-26 20:02:10 +00001575 ctx->Texture.ProxyCubeMap->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001576 if (!ctx->Texture.Proxy1D->Image[i]
1577 || !ctx->Texture.Proxy2D->Image[i]
Brian Paul172281d2001-07-26 20:02:10 +00001578 || !ctx->Texture.Proxy3D->Image[i]
1579 || !ctx->Texture.ProxyCubeMap->Image[i]) {
jtgafb833d1999-08-19 00:55:39 +00001580 out_of_memory = GL_TRUE;
1581 }
1582 }
Brian Paul8afe7de2002-06-15 03:03:06 +00001583 ctx->Texture.ProxyRect->Image[0] = _mesa_alloc_texture_image();
1584 if (!ctx->Texture.ProxyRect->Image[0])
1585 out_of_memory = GL_TRUE;
1586
jtgafb833d1999-08-19 00:55:39 +00001587 if (out_of_memory) {
1588 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1589 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001590 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001591 }
1592 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001593 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001594 }
1595 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001596 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001597 }
Brian Paul172281d2001-07-26 20:02:10 +00001598 if (ctx->Texture.ProxyCubeMap->Image[i]) {
1599 _mesa_free_texture_image(ctx->Texture.ProxyCubeMap->Image[i]);
1600 }
jtgafb833d1999-08-19 00:55:39 +00001601 }
Brian Paul8afe7de2002-06-15 03:03:06 +00001602 if (ctx->Texture.ProxyRect->Image[0]) {
1603 _mesa_free_texture_image(ctx->Texture.ProxyRect->Image[0]);
1604 }
Brian Paula8523782000-11-19 23:10:25 +00001605 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1606 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1607 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
Brian Paul172281d2001-07-26 20:02:10 +00001608 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
Brian Paul8afe7de2002-06-15 03:03:06 +00001609 _mesa_free_texture_object(NULL, ctx->Texture.ProxyRect);
jtgafb833d1999-08-19 00:55:39 +00001610 return GL_FALSE;
1611 }
1612 else {
1613 return GL_TRUE;
1614 }
1615}
1616
1617
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001618static void add_debug_flags( const char *debug )
1619{
1620#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001621 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001622 MESA_VERBOSE |= VERBOSE_VARRAY;
1623
Brian Paul3c634522002-10-24 23:57:19 +00001624 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001625 MESA_VERBOSE |= VERBOSE_TEXTURE;
1626
Brian Paul3c634522002-10-24 23:57:19 +00001627 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001628 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1629
Brian Paul3c634522002-10-24 23:57:19 +00001630 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001631 MESA_VERBOSE |= VERBOSE_PIPELINE;
1632
Brian Paul3c634522002-10-24 23:57:19 +00001633 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001634 MESA_VERBOSE |= VERBOSE_DRIVER;
1635
Brian Paul3c634522002-10-24 23:57:19 +00001636 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001637 MESA_VERBOSE |= VERBOSE_STATE;
1638
Brian Paul3c634522002-10-24 23:57:19 +00001639 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001640 MESA_VERBOSE |= VERBOSE_API;
1641
Brian Paul3c634522002-10-24 23:57:19 +00001642 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001643 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1644
Brian Paul3c634522002-10-24 23:57:19 +00001645 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001646 MESA_VERBOSE |= VERBOSE_LIGHTING;
1647
1648 /* Debug flag:
1649 */
Brian Paul3c634522002-10-24 23:57:19 +00001650 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001651 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1652#endif
1653}
1654
1655
jtgafb833d1999-08-19 00:55:39 +00001656/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001657 * Initialize a GLcontext struct. This includes allocating all the
1658 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001659 */
Brian Paul178a1c52000-04-22 01:05:00 +00001660GLboolean
1661_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001662 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001663 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001664 void *driver_ctx,
1665 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001666{
Brian Paul5fb84d22000-05-24 15:04:45 +00001667 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001668 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001669
Brian Paul3c634522002-10-24 23:57:19 +00001670 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001671
Brian Paul3c634522002-10-24 23:57:19 +00001672 /* If the driver wants core Mesa to use special imports, it'll have to
1673 * override these defaults.
1674 */
1675 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001676
Brian Paul9a33a112002-06-13 04:28:29 +00001677 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001678 _mesa_init_default_exports( &(ctx->exports) );
1679
1680 /* misc one-time initializations */
1681 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001682
Brian Paul3c634522002-10-24 23:57:19 +00001683 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001684 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001685 ctx->DrawBuffer = NULL;
1686 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001687
jtgafb833d1999-08-19 00:55:39 +00001688 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001689 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001690 ctx->Shared = share_list->Shared;
1691 }
1692 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001693 /* allocate new, unshared state */
jtgafb833d1999-08-19 00:55:39 +00001694 ctx->Shared = alloc_shared_state();
1695 if (!ctx->Shared) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001696 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001697 }
1698 }
Brian Paul9560f052000-01-31 23:11:39 +00001699 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001700 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001701 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001702
Brian Paul5a2f32b2001-04-25 18:21:05 +00001703 /* Effectively bind the default textures to all texture units */
Brian Paul610d5992003-01-14 04:55:45 +00001704 ctx->Shared->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1705 ctx->Shared->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1706 ctx->Shared->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1707 ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1708 ctx->Shared->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
Brian Paul5a2f32b2001-04-25 18:21:05 +00001709
Brian Paul4d053dd2000-01-14 04:45:47 +00001710 init_attrib_groups( ctx );
1711
Brian Paulb6bcae52001-01-23 23:39:36 +00001712 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001713 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001714 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001715 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001716 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001717 }
1718 else {
1719 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001720 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001721 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001722 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001723 }
1724
jtgafb833d1999-08-19 00:55:39 +00001725 if (!alloc_proxy_textures(ctx)) {
1726 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001727 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001728 }
jtgafb833d1999-08-19 00:55:39 +00001729
Brian Paul8ad10762002-10-11 17:41:03 +00001730 /*
1731 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1732 * Basically, we should add all extension functions above offset 577.
1733 * This enables older libGL libraries to work with newer drivers that
1734 * have newer extensions.
1735 */
1736 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1737 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1738 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1739 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1740 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1741 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1742 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1743 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1744 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1745 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1746 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1747 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1748 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1749 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1750 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1751 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1752 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1753 /* new extension functions */
1754 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1755 _glapi_add_entrypoint("glBindProgramNV", 579);
1756 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1757 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1758 _glapi_add_entrypoint("glGenProgramsNV", 582);
1759 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1760 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1761 _glapi_add_entrypoint("glGetProgramivNV", 585);
1762 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1763 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1764 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1765 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1766 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1767 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1768 _glapi_add_entrypoint("glIsProgramNV", 592);
1769 _glapi_add_entrypoint("glLoadProgramNV", 593);
1770 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1771 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1772 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1773 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1774 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1775 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1776 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1777 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1778 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1779 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1780 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1781 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1782 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1783 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1784 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1785 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1786 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1787 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1788 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1789 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1790 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1791 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1792 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1793 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1794 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1795 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1796 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1797 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1798 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1799 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1800 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1801 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1802 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1803 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1804 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1805 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1806 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1807 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1808 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1809 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1810 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1811 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1812 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1813 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1814 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1815 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1816 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1817 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1818 _glapi_add_entrypoint("glPointParameteriNV", 642);
1819 _glapi_add_entrypoint("glPointParameterivNV", 643);
1820 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1821 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1822 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1823 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1824 _glapi_add_entrypoint("glGenFencesNV", 648);
1825 _glapi_add_entrypoint("glIsFenceNV", 649);
1826 _glapi_add_entrypoint("glTestFenceNV", 650);
1827 _glapi_add_entrypoint("glGetFenceivNV", 651);
1828 _glapi_add_entrypoint("glFinishFenceNV", 652);
1829 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paulf59afc92000-05-23 23:23:00 +00001830
Brian Paul5fb84d22000-05-24 15:04:45 +00001831 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1832 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1833 * Mesa we do this to accomodate different versions of libGL and various
1834 * DRI drivers.
1835 */
1836 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1837 sizeof(struct _glapi_table) / sizeof(void *));
1838
Brian Paulfbd8f211999-11-11 01:22:25 +00001839 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001840 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1841 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001842 if (!ctx->Exec || !ctx->Save) {
1843 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001844 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001845 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001846 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001847 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1848 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001849 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001850
Keith Whitwellad2ac212000-11-24 10:25:05 +00001851 ctx->ExecPrefersFloat = GL_FALSE;
1852 ctx->SavePrefersFloat = GL_FALSE;
1853
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001854 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001855 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001856 ctx->TnlModule.Current = NULL;
1857 ctx->TnlModule.SwapCount = 0;
1858
Brian Paulb6bcae52001-01-23 23:39:36 +00001859 /* Z buffer stuff */
1860 if (ctx->Visual.depthBits == 0) {
1861 /* Special case. Even if we don't have a depth buffer we need
1862 * good values for DepthMax for Z vertex transformation purposes
1863 * and for per-fragment fog computation.
1864 */
1865 ctx->DepthMax = 1 << 16;
1866 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1867 }
1868 else if (ctx->Visual.depthBits < 32) {
1869 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1870 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1871 }
1872 else {
1873 /* Special case since shift values greater than or equal to the
1874 * number of bits in the left hand expression's type are undefined.
1875 */
1876 ctx->DepthMax = 0xffffffff;
1877 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1878 }
Brian Paulbc920f02001-05-07 16:32:51 +00001879 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001880
Brian Paul3c634522002-10-24 23:57:19 +00001881 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001882 if (c)
1883 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001884
Brian Paul3c634522002-10-24 23:57:19 +00001885 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001886 if (c)
1887 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001888
Brian Paul4d053dd2000-01-14 04:45:47 +00001889 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001890}
1891
jtgafb833d1999-08-19 00:55:39 +00001892
1893
1894/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001895 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001896 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001897 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001898 * driver_ctx - pointer to device driver's context state struct
1899 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001900 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001901 */
Brian Paul178a1c52000-04-22 01:05:00 +00001902GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001903_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001904 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001905 void *driver_ctx,
1906 GLboolean direct )
1907
Brian Paul4d053dd2000-01-14 04:45:47 +00001908{
Brian Paul4753d602002-06-15 02:38:15 +00001909 GLcontext *ctx;
1910
1911 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001912 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001913
Brian Paul3c634522002-10-24 23:57:19 +00001914 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001915 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001916 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001917
Brian Paul3c634522002-10-24 23:57:19 +00001918 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001919 return ctx;
1920 }
1921 else {
Brian Paul3c634522002-10-24 23:57:19 +00001922 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001923 return NULL;
1924 }
1925}
1926
1927
1928
1929/*
1930 * Free the data associated with the given context.
1931 * But don't free() the GLcontext struct itself!
1932 */
Brian Paul178a1c52000-04-22 01:05:00 +00001933void
Brian Paulb1394fa2000-09-26 20:53:53 +00001934_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001935{
Brian Paul4d053dd2000-01-14 04:45:47 +00001936 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001937 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001938
1939 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001940 if (ctx == _mesa_get_current_context()) {
1941 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001942 }
1943
Brian Paul30f51ae2001-12-18 04:06:44 +00001944 /*
1945 * Free transformation matrix stacks
1946 */
1947 free_matrix_stack(&ctx->ModelviewMatrixStack);
1948 free_matrix_stack(&ctx->ProjectionMatrixStack);
1949 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001950 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001951 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1952 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1953 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1954 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001955 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1956
Brian Paul30f51ae2001-12-18 04:06:44 +00001957
Brian Paul8dfc5b92002-10-16 17:57:51 +00001958#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001959 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001960 ctx->VertexProgram.Current->Base.RefCount--;
1961 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
1962 _mesa_delete_program(ctx, ctx->VertexProgram.Current->Base.Id);
1963 }
1964#endif
1965#if FEATURE_NV_fragment_program
1966 if (ctx->FragmentProgram.Current) {
1967 ctx->FragmentProgram.Current->Base.RefCount--;
1968 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
1969 _mesa_delete_program(ctx, ctx->FragmentProgram.Current->Base.Id);
Brian Paulfd284452001-07-19 15:54:34 +00001970 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001971#endif
Brian Paulfd284452001-07-19 15:54:34 +00001972
Brian Paul30f51ae2001-12-18 04:06:44 +00001973 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001974 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001975 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001976 assert(ctx->Shared->RefCount >= 0);
1977 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1978 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001979 /* free shared state */
1980 free_shared_state( ctx, ctx->Shared );
1981 }
1982
Brian Paul30f51ae2001-12-18 04:06:44 +00001983 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001984 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001985 FREE( s );
1986 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001987 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001988
1989 /* Free proxy texture objects */
Brian Paula8523782000-11-19 23:10:25 +00001990 _mesa_free_texture_object( NULL, ctx->Texture.Proxy1D );
1991 _mesa_free_texture_object( NULL, ctx->Texture.Proxy2D );
1992 _mesa_free_texture_object( NULL, ctx->Texture.Proxy3D );
Brian Paulfd284452001-07-19 15:54:34 +00001993 _mesa_free_texture_object( NULL, ctx->Texture.ProxyCubeMap );
Brian Paul8afe7de2002-06-15 03:03:06 +00001994 _mesa_free_texture_object( NULL, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00001995
1996 /* Free evaluator data */
1997 if (ctx->EvalMap.Map1Vertex3.Points)
1998 FREE( ctx->EvalMap.Map1Vertex3.Points );
1999 if (ctx->EvalMap.Map1Vertex4.Points)
2000 FREE( ctx->EvalMap.Map1Vertex4.Points );
2001 if (ctx->EvalMap.Map1Index.Points)
2002 FREE( ctx->EvalMap.Map1Index.Points );
2003 if (ctx->EvalMap.Map1Color4.Points)
2004 FREE( ctx->EvalMap.Map1Color4.Points );
2005 if (ctx->EvalMap.Map1Normal.Points)
2006 FREE( ctx->EvalMap.Map1Normal.Points );
2007 if (ctx->EvalMap.Map1Texture1.Points)
2008 FREE( ctx->EvalMap.Map1Texture1.Points );
2009 if (ctx->EvalMap.Map1Texture2.Points)
2010 FREE( ctx->EvalMap.Map1Texture2.Points );
2011 if (ctx->EvalMap.Map1Texture3.Points)
2012 FREE( ctx->EvalMap.Map1Texture3.Points );
2013 if (ctx->EvalMap.Map1Texture4.Points)
2014 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002015 for (i = 0; i < 16; i++)
2016 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002017
2018 if (ctx->EvalMap.Map2Vertex3.Points)
2019 FREE( ctx->EvalMap.Map2Vertex3.Points );
2020 if (ctx->EvalMap.Map2Vertex4.Points)
2021 FREE( ctx->EvalMap.Map2Vertex4.Points );
2022 if (ctx->EvalMap.Map2Index.Points)
2023 FREE( ctx->EvalMap.Map2Index.Points );
2024 if (ctx->EvalMap.Map2Color4.Points)
2025 FREE( ctx->EvalMap.Map2Color4.Points );
2026 if (ctx->EvalMap.Map2Normal.Points)
2027 FREE( ctx->EvalMap.Map2Normal.Points );
2028 if (ctx->EvalMap.Map2Texture1.Points)
2029 FREE( ctx->EvalMap.Map2Texture1.Points );
2030 if (ctx->EvalMap.Map2Texture2.Points)
2031 FREE( ctx->EvalMap.Map2Texture2.Points );
2032 if (ctx->EvalMap.Map2Texture3.Points)
2033 FREE( ctx->EvalMap.Map2Texture3.Points );
2034 if (ctx->EvalMap.Map2Texture4.Points)
2035 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002036 for (i = 0; i < 16; i++)
2037 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002038
Brian Paul4bdcfe52000-04-17 17:57:04 +00002039 _mesa_free_colortable_data( &ctx->ColorTable );
2040 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2041 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2042 _mesa_free_colortable_data( &ctx->Texture.Palette );
Brian Paul418ac002003-01-21 21:47:45 +00002043 _mesa_free_colortable_data( &ctx->TextureColorTable );
Brian Paul4bdcfe52000-04-17 17:57:04 +00002044
Brian Paulfd284452001-07-19 15:54:34 +00002045 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2046
Brian Paul69755402001-02-26 23:58:12 +00002047 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002048
2049 FREE(ctx->Exec);
2050 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002051}
2052
2053
2054
2055/*
2056 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002057 */
Brian Paul178a1c52000-04-22 01:05:00 +00002058void
Brian Paulb1394fa2000-09-26 20:53:53 +00002059_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002060{
2061 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002062 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002063 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002064 }
2065}
2066
2067
2068
2069/*
jtgafb833d1999-08-19 00:55:39 +00002070 * Copy attribute groups from one context to another.
2071 * Input: src - source context
2072 * dst - destination context
2073 * mask - bitwise OR of GL_*_BIT flags
2074 */
Brian Paul178a1c52000-04-22 01:05:00 +00002075void
Brian Paulb1394fa2000-09-26 20:53:53 +00002076_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002077{
2078 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002079 /* OK to memcpy */
2080 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002081 }
2082 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002083 /* OK to memcpy */
2084 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002085 }
2086 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002087 /* OK to memcpy */
2088 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002089 }
2090 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002091 /* OK to memcpy */
2092 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002093 }
2094 if (mask & GL_ENABLE_BIT) {
2095 /* no op */
2096 }
2097 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002098 /* OK to memcpy */
2099 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002100 }
2101 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002102 /* OK to memcpy */
2103 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002104 }
2105 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002106 /* OK to memcpy */
2107 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002108 }
2109 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002110 GLuint i;
2111 /* begin with memcpy */
2112 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2113 /* fixup linked lists to prevent pointer insanity */
2114 make_empty_list( &(dst->Light.EnabledList) );
2115 for (i = 0; i < MAX_LIGHTS; i++) {
2116 if (dst->Light.Light[i].Enabled) {
2117 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2118 }
2119 }
jtgafb833d1999-08-19 00:55:39 +00002120 }
2121 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002122 /* OK to memcpy */
2123 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002124 }
2125 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002126 /* OK to memcpy */
2127 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002128 }
2129 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002130 /* OK to memcpy */
2131 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002132 }
2133 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002134 /* OK to memcpy */
2135 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002136 }
2137 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002138 /* OK to memcpy */
2139 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002140 }
2141 if (mask & GL_POLYGON_STIPPLE_BIT) {
2142 /* Use loop instead of MEMCPY due to problem with Portland Group's
2143 * C compiler. Reported by John Stone.
2144 */
Brian Paul85d81602002-06-17 23:36:31 +00002145 GLuint i;
2146 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002147 dst->PolygonStipple[i] = src->PolygonStipple[i];
2148 }
2149 }
2150 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002151 /* OK to memcpy */
2152 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002153 }
2154 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002155 /* OK to memcpy */
2156 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002157 }
2158 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002159 /* Cannot memcpy because of pointers */
2160 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002161 }
2162 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002163 /* OK to memcpy */
2164 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002165 }
2166 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002167 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2168 dst->Viewport.X = src->Viewport.X;
2169 dst->Viewport.Y = src->Viewport.Y;
2170 dst->Viewport.Width = src->Viewport.Width;
2171 dst->Viewport.Height = src->Viewport.Height;
2172 dst->Viewport.Near = src->Viewport.Near;
2173 dst->Viewport.Far = src->Viewport.Far;
2174 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002175 }
Brian Paul85d81602002-06-17 23:36:31 +00002176
Keith Whitwella96308c2000-10-30 13:31:59 +00002177 /* XXX FIXME: Call callbacks?
2178 */
2179 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002180}
2181
2182
Brian Paul00037781999-12-17 14:52:35 +00002183
Keith Whitwell23caf202000-11-16 21:05:34 +00002184static void print_info( void )
2185{
Brian Paul4e9676f2002-06-29 19:48:15 +00002186 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002187 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002188 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002189 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002190 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002191 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002192 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002193 (char *) _mesa_GetString(GL_EXTENSIONS));
2194#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002195 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002196#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002197 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002198#endif
2199#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002200 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002201#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002202 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002203#endif
davem69e4f84b42001-06-05 03:58:20 +00002204#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002205 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002206#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002207 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002208#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002209}
2210
2211
Brian Paul00037781999-12-17 14:52:35 +00002212/*
Brian Paul9a33a112002-06-13 04:28:29 +00002213 * Set the current context, binding the given frame buffer to the context.
2214 */
2215void
2216_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2217{
2218 _mesa_make_current2( newCtx, buffer, buffer );
2219}
2220
2221
2222/*
Brian Paul00037781999-12-17 14:52:35 +00002223 * Bind the given context to the given draw-buffer and read-buffer
2224 * and make it the current context for this thread.
2225 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002226void
2227_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2228 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002229{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002230 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002231 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002232
Brian Paulbe3602d2001-02-28 00:27:48 +00002233 /* Check that the context's and framebuffer's visuals are compatible.
2234 * We could do a lot more checking here but this'll catch obvious
2235 * problems.
2236 */
2237 if (newCtx && drawBuffer && readBuffer) {
2238 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2239 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2240 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2241 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2242 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2243 return; /* incompatible */
2244 }
2245 }
2246
Brian Paul00037781999-12-17 14:52:35 +00002247 /* We call this function periodically (just here for now) in
2248 * order to detect when multithreading has begun.
2249 */
2250 _glapi_check_multithread();
2251
Brian Paulf9b97d92000-01-28 20:17:42 +00002252 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002253 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002254
2255
2256 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002257 _glapi_set_dispatch(NULL); /* none current */
2258 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002259 else {
2260 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002261
Keith Whitwell23caf202000-11-16 21:05:34 +00002262 if (drawBuffer && readBuffer) {
2263 /* TODO: check if newCtx and buffer's visual match??? */
2264 newCtx->DrawBuffer = drawBuffer;
2265 newCtx->ReadBuffer = readBuffer;
2266 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002267
2268 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2269 /* get initial window size */
2270 GLuint bufWidth, bufHeight;
2271
2272 /* ask device driver for size of output buffer */
2273 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2274
2275 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2276 return; /* size is as expected */
2277
2278 drawBuffer->Width = bufWidth;
2279 drawBuffer->Height = bufHeight;
2280
2281 newCtx->Driver.ResizeBuffers( drawBuffer );
2282 }
2283
2284 if (readBuffer != drawBuffer &&
2285 readBuffer->Width == 0 && readBuffer->Height == 0) {
2286 /* get initial window size */
2287 GLuint bufWidth, bufHeight;
2288
2289 /* ask device driver for size of output buffer */
2290 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2291
2292 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2293 return; /* size is as expected */
2294
2295 readBuffer->Width = bufWidth;
2296 readBuffer->Height = bufHeight;
2297
2298 newCtx->Driver.ResizeBuffers( readBuffer );
2299 }
Brian Paul00037781999-12-17 14:52:35 +00002300 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002301
Brian Paul8816c702002-06-16 01:10:41 +00002302 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002303 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002304 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2305
2306 /* We can use this to help debug user's problems. Tell them to set
2307 * the MESA_INFO env variable before running their app. Then the
2308 * first time each context is made current we'll print some useful
2309 * information.
2310 */
2311 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002312 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002313 print_info();
2314 }
2315 newCtx->FirstTimeCurrent = GL_FALSE;
2316 }
Brian Paul00037781999-12-17 14:52:35 +00002317 }
2318}
2319
2320
2321
2322/*
2323 * Return current context handle for the calling thread.
2324 * This isn't the fastest way to get the current context.
2325 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2326 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002327GLcontext *
2328_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002329{
Brian Paulf9b97d92000-01-28 20:17:42 +00002330 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002331}
2332
2333
Brian Paulfbd8f211999-11-11 01:22:25 +00002334/*
2335 * Return pointer to this context's current API dispatch table.
2336 * It'll either be the immediate-mode execute dispatcher or the
2337 * display list compile dispatcher.
2338 */
2339struct _glapi_table *
2340_mesa_get_dispatch(GLcontext *ctx)
2341{
2342 return ctx->CurrentDispatch;
2343}
2344
2345
2346
jtgafb833d1999-08-19 00:55:39 +00002347/**********************************************************************/
2348/***** Miscellaneous functions *****/
2349/**********************************************************************/
2350
2351
2352/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002353 * Record the given error code and call the driver's Error function if defined.
2354 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002355 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002356void
Brian Paul4e9676f2002-06-29 19:48:15 +00002357_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002358{
Brian Paul18a285a2002-03-16 00:53:15 +00002359 if (!ctx)
2360 return;
2361
Brian Paul7eb06032000-07-14 04:13:40 +00002362 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002363 ctx->ErrorValue = error;
2364 }
2365
2366 /* Call device driver's error handler, if any. This is used on the Mac. */
2367 if (ctx->Driver.Error) {
2368 (*ctx->Driver.Error)( ctx );
2369 }
2370}
2371
2372
Brian Paulfa9df402000-02-02 19:16:46 +00002373void
2374_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002375{
Brian Paulfa9df402000-02-02 19:16:46 +00002376 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002377 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002378 if (ctx->Driver.Finish) {
2379 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002380 }
2381}
2382
2383
2384
Brian Paulfa9df402000-02-02 19:16:46 +00002385void
2386_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002387{
Brian Paulfa9df402000-02-02 19:16:46 +00002388 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002389 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002390 if (ctx->Driver.Flush) {
2391 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002392 }
jtgafb833d1999-08-19 00:55:39 +00002393}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002394
2395
2396
Keith Whitwellcab974c2000-12-26 05:09:27 +00002397const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002398 "GL_POINTS",
2399 "GL_LINES",
2400 "GL_LINE_LOOP",
2401 "GL_LINE_STRIP",
2402 "GL_TRIANGLES",
2403 "GL_TRIANGLE_STRIP",
2404 "GL_TRIANGLE_FAN",
2405 "GL_QUADS",
2406 "GL_QUAD_STRIP",
2407 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002408 "outside begin/end",
2409 "inside unkown primitive",
2410 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002411};