blob: b9bbe65193324882ac75986fd2e21fd451dc477a [file] [log] [blame]
Brian Paul27558a12003-03-01 01:50:20 +00001/* $Id: context.c,v 1.194 2003/03/01 01:50:20 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 "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000045#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000046#include "teximage.h"
47#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000048#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000049#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000050#include "varray.h"
Brian Paul3a212032002-11-19 15:25:00 +000051#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +000052#include "nvprogram.h"
53#include "nvvertprog.h"
54#endif
55#if FEATURE_NV_fragment_program
56#include "nvfragprog.h"
Brian Paul3a212032002-11-19 15:25:00 +000057#endif
Gareth Hughesd4eb6652001-03-12 01:32:20 +000058#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000059#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000060#include "math/m_matrix.h"
61#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000062#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000063
jtgafb833d1999-08-19 00:55:39 +000064
Brian Paul3b18a362000-09-26 15:27:20 +000065#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000066#include "Trace/tr_context.h"
67#include "Trace/tr_wrapper.h"
68#endif
69
davem69775355a2001-06-05 23:54:00 +000070#ifdef USE_SPARC_ASM
71#include "SPARC/sparc.h"
72#endif
jtgafb833d1999-08-19 00:55:39 +000073
Keith Whitwell23caf202000-11-16 21:05:34 +000074#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000075int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000076#endif
77
78#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000079int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000080#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000081
Brian Paul86b84272001-12-14 02:50:01 +000082
Brian Paul27558a12003-03-01 01:50:20 +000083/* ubyte -> float conversion */
84GLfloat _mesa_ubyte_to_float_color_tab[256];
85
Brian Paul9a33a112002-06-13 04:28:29 +000086static void
87free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
88
Brian Paul86b84272001-12-14 02:50:01 +000089
Brian Paulb1394fa2000-09-26 20:53:53 +000090/**********************************************************************/
91/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
92/**********************************************************************/
93
Brian Paul9a33a112002-06-13 04:28:29 +000094/* Called by window system/device driver (via gc->exports.destroyCurrent())
95 * when the rendering context is to be destroyed.
96 */
97GLboolean
98_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000099{
100 if (gc) {
101 _mesa_free_context_data(gc);
Brian Paul3c634522002-10-24 23:57:19 +0000102 _mesa_free(gc);
Brian Paulb1394fa2000-09-26 20:53:53 +0000103 }
104 return GL_TRUE;
105}
106
Brian Paul9a33a112002-06-13 04:28:29 +0000107/* Called by window system/device driver (via gc->exports.loseCurrent())
108 * when the rendering context is made non-current.
109 */
110GLboolean
111_mesa_loseCurrent(__GLcontext *gc)
112{
113 /* XXX unbind context from thread */
114 return GL_TRUE;
115}
116
117/* Called by window system/device driver (via gc->exports.makeCurrent())
118 * when the rendering context is made current.
119 */
120GLboolean
121_mesa_makeCurrent(__GLcontext *gc)
122{
123 /* XXX bind context to thread */
124 return GL_TRUE;
125}
126
127/* Called by window system/device driver - yadda, yadda, yadda.
128 * See above comments.
129 */
130GLboolean
131_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
132{
133 if (gc && gcShare && gc->Shared && gcShare->Shared) {
134 gc->Shared->RefCount--;
135 if (gc->Shared->RefCount == 0) {
136 free_shared_state(gc, gc->Shared);
137 }
138 gc->Shared = gcShare->Shared;
139 gc->Shared->RefCount++;
140 return GL_TRUE;
141 }
142 else {
143 return GL_FALSE;
144 }
145}
146
147GLboolean
148_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
149{
150 if (dst && src) {
151 _mesa_copy_context( src, dst, mask );
152 return GL_TRUE;
153 }
154 else {
155 return GL_FALSE;
156 }
157}
158
159GLboolean
160_mesa_forceCurrent(__GLcontext *gc)
161{
162 return GL_TRUE;
163}
164
165GLboolean
166_mesa_notifyResize(__GLcontext *gc)
167{
168 GLint x, y;
169 GLuint width, height;
170 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
171 if (!d || !d->getDrawableSize)
172 return GL_FALSE;
173 d->getDrawableSize( d, &x, &y, &width, &height );
174 /* update viewport, resize software buffers, etc. */
175 return GL_TRUE;
176}
177
178void
179_mesa_notifyDestroy(__GLcontext *gc)
180{
Brian Paul60b6e4f2002-10-14 17:08:17 +0000181 /* Called when the context's window/buffer is going to be destroyed. */
182 /* Unbind from it. */
Brian Paul9a33a112002-06-13 04:28:29 +0000183}
184
185/* Called by window system just before swapping buffers.
186 * We have to finish any pending rendering.
187 */
188void
189_mesa_notifySwapBuffers(__GLcontext *gc)
190{
191 FLUSH_VERTICES( gc, 0 );
192}
193
194struct __GLdispatchStateRec *
195_mesa_dispatchExec(__GLcontext *gc)
196{
197 return NULL;
198}
199
200void
201_mesa_beginDispatchOverride(__GLcontext *gc)
202{
203}
204
205void
206_mesa_endDispatchOverride(__GLcontext *gc)
207{
208}
209
210/* Setup the exports. The window system will call these functions
211 * when it needs Mesa to do something.
212 * NOTE: Device drivers should override these functions! For example,
213 * the Xlib driver should plug in the XMesa*-style functions into this
214 * structure. The XMesa-style functions should then call the _mesa_*
215 * version of these functions. This is an approximation to OO design
216 * (inheritance and virtual functions).
217 */
218static void
219_mesa_init_default_exports(__GLexports *exports)
220{
221 exports->destroyContext = _mesa_destroyContext;
222 exports->loseCurrent = _mesa_loseCurrent;
223 exports->makeCurrent = _mesa_makeCurrent;
224 exports->shareContext = _mesa_shareContext;
225 exports->copyContext = _mesa_copyContext;
226 exports->forceCurrent = _mesa_forceCurrent;
227 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000228 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000229 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
230 exports->dispatchExec = _mesa_dispatchExec;
231 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
232 exports->endDispatchOverride = _mesa_endDispatchOverride;
233}
234
235
Brian Paulb1394fa2000-09-26 20:53:53 +0000236
237/* exported OpenGL SI interface */
238__GLcontext *
239__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
240{
241 GLcontext *ctx;
242
Brian Paul4753d602002-06-15 02:38:15 +0000243 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000244 if (ctx == NULL) {
245 return NULL;
246 }
Brian Paul60b6e4f2002-10-14 17:08:17 +0000247
Brian Paul3c634522002-10-24 23:57:19 +0000248 _mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000249 ctx->imports = *imports;
Brian Paulb1394fa2000-09-26 20:53:53 +0000250
251 return ctx;
252}
253
254
255/* exported OpenGL SI interface */
256void
257__glCoreNopDispatch(void)
258{
259#if 0
260 /* SI */
261 __gl_dispatch = __glNopDispatchState;
262#else
263 /* Mesa */
264 _glapi_set_dispatch(NULL);
265#endif
266}
267
268
jtgafb833d1999-08-19 00:55:39 +0000269/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000270/***** GL Visual allocation/destruction *****/
271/**********************************************************************/
272
273
274/*
275 * Allocate a new GLvisual object.
276 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000277 * dbFlag - double buffering?
278 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000279 * depthBits - requested bits per depth buffer value
280 * Any value in [0, 32] is acceptable but the actual
281 * depth type will be GLushort or GLuint as needed.
282 * stencilBits - requested minimum bits per stencil buffer value
283 * accumBits - requested minimum bits per accum buffer component
284 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
285 * red/green/blue/alphaBits - number of bits per color component
286 * in frame buffer for RGB(A) mode.
287 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000288 * Return: pointer to new GLvisual or NULL if requested parameters can't
289 * be met.
290 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000291GLvisual *
292_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000293 GLboolean dbFlag,
294 GLboolean stereoFlag,
295 GLint redBits,
296 GLint greenBits,
297 GLint blueBits,
298 GLint alphaBits,
299 GLint indexBits,
300 GLint depthBits,
301 GLint stencilBits,
302 GLint accumRedBits,
303 GLint accumGreenBits,
304 GLint accumBlueBits,
305 GLint accumAlphaBits,
306 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000307{
Brian Paul178a1c52000-04-22 01:05:00 +0000308 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
309 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000310 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000311 redBits, greenBits, blueBits, alphaBits,
312 indexBits, depthBits, stencilBits,
313 accumRedBits, accumGreenBits,
314 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000315 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000316 FREE(vis);
317 return NULL;
318 }
319 }
320 return vis;
321}
322
323
324/*
325 * Initialize the fields of the given GLvisual.
326 * Input: see _mesa_create_visual() above.
327 * Return: GL_TRUE = success
328 * GL_FALSE = failure.
329 */
330GLboolean
331_mesa_initialize_visual( GLvisual *vis,
332 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000333 GLboolean dbFlag,
334 GLboolean stereoFlag,
335 GLint redBits,
336 GLint greenBits,
337 GLint blueBits,
338 GLint alphaBits,
339 GLint indexBits,
340 GLint depthBits,
341 GLint stencilBits,
342 GLint accumRedBits,
343 GLint accumGreenBits,
344 GLint accumBlueBits,
345 GLint accumAlphaBits,
346 GLint numSamples )
347{
Brian Paulb6bcae52001-01-23 23:39:36 +0000348 (void) numSamples;
349
Brian Paul178a1c52000-04-22 01:05:00 +0000350 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000351
Brian Pauled30dfa2000-03-03 17:47:39 +0000352 /* This is to catch bad values from device drivers not updated for
353 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
354 * bad value now (a 1-bit depth buffer!?!).
355 */
356 assert(depthBits == 0 || depthBits > 1);
357
358 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000359 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000360 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000361 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000362 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000363 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000364 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000365 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000366 }
367 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000368 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000369 }
370 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000371 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000372 }
373 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000374 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000375 }
376
Brian Paulb6bcae52001-01-23 23:39:36 +0000377 vis->rgbMode = rgbFlag;
378 vis->doubleBufferMode = dbFlag;
379 vis->stereoMode = stereoFlag;
Brian Paul153f1542002-10-29 15:04:35 +0000380
Brian Paulb6bcae52001-01-23 23:39:36 +0000381 vis->redBits = redBits;
382 vis->greenBits = greenBits;
383 vis->blueBits = blueBits;
384 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000385
Brian Paulb6bcae52001-01-23 23:39:36 +0000386 vis->indexBits = indexBits;
387 vis->depthBits = depthBits;
388 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
389 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
390 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
391 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
392 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000393
Brian Paul153f1542002-10-29 15:04:35 +0000394 vis->haveAccumBuffer = accumRedBits > 0;
395 vis->haveDepthBuffer = depthBits > 0;
396 vis->haveStencilBuffer = stencilBits > 0;
397
398 vis->numAuxBuffers = 0;
399 vis->level = 0;
400 vis->pixmapMode = 0;
401
Brian Paul178a1c52000-04-22 01:05:00 +0000402 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000403}
404
405
Brian Paulb371e0d2000-03-31 01:05:51 +0000406void
407_mesa_destroy_visual( GLvisual *vis )
408{
409 FREE(vis);
410}
411
412
Brian Paul4d053dd2000-01-14 04:45:47 +0000413/**********************************************************************/
414/***** GL Framebuffer allocation/destruction *****/
415/**********************************************************************/
416
417
418/*
419 * Create a new framebuffer. A GLframebuffer is a struct which
420 * encapsulates the depth, stencil and accum buffers and related
421 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000422 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000423 * softwareDepth - create/use a software depth buffer?
424 * softwareStencil - create/use a software stencil buffer?
425 * softwareAccum - create/use a software accum buffer?
426 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000427 * Return: pointer to new GLframebuffer struct or NULL if error.
428 */
Brian Paul178a1c52000-04-22 01:05:00 +0000429GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000430_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000431 GLboolean softwareDepth,
432 GLboolean softwareStencil,
433 GLboolean softwareAccum,
434 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000435{
Brian Paul178a1c52000-04-22 01:05:00 +0000436 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
437 assert(visual);
438 if (buffer) {
439 _mesa_initialize_framebuffer(buffer, visual,
440 softwareDepth, softwareStencil,
441 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000442 }
Brian Paul178a1c52000-04-22 01:05:00 +0000443 return buffer;
444}
445
446
447/*
448 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000449 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000450 */
451void
452_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000453 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000454 GLboolean softwareDepth,
455 GLboolean softwareStencil,
456 GLboolean softwareAccum,
457 GLboolean softwareAlpha )
458{
459 assert(buffer);
460 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000461
Brian Paul6ec6b842002-10-30 19:49:29 +0000462 _mesa_bzero(buffer, sizeof(GLframebuffer));
Brian Paul85d81602002-06-17 23:36:31 +0000463
Brian Paul4d053dd2000-01-14 04:45:47 +0000464 /* sanity checks */
465 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000466 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000467 }
468 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000469 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000470 }
471 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000472 assert(visual->rgbMode);
473 assert(visual->accumRedBits > 0);
474 assert(visual->accumGreenBits > 0);
475 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000476 }
477 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000478 assert(visual->rgbMode);
479 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000480 }
481
Brian Paul75978bd2001-04-27 21:17:20 +0000482 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000483 buffer->UseSoftwareDepthBuffer = softwareDepth;
484 buffer->UseSoftwareStencilBuffer = softwareStencil;
485 buffer->UseSoftwareAccumBuffer = softwareAccum;
486 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000487}
488
489
Brian Paul4d053dd2000-01-14 04:45:47 +0000490/*
491 * Free a framebuffer struct and its buffers.
492 */
Brian Paul178a1c52000-04-22 01:05:00 +0000493void
Brian Paulb1394fa2000-09-26 20:53:53 +0000494_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000495{
496 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000497 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000498 FREE(buffer);
499 }
500}
501
502
Brian Paul75978bd2001-04-27 21:17:20 +0000503/*
504 * Free the data hanging off of <buffer>, but not <buffer> itself.
505 */
506void
507_mesa_free_framebuffer_data( GLframebuffer *buffer )
508{
509 if (!buffer)
510 return;
511
512 if (buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000513 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000514 buffer->DepthBuffer = NULL;
515 }
516 if (buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000517 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000518 buffer->Accum = NULL;
519 }
520 if (buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000521 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000522 buffer->Stencil = NULL;
523 }
524 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000525 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000526 buffer->FrontLeftAlpha = NULL;
527 }
528 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000529 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000530 buffer->BackLeftAlpha = NULL;
531 }
532 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000533 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000534 buffer->FrontRightAlpha = NULL;
535 }
536 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000537 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000538 buffer->BackRightAlpha = NULL;
539 }
540}
541
542
Brian Paul4d053dd2000-01-14 04:45:47 +0000543
544/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000545/***** Context allocation, initialization, destroying *****/
546/**********************************************************************/
547
548
Brian Paul9560f052000-01-31 23:11:39 +0000549_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
550
551
jtgafb833d1999-08-19 00:55:39 +0000552/*
553 * This function just calls all the various one-time-init functions in Mesa.
554 */
Brian Paul178a1c52000-04-22 01:05:00 +0000555static void
Brian Paul4753d602002-06-15 02:38:15 +0000556one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000557{
558 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000559 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000560 if (!alreadyCalled) {
Brian Paul27558a12003-03-01 01:50:20 +0000561 GLuint i;
562
Brian Paul4d053dd2000-01-14 04:45:47 +0000563 /* do some implementation tests */
564 assert( sizeof(GLbyte) == 1 );
565 assert( sizeof(GLshort) >= 2 );
566 assert( sizeof(GLint) >= 4 );
567 assert( sizeof(GLubyte) == 1 );
568 assert( sizeof(GLushort) >= 2 );
569 assert( sizeof(GLuint) >= 4 );
570
Brian Paul08836342001-03-03 20:33:27 +0000571 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000572
Keith Whitwell23caf202000-11-16 21:05:34 +0000573 _math_init();
Brian Paul27558a12003-03-01 01:50:20 +0000574
575 for (i = 0; i < 256; i++) {
576 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
577 }
Brian Paul68ee4bc2000-01-28 19:02:22 +0000578
davem69775355a2001-06-05 23:54:00 +0000579#ifdef USE_SPARC_ASM
580 _mesa_init_sparc_glapi_relocs();
581#endif
Brian Paul3c634522002-10-24 23:57:19 +0000582 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000583 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000584#ifndef GLX_DIRECT_RENDERING
585 /* libGL from before 2002/06/28 don't have this function. Someday,
586 * when newer libGL libs are common, remove the #ifdef test. This
587 * only serves to print warnings when calling undefined GL functions.
588 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000589 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000590#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000591 }
592 else {
593 _glapi_noop_enable_warnings(GL_FALSE);
594 }
595
jtgafb833d1999-08-19 00:55:39 +0000596#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000597 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000598#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000599
600 alreadyCalled = GL_TRUE;
601 }
Brian Paul9560f052000-01-31 23:11:39 +0000602 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000603}
604
605
Brian Paul86b84272001-12-14 02:50:01 +0000606static void
607init_matrix_stack( struct matrix_stack *stack,
608 GLuint maxDepth, GLuint dirtyFlag )
609{
610 GLuint i;
611
612 stack->Depth = 0;
613 stack->MaxDepth = maxDepth;
614 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000615 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000616 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000617 for (i = 0; i < maxDepth; i++) {
618 _math_matrix_ctr(&stack->Stack[i]);
619 _math_matrix_alloc_inv(&stack->Stack[i]);
620 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000621 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000622}
623
624
625static void
626free_matrix_stack( struct matrix_stack *stack )
627{
628 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000629 for (i = 0; i < stack->MaxDepth; i++) {
630 _math_matrix_dtr(&stack->Stack[i]);
631 }
Brian Paulc4afba32002-02-05 23:21:45 +0000632 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000633 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000634}
635
Brian Paul4d053dd2000-01-14 04:45:47 +0000636
jtgafb833d1999-08-19 00:55:39 +0000637/*
638 * Allocate and initialize a shared context state structure.
639 */
Brian Paul178a1c52000-04-22 01:05:00 +0000640static struct gl_shared_state *
641alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000642{
jtgafb833d1999-08-19 00:55:39 +0000643 struct gl_shared_state *ss;
644 GLboolean outOfMemory;
645
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000646 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000647 if (!ss)
648 return NULL;
649
Brian Paule4b684c2000-09-12 21:07:40 +0000650 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000651
Brian Paule4b684c2000-09-12 21:07:40 +0000652 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000653 ss->TexObjects = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000654#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +0000655 ss->Programs = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000656#endif
jtgafb833d1999-08-19 00:55:39 +0000657
658 /* Default Texture objects */
659 outOfMemory = GL_FALSE;
Brian Paula8523782000-11-19 23:10:25 +0000660
Brian Paul8afe7de2002-06-15 03:03:06 +0000661 ss->Default1D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_1D);
Brian Paula8523782000-11-19 23:10:25 +0000662 if (!ss->Default1D) {
663 outOfMemory = GL_TRUE;
664 }
jtgafb833d1999-08-19 00:55:39 +0000665
Brian Paul8afe7de2002-06-15 03:03:06 +0000666 ss->Default2D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_2D);
Brian Paula8523782000-11-19 23:10:25 +0000667 if (!ss->Default2D) {
668 outOfMemory = GL_TRUE;
669 }
Brian Paula8523782000-11-19 23:10:25 +0000670
Brian Paul8afe7de2002-06-15 03:03:06 +0000671 ss->Default3D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_3D);
Brian Paula8523782000-11-19 23:10:25 +0000672 if (!ss->Default3D) {
673 outOfMemory = GL_TRUE;
674 }
Brian Paula8523782000-11-19 23:10:25 +0000675
Brian Paul8afe7de2002-06-15 03:03:06 +0000676 ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0,
677 GL_TEXTURE_CUBE_MAP_ARB);
Brian Paul413d6a22000-05-26 14:44:59 +0000678 if (!ss->DefaultCubeMap) {
679 outOfMemory = GL_TRUE;
680 }
Brian Paul413d6a22000-05-26 14:44:59 +0000681
Brian Paul8afe7de2002-06-15 03:03:06 +0000682 ss->DefaultRect = _mesa_alloc_texture_object(ss, 0,
683 GL_TEXTURE_RECTANGLE_NV);
684 if (!ss->DefaultRect) {
685 outOfMemory = GL_TRUE;
686 }
687
Brian Paul8dfc5b92002-10-16 17:57:51 +0000688 if (!ss->DisplayList || !ss->TexObjects
689#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +0000690 || !ss->Programs
Brian Paul8dfc5b92002-10-16 17:57:51 +0000691#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000692 || outOfMemory) {
jtgafb833d1999-08-19 00:55:39 +0000693 /* Ran out of memory at some point. Free everything and return NULL */
694 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000695 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000696 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000697 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul610d5992003-01-14 04:55:45 +0000698 if (ss->Programs)
699 _mesa_DeleteHashTable(ss->Programs);
Brian Paula8523782000-11-19 23:10:25 +0000700 if (ss->Default1D)
701 _mesa_free_texture_object(ss, ss->Default1D);
702 if (ss->Default2D)
703 _mesa_free_texture_object(ss, ss->Default2D);
704 if (ss->Default3D)
705 _mesa_free_texture_object(ss, ss->Default3D);
Brian Paul413d6a22000-05-26 14:44:59 +0000706 if (ss->DefaultCubeMap)
Brian Paula8523782000-11-19 23:10:25 +0000707 _mesa_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paul8afe7de2002-06-15 03:03:06 +0000708 if (ss->DefaultRect)
709 _mesa_free_texture_object(ss, ss->DefaultRect);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000710 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000711 return NULL;
712 }
713 else {
714 return ss;
715 }
716}
717
718
719/*
720 * Deallocate a shared state context and all children structures.
721 */
Brian Paul178a1c52000-04-22 01:05:00 +0000722static void
723free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000724{
725 /* Free display lists */
726 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000727 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000728 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000729 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000730 }
731 else {
732 break;
733 }
734 }
Brian Paulbb797902000-01-24 16:19:54 +0000735 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000736
737 /* Free texture objects */
Brian Paul5a2f32b2001-04-25 18:21:05 +0000738 while (ss->TexObjectList) {
jtgafb833d1999-08-19 00:55:39 +0000739 if (ctx->Driver.DeleteTexture)
740 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
741 /* this function removes from linked list too! */
Brian Paula8523782000-11-19 23:10:25 +0000742 _mesa_free_texture_object(ss, ss->TexObjectList);
jtgafb833d1999-08-19 00:55:39 +0000743 }
Brian Paulbb797902000-01-24 16:19:54 +0000744 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000745
Brian Paul8dfc5b92002-10-16 17:57:51 +0000746#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000747 /* Free vertex programs */
748 while (1) {
Brian Paul610d5992003-01-14 04:55:45 +0000749 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
Brian Paul30f51ae2001-12-18 04:06:44 +0000750 if (prog) {
751 _mesa_delete_program(ctx, prog);
752 }
753 else {
754 break;
755 }
756 }
Brian Paul610d5992003-01-14 04:55:45 +0000757 _mesa_DeleteHashTable(ss->Programs);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000758#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000759
Keith Whitwelle15fd852002-12-12 13:03:15 +0000760 _glthread_DESTROY_MUTEX(ss->Mutex);
761
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000762 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000763}
764
765
766
jtgafb833d1999-08-19 00:55:39 +0000767/*
768 * Initialize the nth light. Note that the defaults for light 0 are
769 * different than the other lights.
770 */
Brian Paul178a1c52000-04-22 01:05:00 +0000771static void
772init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000773{
774 make_empty_list( l );
775
776 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
777 if (n==0) {
778 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
779 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
780 }
781 else {
782 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
783 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
784 }
785 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
786 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
787 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000788 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000789 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000790 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000791 l->ConstantAttenuation = 1.0;
792 l->LinearAttenuation = 0.0;
793 l->QuadraticAttenuation = 0.0;
794 l->Enabled = GL_FALSE;
795}
796
797
798
Brian Paul178a1c52000-04-22 01:05:00 +0000799static void
800init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000801{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000802 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000803 lm->LocalViewer = GL_FALSE;
804 lm->TwoSide = GL_FALSE;
805 lm->ColorControl = GL_SINGLE_COLOR;
806}
807
808
Brian Paul178a1c52000-04-22 01:05:00 +0000809static void
810init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000811{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000812 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
813 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
814 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
815 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000816 m->Shininess = 0.0;
817 m->AmbientIndex = 0;
818 m->DiffuseIndex = 1;
819 m->SpecularIndex = 1;
820}
821
822
823
Brian Paul178a1c52000-04-22 01:05:00 +0000824static void
825init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000826{
827 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
828
829 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000830 texUnit->CombineModeRGB = GL_MODULATE;
831 texUnit->CombineModeA = GL_MODULATE;
832 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
833 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
834 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
835 texUnit->CombineSourceA[0] = GL_TEXTURE;
836 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
837 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
838 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
839 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
840 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
841 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
842 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
843 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
844 texUnit->CombineScaleShiftRGB = 0;
845 texUnit->CombineScaleShiftA = 0;
846
jtgafb833d1999-08-19 00:55:39 +0000847 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
848 texUnit->TexGenEnabled = 0;
849 texUnit->GenModeS = GL_EYE_LINEAR;
850 texUnit->GenModeT = GL_EYE_LINEAR;
851 texUnit->GenModeR = GL_EYE_LINEAR;
852 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000853 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
854 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
855 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
856 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000857
jtgafb833d1999-08-19 00:55:39 +0000858 /* Yes, these plane coefficients are correct! */
859 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
860 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
861 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
862 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
863 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
864 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
865 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
866 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
867
Brian Paula8523782000-11-19 23:10:25 +0000868 texUnit->Current1D = ctx->Shared->Default1D;
869 texUnit->Current2D = ctx->Shared->Default2D;
870 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000871 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000872 texUnit->CurrentRect = ctx->Shared->DefaultRect;
Brian Paul45b47d02003-01-26 14:37:15 +0000873
874 /* GL_SGI_texture_color_table */
875 texUnit->ColorTableEnabled = GL_FALSE;
876 _mesa_init_colortable(&texUnit->ColorTable);
877 _mesa_init_colortable(&texUnit->ProxyColorTable);
jtgafb833d1999-08-19 00:55:39 +0000878}
879
880
jtgafb833d1999-08-19 00:55:39 +0000881
Brian Paul4d053dd2000-01-14 04:45:47 +0000882
jtgafb833d1999-08-19 00:55:39 +0000883/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000884static void
885init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000886{
887 map->Order = 1;
888 map->u1 = 0.0;
889 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000890 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000891 if (map->Points) {
892 GLint i;
893 for (i=0;i<n;i++)
894 map->Points[i] = initial[i];
895 }
jtgafb833d1999-08-19 00:55:39 +0000896}
897
898
899/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000900static void
901init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000902{
903 map->Uorder = 1;
904 map->Vorder = 1;
905 map->u1 = 0.0;
906 map->u2 = 1.0;
907 map->v1 = 0.0;
908 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000909 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000910 if (map->Points) {
911 GLint i;
912 for (i=0;i<n;i++)
913 map->Points[i] = initial[i];
914 }
jtgafb833d1999-08-19 00:55:39 +0000915}
916
917
jtgafb833d1999-08-19 00:55:39 +0000918/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000919 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000920 */
Brian Paul178a1c52000-04-22 01:05:00 +0000921static void
922init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000923{
Brian Paul30f51ae2001-12-18 04:06:44 +0000924 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000925
Brian Paul4d053dd2000-01-14 04:45:47 +0000926 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000927
Brian Paulcd1cefa2001-06-13 14:56:14 +0000928 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
929 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
930
Brian Paul539cce52000-02-03 19:40:07 +0000931 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000932 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000933 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
934 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000935 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000936 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Brian Paul610d5992003-01-14 04:55:45 +0000937 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
938 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000939 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000940 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000941 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000942 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
943 ctx->Const.MinPointSize = MIN_POINT_SIZE;
944 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
945 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
946 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000947 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000948 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
949 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
950 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
951 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000952 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000953 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000954 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000955 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
956 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000957 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
958 ctx->Const.MaxLights = MAX_LIGHTS;
jtgafb833d1999-08-19 00:55:39 +0000959
Brian Paul30f51ae2001-12-18 04:06:44 +0000960 /* Initialize matrix stacks */
961 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
962 _NEW_MODELVIEW);
963 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
964 _NEW_PROJECTION);
965 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
966 _NEW_COLOR_MATRIX);
Brian Paul610d5992003-01-14 04:55:45 +0000967 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +0000968 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
969 _NEW_TEXTURE_MATRIX);
970 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
971 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
972 _NEW_TRACK_MATRIX);
973 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +0000974
Brian Paul30f51ae2001-12-18 04:06:44 +0000975 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +0000976 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
977
Brian Paul4d053dd2000-01-14 04:45:47 +0000978 /* Accumulate buffer group */
979 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000980
Brian Paul4d053dd2000-01-14 04:45:47 +0000981 /* Color buffer group */
982 ctx->Color.IndexMask = 0xffffffff;
983 ctx->Color.ColorMask[0] = 0xff;
984 ctx->Color.ColorMask[1] = 0xff;
985 ctx->Color.ColorMask[2] = 0xff;
986 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000987 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +0000988 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000989 ctx->Color.DrawBuffer = GL_FRONT;
990 ctx->Color.AlphaEnabled = GL_FALSE;
991 ctx->Color.AlphaFunc = GL_ALWAYS;
992 ctx->Color.AlphaRef = 0;
993 ctx->Color.BlendEnabled = GL_FALSE;
994 ctx->Color.BlendSrcRGB = GL_ONE;
995 ctx->Color.BlendDstRGB = GL_ZERO;
996 ctx->Color.BlendSrcA = GL_ONE;
997 ctx->Color.BlendDstA = GL_ZERO;
998 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +0000999 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
1000 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
1001 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001002 ctx->Color.LogicOp = GL_COPY;
1003 ctx->Color.DitherFlag = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001004
Brian Paul4d053dd2000-01-14 04:45:47 +00001005 /* Current group */
Brian Paul86b84272001-12-14 02:50:01 +00001006 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
1007 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
1008 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
1009 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
1010 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
Brian Paul610d5992003-01-14 04:55:45 +00001011 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul86b84272001-12-14 02:50:01 +00001012 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001013 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +00001014 ctx->Current.EdgeFlag = GL_TRUE;
1015
Brian Paul4d053dd2000-01-14 04:45:47 +00001016 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
1017 ctx->Current.RasterDistance = 0.0;
1018 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
1019 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001020 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001021 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001022 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001023
jtgafb833d1999-08-19 00:55:39 +00001024
Brian Paul4d053dd2000-01-14 04:45:47 +00001025 /* Depth buffer group */
1026 ctx->Depth.Test = GL_FALSE;
1027 ctx->Depth.Clear = 1.0;
1028 ctx->Depth.Func = GL_LESS;
1029 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001030 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001031
Brian Paul4d053dd2000-01-14 04:45:47 +00001032 /* Evaluators group */
1033 ctx->Eval.Map1Color4 = GL_FALSE;
1034 ctx->Eval.Map1Index = GL_FALSE;
1035 ctx->Eval.Map1Normal = GL_FALSE;
1036 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1037 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1038 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1039 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1040 ctx->Eval.Map1Vertex3 = GL_FALSE;
1041 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001042 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001043 ctx->Eval.Map2Color4 = GL_FALSE;
1044 ctx->Eval.Map2Index = GL_FALSE;
1045 ctx->Eval.Map2Normal = GL_FALSE;
1046 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1047 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1048 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1049 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1050 ctx->Eval.Map2Vertex3 = GL_FALSE;
1051 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001052 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001053 ctx->Eval.AutoNormal = GL_FALSE;
1054 ctx->Eval.MapGrid1un = 1;
1055 ctx->Eval.MapGrid1u1 = 0.0;
1056 ctx->Eval.MapGrid1u2 = 1.0;
1057 ctx->Eval.MapGrid2un = 1;
1058 ctx->Eval.MapGrid2vn = 1;
1059 ctx->Eval.MapGrid2u1 = 0.0;
1060 ctx->Eval.MapGrid2u2 = 1.0;
1061 ctx->Eval.MapGrid2v1 = 0.0;
1062 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001063
Brian Paul4d053dd2000-01-14 04:45:47 +00001064 /* Evaluator data */
1065 {
1066 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1067 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1068 static GLfloat index[1] = { 1.0 };
1069 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1070 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001071 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001072
Brian Paul4d053dd2000-01-14 04:45:47 +00001073 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1074 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1075 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1076 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1077 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1078 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1079 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1080 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1081 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001082 for (i = 0; i < 16; i++)
1083 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001084
Brian Paul4d053dd2000-01-14 04:45:47 +00001085 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1086 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1087 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1088 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1089 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1090 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1091 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1092 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1093 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001094 for (i = 0; i < 16; i++)
1095 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001096 }
jtgafb833d1999-08-19 00:55:39 +00001097
Brian Paul4d053dd2000-01-14 04:45:47 +00001098 /* Fog group */
1099 ctx->Fog.Enabled = GL_FALSE;
1100 ctx->Fog.Mode = GL_EXP;
1101 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1102 ctx->Fog.Index = 0.0;
1103 ctx->Fog.Density = 1.0;
1104 ctx->Fog.Start = 0.0;
1105 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001106 ctx->Fog.ColorSumEnabled = GL_FALSE;
1107 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001108
Brian Paul4d053dd2000-01-14 04:45:47 +00001109 /* Hint group */
1110 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1111 ctx->Hint.PointSmooth = GL_DONT_CARE;
1112 ctx->Hint.LineSmooth = GL_DONT_CARE;
1113 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1114 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001115 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1116 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001117 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001118
Brian Paul0771d152000-04-07 00:19:41 +00001119 /* Histogram group */
1120 ctx->Histogram.Width = 0;
1121 ctx->Histogram.Format = GL_RGBA;
1122 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001123 ctx->Histogram.RedSize = 0;
1124 ctx->Histogram.GreenSize = 0;
1125 ctx->Histogram.BlueSize = 0;
1126 ctx->Histogram.AlphaSize = 0;
1127 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001128 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1129 ctx->Histogram.Count[i][0] = 0;
1130 ctx->Histogram.Count[i][1] = 0;
1131 ctx->Histogram.Count[i][2] = 0;
1132 ctx->Histogram.Count[i][3] = 0;
1133 }
1134
1135 /* Min/Max group */
1136 ctx->MinMax.Format = GL_RGBA;
1137 ctx->MinMax.Sink = GL_FALSE;
1138 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1139 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1140 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1141 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1142
Brian Paul4d053dd2000-01-14 04:45:47 +00001143 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001144 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001145
Brian Paul4d053dd2000-01-14 04:45:47 +00001146 /* Lighting group */
1147 for (i=0;i<MAX_LIGHTS;i++) {
1148 init_light( &ctx->Light.Light[i], i );
1149 }
1150 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001151
Brian Paul4d053dd2000-01-14 04:45:47 +00001152 init_lightmodel( &ctx->Light.Model );
1153 init_material( &ctx->Light.Material[0] );
1154 init_material( &ctx->Light.Material[1] );
1155 ctx->Light.ShadeModel = GL_SMOOTH;
1156 ctx->Light.Enabled = GL_FALSE;
1157 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1158 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001159 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1160 GL_FRONT_AND_BACK,
1161 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001162
Brian Paul4d053dd2000-01-14 04:45:47 +00001163 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001164
Brian Paul4d053dd2000-01-14 04:45:47 +00001165 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001166 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1167 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001168 for (i = 0 ; i < 10 ; i++) {
1169 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1170 s->shininess = -1;
1171 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001172 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001173 }
Brian Paul77d61af2000-06-28 04:20:21 +00001174
jtgafb833d1999-08-19 00:55:39 +00001175
Brian Paul4d053dd2000-01-14 04:45:47 +00001176 /* Line group */
1177 ctx->Line.SmoothFlag = GL_FALSE;
1178 ctx->Line.StippleFlag = GL_FALSE;
1179 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001180 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001181 ctx->Line.StipplePattern = 0xffff;
1182 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001183
Brian Paul4d053dd2000-01-14 04:45:47 +00001184 /* Display List group */
1185 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001186
Brian Paul736fcbe2001-05-29 15:23:48 +00001187 /* Multisample */
1188 ctx->Multisample.Enabled = GL_FALSE;
1189 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1190 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1191 ctx->Multisample.SampleCoverage = GL_FALSE;
1192 ctx->Multisample.SampleCoverageValue = 1.0;
1193 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1194
Brian Paul4d053dd2000-01-14 04:45:47 +00001195 /* Pixel group */
1196 ctx->Pixel.RedBias = 0.0;
1197 ctx->Pixel.RedScale = 1.0;
1198 ctx->Pixel.GreenBias = 0.0;
1199 ctx->Pixel.GreenScale = 1.0;
1200 ctx->Pixel.BlueBias = 0.0;
1201 ctx->Pixel.BlueScale = 1.0;
1202 ctx->Pixel.AlphaBias = 0.0;
1203 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001204 ctx->Pixel.DepthBias = 0.0;
1205 ctx->Pixel.DepthScale = 1.0;
1206 ctx->Pixel.IndexOffset = 0;
1207 ctx->Pixel.IndexShift = 0;
1208 ctx->Pixel.ZoomX = 1.0;
1209 ctx->Pixel.ZoomY = 1.0;
1210 ctx->Pixel.MapColorFlag = GL_FALSE;
1211 ctx->Pixel.MapStencilFlag = GL_FALSE;
1212 ctx->Pixel.MapStoSsize = 1;
1213 ctx->Pixel.MapItoIsize = 1;
1214 ctx->Pixel.MapItoRsize = 1;
1215 ctx->Pixel.MapItoGsize = 1;
1216 ctx->Pixel.MapItoBsize = 1;
1217 ctx->Pixel.MapItoAsize = 1;
1218 ctx->Pixel.MapRtoRsize = 1;
1219 ctx->Pixel.MapGtoGsize = 1;
1220 ctx->Pixel.MapBtoBsize = 1;
1221 ctx->Pixel.MapAtoAsize = 1;
1222 ctx->Pixel.MapStoS[0] = 0;
1223 ctx->Pixel.MapItoI[0] = 0;
1224 ctx->Pixel.MapItoR[0] = 0.0;
1225 ctx->Pixel.MapItoG[0] = 0.0;
1226 ctx->Pixel.MapItoB[0] = 0.0;
1227 ctx->Pixel.MapItoA[0] = 0.0;
1228 ctx->Pixel.MapItoR8[0] = 0;
1229 ctx->Pixel.MapItoG8[0] = 0;
1230 ctx->Pixel.MapItoB8[0] = 0;
1231 ctx->Pixel.MapItoA8[0] = 0;
1232 ctx->Pixel.MapRtoR[0] = 0.0;
1233 ctx->Pixel.MapGtoG[0] = 0.0;
1234 ctx->Pixel.MapBtoB[0] = 0.0;
1235 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001236 ctx->Pixel.HistogramEnabled = GL_FALSE;
1237 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1238 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1239 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1240 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001241 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1242 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1243 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1244 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001245 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1246 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1247 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1248 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001249 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1250 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1251 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001252 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1253 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1254 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1255 for (i = 0; i < 3; i++) {
1256 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1257 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1258 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1259 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1260 }
Brian Paul67adba12000-12-09 20:35:54 +00001261 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1262 ctx->Convolution1D.Filter[i] = 0.0;
1263 ctx->Convolution2D.Filter[i] = 0.0;
1264 ctx->Separable2D.Filter[i] = 0.0;
1265 }
Brian Paul82b02f02000-05-07 20:37:40 +00001266 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1267 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001268 /* GL_SGI_texture_color_table */
1269 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1270 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001271
Brian Paul4d053dd2000-01-14 04:45:47 +00001272 /* Point group */
1273 ctx->Point.SmoothFlag = GL_FALSE;
1274 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001275 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001276 ctx->Point.Params[0] = 1.0;
1277 ctx->Point.Params[1] = 0.0;
1278 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001279 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001280 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001281 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001282 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001283 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1284 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001285 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001286 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1287 }
jtgafb833d1999-08-19 00:55:39 +00001288
Brian Paul4d053dd2000-01-14 04:45:47 +00001289 /* Polygon group */
1290 ctx->Polygon.CullFlag = GL_FALSE;
1291 ctx->Polygon.CullFaceMode = GL_BACK;
1292 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001293 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001294 ctx->Polygon.FrontMode = GL_FILL;
1295 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001296 ctx->Polygon.SmoothFlag = GL_FALSE;
1297 ctx->Polygon.StippleFlag = GL_FALSE;
1298 ctx->Polygon.OffsetFactor = 0.0F;
1299 ctx->Polygon.OffsetUnits = 0.0F;
1300 ctx->Polygon.OffsetPoint = GL_FALSE;
1301 ctx->Polygon.OffsetLine = GL_FALSE;
1302 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001303
Brian Paul4d053dd2000-01-14 04:45:47 +00001304 /* Polygon Stipple group */
1305 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001306
Brian Paul4d053dd2000-01-14 04:45:47 +00001307 /* Scissor group */
1308 ctx->Scissor.Enabled = GL_FALSE;
1309 ctx->Scissor.X = 0;
1310 ctx->Scissor.Y = 0;
1311 ctx->Scissor.Width = 0;
1312 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001313
Brian Paul4d053dd2000-01-14 04:45:47 +00001314 /* Stencil group */
1315 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001316 ctx->Stencil.TestTwoSide = GL_FALSE;
1317 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1318 ctx->Stencil.Function[0] = GL_ALWAYS;
1319 ctx->Stencil.Function[1] = GL_ALWAYS;
1320 ctx->Stencil.FailFunc[0] = GL_KEEP;
1321 ctx->Stencil.FailFunc[1] = GL_KEEP;
1322 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1323 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1324 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1325 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1326 ctx->Stencil.Ref[0] = 0;
1327 ctx->Stencil.Ref[1] = 0;
1328 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1329 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1330 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1331 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001332 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001333
Brian Paul4d053dd2000-01-14 04:45:47 +00001334 /* Texture group */
1335 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001336 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001337 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1338 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001339 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001340 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001341
Brian Paul4d053dd2000-01-14 04:45:47 +00001342 /* Transformation group */
1343 ctx->Transform.MatrixMode = GL_MODELVIEW;
1344 ctx->Transform.Normalize = GL_FALSE;
1345 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001346 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001347 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001348 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1349 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001350 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001351
Brian Paul4d053dd2000-01-14 04:45:47 +00001352 /* Viewport group */
1353 ctx->Viewport.X = 0;
1354 ctx->Viewport.Y = 0;
1355 ctx->Viewport.Width = 0;
1356 ctx->Viewport.Height = 0;
1357 ctx->Viewport.Near = 0.0;
1358 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001359 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001360
1361#define Sz 10
1362#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001363 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1364 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001365#undef Sz
1366#undef Tz
1367
Keith Whitwell14940c42000-11-05 18:40:57 +00001368 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1369 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001370
Brian Paul4d053dd2000-01-14 04:45:47 +00001371 /* Vertex arrays */
1372 ctx->Array.Vertex.Size = 4;
1373 ctx->Array.Vertex.Type = GL_FLOAT;
1374 ctx->Array.Vertex.Stride = 0;
1375 ctx->Array.Vertex.StrideB = 0;
1376 ctx->Array.Vertex.Ptr = NULL;
1377 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001378 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001379 ctx->Array.Normal.Type = GL_FLOAT;
1380 ctx->Array.Normal.Stride = 0;
1381 ctx->Array.Normal.StrideB = 0;
1382 ctx->Array.Normal.Ptr = NULL;
1383 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001384 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001385 ctx->Array.Color.Size = 4;
1386 ctx->Array.Color.Type = GL_FLOAT;
1387 ctx->Array.Color.Stride = 0;
1388 ctx->Array.Color.StrideB = 0;
1389 ctx->Array.Color.Ptr = NULL;
1390 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001391 ctx->Array.Color.Flags = CA_CLIENT_DATA;
1392 ctx->Array.SecondaryColor.Size = 4;
1393 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1394 ctx->Array.SecondaryColor.Stride = 0;
1395 ctx->Array.SecondaryColor.StrideB = 0;
1396 ctx->Array.SecondaryColor.Ptr = NULL;
1397 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1398 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1399 ctx->Array.FogCoord.Size = 1;
1400 ctx->Array.FogCoord.Type = GL_FLOAT;
1401 ctx->Array.FogCoord.Stride = 0;
1402 ctx->Array.FogCoord.StrideB = 0;
1403 ctx->Array.FogCoord.Ptr = NULL;
1404 ctx->Array.FogCoord.Enabled = GL_FALSE;
1405 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001406 ctx->Array.Index.Type = GL_FLOAT;
1407 ctx->Array.Index.Stride = 0;
1408 ctx->Array.Index.StrideB = 0;
1409 ctx->Array.Index.Ptr = NULL;
1410 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001411 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001412 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001413 ctx->Array.TexCoord[i].Size = 4;
1414 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1415 ctx->Array.TexCoord[i].Stride = 0;
1416 ctx->Array.TexCoord[i].StrideB = 0;
1417 ctx->Array.TexCoord[i].Ptr = NULL;
1418 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001419 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001420 }
1421 ctx->Array.TexCoordInterleaveFactor = 1;
1422 ctx->Array.EdgeFlag.Stride = 0;
1423 ctx->Array.EdgeFlag.StrideB = 0;
1424 ctx->Array.EdgeFlag.Ptr = NULL;
1425 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001426 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001427 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1428
1429 /* Pixel transfer */
1430 ctx->Pack.Alignment = 4;
1431 ctx->Pack.RowLength = 0;
1432 ctx->Pack.ImageHeight = 0;
1433 ctx->Pack.SkipPixels = 0;
1434 ctx->Pack.SkipRows = 0;
1435 ctx->Pack.SkipImages = 0;
1436 ctx->Pack.SwapBytes = GL_FALSE;
1437 ctx->Pack.LsbFirst = GL_FALSE;
1438 ctx->Unpack.Alignment = 4;
1439 ctx->Unpack.RowLength = 0;
1440 ctx->Unpack.ImageHeight = 0;
1441 ctx->Unpack.SkipPixels = 0;
1442 ctx->Unpack.SkipRows = 0;
1443 ctx->Unpack.SkipImages = 0;
1444 ctx->Unpack.SwapBytes = GL_FALSE;
1445 ctx->Unpack.LsbFirst = GL_FALSE;
1446
1447 /* Feedback */
1448 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1449 ctx->Feedback.Buffer = NULL;
1450 ctx->Feedback.BufferSize = 0;
1451 ctx->Feedback.Count = 0;
1452
1453 /* Selection/picking */
1454 ctx->Select.Buffer = NULL;
1455 ctx->Select.BufferSize = 0;
1456 ctx->Select.BufferCount = 0;
1457 ctx->Select.Hits = 0;
1458 ctx->Select.NameStackDepth = 0;
1459
Brian Paul4d053dd2000-01-14 04:45:47 +00001460 /* Renderer and client attribute stacks */
1461 ctx->AttribStackDepth = 0;
1462 ctx->ClientAttribStackDepth = 0;
1463
Brian Paul13811372000-04-12 00:27:37 +00001464 /* Display list */
1465 ctx->CallDepth = 0;
1466 ctx->ExecuteFlag = GL_TRUE;
1467 ctx->CompileFlag = GL_FALSE;
1468 ctx->CurrentListPtr = NULL;
1469 ctx->CurrentBlock = NULL;
1470 ctx->CurrentListNum = 0;
1471 ctx->CurrentPos = 0;
1472
1473 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001474 _mesa_init_colortable(&ctx->ColorTable);
1475 _mesa_init_colortable(&ctx->ProxyColorTable);
1476 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1477 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1478 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1479 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001480
Brian Paul610d5992003-01-14 04:55:45 +00001481 /* Vertex/fragment programs */
1482 ctx->Program.ErrorPos = -1;
1483 ctx->Program.ErrorString = _mesa_strdup("");
1484#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001485 ctx->VertexProgram.Enabled = GL_FALSE;
1486 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1487 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001488 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001489 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1490 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1491 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1492 }
Brian Paul610d5992003-01-14 04:55:45 +00001493#endif
1494#if FEATURE_NV_fragment_program
1495 ctx->FragmentProgram.Enabled = GL_FALSE;
1496 ctx->FragmentProgram.Current = NULL;
1497#endif
Brian Paul86b84272001-12-14 02:50:01 +00001498
Brian Paul4d053dd2000-01-14 04:45:47 +00001499 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001500 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001501 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001502 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001503
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001504 ctx->_NeedNormals = 0;
1505 ctx->_NeedEyeCoords = 0;
1506 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001507
Brian Paul4d053dd2000-01-14 04:45:47 +00001508 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1509
1510 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001511 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001512 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001513 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001514
1515 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001516 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001517 ctx->FirstTimeCurrent = GL_TRUE;
1518
1519 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001520 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001521 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001522 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001523 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001524 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001525 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001526 }
1527}
1528
1529
1530
1531
jtgafb833d1999-08-19 00:55:39 +00001532/*
1533 * Allocate the proxy textures. If we run out of memory part way through
1534 * the allocations clean up and return GL_FALSE.
1535 * Return: GL_TRUE=success, GL_FALSE=failure
1536 */
Brian Paul178a1c52000-04-22 01:05:00 +00001537static GLboolean
1538alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001539{
1540 GLboolean out_of_memory;
1541 GLint i;
1542
Brian Paul8afe7de2002-06-15 03:03:06 +00001543 ctx->Texture.Proxy1D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_1D);
jtgafb833d1999-08-19 00:55:39 +00001544 if (!ctx->Texture.Proxy1D) {
1545 return GL_FALSE;
1546 }
1547
Brian Paul8afe7de2002-06-15 03:03:06 +00001548 ctx->Texture.Proxy2D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_2D);
jtgafb833d1999-08-19 00:55:39 +00001549 if (!ctx->Texture.Proxy2D) {
Brian Paula8523782000-11-19 23:10:25 +00001550 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
jtgafb833d1999-08-19 00:55:39 +00001551 return GL_FALSE;
1552 }
1553
Brian Paul8afe7de2002-06-15 03:03:06 +00001554 ctx->Texture.Proxy3D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_3D);
jtgafb833d1999-08-19 00:55:39 +00001555 if (!ctx->Texture.Proxy3D) {
Brian Paula8523782000-11-19 23:10:25 +00001556 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1557 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1558 return GL_FALSE;
1559 }
1560
Brian Paul8afe7de2002-06-15 03:03:06 +00001561 ctx->Texture.ProxyCubeMap = _mesa_alloc_texture_object(NULL, 0,
1562 GL_TEXTURE_CUBE_MAP_ARB);
Brian Paula8523782000-11-19 23:10:25 +00001563 if (!ctx->Texture.ProxyCubeMap) {
1564 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1565 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1566 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
jtgafb833d1999-08-19 00:55:39 +00001567 return GL_FALSE;
1568 }
1569
Brian Paul8afe7de2002-06-15 03:03:06 +00001570 ctx->Texture.ProxyRect = _mesa_alloc_texture_object(NULL, 0,
1571 GL_TEXTURE_RECTANGLE_NV);
1572 if (!ctx->Texture.ProxyRect) {
1573 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1574 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1575 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
1576 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
1577 return GL_FALSE;
1578 }
1579
jtgafb833d1999-08-19 00:55:39 +00001580 out_of_memory = GL_FALSE;
1581 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001582 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1583 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1584 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
Brian Paul172281d2001-07-26 20:02:10 +00001585 ctx->Texture.ProxyCubeMap->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001586 if (!ctx->Texture.Proxy1D->Image[i]
1587 || !ctx->Texture.Proxy2D->Image[i]
Brian Paul172281d2001-07-26 20:02:10 +00001588 || !ctx->Texture.Proxy3D->Image[i]
1589 || !ctx->Texture.ProxyCubeMap->Image[i]) {
jtgafb833d1999-08-19 00:55:39 +00001590 out_of_memory = GL_TRUE;
1591 }
1592 }
Brian Paul8afe7de2002-06-15 03:03:06 +00001593 ctx->Texture.ProxyRect->Image[0] = _mesa_alloc_texture_image();
1594 if (!ctx->Texture.ProxyRect->Image[0])
1595 out_of_memory = GL_TRUE;
1596
jtgafb833d1999-08-19 00:55:39 +00001597 if (out_of_memory) {
1598 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1599 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001600 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001601 }
1602 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001603 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001604 }
1605 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001606 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001607 }
Brian Paul172281d2001-07-26 20:02:10 +00001608 if (ctx->Texture.ProxyCubeMap->Image[i]) {
1609 _mesa_free_texture_image(ctx->Texture.ProxyCubeMap->Image[i]);
1610 }
jtgafb833d1999-08-19 00:55:39 +00001611 }
Brian Paul8afe7de2002-06-15 03:03:06 +00001612 if (ctx->Texture.ProxyRect->Image[0]) {
1613 _mesa_free_texture_image(ctx->Texture.ProxyRect->Image[0]);
1614 }
Brian Paula8523782000-11-19 23:10:25 +00001615 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1616 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1617 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
Brian Paul172281d2001-07-26 20:02:10 +00001618 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
Brian Paul8afe7de2002-06-15 03:03:06 +00001619 _mesa_free_texture_object(NULL, ctx->Texture.ProxyRect);
jtgafb833d1999-08-19 00:55:39 +00001620 return GL_FALSE;
1621 }
1622 else {
1623 return GL_TRUE;
1624 }
1625}
1626
1627
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001628static void add_debug_flags( const char *debug )
1629{
1630#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001631 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001632 MESA_VERBOSE |= VERBOSE_VARRAY;
1633
Brian Paul3c634522002-10-24 23:57:19 +00001634 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001635 MESA_VERBOSE |= VERBOSE_TEXTURE;
1636
Brian Paul3c634522002-10-24 23:57:19 +00001637 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001638 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1639
Brian Paul3c634522002-10-24 23:57:19 +00001640 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001641 MESA_VERBOSE |= VERBOSE_PIPELINE;
1642
Brian Paul3c634522002-10-24 23:57:19 +00001643 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001644 MESA_VERBOSE |= VERBOSE_DRIVER;
1645
Brian Paul3c634522002-10-24 23:57:19 +00001646 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001647 MESA_VERBOSE |= VERBOSE_STATE;
1648
Brian Paul3c634522002-10-24 23:57:19 +00001649 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001650 MESA_VERBOSE |= VERBOSE_API;
1651
Brian Paul3c634522002-10-24 23:57:19 +00001652 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001653 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1654
Brian Paul3c634522002-10-24 23:57:19 +00001655 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001656 MESA_VERBOSE |= VERBOSE_LIGHTING;
1657
1658 /* Debug flag:
1659 */
Brian Paul3c634522002-10-24 23:57:19 +00001660 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001661 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1662#endif
1663}
1664
1665
jtgafb833d1999-08-19 00:55:39 +00001666/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001667 * Initialize a GLcontext struct. This includes allocating all the
1668 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001669 */
Brian Paul178a1c52000-04-22 01:05:00 +00001670GLboolean
1671_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001672 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001673 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001674 void *driver_ctx,
1675 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001676{
Brian Paul5fb84d22000-05-24 15:04:45 +00001677 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001678 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001679
Brian Paul3c634522002-10-24 23:57:19 +00001680 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001681
Brian Paul3c634522002-10-24 23:57:19 +00001682 /* If the driver wants core Mesa to use special imports, it'll have to
1683 * override these defaults.
1684 */
1685 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001686
Brian Paul9a33a112002-06-13 04:28:29 +00001687 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001688 _mesa_init_default_exports( &(ctx->exports) );
1689
1690 /* misc one-time initializations */
1691 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001692
Brian Paul3c634522002-10-24 23:57:19 +00001693 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001694 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001695 ctx->DrawBuffer = NULL;
1696 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001697
jtgafb833d1999-08-19 00:55:39 +00001698 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001699 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001700 ctx->Shared = share_list->Shared;
1701 }
1702 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001703 /* allocate new, unshared state */
jtgafb833d1999-08-19 00:55:39 +00001704 ctx->Shared = alloc_shared_state();
1705 if (!ctx->Shared) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001706 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001707 }
1708 }
Brian Paul9560f052000-01-31 23:11:39 +00001709 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001710 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001711 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001712
Brian Paul5a2f32b2001-04-25 18:21:05 +00001713 /* Effectively bind the default textures to all texture units */
Brian Paul610d5992003-01-14 04:55:45 +00001714 ctx->Shared->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1715 ctx->Shared->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1716 ctx->Shared->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1717 ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
1718 ctx->Shared->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
Brian Paul5a2f32b2001-04-25 18:21:05 +00001719
Brian Paul4d053dd2000-01-14 04:45:47 +00001720 init_attrib_groups( ctx );
1721
Brian Paulb6bcae52001-01-23 23:39:36 +00001722 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001723 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001724 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001725 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001726 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001727 }
1728 else {
1729 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001730 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001731 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001732 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001733 }
1734
jtgafb833d1999-08-19 00:55:39 +00001735 if (!alloc_proxy_textures(ctx)) {
1736 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001737 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001738 }
jtgafb833d1999-08-19 00:55:39 +00001739
Brian Paul8ad10762002-10-11 17:41:03 +00001740 /*
1741 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1742 * Basically, we should add all extension functions above offset 577.
1743 * This enables older libGL libraries to work with newer drivers that
1744 * have newer extensions.
1745 */
1746 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1747 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1748 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1749 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1750 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1751 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1752 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1753 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1754 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1755 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1756 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1757 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1758 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1759 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1760 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1761 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1762 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1763 /* new extension functions */
1764 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1765 _glapi_add_entrypoint("glBindProgramNV", 579);
1766 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1767 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1768 _glapi_add_entrypoint("glGenProgramsNV", 582);
1769 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1770 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1771 _glapi_add_entrypoint("glGetProgramivNV", 585);
1772 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1773 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1774 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1775 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1776 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1777 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1778 _glapi_add_entrypoint("glIsProgramNV", 592);
1779 _glapi_add_entrypoint("glLoadProgramNV", 593);
1780 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1781 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1782 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1783 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1784 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1785 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1786 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1787 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1788 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1789 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1790 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1791 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1792 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1793 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1794 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1795 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1796 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1797 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1798 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1799 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1800 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1801 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1802 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1803 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1804 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1805 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1806 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1807 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1808 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1809 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1810 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1811 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1812 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1813 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1814 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1815 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1816 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1817 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1818 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1819 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1820 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1821 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1822 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1823 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1824 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1825 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1826 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1827 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1828 _glapi_add_entrypoint("glPointParameteriNV", 642);
1829 _glapi_add_entrypoint("glPointParameterivNV", 643);
1830 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1831 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1832 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1833 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1834 _glapi_add_entrypoint("glGenFencesNV", 648);
1835 _glapi_add_entrypoint("glIsFenceNV", 649);
1836 _glapi_add_entrypoint("glTestFenceNV", 650);
1837 _glapi_add_entrypoint("glGetFenceivNV", 651);
1838 _glapi_add_entrypoint("glFinishFenceNV", 652);
1839 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paulf59afc92000-05-23 23:23:00 +00001840
Brian Paul5fb84d22000-05-24 15:04:45 +00001841 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1842 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1843 * Mesa we do this to accomodate different versions of libGL and various
1844 * DRI drivers.
1845 */
1846 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1847 sizeof(struct _glapi_table) / sizeof(void *));
1848
Brian Paulfbd8f211999-11-11 01:22:25 +00001849 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001850 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1851 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001852 if (!ctx->Exec || !ctx->Save) {
1853 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001854 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001855 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001856 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001857 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1858 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001859 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001860
Keith Whitwellad2ac212000-11-24 10:25:05 +00001861 ctx->ExecPrefersFloat = GL_FALSE;
1862 ctx->SavePrefersFloat = GL_FALSE;
1863
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001864 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001865 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001866 ctx->TnlModule.Current = NULL;
1867 ctx->TnlModule.SwapCount = 0;
1868
Brian Paulb6bcae52001-01-23 23:39:36 +00001869 /* Z buffer stuff */
1870 if (ctx->Visual.depthBits == 0) {
1871 /* Special case. Even if we don't have a depth buffer we need
1872 * good values for DepthMax for Z vertex transformation purposes
1873 * and for per-fragment fog computation.
1874 */
1875 ctx->DepthMax = 1 << 16;
1876 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1877 }
1878 else if (ctx->Visual.depthBits < 32) {
1879 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1880 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1881 }
1882 else {
1883 /* Special case since shift values greater than or equal to the
1884 * number of bits in the left hand expression's type are undefined.
1885 */
1886 ctx->DepthMax = 0xffffffff;
1887 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1888 }
Brian Paulbc920f02001-05-07 16:32:51 +00001889 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001890
Brian Paul3c634522002-10-24 23:57:19 +00001891 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001892 if (c)
1893 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001894
Brian Paul3c634522002-10-24 23:57:19 +00001895 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001896 if (c)
1897 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001898
Brian Paul4d053dd2000-01-14 04:45:47 +00001899 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001900}
1901
jtgafb833d1999-08-19 00:55:39 +00001902
1903
1904/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001905 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001906 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001907 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001908 * driver_ctx - pointer to device driver's context state struct
1909 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001910 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001911 */
Brian Paul178a1c52000-04-22 01:05:00 +00001912GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001913_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001914 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001915 void *driver_ctx,
1916 GLboolean direct )
1917
Brian Paul4d053dd2000-01-14 04:45:47 +00001918{
Brian Paul4753d602002-06-15 02:38:15 +00001919 GLcontext *ctx;
1920
1921 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001922 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001923
Brian Paul3c634522002-10-24 23:57:19 +00001924 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001925 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001926 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001927
Brian Paul3c634522002-10-24 23:57:19 +00001928 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001929 return ctx;
1930 }
1931 else {
Brian Paul3c634522002-10-24 23:57:19 +00001932 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001933 return NULL;
1934 }
1935}
1936
1937
1938
1939/*
1940 * Free the data associated with the given context.
1941 * But don't free() the GLcontext struct itself!
1942 */
Brian Paul178a1c52000-04-22 01:05:00 +00001943void
Brian Paulb1394fa2000-09-26 20:53:53 +00001944_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001945{
Brian Paul4d053dd2000-01-14 04:45:47 +00001946 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001947 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001948
1949 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001950 if (ctx == _mesa_get_current_context()) {
1951 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001952 }
1953
Brian Paul30f51ae2001-12-18 04:06:44 +00001954 /*
1955 * Free transformation matrix stacks
1956 */
1957 free_matrix_stack(&ctx->ModelviewMatrixStack);
1958 free_matrix_stack(&ctx->ProjectionMatrixStack);
1959 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001960 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001961 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1962 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1963 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1964 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001965 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1966
Brian Paul30f51ae2001-12-18 04:06:44 +00001967
Brian Paul8dfc5b92002-10-16 17:57:51 +00001968#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001969 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001970 ctx->VertexProgram.Current->Base.RefCount--;
1971 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
1972 _mesa_delete_program(ctx, ctx->VertexProgram.Current->Base.Id);
1973 }
1974#endif
1975#if FEATURE_NV_fragment_program
1976 if (ctx->FragmentProgram.Current) {
1977 ctx->FragmentProgram.Current->Base.RefCount--;
1978 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
1979 _mesa_delete_program(ctx, ctx->FragmentProgram.Current->Base.Id);
Brian Paulfd284452001-07-19 15:54:34 +00001980 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001981#endif
Brian Paulfd284452001-07-19 15:54:34 +00001982
Brian Paul30f51ae2001-12-18 04:06:44 +00001983 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001984 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001985 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001986 assert(ctx->Shared->RefCount >= 0);
1987 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1988 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001989 /* free shared state */
1990 free_shared_state( ctx, ctx->Shared );
1991 }
1992
Brian Paul30f51ae2001-12-18 04:06:44 +00001993 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001994 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001995 FREE( s );
1996 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001997 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001998
1999 /* Free proxy texture objects */
Brian Paula8523782000-11-19 23:10:25 +00002000 _mesa_free_texture_object( NULL, ctx->Texture.Proxy1D );
2001 _mesa_free_texture_object( NULL, ctx->Texture.Proxy2D );
2002 _mesa_free_texture_object( NULL, ctx->Texture.Proxy3D );
Brian Paulfd284452001-07-19 15:54:34 +00002003 _mesa_free_texture_object( NULL, ctx->Texture.ProxyCubeMap );
Brian Paul8afe7de2002-06-15 03:03:06 +00002004 _mesa_free_texture_object( NULL, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00002005
Brian Paul45b47d02003-01-26 14:37:15 +00002006 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
2007 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
2008
Brian Paul4d053dd2000-01-14 04:45:47 +00002009 /* Free evaluator data */
2010 if (ctx->EvalMap.Map1Vertex3.Points)
2011 FREE( ctx->EvalMap.Map1Vertex3.Points );
2012 if (ctx->EvalMap.Map1Vertex4.Points)
2013 FREE( ctx->EvalMap.Map1Vertex4.Points );
2014 if (ctx->EvalMap.Map1Index.Points)
2015 FREE( ctx->EvalMap.Map1Index.Points );
2016 if (ctx->EvalMap.Map1Color4.Points)
2017 FREE( ctx->EvalMap.Map1Color4.Points );
2018 if (ctx->EvalMap.Map1Normal.Points)
2019 FREE( ctx->EvalMap.Map1Normal.Points );
2020 if (ctx->EvalMap.Map1Texture1.Points)
2021 FREE( ctx->EvalMap.Map1Texture1.Points );
2022 if (ctx->EvalMap.Map1Texture2.Points)
2023 FREE( ctx->EvalMap.Map1Texture2.Points );
2024 if (ctx->EvalMap.Map1Texture3.Points)
2025 FREE( ctx->EvalMap.Map1Texture3.Points );
2026 if (ctx->EvalMap.Map1Texture4.Points)
2027 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002028 for (i = 0; i < 16; i++)
2029 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002030
2031 if (ctx->EvalMap.Map2Vertex3.Points)
2032 FREE( ctx->EvalMap.Map2Vertex3.Points );
2033 if (ctx->EvalMap.Map2Vertex4.Points)
2034 FREE( ctx->EvalMap.Map2Vertex4.Points );
2035 if (ctx->EvalMap.Map2Index.Points)
2036 FREE( ctx->EvalMap.Map2Index.Points );
2037 if (ctx->EvalMap.Map2Color4.Points)
2038 FREE( ctx->EvalMap.Map2Color4.Points );
2039 if (ctx->EvalMap.Map2Normal.Points)
2040 FREE( ctx->EvalMap.Map2Normal.Points );
2041 if (ctx->EvalMap.Map2Texture1.Points)
2042 FREE( ctx->EvalMap.Map2Texture1.Points );
2043 if (ctx->EvalMap.Map2Texture2.Points)
2044 FREE( ctx->EvalMap.Map2Texture2.Points );
2045 if (ctx->EvalMap.Map2Texture3.Points)
2046 FREE( ctx->EvalMap.Map2Texture3.Points );
2047 if (ctx->EvalMap.Map2Texture4.Points)
2048 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002049 for (i = 0; i < 16; i++)
2050 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002051
Brian Paul4bdcfe52000-04-17 17:57:04 +00002052 _mesa_free_colortable_data( &ctx->ColorTable );
2053 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2054 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2055 _mesa_free_colortable_data( &ctx->Texture.Palette );
2056
Brian Paulfd284452001-07-19 15:54:34 +00002057 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2058
Brian Paul69755402001-02-26 23:58:12 +00002059 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002060
2061 FREE(ctx->Exec);
2062 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002063}
2064
2065
2066
2067/*
2068 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002069 */
Brian Paul178a1c52000-04-22 01:05:00 +00002070void
Brian Paulb1394fa2000-09-26 20:53:53 +00002071_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002072{
2073 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002074 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002075 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002076 }
2077}
2078
2079
2080
2081/*
jtgafb833d1999-08-19 00:55:39 +00002082 * Copy attribute groups from one context to another.
2083 * Input: src - source context
2084 * dst - destination context
2085 * mask - bitwise OR of GL_*_BIT flags
2086 */
Brian Paul178a1c52000-04-22 01:05:00 +00002087void
Brian Paulb1394fa2000-09-26 20:53:53 +00002088_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002089{
2090 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002091 /* OK to memcpy */
2092 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002093 }
2094 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002095 /* OK to memcpy */
2096 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002097 }
2098 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002099 /* OK to memcpy */
2100 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002101 }
2102 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002103 /* OK to memcpy */
2104 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002105 }
2106 if (mask & GL_ENABLE_BIT) {
2107 /* no op */
2108 }
2109 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002110 /* OK to memcpy */
2111 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002112 }
2113 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002114 /* OK to memcpy */
2115 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002116 }
2117 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002118 /* OK to memcpy */
2119 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002120 }
2121 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002122 GLuint i;
2123 /* begin with memcpy */
2124 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2125 /* fixup linked lists to prevent pointer insanity */
2126 make_empty_list( &(dst->Light.EnabledList) );
2127 for (i = 0; i < MAX_LIGHTS; i++) {
2128 if (dst->Light.Light[i].Enabled) {
2129 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2130 }
2131 }
jtgafb833d1999-08-19 00:55:39 +00002132 }
2133 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002134 /* OK to memcpy */
2135 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002136 }
2137 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002138 /* OK to memcpy */
2139 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002140 }
2141 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002142 /* OK to memcpy */
2143 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002144 }
2145 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002146 /* OK to memcpy */
2147 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002148 }
2149 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002150 /* OK to memcpy */
2151 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002152 }
2153 if (mask & GL_POLYGON_STIPPLE_BIT) {
2154 /* Use loop instead of MEMCPY due to problem with Portland Group's
2155 * C compiler. Reported by John Stone.
2156 */
Brian Paul85d81602002-06-17 23:36:31 +00002157 GLuint i;
2158 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002159 dst->PolygonStipple[i] = src->PolygonStipple[i];
2160 }
2161 }
2162 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002163 /* OK to memcpy */
2164 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002165 }
2166 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002167 /* OK to memcpy */
2168 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002169 }
2170 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002171 /* Cannot memcpy because of pointers */
2172 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002173 }
2174 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002175 /* OK to memcpy */
2176 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002177 }
2178 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002179 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2180 dst->Viewport.X = src->Viewport.X;
2181 dst->Viewport.Y = src->Viewport.Y;
2182 dst->Viewport.Width = src->Viewport.Width;
2183 dst->Viewport.Height = src->Viewport.Height;
2184 dst->Viewport.Near = src->Viewport.Near;
2185 dst->Viewport.Far = src->Viewport.Far;
2186 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002187 }
Brian Paul85d81602002-06-17 23:36:31 +00002188
Keith Whitwella96308c2000-10-30 13:31:59 +00002189 /* XXX FIXME: Call callbacks?
2190 */
2191 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002192}
2193
2194
Brian Paul00037781999-12-17 14:52:35 +00002195
Keith Whitwell23caf202000-11-16 21:05:34 +00002196static void print_info( void )
2197{
Brian Paul4e9676f2002-06-29 19:48:15 +00002198 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002199 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002200 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002201 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002202 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002203 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002204 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002205 (char *) _mesa_GetString(GL_EXTENSIONS));
2206#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002207 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002208#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002209 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002210#endif
2211#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002212 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002213#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002214 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002215#endif
davem69e4f84b42001-06-05 03:58:20 +00002216#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002217 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002218#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002219 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002220#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002221}
2222
2223
Brian Paul00037781999-12-17 14:52:35 +00002224/*
Brian Paul9a33a112002-06-13 04:28:29 +00002225 * Set the current context, binding the given frame buffer to the context.
2226 */
2227void
2228_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2229{
2230 _mesa_make_current2( newCtx, buffer, buffer );
2231}
2232
2233
2234/*
Brian Paul00037781999-12-17 14:52:35 +00002235 * Bind the given context to the given draw-buffer and read-buffer
2236 * and make it the current context for this thread.
2237 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002238void
2239_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2240 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002241{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002242 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002243 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002244
Brian Paulbe3602d2001-02-28 00:27:48 +00002245 /* Check that the context's and framebuffer's visuals are compatible.
2246 * We could do a lot more checking here but this'll catch obvious
2247 * problems.
2248 */
2249 if (newCtx && drawBuffer && readBuffer) {
2250 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2251 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2252 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2253 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2254 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2255 return; /* incompatible */
2256 }
2257 }
2258
Brian Paul00037781999-12-17 14:52:35 +00002259 /* We call this function periodically (just here for now) in
2260 * order to detect when multithreading has begun.
2261 */
2262 _glapi_check_multithread();
2263
Brian Paulf9b97d92000-01-28 20:17:42 +00002264 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002265 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002266
2267
2268 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002269 _glapi_set_dispatch(NULL); /* none current */
2270 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002271 else {
2272 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002273
Keith Whitwell23caf202000-11-16 21:05:34 +00002274 if (drawBuffer && readBuffer) {
2275 /* TODO: check if newCtx and buffer's visual match??? */
2276 newCtx->DrawBuffer = drawBuffer;
2277 newCtx->ReadBuffer = readBuffer;
2278 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002279
2280 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2281 /* get initial window size */
2282 GLuint bufWidth, bufHeight;
2283
2284 /* ask device driver for size of output buffer */
2285 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2286
2287 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2288 return; /* size is as expected */
2289
2290 drawBuffer->Width = bufWidth;
2291 drawBuffer->Height = bufHeight;
2292
2293 newCtx->Driver.ResizeBuffers( drawBuffer );
2294 }
2295
2296 if (readBuffer != drawBuffer &&
2297 readBuffer->Width == 0 && readBuffer->Height == 0) {
2298 /* get initial window size */
2299 GLuint bufWidth, bufHeight;
2300
2301 /* ask device driver for size of output buffer */
2302 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2303
2304 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2305 return; /* size is as expected */
2306
2307 readBuffer->Width = bufWidth;
2308 readBuffer->Height = bufHeight;
2309
2310 newCtx->Driver.ResizeBuffers( readBuffer );
2311 }
Brian Paul00037781999-12-17 14:52:35 +00002312 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002313
Brian Paul8816c702002-06-16 01:10:41 +00002314 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002315 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002316 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2317
2318 /* We can use this to help debug user's problems. Tell them to set
2319 * the MESA_INFO env variable before running their app. Then the
2320 * first time each context is made current we'll print some useful
2321 * information.
2322 */
2323 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002324 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002325 print_info();
2326 }
2327 newCtx->FirstTimeCurrent = GL_FALSE;
2328 }
Brian Paul00037781999-12-17 14:52:35 +00002329 }
2330}
2331
2332
2333
2334/*
2335 * Return current context handle for the calling thread.
2336 * This isn't the fastest way to get the current context.
2337 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2338 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002339GLcontext *
2340_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002341{
Brian Paulf9b97d92000-01-28 20:17:42 +00002342 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002343}
2344
2345
Brian Paulfbd8f211999-11-11 01:22:25 +00002346/*
2347 * Return pointer to this context's current API dispatch table.
2348 * It'll either be the immediate-mode execute dispatcher or the
2349 * display list compile dispatcher.
2350 */
2351struct _glapi_table *
2352_mesa_get_dispatch(GLcontext *ctx)
2353{
2354 return ctx->CurrentDispatch;
2355}
2356
2357
2358
jtgafb833d1999-08-19 00:55:39 +00002359/**********************************************************************/
2360/***** Miscellaneous functions *****/
2361/**********************************************************************/
2362
2363
2364/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002365 * Record the given error code and call the driver's Error function if defined.
2366 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002367 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002368void
Brian Paul4e9676f2002-06-29 19:48:15 +00002369_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002370{
Brian Paul18a285a2002-03-16 00:53:15 +00002371 if (!ctx)
2372 return;
2373
Brian Paul7eb06032000-07-14 04:13:40 +00002374 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002375 ctx->ErrorValue = error;
2376 }
2377
2378 /* Call device driver's error handler, if any. This is used on the Mac. */
2379 if (ctx->Driver.Error) {
2380 (*ctx->Driver.Error)( ctx );
2381 }
2382}
2383
2384
Brian Paulfa9df402000-02-02 19:16:46 +00002385void
2386_mesa_Finish( 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.Finish) {
2391 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002392 }
2393}
2394
2395
2396
Brian Paulfa9df402000-02-02 19:16:46 +00002397void
2398_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002399{
Brian Paulfa9df402000-02-02 19:16:46 +00002400 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002401 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002402 if (ctx->Driver.Flush) {
2403 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002404 }
jtgafb833d1999-08-19 00:55:39 +00002405}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002406
2407
2408
Keith Whitwellcab974c2000-12-26 05:09:27 +00002409const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002410 "GL_POINTS",
2411 "GL_LINES",
2412 "GL_LINE_LOOP",
2413 "GL_LINE_STRIP",
2414 "GL_TRIANGLES",
2415 "GL_TRIANGLE_STRIP",
2416 "GL_TRIANGLE_FAN",
2417 "GL_QUADS",
2418 "GL_QUAD_STRIP",
2419 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002420 "outside begin/end",
2421 "inside unkown primitive",
2422 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002423};