blob: fef403671ec0377f23a465bd6166745acff5da2e [file] [log] [blame]
Brian Paul3c634522002-10-24 23:57:19 +00001/* $Id: context.c,v 1.186 2002/10/24 23:57:20 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paul86b84272001-12-14 02:50:01 +00005 * Version: 4.1
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paulbc42c192002-01-05 21:53:20 +00007 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
Brian Paulfbd8f211999-11-11 01:22:25 +000028#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000029#include "imports.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000030#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000032#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000034#include "dlist.h"
35#include "eval.h"
36#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000037#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000038#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000039#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000040#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "hash.h"
42#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "macros.h"
jtgafb833d1999-08-19 00:55:39 +000044#include "mmath.h"
jtgafb833d1999-08-19 00:55:39 +000045#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000046#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000047#include "teximage.h"
48#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000049#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000050#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000051#include "varray.h"
Brian Paul30f51ae2001-12-18 04:06:44 +000052#include "vpstate.h"
Gareth Hughesd4eb6652001-03-12 01:32:20 +000053#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000054#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000055#include "math/m_matrix.h"
56#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000057#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000058
jtgafb833d1999-08-19 00:55:39 +000059
Brian Paul3b18a362000-09-26 15:27:20 +000060#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000061#include "Trace/tr_context.h"
62#include "Trace/tr_wrapper.h"
63#endif
64
davem69775355a2001-06-05 23:54:00 +000065#ifdef USE_SPARC_ASM
66#include "SPARC/sparc.h"
67#endif
jtgafb833d1999-08-19 00:55:39 +000068
Keith Whitwell23caf202000-11-16 21:05:34 +000069#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000070int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000071#endif
72
73#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000074int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000075#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000076
Brian Paul86b84272001-12-14 02:50:01 +000077
Brian Paul9a33a112002-06-13 04:28:29 +000078static void
79free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
80
Brian Paul86b84272001-12-14 02:50:01 +000081
Brian Paulb1394fa2000-09-26 20:53:53 +000082/**********************************************************************/
83/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
84/**********************************************************************/
85
Brian Paul9a33a112002-06-13 04:28:29 +000086/* Called by window system/device driver (via gc->exports.destroyCurrent())
87 * when the rendering context is to be destroyed.
88 */
89GLboolean
90_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000091{
92 if (gc) {
93 _mesa_free_context_data(gc);
Brian Paul3c634522002-10-24 23:57:19 +000094 _mesa_free(gc);
Brian Paulb1394fa2000-09-26 20:53:53 +000095 }
96 return GL_TRUE;
97}
98
Brian Paul9a33a112002-06-13 04:28:29 +000099/* Called by window system/device driver (via gc->exports.loseCurrent())
100 * when the rendering context is made non-current.
101 */
102GLboolean
103_mesa_loseCurrent(__GLcontext *gc)
104{
105 /* XXX unbind context from thread */
106 return GL_TRUE;
107}
108
109/* Called by window system/device driver (via gc->exports.makeCurrent())
110 * when the rendering context is made current.
111 */
112GLboolean
113_mesa_makeCurrent(__GLcontext *gc)
114{
115 /* XXX bind context to thread */
116 return GL_TRUE;
117}
118
119/* Called by window system/device driver - yadda, yadda, yadda.
120 * See above comments.
121 */
122GLboolean
123_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
124{
125 if (gc && gcShare && gc->Shared && gcShare->Shared) {
126 gc->Shared->RefCount--;
127 if (gc->Shared->RefCount == 0) {
128 free_shared_state(gc, gc->Shared);
129 }
130 gc->Shared = gcShare->Shared;
131 gc->Shared->RefCount++;
132 return GL_TRUE;
133 }
134 else {
135 return GL_FALSE;
136 }
137}
138
139GLboolean
140_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
141{
142 if (dst && src) {
143 _mesa_copy_context( src, dst, mask );
144 return GL_TRUE;
145 }
146 else {
147 return GL_FALSE;
148 }
149}
150
151GLboolean
152_mesa_forceCurrent(__GLcontext *gc)
153{
154 return GL_TRUE;
155}
156
157GLboolean
158_mesa_notifyResize(__GLcontext *gc)
159{
160 GLint x, y;
161 GLuint width, height;
162 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
163 if (!d || !d->getDrawableSize)
164 return GL_FALSE;
165 d->getDrawableSize( d, &x, &y, &width, &height );
166 /* update viewport, resize software buffers, etc. */
167 return GL_TRUE;
168}
169
170void
171_mesa_notifyDestroy(__GLcontext *gc)
172{
Brian Paul60b6e4f2002-10-14 17:08:17 +0000173 /* Called when the context's window/buffer is going to be destroyed. */
174 /* Unbind from it. */
Brian Paul9a33a112002-06-13 04:28:29 +0000175}
176
177/* Called by window system just before swapping buffers.
178 * We have to finish any pending rendering.
179 */
180void
181_mesa_notifySwapBuffers(__GLcontext *gc)
182{
183 FLUSH_VERTICES( gc, 0 );
184}
185
186struct __GLdispatchStateRec *
187_mesa_dispatchExec(__GLcontext *gc)
188{
189 return NULL;
190}
191
192void
193_mesa_beginDispatchOverride(__GLcontext *gc)
194{
195}
196
197void
198_mesa_endDispatchOverride(__GLcontext *gc)
199{
200}
201
202/* Setup the exports. The window system will call these functions
203 * when it needs Mesa to do something.
204 * NOTE: Device drivers should override these functions! For example,
205 * the Xlib driver should plug in the XMesa*-style functions into this
206 * structure. The XMesa-style functions should then call the _mesa_*
207 * version of these functions. This is an approximation to OO design
208 * (inheritance and virtual functions).
209 */
210static void
211_mesa_init_default_exports(__GLexports *exports)
212{
213 exports->destroyContext = _mesa_destroyContext;
214 exports->loseCurrent = _mesa_loseCurrent;
215 exports->makeCurrent = _mesa_makeCurrent;
216 exports->shareContext = _mesa_shareContext;
217 exports->copyContext = _mesa_copyContext;
218 exports->forceCurrent = _mesa_forceCurrent;
219 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000220 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000221 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
222 exports->dispatchExec = _mesa_dispatchExec;
223 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
224 exports->endDispatchOverride = _mesa_endDispatchOverride;
225}
226
227
Brian Paulb1394fa2000-09-26 20:53:53 +0000228
229/* exported OpenGL SI interface */
230__GLcontext *
231__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
232{
233 GLcontext *ctx;
234
Brian Paul4753d602002-06-15 02:38:15 +0000235 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000236 if (ctx == NULL) {
237 return NULL;
238 }
Brian Paul60b6e4f2002-10-14 17:08:17 +0000239
Brian Paul3c634522002-10-24 23:57:19 +0000240 _mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000241 ctx->imports = *imports;
Brian Paulb1394fa2000-09-26 20:53:53 +0000242
243 return ctx;
244}
245
246
247/* exported OpenGL SI interface */
248void
249__glCoreNopDispatch(void)
250{
251#if 0
252 /* SI */
253 __gl_dispatch = __glNopDispatchState;
254#else
255 /* Mesa */
256 _glapi_set_dispatch(NULL);
257#endif
258}
259
260
jtgafb833d1999-08-19 00:55:39 +0000261/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000262/***** GL Visual allocation/destruction *****/
263/**********************************************************************/
264
265
266/*
267 * Allocate a new GLvisual object.
268 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000269 * dbFlag - double buffering?
270 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000271 * depthBits - requested bits per depth buffer value
272 * Any value in [0, 32] is acceptable but the actual
273 * depth type will be GLushort or GLuint as needed.
274 * stencilBits - requested minimum bits per stencil buffer value
275 * accumBits - requested minimum bits per accum buffer component
276 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
277 * red/green/blue/alphaBits - number of bits per color component
278 * in frame buffer for RGB(A) mode.
279 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000280 * Return: pointer to new GLvisual or NULL if requested parameters can't
281 * be met.
282 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000283GLvisual *
284_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000285 GLboolean dbFlag,
286 GLboolean stereoFlag,
287 GLint redBits,
288 GLint greenBits,
289 GLint blueBits,
290 GLint alphaBits,
291 GLint indexBits,
292 GLint depthBits,
293 GLint stencilBits,
294 GLint accumRedBits,
295 GLint accumGreenBits,
296 GLint accumBlueBits,
297 GLint accumAlphaBits,
298 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000299{
Brian Paul178a1c52000-04-22 01:05:00 +0000300 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
301 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000302 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000303 redBits, greenBits, blueBits, alphaBits,
304 indexBits, depthBits, stencilBits,
305 accumRedBits, accumGreenBits,
306 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000307 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000308 FREE(vis);
309 return NULL;
310 }
311 }
312 return vis;
313}
314
315
316/*
317 * Initialize the fields of the given GLvisual.
318 * Input: see _mesa_create_visual() above.
319 * Return: GL_TRUE = success
320 * GL_FALSE = failure.
321 */
322GLboolean
323_mesa_initialize_visual( GLvisual *vis,
324 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000325 GLboolean dbFlag,
326 GLboolean stereoFlag,
327 GLint redBits,
328 GLint greenBits,
329 GLint blueBits,
330 GLint alphaBits,
331 GLint indexBits,
332 GLint depthBits,
333 GLint stencilBits,
334 GLint accumRedBits,
335 GLint accumGreenBits,
336 GLint accumBlueBits,
337 GLint accumAlphaBits,
338 GLint numSamples )
339{
Brian Paulb6bcae52001-01-23 23:39:36 +0000340 (void) numSamples;
341
Brian Paul178a1c52000-04-22 01:05:00 +0000342 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000343
Brian Pauled30dfa2000-03-03 17:47:39 +0000344 /* This is to catch bad values from device drivers not updated for
345 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
346 * bad value now (a 1-bit depth buffer!?!).
347 */
348 assert(depthBits == 0 || depthBits > 1);
349
350 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000351 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000352 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000353 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000354 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000355 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000356 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000357 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000358 }
359 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000360 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000361 }
362 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000363 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000364 }
365 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000366 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000367 }
368
Brian Paulb6bcae52001-01-23 23:39:36 +0000369 vis->rgbMode = rgbFlag;
370 vis->doubleBufferMode = dbFlag;
371 vis->stereoMode = stereoFlag;
372 vis->redBits = redBits;
373 vis->greenBits = greenBits;
374 vis->blueBits = blueBits;
375 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000376
Brian Paulb6bcae52001-01-23 23:39:36 +0000377 vis->indexBits = indexBits;
378 vis->depthBits = depthBits;
379 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
380 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
381 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
382 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
383 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000384
Brian Paul178a1c52000-04-22 01:05:00 +0000385 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000386}
387
388
Brian Paulb371e0d2000-03-31 01:05:51 +0000389void
390_mesa_destroy_visual( GLvisual *vis )
391{
392 FREE(vis);
393}
394
395
Brian Paul4d053dd2000-01-14 04:45:47 +0000396/**********************************************************************/
397/***** GL Framebuffer allocation/destruction *****/
398/**********************************************************************/
399
400
401/*
402 * Create a new framebuffer. A GLframebuffer is a struct which
403 * encapsulates the depth, stencil and accum buffers and related
404 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000405 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000406 * softwareDepth - create/use a software depth buffer?
407 * softwareStencil - create/use a software stencil buffer?
408 * softwareAccum - create/use a software accum buffer?
409 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000410 * Return: pointer to new GLframebuffer struct or NULL if error.
411 */
Brian Paul178a1c52000-04-22 01:05:00 +0000412GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000413_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000414 GLboolean softwareDepth,
415 GLboolean softwareStencil,
416 GLboolean softwareAccum,
417 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000418{
Brian Paul178a1c52000-04-22 01:05:00 +0000419 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
420 assert(visual);
421 if (buffer) {
422 _mesa_initialize_framebuffer(buffer, visual,
423 softwareDepth, softwareStencil,
424 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000425 }
Brian Paul178a1c52000-04-22 01:05:00 +0000426 return buffer;
427}
428
429
430/*
431 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000432 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000433 */
434void
435_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000436 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000437 GLboolean softwareDepth,
438 GLboolean softwareStencil,
439 GLboolean softwareAccum,
440 GLboolean softwareAlpha )
441{
442 assert(buffer);
443 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000444
Brian Paul85d81602002-06-17 23:36:31 +0000445 BZERO(buffer, sizeof(GLframebuffer));
446
Brian Paul4d053dd2000-01-14 04:45:47 +0000447 /* sanity checks */
448 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000449 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000450 }
451 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000452 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000453 }
454 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000455 assert(visual->rgbMode);
456 assert(visual->accumRedBits > 0);
457 assert(visual->accumGreenBits > 0);
458 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000459 }
460 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000461 assert(visual->rgbMode);
462 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000463 }
464
Brian Paul75978bd2001-04-27 21:17:20 +0000465 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000466 buffer->UseSoftwareDepthBuffer = softwareDepth;
467 buffer->UseSoftwareStencilBuffer = softwareStencil;
468 buffer->UseSoftwareAccumBuffer = softwareAccum;
469 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000470}
471
472
Brian Paul4d053dd2000-01-14 04:45:47 +0000473/*
474 * Free a framebuffer struct and its buffers.
475 */
Brian Paul178a1c52000-04-22 01:05:00 +0000476void
Brian Paulb1394fa2000-09-26 20:53:53 +0000477_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000478{
479 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000480 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000481 FREE(buffer);
482 }
483}
484
485
Brian Paul75978bd2001-04-27 21:17:20 +0000486/*
487 * Free the data hanging off of <buffer>, but not <buffer> itself.
488 */
489void
490_mesa_free_framebuffer_data( GLframebuffer *buffer )
491{
492 if (!buffer)
493 return;
494
495 if (buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000496 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000497 buffer->DepthBuffer = NULL;
498 }
499 if (buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000500 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000501 buffer->Accum = NULL;
502 }
503 if (buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000504 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000505 buffer->Stencil = NULL;
506 }
507 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000508 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000509 buffer->FrontLeftAlpha = NULL;
510 }
511 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000512 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000513 buffer->BackLeftAlpha = NULL;
514 }
515 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000516 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000517 buffer->FrontRightAlpha = NULL;
518 }
519 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000520 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000521 buffer->BackRightAlpha = NULL;
522 }
523}
524
525
Brian Paul4d053dd2000-01-14 04:45:47 +0000526
527/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000528/***** Context allocation, initialization, destroying *****/
529/**********************************************************************/
530
531
Brian Paul9560f052000-01-31 23:11:39 +0000532_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
533
534
jtgafb833d1999-08-19 00:55:39 +0000535/*
536 * This function just calls all the various one-time-init functions in Mesa.
537 */
Brian Paul178a1c52000-04-22 01:05:00 +0000538static void
Brian Paul4753d602002-06-15 02:38:15 +0000539one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000540{
541 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000542 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000543 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000544 /* do some implementation tests */
545 assert( sizeof(GLbyte) == 1 );
546 assert( sizeof(GLshort) >= 2 );
547 assert( sizeof(GLint) >= 4 );
548 assert( sizeof(GLubyte) == 1 );
549 assert( sizeof(GLushort) >= 2 );
550 assert( sizeof(GLuint) >= 4 );
551
Brian Paul08836342001-03-03 20:33:27 +0000552 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000553
Keith Whitwell23caf202000-11-16 21:05:34 +0000554 _math_init();
Brian Paul69755402001-02-26 23:58:12 +0000555 _mesa_init_math();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000556
davem69775355a2001-06-05 23:54:00 +0000557#ifdef USE_SPARC_ASM
558 _mesa_init_sparc_glapi_relocs();
559#endif
Brian Paul3c634522002-10-24 23:57:19 +0000560 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000561 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000562#ifndef GLX_DIRECT_RENDERING
563 /* libGL from before 2002/06/28 don't have this function. Someday,
564 * when newer libGL libs are common, remove the #ifdef test. This
565 * only serves to print warnings when calling undefined GL functions.
566 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000567 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000568#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000569 }
570 else {
571 _glapi_noop_enable_warnings(GL_FALSE);
572 }
573
jtgafb833d1999-08-19 00:55:39 +0000574#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000575 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000576#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000577
578 alreadyCalled = GL_TRUE;
579 }
Brian Paul9560f052000-01-31 23:11:39 +0000580 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000581}
582
583
Brian Paul86b84272001-12-14 02:50:01 +0000584static void
585init_matrix_stack( struct matrix_stack *stack,
586 GLuint maxDepth, GLuint dirtyFlag )
587{
588 GLuint i;
589
590 stack->Depth = 0;
591 stack->MaxDepth = maxDepth;
592 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000593 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000594 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000595 for (i = 0; i < maxDepth; i++) {
596 _math_matrix_ctr(&stack->Stack[i]);
597 _math_matrix_alloc_inv(&stack->Stack[i]);
598 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000599 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000600}
601
602
603static void
604free_matrix_stack( struct matrix_stack *stack )
605{
606 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000607 for (i = 0; i < stack->MaxDepth; i++) {
608 _math_matrix_dtr(&stack->Stack[i]);
609 }
Brian Paulc4afba32002-02-05 23:21:45 +0000610 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000611 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000612}
613
Brian Paul4d053dd2000-01-14 04:45:47 +0000614
jtgafb833d1999-08-19 00:55:39 +0000615/*
616 * Allocate and initialize a shared context state structure.
617 */
Brian Paul178a1c52000-04-22 01:05:00 +0000618static struct gl_shared_state *
619alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000620{
jtgafb833d1999-08-19 00:55:39 +0000621 struct gl_shared_state *ss;
622 GLboolean outOfMemory;
623
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000624 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000625 if (!ss)
626 return NULL;
627
Brian Paule4b684c2000-09-12 21:07:40 +0000628 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000629
Brian Paule4b684c2000-09-12 21:07:40 +0000630 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000631 ss->TexObjects = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000632#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000633 ss->VertexPrograms = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000634#endif
jtgafb833d1999-08-19 00:55:39 +0000635
636 /* Default Texture objects */
637 outOfMemory = GL_FALSE;
Brian Paula8523782000-11-19 23:10:25 +0000638
Brian Paul8afe7de2002-06-15 03:03:06 +0000639 ss->Default1D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_1D);
Brian Paula8523782000-11-19 23:10:25 +0000640 if (!ss->Default1D) {
641 outOfMemory = GL_TRUE;
642 }
jtgafb833d1999-08-19 00:55:39 +0000643
Brian Paul8afe7de2002-06-15 03:03:06 +0000644 ss->Default2D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_2D);
Brian Paula8523782000-11-19 23:10:25 +0000645 if (!ss->Default2D) {
646 outOfMemory = GL_TRUE;
647 }
Brian Paula8523782000-11-19 23:10:25 +0000648
Brian Paul8afe7de2002-06-15 03:03:06 +0000649 ss->Default3D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_3D);
Brian Paula8523782000-11-19 23:10:25 +0000650 if (!ss->Default3D) {
651 outOfMemory = GL_TRUE;
652 }
Brian Paula8523782000-11-19 23:10:25 +0000653
Brian Paul8afe7de2002-06-15 03:03:06 +0000654 ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0,
655 GL_TEXTURE_CUBE_MAP_ARB);
Brian Paul413d6a22000-05-26 14:44:59 +0000656 if (!ss->DefaultCubeMap) {
657 outOfMemory = GL_TRUE;
658 }
Brian Paul413d6a22000-05-26 14:44:59 +0000659
Brian Paul8afe7de2002-06-15 03:03:06 +0000660 ss->DefaultRect = _mesa_alloc_texture_object(ss, 0,
661 GL_TEXTURE_RECTANGLE_NV);
662 if (!ss->DefaultRect) {
663 outOfMemory = GL_TRUE;
664 }
665
Brian Paul8dfc5b92002-10-16 17:57:51 +0000666 if (!ss->DisplayList || !ss->TexObjects
667#if FEATURE_NV_vertex_program
668 || !ss->VertexPrograms
669#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000670 || outOfMemory) {
jtgafb833d1999-08-19 00:55:39 +0000671 /* Ran out of memory at some point. Free everything and return NULL */
672 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000673 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000674 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000675 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul30f51ae2001-12-18 04:06:44 +0000676 if (ss->VertexPrograms)
677 _mesa_DeleteHashTable(ss->VertexPrograms);
Brian Paula8523782000-11-19 23:10:25 +0000678 if (ss->Default1D)
679 _mesa_free_texture_object(ss, ss->Default1D);
680 if (ss->Default2D)
681 _mesa_free_texture_object(ss, ss->Default2D);
682 if (ss->Default3D)
683 _mesa_free_texture_object(ss, ss->Default3D);
Brian Paul413d6a22000-05-26 14:44:59 +0000684 if (ss->DefaultCubeMap)
Brian Paula8523782000-11-19 23:10:25 +0000685 _mesa_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paul8afe7de2002-06-15 03:03:06 +0000686 if (ss->DefaultRect)
687 _mesa_free_texture_object(ss, ss->DefaultRect);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000688 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000689 return NULL;
690 }
691 else {
692 return ss;
693 }
694}
695
696
697/*
698 * Deallocate a shared state context and all children structures.
699 */
Brian Paul178a1c52000-04-22 01:05:00 +0000700static void
701free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000702{
703 /* Free display lists */
704 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000705 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000706 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000707 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000708 }
709 else {
710 break;
711 }
712 }
Brian Paulbb797902000-01-24 16:19:54 +0000713 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000714
715 /* Free texture objects */
Brian Paul5a2f32b2001-04-25 18:21:05 +0000716 while (ss->TexObjectList) {
jtgafb833d1999-08-19 00:55:39 +0000717 if (ctx->Driver.DeleteTexture)
718 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
719 /* this function removes from linked list too! */
Brian Paula8523782000-11-19 23:10:25 +0000720 _mesa_free_texture_object(ss, ss->TexObjectList);
jtgafb833d1999-08-19 00:55:39 +0000721 }
Brian Paulbb797902000-01-24 16:19:54 +0000722 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000723
Brian Paul8dfc5b92002-10-16 17:57:51 +0000724#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000725 /* Free vertex programs */
726 while (1) {
727 GLuint prog = _mesa_HashFirstEntry(ss->VertexPrograms);
728 if (prog) {
729 _mesa_delete_program(ctx, prog);
730 }
731 else {
732 break;
733 }
734 }
735 _mesa_DeleteHashTable(ss->VertexPrograms);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000736#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000737
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000738 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000739}
740
741
742
jtgafb833d1999-08-19 00:55:39 +0000743/*
744 * Initialize the nth light. Note that the defaults for light 0 are
745 * different than the other lights.
746 */
Brian Paul178a1c52000-04-22 01:05:00 +0000747static void
748init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000749{
750 make_empty_list( l );
751
752 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
753 if (n==0) {
754 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
755 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
756 }
757 else {
758 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
759 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
760 }
761 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
762 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
763 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000764 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000765 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000766 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000767 l->ConstantAttenuation = 1.0;
768 l->LinearAttenuation = 0.0;
769 l->QuadraticAttenuation = 0.0;
770 l->Enabled = GL_FALSE;
771}
772
773
774
Brian Paul178a1c52000-04-22 01:05:00 +0000775static void
776init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000777{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000778 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000779 lm->LocalViewer = GL_FALSE;
780 lm->TwoSide = GL_FALSE;
781 lm->ColorControl = GL_SINGLE_COLOR;
782}
783
784
Brian Paul178a1c52000-04-22 01:05:00 +0000785static void
786init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000787{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000788 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
789 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
790 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
791 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000792 m->Shininess = 0.0;
793 m->AmbientIndex = 0;
794 m->DiffuseIndex = 1;
795 m->SpecularIndex = 1;
796}
797
798
799
Brian Paul178a1c52000-04-22 01:05:00 +0000800static void
801init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000802{
803 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
804
805 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000806 texUnit->CombineModeRGB = GL_MODULATE;
807 texUnit->CombineModeA = GL_MODULATE;
808 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
809 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
810 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
811 texUnit->CombineSourceA[0] = GL_TEXTURE;
812 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
813 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
814 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
815 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
816 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
817 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
818 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
819 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
820 texUnit->CombineScaleShiftRGB = 0;
821 texUnit->CombineScaleShiftA = 0;
822
jtgafb833d1999-08-19 00:55:39 +0000823 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
824 texUnit->TexGenEnabled = 0;
825 texUnit->GenModeS = GL_EYE_LINEAR;
826 texUnit->GenModeT = GL_EYE_LINEAR;
827 texUnit->GenModeR = GL_EYE_LINEAR;
828 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000829 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
830 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
831 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
832 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000833
jtgafb833d1999-08-19 00:55:39 +0000834 /* Yes, these plane coefficients are correct! */
835 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
836 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
837 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
838 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
839 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
840 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
841 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
842 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
843
Brian Paula8523782000-11-19 23:10:25 +0000844 texUnit->Current1D = ctx->Shared->Default1D;
845 texUnit->Current2D = ctx->Shared->Default2D;
846 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000847 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000848 texUnit->CurrentRect = ctx->Shared->DefaultRect;
jtgafb833d1999-08-19 00:55:39 +0000849}
850
851
jtgafb833d1999-08-19 00:55:39 +0000852
Brian Paul4d053dd2000-01-14 04:45:47 +0000853
jtgafb833d1999-08-19 00:55:39 +0000854/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000855static void
856init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000857{
858 map->Order = 1;
859 map->u1 = 0.0;
860 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000861 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000862 if (map->Points) {
863 GLint i;
864 for (i=0;i<n;i++)
865 map->Points[i] = initial[i];
866 }
jtgafb833d1999-08-19 00:55:39 +0000867}
868
869
870/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000871static void
872init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000873{
874 map->Uorder = 1;
875 map->Vorder = 1;
876 map->u1 = 0.0;
877 map->u2 = 1.0;
878 map->v1 = 0.0;
879 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000880 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000881 if (map->Points) {
882 GLint i;
883 for (i=0;i<n;i++)
884 map->Points[i] = initial[i];
885 }
jtgafb833d1999-08-19 00:55:39 +0000886}
887
888
jtgafb833d1999-08-19 00:55:39 +0000889/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000890 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000891 */
Brian Paul178a1c52000-04-22 01:05:00 +0000892static void
893init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000894{
Brian Paul30f51ae2001-12-18 04:06:44 +0000895 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000896
Brian Paul4d053dd2000-01-14 04:45:47 +0000897 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000898
Brian Paulcd1cefa2001-06-13 14:56:14 +0000899 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
900 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
901
Brian Paul539cce52000-02-03 19:40:07 +0000902 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000903 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000904 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
905 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000906 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000907 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000908 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000909 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000910 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000911 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
912 ctx->Const.MinPointSize = MIN_POINT_SIZE;
913 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
914 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
915 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000916 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000917 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
918 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
919 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
920 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000921 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000922 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000923 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000924 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
925 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000926 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
927 ctx->Const.MaxLights = MAX_LIGHTS;
jtgafb833d1999-08-19 00:55:39 +0000928
Brian Paul30f51ae2001-12-18 04:06:44 +0000929 /* Initialize matrix stacks */
930 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
931 _NEW_MODELVIEW);
932 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
933 _NEW_PROJECTION);
934 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
935 _NEW_COLOR_MATRIX);
936 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
937 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
938 _NEW_TEXTURE_MATRIX);
939 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
940 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
941 _NEW_TRACK_MATRIX);
942 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +0000943
Brian Paul30f51ae2001-12-18 04:06:44 +0000944 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +0000945 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
946
Brian Paul4d053dd2000-01-14 04:45:47 +0000947 /* Accumulate buffer group */
948 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000949
Brian Paul4d053dd2000-01-14 04:45:47 +0000950 /* Color buffer group */
951 ctx->Color.IndexMask = 0xffffffff;
952 ctx->Color.ColorMask[0] = 0xff;
953 ctx->Color.ColorMask[1] = 0xff;
954 ctx->Color.ColorMask[2] = 0xff;
955 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000956 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +0000957 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000958 ctx->Color.DrawBuffer = GL_FRONT;
959 ctx->Color.AlphaEnabled = GL_FALSE;
960 ctx->Color.AlphaFunc = GL_ALWAYS;
961 ctx->Color.AlphaRef = 0;
962 ctx->Color.BlendEnabled = GL_FALSE;
963 ctx->Color.BlendSrcRGB = GL_ONE;
964 ctx->Color.BlendDstRGB = GL_ZERO;
965 ctx->Color.BlendSrcA = GL_ONE;
966 ctx->Color.BlendDstA = GL_ZERO;
967 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +0000968 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
969 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
970 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000971 ctx->Color.LogicOp = GL_COPY;
972 ctx->Color.DitherFlag = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +0000973
Brian Paul4d053dd2000-01-14 04:45:47 +0000974 /* Current group */
Brian Paul86b84272001-12-14 02:50:01 +0000975 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
976 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
977 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
978 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
979 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
980 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
981 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000982 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +0000983 ctx->Current.EdgeFlag = GL_TRUE;
984
Brian Paul4d053dd2000-01-14 04:45:47 +0000985 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
986 ctx->Current.RasterDistance = 0.0;
987 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
988 ctx->Current.RasterIndex = 1;
989 for (i=0; i<MAX_TEXTURE_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +0000990 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000991 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +0000992
jtgafb833d1999-08-19 00:55:39 +0000993
Brian Paul4d053dd2000-01-14 04:45:47 +0000994 /* Depth buffer group */
995 ctx->Depth.Test = GL_FALSE;
996 ctx->Depth.Clear = 1.0;
997 ctx->Depth.Func = GL_LESS;
998 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000999 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001000
Brian Paul4d053dd2000-01-14 04:45:47 +00001001 /* Evaluators group */
1002 ctx->Eval.Map1Color4 = GL_FALSE;
1003 ctx->Eval.Map1Index = GL_FALSE;
1004 ctx->Eval.Map1Normal = GL_FALSE;
1005 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1006 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1007 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1008 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1009 ctx->Eval.Map1Vertex3 = GL_FALSE;
1010 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001011 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001012 ctx->Eval.Map2Color4 = GL_FALSE;
1013 ctx->Eval.Map2Index = GL_FALSE;
1014 ctx->Eval.Map2Normal = GL_FALSE;
1015 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1016 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1017 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1018 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1019 ctx->Eval.Map2Vertex3 = GL_FALSE;
1020 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001021 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001022 ctx->Eval.AutoNormal = GL_FALSE;
1023 ctx->Eval.MapGrid1un = 1;
1024 ctx->Eval.MapGrid1u1 = 0.0;
1025 ctx->Eval.MapGrid1u2 = 1.0;
1026 ctx->Eval.MapGrid2un = 1;
1027 ctx->Eval.MapGrid2vn = 1;
1028 ctx->Eval.MapGrid2u1 = 0.0;
1029 ctx->Eval.MapGrid2u2 = 1.0;
1030 ctx->Eval.MapGrid2v1 = 0.0;
1031 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001032
Brian Paul4d053dd2000-01-14 04:45:47 +00001033 /* Evaluator data */
1034 {
1035 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1036 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1037 static GLfloat index[1] = { 1.0 };
1038 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1039 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001040 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001041
Brian Paul4d053dd2000-01-14 04:45:47 +00001042 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1043 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1044 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1045 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1046 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1047 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1048 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1049 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1050 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001051 for (i = 0; i < 16; i++)
1052 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001053
Brian Paul4d053dd2000-01-14 04:45:47 +00001054 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1055 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1056 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1057 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1058 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1059 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1060 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1061 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1062 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001063 for (i = 0; i < 16; i++)
1064 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001065 }
jtgafb833d1999-08-19 00:55:39 +00001066
Brian Paul4d053dd2000-01-14 04:45:47 +00001067 /* Fog group */
1068 ctx->Fog.Enabled = GL_FALSE;
1069 ctx->Fog.Mode = GL_EXP;
1070 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1071 ctx->Fog.Index = 0.0;
1072 ctx->Fog.Density = 1.0;
1073 ctx->Fog.Start = 0.0;
1074 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001075 ctx->Fog.ColorSumEnabled = GL_FALSE;
1076 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001077
Brian Paul4d053dd2000-01-14 04:45:47 +00001078 /* Hint group */
1079 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1080 ctx->Hint.PointSmooth = GL_DONT_CARE;
1081 ctx->Hint.LineSmooth = GL_DONT_CARE;
1082 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1083 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001084 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1085 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001086 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001087
Brian Paul0771d152000-04-07 00:19:41 +00001088 /* Histogram group */
1089 ctx->Histogram.Width = 0;
1090 ctx->Histogram.Format = GL_RGBA;
1091 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001092 ctx->Histogram.RedSize = 0;
1093 ctx->Histogram.GreenSize = 0;
1094 ctx->Histogram.BlueSize = 0;
1095 ctx->Histogram.AlphaSize = 0;
1096 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001097 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1098 ctx->Histogram.Count[i][0] = 0;
1099 ctx->Histogram.Count[i][1] = 0;
1100 ctx->Histogram.Count[i][2] = 0;
1101 ctx->Histogram.Count[i][3] = 0;
1102 }
1103
1104 /* Min/Max group */
1105 ctx->MinMax.Format = GL_RGBA;
1106 ctx->MinMax.Sink = GL_FALSE;
1107 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1108 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1109 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1110 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1111
Brian Paul4d053dd2000-01-14 04:45:47 +00001112 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001113 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001114
Brian Paul4d053dd2000-01-14 04:45:47 +00001115 /* Lighting group */
1116 for (i=0;i<MAX_LIGHTS;i++) {
1117 init_light( &ctx->Light.Light[i], i );
1118 }
1119 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001120
Brian Paul4d053dd2000-01-14 04:45:47 +00001121 init_lightmodel( &ctx->Light.Model );
1122 init_material( &ctx->Light.Material[0] );
1123 init_material( &ctx->Light.Material[1] );
1124 ctx->Light.ShadeModel = GL_SMOOTH;
1125 ctx->Light.Enabled = GL_FALSE;
1126 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1127 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001128 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1129 GL_FRONT_AND_BACK,
1130 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001131
Brian Paul4d053dd2000-01-14 04:45:47 +00001132 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001133
Brian Paul4d053dd2000-01-14 04:45:47 +00001134 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001135 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1136 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001137 for (i = 0 ; i < 10 ; i++) {
1138 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1139 s->shininess = -1;
1140 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001141 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001142 }
Brian Paul77d61af2000-06-28 04:20:21 +00001143
jtgafb833d1999-08-19 00:55:39 +00001144
Brian Paul4d053dd2000-01-14 04:45:47 +00001145 /* Line group */
1146 ctx->Line.SmoothFlag = GL_FALSE;
1147 ctx->Line.StippleFlag = GL_FALSE;
1148 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001149 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001150 ctx->Line.StipplePattern = 0xffff;
1151 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001152
Brian Paul4d053dd2000-01-14 04:45:47 +00001153 /* Display List group */
1154 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001155
Brian Paul736fcbe2001-05-29 15:23:48 +00001156 /* Multisample */
1157 ctx->Multisample.Enabled = GL_FALSE;
1158 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1159 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1160 ctx->Multisample.SampleCoverage = GL_FALSE;
1161 ctx->Multisample.SampleCoverageValue = 1.0;
1162 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1163
Brian Paul4d053dd2000-01-14 04:45:47 +00001164 /* Pixel group */
1165 ctx->Pixel.RedBias = 0.0;
1166 ctx->Pixel.RedScale = 1.0;
1167 ctx->Pixel.GreenBias = 0.0;
1168 ctx->Pixel.GreenScale = 1.0;
1169 ctx->Pixel.BlueBias = 0.0;
1170 ctx->Pixel.BlueScale = 1.0;
1171 ctx->Pixel.AlphaBias = 0.0;
1172 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001173 ctx->Pixel.DepthBias = 0.0;
1174 ctx->Pixel.DepthScale = 1.0;
1175 ctx->Pixel.IndexOffset = 0;
1176 ctx->Pixel.IndexShift = 0;
1177 ctx->Pixel.ZoomX = 1.0;
1178 ctx->Pixel.ZoomY = 1.0;
1179 ctx->Pixel.MapColorFlag = GL_FALSE;
1180 ctx->Pixel.MapStencilFlag = GL_FALSE;
1181 ctx->Pixel.MapStoSsize = 1;
1182 ctx->Pixel.MapItoIsize = 1;
1183 ctx->Pixel.MapItoRsize = 1;
1184 ctx->Pixel.MapItoGsize = 1;
1185 ctx->Pixel.MapItoBsize = 1;
1186 ctx->Pixel.MapItoAsize = 1;
1187 ctx->Pixel.MapRtoRsize = 1;
1188 ctx->Pixel.MapGtoGsize = 1;
1189 ctx->Pixel.MapBtoBsize = 1;
1190 ctx->Pixel.MapAtoAsize = 1;
1191 ctx->Pixel.MapStoS[0] = 0;
1192 ctx->Pixel.MapItoI[0] = 0;
1193 ctx->Pixel.MapItoR[0] = 0.0;
1194 ctx->Pixel.MapItoG[0] = 0.0;
1195 ctx->Pixel.MapItoB[0] = 0.0;
1196 ctx->Pixel.MapItoA[0] = 0.0;
1197 ctx->Pixel.MapItoR8[0] = 0;
1198 ctx->Pixel.MapItoG8[0] = 0;
1199 ctx->Pixel.MapItoB8[0] = 0;
1200 ctx->Pixel.MapItoA8[0] = 0;
1201 ctx->Pixel.MapRtoR[0] = 0.0;
1202 ctx->Pixel.MapGtoG[0] = 0.0;
1203 ctx->Pixel.MapBtoB[0] = 0.0;
1204 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001205 ctx->Pixel.HistogramEnabled = GL_FALSE;
1206 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1207 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1208 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1209 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001210 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1211 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1212 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1213 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001214 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1215 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1216 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1217 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001218 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1219 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1220 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001221 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1222 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1223 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1224 for (i = 0; i < 3; i++) {
1225 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1226 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1227 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1228 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1229 }
Brian Paul67adba12000-12-09 20:35:54 +00001230 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1231 ctx->Convolution1D.Filter[i] = 0.0;
1232 ctx->Convolution2D.Filter[i] = 0.0;
1233 ctx->Separable2D.Filter[i] = 0.0;
1234 }
Brian Paul82b02f02000-05-07 20:37:40 +00001235 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1236 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001237
Brian Paul4d053dd2000-01-14 04:45:47 +00001238 /* Point group */
1239 ctx->Point.SmoothFlag = GL_FALSE;
1240 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001241 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001242 ctx->Point.Params[0] = 1.0;
1243 ctx->Point.Params[1] = 0.0;
1244 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001245 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001246 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001247 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001248 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001249 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1250 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
1251 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1252 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1253 }
jtgafb833d1999-08-19 00:55:39 +00001254
Brian Paul4d053dd2000-01-14 04:45:47 +00001255 /* Polygon group */
1256 ctx->Polygon.CullFlag = GL_FALSE;
1257 ctx->Polygon.CullFaceMode = GL_BACK;
1258 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001259 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001260 ctx->Polygon.FrontMode = GL_FILL;
1261 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001262 ctx->Polygon.SmoothFlag = GL_FALSE;
1263 ctx->Polygon.StippleFlag = GL_FALSE;
1264 ctx->Polygon.OffsetFactor = 0.0F;
1265 ctx->Polygon.OffsetUnits = 0.0F;
1266 ctx->Polygon.OffsetPoint = GL_FALSE;
1267 ctx->Polygon.OffsetLine = GL_FALSE;
1268 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001269
Brian Paul4d053dd2000-01-14 04:45:47 +00001270 /* Polygon Stipple group */
1271 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001272
Brian Paul4d053dd2000-01-14 04:45:47 +00001273 /* Scissor group */
1274 ctx->Scissor.Enabled = GL_FALSE;
1275 ctx->Scissor.X = 0;
1276 ctx->Scissor.Y = 0;
1277 ctx->Scissor.Width = 0;
1278 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001279
Brian Paul4d053dd2000-01-14 04:45:47 +00001280 /* Stencil group */
1281 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001282 ctx->Stencil.TestTwoSide = GL_FALSE;
1283 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1284 ctx->Stencil.Function[0] = GL_ALWAYS;
1285 ctx->Stencil.Function[1] = GL_ALWAYS;
1286 ctx->Stencil.FailFunc[0] = GL_KEEP;
1287 ctx->Stencil.FailFunc[1] = GL_KEEP;
1288 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1289 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1290 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1291 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1292 ctx->Stencil.Ref[0] = 0;
1293 ctx->Stencil.Ref[1] = 0;
1294 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1295 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1296 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1297 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001298 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001299
Brian Paul4d053dd2000-01-14 04:45:47 +00001300 /* Texture group */
1301 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001302 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001303 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1304 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001305 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001306 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001307
Brian Paul4d053dd2000-01-14 04:45:47 +00001308 /* Transformation group */
1309 ctx->Transform.MatrixMode = GL_MODELVIEW;
1310 ctx->Transform.Normalize = GL_FALSE;
1311 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001312 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001313 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001314 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1315 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001316 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001317
Brian Paul4d053dd2000-01-14 04:45:47 +00001318 /* Viewport group */
1319 ctx->Viewport.X = 0;
1320 ctx->Viewport.Y = 0;
1321 ctx->Viewport.Width = 0;
1322 ctx->Viewport.Height = 0;
1323 ctx->Viewport.Near = 0.0;
1324 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001325 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001326
1327#define Sz 10
1328#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001329 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1330 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001331#undef Sz
1332#undef Tz
1333
Keith Whitwell14940c42000-11-05 18:40:57 +00001334 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1335 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001336
Brian Paul4d053dd2000-01-14 04:45:47 +00001337 /* Vertex arrays */
1338 ctx->Array.Vertex.Size = 4;
1339 ctx->Array.Vertex.Type = GL_FLOAT;
1340 ctx->Array.Vertex.Stride = 0;
1341 ctx->Array.Vertex.StrideB = 0;
1342 ctx->Array.Vertex.Ptr = NULL;
1343 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001344 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001345 ctx->Array.Normal.Type = GL_FLOAT;
1346 ctx->Array.Normal.Stride = 0;
1347 ctx->Array.Normal.StrideB = 0;
1348 ctx->Array.Normal.Ptr = NULL;
1349 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001350 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001351 ctx->Array.Color.Size = 4;
1352 ctx->Array.Color.Type = GL_FLOAT;
1353 ctx->Array.Color.Stride = 0;
1354 ctx->Array.Color.StrideB = 0;
1355 ctx->Array.Color.Ptr = NULL;
1356 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001357 ctx->Array.Color.Flags = CA_CLIENT_DATA;
1358 ctx->Array.SecondaryColor.Size = 4;
1359 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1360 ctx->Array.SecondaryColor.Stride = 0;
1361 ctx->Array.SecondaryColor.StrideB = 0;
1362 ctx->Array.SecondaryColor.Ptr = NULL;
1363 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1364 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1365 ctx->Array.FogCoord.Size = 1;
1366 ctx->Array.FogCoord.Type = GL_FLOAT;
1367 ctx->Array.FogCoord.Stride = 0;
1368 ctx->Array.FogCoord.StrideB = 0;
1369 ctx->Array.FogCoord.Ptr = NULL;
1370 ctx->Array.FogCoord.Enabled = GL_FALSE;
1371 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001372 ctx->Array.Index.Type = GL_FLOAT;
1373 ctx->Array.Index.Stride = 0;
1374 ctx->Array.Index.StrideB = 0;
1375 ctx->Array.Index.Ptr = NULL;
1376 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001377 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001378 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1379 ctx->Array.TexCoord[i].Size = 4;
1380 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1381 ctx->Array.TexCoord[i].Stride = 0;
1382 ctx->Array.TexCoord[i].StrideB = 0;
1383 ctx->Array.TexCoord[i].Ptr = NULL;
1384 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001385 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001386 }
1387 ctx->Array.TexCoordInterleaveFactor = 1;
1388 ctx->Array.EdgeFlag.Stride = 0;
1389 ctx->Array.EdgeFlag.StrideB = 0;
1390 ctx->Array.EdgeFlag.Ptr = NULL;
1391 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001392 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001393 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1394
1395 /* Pixel transfer */
1396 ctx->Pack.Alignment = 4;
1397 ctx->Pack.RowLength = 0;
1398 ctx->Pack.ImageHeight = 0;
1399 ctx->Pack.SkipPixels = 0;
1400 ctx->Pack.SkipRows = 0;
1401 ctx->Pack.SkipImages = 0;
1402 ctx->Pack.SwapBytes = GL_FALSE;
1403 ctx->Pack.LsbFirst = GL_FALSE;
1404 ctx->Unpack.Alignment = 4;
1405 ctx->Unpack.RowLength = 0;
1406 ctx->Unpack.ImageHeight = 0;
1407 ctx->Unpack.SkipPixels = 0;
1408 ctx->Unpack.SkipRows = 0;
1409 ctx->Unpack.SkipImages = 0;
1410 ctx->Unpack.SwapBytes = GL_FALSE;
1411 ctx->Unpack.LsbFirst = GL_FALSE;
1412
1413 /* Feedback */
1414 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1415 ctx->Feedback.Buffer = NULL;
1416 ctx->Feedback.BufferSize = 0;
1417 ctx->Feedback.Count = 0;
1418
1419 /* Selection/picking */
1420 ctx->Select.Buffer = NULL;
1421 ctx->Select.BufferSize = 0;
1422 ctx->Select.BufferCount = 0;
1423 ctx->Select.Hits = 0;
1424 ctx->Select.NameStackDepth = 0;
1425
Brian Paul4d053dd2000-01-14 04:45:47 +00001426 /* Renderer and client attribute stacks */
1427 ctx->AttribStackDepth = 0;
1428 ctx->ClientAttribStackDepth = 0;
1429
Brian Paul13811372000-04-12 00:27:37 +00001430 /* Display list */
1431 ctx->CallDepth = 0;
1432 ctx->ExecuteFlag = GL_TRUE;
1433 ctx->CompileFlag = GL_FALSE;
1434 ctx->CurrentListPtr = NULL;
1435 ctx->CurrentBlock = NULL;
1436 ctx->CurrentListNum = 0;
1437 ctx->CurrentPos = 0;
1438
1439 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001440 _mesa_init_colortable(&ctx->ColorTable);
1441 _mesa_init_colortable(&ctx->ProxyColorTable);
1442 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1443 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1444 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1445 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001446
Brian Paul86b84272001-12-14 02:50:01 +00001447 /* GL_NV_vertex_program */
Brian Paul86b84272001-12-14 02:50:01 +00001448 ctx->VertexProgram.Enabled = GL_FALSE;
1449 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1450 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001451 ctx->VertexProgram.CurrentID = 0;
1452 ctx->VertexProgram.ErrorPos = -1;
1453 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001454 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1455 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1456 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1457 }
1458
Brian Paul4d053dd2000-01-14 04:45:47 +00001459 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001460 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001461 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001462 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001463
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001464 ctx->_NeedNormals = 0;
1465 ctx->_NeedEyeCoords = 0;
1466 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001467
Brian Paul4d053dd2000-01-14 04:45:47 +00001468 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1469
1470 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001471 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001472 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001473 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001474
1475 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001476 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001477 ctx->FirstTimeCurrent = GL_TRUE;
1478
1479 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001480 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001481 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001482 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001483 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001484 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001485 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001486 }
1487}
1488
1489
1490
1491
jtgafb833d1999-08-19 00:55:39 +00001492/*
1493 * Allocate the proxy textures. If we run out of memory part way through
1494 * the allocations clean up and return GL_FALSE.
1495 * Return: GL_TRUE=success, GL_FALSE=failure
1496 */
Brian Paul178a1c52000-04-22 01:05:00 +00001497static GLboolean
1498alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001499{
1500 GLboolean out_of_memory;
1501 GLint i;
1502
Brian Paul8afe7de2002-06-15 03:03:06 +00001503 ctx->Texture.Proxy1D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_1D);
jtgafb833d1999-08-19 00:55:39 +00001504 if (!ctx->Texture.Proxy1D) {
1505 return GL_FALSE;
1506 }
1507
Brian Paul8afe7de2002-06-15 03:03:06 +00001508 ctx->Texture.Proxy2D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_2D);
jtgafb833d1999-08-19 00:55:39 +00001509 if (!ctx->Texture.Proxy2D) {
Brian Paula8523782000-11-19 23:10:25 +00001510 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
jtgafb833d1999-08-19 00:55:39 +00001511 return GL_FALSE;
1512 }
1513
Brian Paul8afe7de2002-06-15 03:03:06 +00001514 ctx->Texture.Proxy3D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_3D);
jtgafb833d1999-08-19 00:55:39 +00001515 if (!ctx->Texture.Proxy3D) {
Brian Paula8523782000-11-19 23:10:25 +00001516 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1517 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1518 return GL_FALSE;
1519 }
1520
Brian Paul8afe7de2002-06-15 03:03:06 +00001521 ctx->Texture.ProxyCubeMap = _mesa_alloc_texture_object(NULL, 0,
1522 GL_TEXTURE_CUBE_MAP_ARB);
Brian Paula8523782000-11-19 23:10:25 +00001523 if (!ctx->Texture.ProxyCubeMap) {
1524 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1525 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1526 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
jtgafb833d1999-08-19 00:55:39 +00001527 return GL_FALSE;
1528 }
1529
Brian Paul8afe7de2002-06-15 03:03:06 +00001530 ctx->Texture.ProxyRect = _mesa_alloc_texture_object(NULL, 0,
1531 GL_TEXTURE_RECTANGLE_NV);
1532 if (!ctx->Texture.ProxyRect) {
1533 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1534 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1535 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
1536 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
1537 return GL_FALSE;
1538 }
1539
jtgafb833d1999-08-19 00:55:39 +00001540 out_of_memory = GL_FALSE;
1541 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001542 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1543 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1544 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
Brian Paul172281d2001-07-26 20:02:10 +00001545 ctx->Texture.ProxyCubeMap->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001546 if (!ctx->Texture.Proxy1D->Image[i]
1547 || !ctx->Texture.Proxy2D->Image[i]
Brian Paul172281d2001-07-26 20:02:10 +00001548 || !ctx->Texture.Proxy3D->Image[i]
1549 || !ctx->Texture.ProxyCubeMap->Image[i]) {
jtgafb833d1999-08-19 00:55:39 +00001550 out_of_memory = GL_TRUE;
1551 }
1552 }
Brian Paul8afe7de2002-06-15 03:03:06 +00001553 ctx->Texture.ProxyRect->Image[0] = _mesa_alloc_texture_image();
1554 if (!ctx->Texture.ProxyRect->Image[0])
1555 out_of_memory = GL_TRUE;
1556
jtgafb833d1999-08-19 00:55:39 +00001557 if (out_of_memory) {
1558 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1559 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001560 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001561 }
1562 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001563 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001564 }
1565 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001566 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001567 }
Brian Paul172281d2001-07-26 20:02:10 +00001568 if (ctx->Texture.ProxyCubeMap->Image[i]) {
1569 _mesa_free_texture_image(ctx->Texture.ProxyCubeMap->Image[i]);
1570 }
jtgafb833d1999-08-19 00:55:39 +00001571 }
Brian Paul8afe7de2002-06-15 03:03:06 +00001572 if (ctx->Texture.ProxyRect->Image[0]) {
1573 _mesa_free_texture_image(ctx->Texture.ProxyRect->Image[0]);
1574 }
Brian Paula8523782000-11-19 23:10:25 +00001575 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1576 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1577 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
Brian Paul172281d2001-07-26 20:02:10 +00001578 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
Brian Paul8afe7de2002-06-15 03:03:06 +00001579 _mesa_free_texture_object(NULL, ctx->Texture.ProxyRect);
jtgafb833d1999-08-19 00:55:39 +00001580 return GL_FALSE;
1581 }
1582 else {
1583 return GL_TRUE;
1584 }
1585}
1586
1587
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001588static void add_debug_flags( const char *debug )
1589{
1590#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001591 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001592 MESA_VERBOSE |= VERBOSE_VARRAY;
1593
Brian Paul3c634522002-10-24 23:57:19 +00001594 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001595 MESA_VERBOSE |= VERBOSE_TEXTURE;
1596
Brian Paul3c634522002-10-24 23:57:19 +00001597 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001598 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1599
Brian Paul3c634522002-10-24 23:57:19 +00001600 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001601 MESA_VERBOSE |= VERBOSE_PIPELINE;
1602
Brian Paul3c634522002-10-24 23:57:19 +00001603 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001604 MESA_VERBOSE |= VERBOSE_DRIVER;
1605
Brian Paul3c634522002-10-24 23:57:19 +00001606 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001607 MESA_VERBOSE |= VERBOSE_STATE;
1608
Brian Paul3c634522002-10-24 23:57:19 +00001609 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001610 MESA_VERBOSE |= VERBOSE_API;
1611
Brian Paul3c634522002-10-24 23:57:19 +00001612 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001613 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1614
Brian Paul3c634522002-10-24 23:57:19 +00001615 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001616 MESA_VERBOSE |= VERBOSE_LIGHTING;
1617
1618 /* Debug flag:
1619 */
Brian Paul3c634522002-10-24 23:57:19 +00001620 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001621 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1622#endif
1623}
1624
1625
jtgafb833d1999-08-19 00:55:39 +00001626/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001627 * Initialize a GLcontext struct. This includes allocating all the
1628 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001629 */
Brian Paul178a1c52000-04-22 01:05:00 +00001630GLboolean
1631_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001632 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001633 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001634 void *driver_ctx,
1635 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001636{
Brian Paul5fb84d22000-05-24 15:04:45 +00001637 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001638 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001639
Brian Paul3c634522002-10-24 23:57:19 +00001640 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001641
Brian Paul3c634522002-10-24 23:57:19 +00001642 /* If the driver wants core Mesa to use special imports, it'll have to
1643 * override these defaults.
1644 */
1645 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001646
Brian Paul9a33a112002-06-13 04:28:29 +00001647 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001648 _mesa_init_default_exports( &(ctx->exports) );
1649
1650 /* misc one-time initializations */
1651 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001652
Brian Paul3c634522002-10-24 23:57:19 +00001653 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001654 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001655 ctx->DrawBuffer = NULL;
1656 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001657
jtgafb833d1999-08-19 00:55:39 +00001658 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001659 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001660 ctx->Shared = share_list->Shared;
1661 }
1662 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001663 /* allocate new, unshared state */
jtgafb833d1999-08-19 00:55:39 +00001664 ctx->Shared = alloc_shared_state();
1665 if (!ctx->Shared) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001666 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001667 }
1668 }
Brian Paul9560f052000-01-31 23:11:39 +00001669 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001670 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001671 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001672
Brian Paul5a2f32b2001-04-25 18:21:05 +00001673 /* Effectively bind the default textures to all texture units */
1674 ctx->Shared->Default1D->RefCount += MAX_TEXTURE_UNITS;
1675 ctx->Shared->Default2D->RefCount += MAX_TEXTURE_UNITS;
1676 ctx->Shared->Default3D->RefCount += MAX_TEXTURE_UNITS;
1677 ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_UNITS;
Brian Paul8afe7de2002-06-15 03:03:06 +00001678 ctx->Shared->DefaultRect->RefCount += MAX_TEXTURE_UNITS;
Brian Paul5a2f32b2001-04-25 18:21:05 +00001679
Brian Paul4d053dd2000-01-14 04:45:47 +00001680 init_attrib_groups( ctx );
1681
Brian Paulb6bcae52001-01-23 23:39:36 +00001682 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001683 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001684 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001685 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001686 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001687 }
1688 else {
1689 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001690 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001691 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001692 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001693 }
1694
jtgafb833d1999-08-19 00:55:39 +00001695 if (!alloc_proxy_textures(ctx)) {
1696 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001697 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001698 }
jtgafb833d1999-08-19 00:55:39 +00001699
Brian Paul8ad10762002-10-11 17:41:03 +00001700 /*
1701 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1702 * Basically, we should add all extension functions above offset 577.
1703 * This enables older libGL libraries to work with newer drivers that
1704 * have newer extensions.
1705 */
1706 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1707 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1708 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1709 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1710 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1711 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1712 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1713 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1714 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1715 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1716 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1717 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1718 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1719 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1720 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1721 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1722 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1723 /* new extension functions */
1724 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1725 _glapi_add_entrypoint("glBindProgramNV", 579);
1726 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1727 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1728 _glapi_add_entrypoint("glGenProgramsNV", 582);
1729 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1730 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1731 _glapi_add_entrypoint("glGetProgramivNV", 585);
1732 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1733 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1734 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1735 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1736 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1737 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1738 _glapi_add_entrypoint("glIsProgramNV", 592);
1739 _glapi_add_entrypoint("glLoadProgramNV", 593);
1740 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1741 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1742 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1743 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1744 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1745 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1746 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1747 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1748 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1749 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1750 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1751 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1752 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1753 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1754 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1755 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1756 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1757 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1758 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1759 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1760 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1761 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1762 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1763 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1764 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1765 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1766 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1767 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1768 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1769 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1770 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1771 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1772 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1773 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1774 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1775 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1776 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1777 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1778 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1779 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1780 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1781 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1782 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1783 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1784 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1785 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1786 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1787 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1788 _glapi_add_entrypoint("glPointParameteriNV", 642);
1789 _glapi_add_entrypoint("glPointParameterivNV", 643);
1790 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1791 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1792 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1793 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1794 _glapi_add_entrypoint("glGenFencesNV", 648);
1795 _glapi_add_entrypoint("glIsFenceNV", 649);
1796 _glapi_add_entrypoint("glTestFenceNV", 650);
1797 _glapi_add_entrypoint("glGetFenceivNV", 651);
1798 _glapi_add_entrypoint("glFinishFenceNV", 652);
1799 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paulf59afc92000-05-23 23:23:00 +00001800
Brian Paul5fb84d22000-05-24 15:04:45 +00001801 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1802 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1803 * Mesa we do this to accomodate different versions of libGL and various
1804 * DRI drivers.
1805 */
1806 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1807 sizeof(struct _glapi_table) / sizeof(void *));
1808
Brian Paulfbd8f211999-11-11 01:22:25 +00001809 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001810 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1811 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001812 if (!ctx->Exec || !ctx->Save) {
1813 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001814 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001815 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001816 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001817 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1818 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001819 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001820
Keith Whitwellad2ac212000-11-24 10:25:05 +00001821 ctx->ExecPrefersFloat = GL_FALSE;
1822 ctx->SavePrefersFloat = GL_FALSE;
1823
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001824 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001825 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001826 ctx->TnlModule.Current = NULL;
1827 ctx->TnlModule.SwapCount = 0;
1828
Brian Paulb6bcae52001-01-23 23:39:36 +00001829 /* Z buffer stuff */
1830 if (ctx->Visual.depthBits == 0) {
1831 /* Special case. Even if we don't have a depth buffer we need
1832 * good values for DepthMax for Z vertex transformation purposes
1833 * and for per-fragment fog computation.
1834 */
1835 ctx->DepthMax = 1 << 16;
1836 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1837 }
1838 else if (ctx->Visual.depthBits < 32) {
1839 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1840 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1841 }
1842 else {
1843 /* Special case since shift values greater than or equal to the
1844 * number of bits in the left hand expression's type are undefined.
1845 */
1846 ctx->DepthMax = 0xffffffff;
1847 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1848 }
Brian Paulbc920f02001-05-07 16:32:51 +00001849 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001850
Brian Paul3c634522002-10-24 23:57:19 +00001851 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001852 if (c)
1853 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001854
Brian Paul3c634522002-10-24 23:57:19 +00001855 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001856 if (c)
1857 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001858
Brian Paul4d053dd2000-01-14 04:45:47 +00001859 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001860}
1861
jtgafb833d1999-08-19 00:55:39 +00001862
1863
1864/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001865 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001866 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001867 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001868 * driver_ctx - pointer to device driver's context state struct
1869 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001870 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001871 */
Brian Paul178a1c52000-04-22 01:05:00 +00001872GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001873_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001874 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001875 void *driver_ctx,
1876 GLboolean direct )
1877
Brian Paul4d053dd2000-01-14 04:45:47 +00001878{
Brian Paul4753d602002-06-15 02:38:15 +00001879 GLcontext *ctx;
1880
1881 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001882 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001883
Brian Paul3c634522002-10-24 23:57:19 +00001884 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001885 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001886 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001887
Brian Paul3c634522002-10-24 23:57:19 +00001888 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001889 return ctx;
1890 }
1891 else {
Brian Paul3c634522002-10-24 23:57:19 +00001892 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001893 return NULL;
1894 }
1895}
1896
1897
1898
1899/*
1900 * Free the data associated with the given context.
1901 * But don't free() the GLcontext struct itself!
1902 */
Brian Paul178a1c52000-04-22 01:05:00 +00001903void
Brian Paulb1394fa2000-09-26 20:53:53 +00001904_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001905{
Brian Paul4d053dd2000-01-14 04:45:47 +00001906 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001907 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001908
1909 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001910 if (ctx == _mesa_get_current_context()) {
1911 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001912 }
1913
Brian Paul30f51ae2001-12-18 04:06:44 +00001914 /*
1915 * Free transformation matrix stacks
1916 */
1917 free_matrix_stack(&ctx->ModelviewMatrixStack);
1918 free_matrix_stack(&ctx->ProjectionMatrixStack);
1919 free_matrix_stack(&ctx->ColorMatrixStack);
1920 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
1921 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1922 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1923 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1924 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001925 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1926
Brian Paul30f51ae2001-12-18 04:06:44 +00001927
Brian Paul8dfc5b92002-10-16 17:57:51 +00001928#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001929 if (ctx->VertexProgram.Current) {
1930 ctx->VertexProgram.Current->RefCount--;
1931 if (ctx->VertexProgram.Current->RefCount <= 0)
1932 _mesa_delete_program(ctx, ctx->VertexProgram.CurrentID);
Brian Paulfd284452001-07-19 15:54:34 +00001933 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001934#endif
Brian Paulfd284452001-07-19 15:54:34 +00001935
Brian Paul30f51ae2001-12-18 04:06:44 +00001936 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001937 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001938 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001939 assert(ctx->Shared->RefCount >= 0);
1940 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1941 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001942 /* free shared state */
1943 free_shared_state( ctx, ctx->Shared );
1944 }
1945
Brian Paul30f51ae2001-12-18 04:06:44 +00001946 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001947 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001948 FREE( s );
1949 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001950 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001951
1952 /* Free proxy texture objects */
Brian Paula8523782000-11-19 23:10:25 +00001953 _mesa_free_texture_object( NULL, ctx->Texture.Proxy1D );
1954 _mesa_free_texture_object( NULL, ctx->Texture.Proxy2D );
1955 _mesa_free_texture_object( NULL, ctx->Texture.Proxy3D );
Brian Paulfd284452001-07-19 15:54:34 +00001956 _mesa_free_texture_object( NULL, ctx->Texture.ProxyCubeMap );
Brian Paul8afe7de2002-06-15 03:03:06 +00001957 _mesa_free_texture_object( NULL, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00001958
1959 /* Free evaluator data */
1960 if (ctx->EvalMap.Map1Vertex3.Points)
1961 FREE( ctx->EvalMap.Map1Vertex3.Points );
1962 if (ctx->EvalMap.Map1Vertex4.Points)
1963 FREE( ctx->EvalMap.Map1Vertex4.Points );
1964 if (ctx->EvalMap.Map1Index.Points)
1965 FREE( ctx->EvalMap.Map1Index.Points );
1966 if (ctx->EvalMap.Map1Color4.Points)
1967 FREE( ctx->EvalMap.Map1Color4.Points );
1968 if (ctx->EvalMap.Map1Normal.Points)
1969 FREE( ctx->EvalMap.Map1Normal.Points );
1970 if (ctx->EvalMap.Map1Texture1.Points)
1971 FREE( ctx->EvalMap.Map1Texture1.Points );
1972 if (ctx->EvalMap.Map1Texture2.Points)
1973 FREE( ctx->EvalMap.Map1Texture2.Points );
1974 if (ctx->EvalMap.Map1Texture3.Points)
1975 FREE( ctx->EvalMap.Map1Texture3.Points );
1976 if (ctx->EvalMap.Map1Texture4.Points)
1977 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001978 for (i = 0; i < 16; i++)
1979 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00001980
1981 if (ctx->EvalMap.Map2Vertex3.Points)
1982 FREE( ctx->EvalMap.Map2Vertex3.Points );
1983 if (ctx->EvalMap.Map2Vertex4.Points)
1984 FREE( ctx->EvalMap.Map2Vertex4.Points );
1985 if (ctx->EvalMap.Map2Index.Points)
1986 FREE( ctx->EvalMap.Map2Index.Points );
1987 if (ctx->EvalMap.Map2Color4.Points)
1988 FREE( ctx->EvalMap.Map2Color4.Points );
1989 if (ctx->EvalMap.Map2Normal.Points)
1990 FREE( ctx->EvalMap.Map2Normal.Points );
1991 if (ctx->EvalMap.Map2Texture1.Points)
1992 FREE( ctx->EvalMap.Map2Texture1.Points );
1993 if (ctx->EvalMap.Map2Texture2.Points)
1994 FREE( ctx->EvalMap.Map2Texture2.Points );
1995 if (ctx->EvalMap.Map2Texture3.Points)
1996 FREE( ctx->EvalMap.Map2Texture3.Points );
1997 if (ctx->EvalMap.Map2Texture4.Points)
1998 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001999 for (i = 0; i < 16; i++)
2000 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002001
Brian Paul4bdcfe52000-04-17 17:57:04 +00002002 _mesa_free_colortable_data( &ctx->ColorTable );
2003 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2004 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2005 _mesa_free_colortable_data( &ctx->Texture.Palette );
2006
Brian Paulfd284452001-07-19 15:54:34 +00002007 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2008
Brian Paul69755402001-02-26 23:58:12 +00002009 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002010
2011 FREE(ctx->Exec);
2012 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002013}
2014
2015
2016
2017/*
2018 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002019 */
Brian Paul178a1c52000-04-22 01:05:00 +00002020void
Brian Paulb1394fa2000-09-26 20:53:53 +00002021_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002022{
2023 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002024 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002025 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002026 }
2027}
2028
2029
2030
2031/*
jtgafb833d1999-08-19 00:55:39 +00002032 * Copy attribute groups from one context to another.
2033 * Input: src - source context
2034 * dst - destination context
2035 * mask - bitwise OR of GL_*_BIT flags
2036 */
Brian Paul178a1c52000-04-22 01:05:00 +00002037void
Brian Paulb1394fa2000-09-26 20:53:53 +00002038_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002039{
2040 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002041 /* OK to memcpy */
2042 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002043 }
2044 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002045 /* OK to memcpy */
2046 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002047 }
2048 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002049 /* OK to memcpy */
2050 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002051 }
2052 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002053 /* OK to memcpy */
2054 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002055 }
2056 if (mask & GL_ENABLE_BIT) {
2057 /* no op */
2058 }
2059 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002060 /* OK to memcpy */
2061 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002062 }
2063 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002064 /* OK to memcpy */
2065 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002066 }
2067 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002068 /* OK to memcpy */
2069 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002070 }
2071 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002072 GLuint i;
2073 /* begin with memcpy */
2074 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2075 /* fixup linked lists to prevent pointer insanity */
2076 make_empty_list( &(dst->Light.EnabledList) );
2077 for (i = 0; i < MAX_LIGHTS; i++) {
2078 if (dst->Light.Light[i].Enabled) {
2079 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2080 }
2081 }
jtgafb833d1999-08-19 00:55:39 +00002082 }
2083 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002084 /* OK to memcpy */
2085 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002086 }
2087 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002088 /* OK to memcpy */
2089 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002090 }
2091 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002092 /* OK to memcpy */
2093 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002094 }
2095 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002096 /* OK to memcpy */
2097 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002098 }
2099 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002100 /* OK to memcpy */
2101 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002102 }
2103 if (mask & GL_POLYGON_STIPPLE_BIT) {
2104 /* Use loop instead of MEMCPY due to problem with Portland Group's
2105 * C compiler. Reported by John Stone.
2106 */
Brian Paul85d81602002-06-17 23:36:31 +00002107 GLuint i;
2108 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002109 dst->PolygonStipple[i] = src->PolygonStipple[i];
2110 }
2111 }
2112 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002113 /* OK to memcpy */
2114 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002115 }
2116 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002117 /* OK to memcpy */
2118 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002119 }
2120 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002121 /* Cannot memcpy because of pointers */
2122 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002123 }
2124 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002125 /* OK to memcpy */
2126 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002127 }
2128 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002129 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2130 dst->Viewport.X = src->Viewport.X;
2131 dst->Viewport.Y = src->Viewport.Y;
2132 dst->Viewport.Width = src->Viewport.Width;
2133 dst->Viewport.Height = src->Viewport.Height;
2134 dst->Viewport.Near = src->Viewport.Near;
2135 dst->Viewport.Far = src->Viewport.Far;
2136 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002137 }
Brian Paul85d81602002-06-17 23:36:31 +00002138
Keith Whitwella96308c2000-10-30 13:31:59 +00002139 /* XXX FIXME: Call callbacks?
2140 */
2141 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002142}
2143
2144
Brian Paul00037781999-12-17 14:52:35 +00002145
Keith Whitwell23caf202000-11-16 21:05:34 +00002146static void print_info( void )
2147{
Brian Paul4e9676f2002-06-29 19:48:15 +00002148 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002149 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002150 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002151 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002152 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002153 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002154 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002155 (char *) _mesa_GetString(GL_EXTENSIONS));
2156#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002157 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002158#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002159 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002160#endif
2161#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002162 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002163#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002164 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002165#endif
davem69e4f84b42001-06-05 03:58:20 +00002166#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002167 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002168#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002169 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002170#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002171}
2172
2173
Brian Paul00037781999-12-17 14:52:35 +00002174/*
Brian Paul9a33a112002-06-13 04:28:29 +00002175 * Set the current context, binding the given frame buffer to the context.
2176 */
2177void
2178_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2179{
2180 _mesa_make_current2( newCtx, buffer, buffer );
2181}
2182
2183
2184/*
Brian Paul00037781999-12-17 14:52:35 +00002185 * Bind the given context to the given draw-buffer and read-buffer
2186 * and make it the current context for this thread.
2187 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002188void
2189_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2190 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002191{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002192 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002193 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002194
Brian Paulbe3602d2001-02-28 00:27:48 +00002195 /* Check that the context's and framebuffer's visuals are compatible.
2196 * We could do a lot more checking here but this'll catch obvious
2197 * problems.
2198 */
2199 if (newCtx && drawBuffer && readBuffer) {
2200 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2201 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2202 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2203 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2204 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2205 return; /* incompatible */
2206 }
2207 }
2208
Brian Paul00037781999-12-17 14:52:35 +00002209 /* We call this function periodically (just here for now) in
2210 * order to detect when multithreading has begun.
2211 */
2212 _glapi_check_multithread();
2213
Brian Paulf9b97d92000-01-28 20:17:42 +00002214 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002215 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002216
2217
2218 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002219 _glapi_set_dispatch(NULL); /* none current */
2220 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002221 else {
2222 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002223
Keith Whitwell23caf202000-11-16 21:05:34 +00002224 if (drawBuffer && readBuffer) {
2225 /* TODO: check if newCtx and buffer's visual match??? */
2226 newCtx->DrawBuffer = drawBuffer;
2227 newCtx->ReadBuffer = readBuffer;
2228 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002229
2230 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2231 /* get initial window size */
2232 GLuint bufWidth, bufHeight;
2233
2234 /* ask device driver for size of output buffer */
2235 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2236
2237 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2238 return; /* size is as expected */
2239
2240 drawBuffer->Width = bufWidth;
2241 drawBuffer->Height = bufHeight;
2242
2243 newCtx->Driver.ResizeBuffers( drawBuffer );
2244 }
2245
2246 if (readBuffer != drawBuffer &&
2247 readBuffer->Width == 0 && readBuffer->Height == 0) {
2248 /* get initial window size */
2249 GLuint bufWidth, bufHeight;
2250
2251 /* ask device driver for size of output buffer */
2252 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2253
2254 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2255 return; /* size is as expected */
2256
2257 readBuffer->Width = bufWidth;
2258 readBuffer->Height = bufHeight;
2259
2260 newCtx->Driver.ResizeBuffers( readBuffer );
2261 }
Brian Paul00037781999-12-17 14:52:35 +00002262 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002263
Brian Paul8816c702002-06-16 01:10:41 +00002264 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002265 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002266 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2267
2268 /* We can use this to help debug user's problems. Tell them to set
2269 * the MESA_INFO env variable before running their app. Then the
2270 * first time each context is made current we'll print some useful
2271 * information.
2272 */
2273 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002274 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002275 print_info();
2276 }
2277 newCtx->FirstTimeCurrent = GL_FALSE;
2278 }
Brian Paul00037781999-12-17 14:52:35 +00002279 }
2280}
2281
2282
2283
2284/*
2285 * Return current context handle for the calling thread.
2286 * This isn't the fastest way to get the current context.
2287 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2288 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002289GLcontext *
2290_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002291{
Brian Paulf9b97d92000-01-28 20:17:42 +00002292 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002293}
2294
2295
Brian Paulfbd8f211999-11-11 01:22:25 +00002296/*
2297 * Return pointer to this context's current API dispatch table.
2298 * It'll either be the immediate-mode execute dispatcher or the
2299 * display list compile dispatcher.
2300 */
2301struct _glapi_table *
2302_mesa_get_dispatch(GLcontext *ctx)
2303{
2304 return ctx->CurrentDispatch;
2305}
2306
2307
2308
jtgafb833d1999-08-19 00:55:39 +00002309/**********************************************************************/
2310/***** Miscellaneous functions *****/
2311/**********************************************************************/
2312
2313
2314/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002315 * Record the given error code and call the driver's Error function if defined.
2316 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002317 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002318void
Brian Paul4e9676f2002-06-29 19:48:15 +00002319_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002320{
Brian Paul18a285a2002-03-16 00:53:15 +00002321 if (!ctx)
2322 return;
2323
Brian Paul7eb06032000-07-14 04:13:40 +00002324 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002325 ctx->ErrorValue = error;
2326 }
2327
2328 /* Call device driver's error handler, if any. This is used on the Mac. */
2329 if (ctx->Driver.Error) {
2330 (*ctx->Driver.Error)( ctx );
2331 }
2332}
2333
2334
Brian Paulfa9df402000-02-02 19:16:46 +00002335void
2336_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002337{
Brian Paulfa9df402000-02-02 19:16:46 +00002338 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002339 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002340 if (ctx->Driver.Finish) {
2341 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002342 }
2343}
2344
2345
2346
Brian Paulfa9df402000-02-02 19:16:46 +00002347void
2348_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002349{
Brian Paulfa9df402000-02-02 19:16:46 +00002350 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002351 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002352 if (ctx->Driver.Flush) {
2353 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002354 }
jtgafb833d1999-08-19 00:55:39 +00002355}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002356
2357
2358
Keith Whitwellcab974c2000-12-26 05:09:27 +00002359const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002360 "GL_POINTS",
2361 "GL_LINES",
2362 "GL_LINE_LOOP",
2363 "GL_LINE_STRIP",
2364 "GL_TRIANGLES",
2365 "GL_TRIANGLE_STRIP",
2366 "GL_TRIANGLE_FAN",
2367 "GL_QUADS",
2368 "GL_QUAD_STRIP",
2369 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002370 "outside begin/end",
2371 "inside unkown primitive",
2372 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002373};