blob: 7189ec88a5edb242afeb08c50ea7190a18c43787 [file] [log] [blame]
Brian Pauldd26d022003-04-01 22:20:42 +00001/* $Id: context.c,v 1.197 2003/04/01 22:20:42 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paul3a212032002-11-19 15:25:00 +00005 * Version: 5.1
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paulbc42c192002-01-05 21:53:20 +00007 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
Brian Paulfbd8f211999-11-11 01:22:25 +000028#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000029#include "imports.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000030#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000032#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000034#include "dlist.h"
35#include "eval.h"
36#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000037#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000038#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000039#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000040#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "hash.h"
42#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "macros.h"
jtgafb833d1999-08-19 00:55:39 +000044#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000045#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000046#include "teximage.h"
47#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000048#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000049#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000050#include "varray.h"
Brian Paul3a212032002-11-19 15:25:00 +000051#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +000052#include "nvprogram.h"
53#include "nvvertprog.h"
54#endif
55#if FEATURE_NV_fragment_program
56#include "nvfragprog.h"
Brian Paul3a212032002-11-19 15:25:00 +000057#endif
Gareth Hughesd4eb6652001-03-12 01:32:20 +000058#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000059#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000060#include "math/m_matrix.h"
61#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000062#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000063
jtgafb833d1999-08-19 00:55:39 +000064
Brian Paul3b18a362000-09-26 15:27:20 +000065#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000066#include "Trace/tr_context.h"
67#include "Trace/tr_wrapper.h"
68#endif
69
davem69775355a2001-06-05 23:54:00 +000070#ifdef USE_SPARC_ASM
71#include "SPARC/sparc.h"
72#endif
jtgafb833d1999-08-19 00:55:39 +000073
Keith Whitwell23caf202000-11-16 21:05:34 +000074#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000075int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000076#endif
77
78#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000079int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000080#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000081
Brian Paul86b84272001-12-14 02:50:01 +000082
Brian Paul27558a12003-03-01 01:50:20 +000083/* ubyte -> float conversion */
84GLfloat _mesa_ubyte_to_float_color_tab[256];
85
Brian Paul9a33a112002-06-13 04:28:29 +000086static void
87free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
88
Brian Paul86b84272001-12-14 02:50:01 +000089
Brian Paulb1394fa2000-09-26 20:53:53 +000090/**********************************************************************/
91/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
92/**********************************************************************/
93
Brian Paul9a33a112002-06-13 04:28:29 +000094/* Called by window system/device driver (via gc->exports.destroyCurrent())
95 * when the rendering context is to be destroyed.
96 */
97GLboolean
98_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000099{
100 if (gc) {
101 _mesa_free_context_data(gc);
Brian Paul3c634522002-10-24 23:57:19 +0000102 _mesa_free(gc);
Brian Paulb1394fa2000-09-26 20:53:53 +0000103 }
104 return GL_TRUE;
105}
106
Brian Paul9a33a112002-06-13 04:28:29 +0000107/* Called by window system/device driver (via gc->exports.loseCurrent())
108 * when the rendering context is made non-current.
109 */
110GLboolean
111_mesa_loseCurrent(__GLcontext *gc)
112{
113 /* XXX unbind context from thread */
114 return GL_TRUE;
115}
116
117/* Called by window system/device driver (via gc->exports.makeCurrent())
118 * when the rendering context is made current.
119 */
120GLboolean
121_mesa_makeCurrent(__GLcontext *gc)
122{
123 /* XXX bind context to thread */
124 return GL_TRUE;
125}
126
127/* Called by window system/device driver - yadda, yadda, yadda.
128 * See above comments.
129 */
130GLboolean
131_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
132{
133 if (gc && gcShare && gc->Shared && gcShare->Shared) {
134 gc->Shared->RefCount--;
135 if (gc->Shared->RefCount == 0) {
136 free_shared_state(gc, gc->Shared);
137 }
138 gc->Shared = gcShare->Shared;
139 gc->Shared->RefCount++;
140 return GL_TRUE;
141 }
142 else {
143 return GL_FALSE;
144 }
145}
146
147GLboolean
148_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
149{
150 if (dst && src) {
151 _mesa_copy_context( src, dst, mask );
152 return GL_TRUE;
153 }
154 else {
155 return GL_FALSE;
156 }
157}
158
159GLboolean
160_mesa_forceCurrent(__GLcontext *gc)
161{
162 return GL_TRUE;
163}
164
165GLboolean
166_mesa_notifyResize(__GLcontext *gc)
167{
168 GLint x, y;
169 GLuint width, height;
170 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
171 if (!d || !d->getDrawableSize)
172 return GL_FALSE;
173 d->getDrawableSize( d, &x, &y, &width, &height );
174 /* update viewport, resize software buffers, etc. */
175 return GL_TRUE;
176}
177
178void
179_mesa_notifyDestroy(__GLcontext *gc)
180{
Brian Paul60b6e4f2002-10-14 17:08:17 +0000181 /* Called when the context's window/buffer is going to be destroyed. */
182 /* Unbind from it. */
Brian Paul9a33a112002-06-13 04:28:29 +0000183}
184
185/* Called by window system just before swapping buffers.
186 * We have to finish any pending rendering.
187 */
188void
189_mesa_notifySwapBuffers(__GLcontext *gc)
190{
191 FLUSH_VERTICES( gc, 0 );
192}
193
194struct __GLdispatchStateRec *
195_mesa_dispatchExec(__GLcontext *gc)
196{
197 return NULL;
198}
199
200void
201_mesa_beginDispatchOverride(__GLcontext *gc)
202{
203}
204
205void
206_mesa_endDispatchOverride(__GLcontext *gc)
207{
208}
209
210/* Setup the exports. The window system will call these functions
211 * when it needs Mesa to do something.
212 * NOTE: Device drivers should override these functions! For example,
213 * the Xlib driver should plug in the XMesa*-style functions into this
214 * structure. The XMesa-style functions should then call the _mesa_*
215 * version of these functions. This is an approximation to OO design
216 * (inheritance and virtual functions).
217 */
218static void
219_mesa_init_default_exports(__GLexports *exports)
220{
221 exports->destroyContext = _mesa_destroyContext;
222 exports->loseCurrent = _mesa_loseCurrent;
223 exports->makeCurrent = _mesa_makeCurrent;
224 exports->shareContext = _mesa_shareContext;
225 exports->copyContext = _mesa_copyContext;
226 exports->forceCurrent = _mesa_forceCurrent;
227 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000228 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000229 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
230 exports->dispatchExec = _mesa_dispatchExec;
231 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
232 exports->endDispatchOverride = _mesa_endDispatchOverride;
233}
234
235
Brian Paulb1394fa2000-09-26 20:53:53 +0000236
237/* exported OpenGL SI interface */
238__GLcontext *
239__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
240{
241 GLcontext *ctx;
242
Brian Paul4753d602002-06-15 02:38:15 +0000243 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000244 if (ctx == NULL) {
245 return NULL;
246 }
Brian Paul60b6e4f2002-10-14 17:08:17 +0000247
Brian Paul3c634522002-10-24 23:57:19 +0000248 _mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000249 ctx->imports = *imports;
Brian Paulb1394fa2000-09-26 20:53:53 +0000250
251 return ctx;
252}
253
254
255/* exported OpenGL SI interface */
256void
257__glCoreNopDispatch(void)
258{
259#if 0
260 /* SI */
261 __gl_dispatch = __glNopDispatchState;
262#else
263 /* Mesa */
264 _glapi_set_dispatch(NULL);
265#endif
266}
267
268
jtgafb833d1999-08-19 00:55:39 +0000269/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000270/***** GL Visual allocation/destruction *****/
271/**********************************************************************/
272
273
274/*
275 * Allocate a new GLvisual object.
276 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000277 * dbFlag - double buffering?
278 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000279 * depthBits - requested bits per depth buffer value
280 * Any value in [0, 32] is acceptable but the actual
281 * depth type will be GLushort or GLuint as needed.
282 * stencilBits - requested minimum bits per stencil buffer value
283 * accumBits - requested minimum bits per accum buffer component
284 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
285 * red/green/blue/alphaBits - number of bits per color component
286 * in frame buffer for RGB(A) mode.
287 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000288 * Return: pointer to new GLvisual or NULL if requested parameters can't
289 * be met.
290 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000291GLvisual *
292_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000293 GLboolean dbFlag,
294 GLboolean stereoFlag,
295 GLint redBits,
296 GLint greenBits,
297 GLint blueBits,
298 GLint alphaBits,
299 GLint indexBits,
300 GLint depthBits,
301 GLint stencilBits,
302 GLint accumRedBits,
303 GLint accumGreenBits,
304 GLint accumBlueBits,
305 GLint accumAlphaBits,
306 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000307{
Brian Paul178a1c52000-04-22 01:05:00 +0000308 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
309 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000310 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000311 redBits, greenBits, blueBits, alphaBits,
312 indexBits, depthBits, stencilBits,
313 accumRedBits, accumGreenBits,
314 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000315 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000316 FREE(vis);
317 return NULL;
318 }
319 }
320 return vis;
321}
322
323
324/*
325 * Initialize the fields of the given GLvisual.
326 * Input: see _mesa_create_visual() above.
327 * Return: GL_TRUE = success
328 * GL_FALSE = failure.
329 */
330GLboolean
331_mesa_initialize_visual( GLvisual *vis,
332 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000333 GLboolean dbFlag,
334 GLboolean stereoFlag,
335 GLint redBits,
336 GLint greenBits,
337 GLint blueBits,
338 GLint alphaBits,
339 GLint indexBits,
340 GLint depthBits,
341 GLint stencilBits,
342 GLint accumRedBits,
343 GLint accumGreenBits,
344 GLint accumBlueBits,
345 GLint accumAlphaBits,
346 GLint numSamples )
347{
Brian Paulb6bcae52001-01-23 23:39:36 +0000348 (void) numSamples;
349
Brian Paul178a1c52000-04-22 01:05:00 +0000350 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000351
Brian Pauled30dfa2000-03-03 17:47:39 +0000352 /* This is to catch bad values from device drivers not updated for
353 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
354 * bad value now (a 1-bit depth buffer!?!).
355 */
356 assert(depthBits == 0 || depthBits > 1);
357
358 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000359 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000360 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000361 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000362 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000363 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000364 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000365 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000366 }
367 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000368 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000369 }
370 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000371 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000372 }
373 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000374 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000375 }
376
Brian Paulb6bcae52001-01-23 23:39:36 +0000377 vis->rgbMode = rgbFlag;
378 vis->doubleBufferMode = dbFlag;
379 vis->stereoMode = stereoFlag;
Brian Paul153f1542002-10-29 15:04:35 +0000380
Brian Paulb6bcae52001-01-23 23:39:36 +0000381 vis->redBits = redBits;
382 vis->greenBits = greenBits;
383 vis->blueBits = blueBits;
384 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000385
Brian Paulb6bcae52001-01-23 23:39:36 +0000386 vis->indexBits = indexBits;
387 vis->depthBits = depthBits;
388 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
389 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
390 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
391 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
392 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000393
Brian Paul153f1542002-10-29 15:04:35 +0000394 vis->haveAccumBuffer = accumRedBits > 0;
395 vis->haveDepthBuffer = depthBits > 0;
396 vis->haveStencilBuffer = stencilBits > 0;
397
398 vis->numAuxBuffers = 0;
399 vis->level = 0;
400 vis->pixmapMode = 0;
401
Brian Paul178a1c52000-04-22 01:05:00 +0000402 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000403}
404
405
Brian Paulb371e0d2000-03-31 01:05:51 +0000406void
407_mesa_destroy_visual( GLvisual *vis )
408{
409 FREE(vis);
410}
411
412
Brian Paul4d053dd2000-01-14 04:45:47 +0000413/**********************************************************************/
414/***** GL Framebuffer allocation/destruction *****/
415/**********************************************************************/
416
417
418/*
419 * Create a new framebuffer. A GLframebuffer is a struct which
420 * encapsulates the depth, stencil and accum buffers and related
421 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000422 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000423 * softwareDepth - create/use a software depth buffer?
424 * softwareStencil - create/use a software stencil buffer?
425 * softwareAccum - create/use a software accum buffer?
426 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000427 * Return: pointer to new GLframebuffer struct or NULL if error.
428 */
Brian Paul178a1c52000-04-22 01:05:00 +0000429GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000430_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000431 GLboolean softwareDepth,
432 GLboolean softwareStencil,
433 GLboolean softwareAccum,
434 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000435{
Brian Paul178a1c52000-04-22 01:05:00 +0000436 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
437 assert(visual);
438 if (buffer) {
439 _mesa_initialize_framebuffer(buffer, visual,
440 softwareDepth, softwareStencil,
441 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000442 }
Brian Paul178a1c52000-04-22 01:05:00 +0000443 return buffer;
444}
445
446
447/*
448 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000449 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000450 */
451void
452_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000453 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000454 GLboolean softwareDepth,
455 GLboolean softwareStencil,
456 GLboolean softwareAccum,
457 GLboolean softwareAlpha )
458{
459 assert(buffer);
460 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000461
Brian Paul6ec6b842002-10-30 19:49:29 +0000462 _mesa_bzero(buffer, sizeof(GLframebuffer));
Brian Paul85d81602002-06-17 23:36:31 +0000463
Brian Paul4d053dd2000-01-14 04:45:47 +0000464 /* sanity checks */
465 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000466 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000467 }
468 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000469 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000470 }
471 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000472 assert(visual->rgbMode);
473 assert(visual->accumRedBits > 0);
474 assert(visual->accumGreenBits > 0);
475 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000476 }
477 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000478 assert(visual->rgbMode);
479 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000480 }
481
Brian Paul75978bd2001-04-27 21:17:20 +0000482 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000483 buffer->UseSoftwareDepthBuffer = softwareDepth;
484 buffer->UseSoftwareStencilBuffer = softwareStencil;
485 buffer->UseSoftwareAccumBuffer = softwareAccum;
486 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000487}
488
489
Brian Paul4d053dd2000-01-14 04:45:47 +0000490/*
491 * Free a framebuffer struct and its buffers.
492 */
Brian Paul178a1c52000-04-22 01:05:00 +0000493void
Brian Paulb1394fa2000-09-26 20:53:53 +0000494_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000495{
496 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000497 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000498 FREE(buffer);
499 }
500}
501
502
Brian Paul75978bd2001-04-27 21:17:20 +0000503/*
504 * Free the data hanging off of <buffer>, but not <buffer> itself.
505 */
506void
507_mesa_free_framebuffer_data( GLframebuffer *buffer )
508{
509 if (!buffer)
510 return;
511
512 if (buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000513 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000514 buffer->DepthBuffer = NULL;
515 }
516 if (buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000517 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000518 buffer->Accum = NULL;
519 }
520 if (buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000521 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000522 buffer->Stencil = NULL;
523 }
524 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000525 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000526 buffer->FrontLeftAlpha = NULL;
527 }
528 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000529 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000530 buffer->BackLeftAlpha = NULL;
531 }
532 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000533 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000534 buffer->FrontRightAlpha = NULL;
535 }
536 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000537 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000538 buffer->BackRightAlpha = NULL;
539 }
540}
541
542
Brian Paul4d053dd2000-01-14 04:45:47 +0000543
544/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000545/***** Context allocation, initialization, destroying *****/
546/**********************************************************************/
547
548
Brian Paul9560f052000-01-31 23:11:39 +0000549_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
550
551
jtgafb833d1999-08-19 00:55:39 +0000552/*
553 * This function just calls all the various one-time-init functions in Mesa.
554 */
Brian Paul178a1c52000-04-22 01:05:00 +0000555static void
Brian Paul4753d602002-06-15 02:38:15 +0000556one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000557{
558 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000559 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000560 if (!alreadyCalled) {
Brian Paul27558a12003-03-01 01:50:20 +0000561 GLuint i;
562
Brian Paul4d053dd2000-01-14 04:45:47 +0000563 /* do some implementation tests */
564 assert( sizeof(GLbyte) == 1 );
565 assert( sizeof(GLshort) >= 2 );
566 assert( sizeof(GLint) >= 4 );
567 assert( sizeof(GLubyte) == 1 );
568 assert( sizeof(GLushort) >= 2 );
569 assert( sizeof(GLuint) >= 4 );
570
Brian Paul08836342001-03-03 20:33:27 +0000571 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000572
Keith Whitwell23caf202000-11-16 21:05:34 +0000573 _math_init();
Brian Paul27558a12003-03-01 01:50:20 +0000574
575 for (i = 0; i < 256; i++) {
576 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
577 }
Brian Paul68ee4bc2000-01-28 19:02:22 +0000578
davem69775355a2001-06-05 23:54:00 +0000579#ifdef USE_SPARC_ASM
580 _mesa_init_sparc_glapi_relocs();
581#endif
Brian Paul3c634522002-10-24 23:57:19 +0000582 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000583 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000584#ifndef GLX_DIRECT_RENDERING
585 /* libGL from before 2002/06/28 don't have this function. Someday,
586 * when newer libGL libs are common, remove the #ifdef test. This
587 * only serves to print warnings when calling undefined GL functions.
588 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000589 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000590#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000591 }
592 else {
593 _glapi_noop_enable_warnings(GL_FALSE);
594 }
595
jtgafb833d1999-08-19 00:55:39 +0000596#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000597 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000598#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000599
600 alreadyCalled = GL_TRUE;
601 }
Brian Paul9560f052000-01-31 23:11:39 +0000602 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000603}
604
605
Brian Paul86b84272001-12-14 02:50:01 +0000606static void
607init_matrix_stack( struct matrix_stack *stack,
608 GLuint maxDepth, GLuint dirtyFlag )
609{
610 GLuint i;
611
612 stack->Depth = 0;
613 stack->MaxDepth = maxDepth;
614 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000615 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000616 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000617 for (i = 0; i < maxDepth; i++) {
618 _math_matrix_ctr(&stack->Stack[i]);
619 _math_matrix_alloc_inv(&stack->Stack[i]);
620 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000621 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000622}
623
624
625static void
626free_matrix_stack( struct matrix_stack *stack )
627{
628 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000629 for (i = 0; i < stack->MaxDepth; i++) {
630 _math_matrix_dtr(&stack->Stack[i]);
631 }
Brian Paulc4afba32002-02-05 23:21:45 +0000632 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000633 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000634}
635
Brian Paul4d053dd2000-01-14 04:45:47 +0000636
jtgafb833d1999-08-19 00:55:39 +0000637/*
638 * Allocate and initialize a shared context state structure.
639 */
Brian Paula3f13702003-04-01 16:41:50 +0000640static GLboolean
641alloc_shared_state( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000642{
Brian Paula3f13702003-04-01 16:41:50 +0000643 struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000644 if (!ss)
Brian Paula3f13702003-04-01 16:41:50 +0000645 return GL_FALSE;
646
647 ctx->Shared = ss;
jtgafb833d1999-08-19 00:55:39 +0000648
Brian Paule4b684c2000-09-12 21:07:40 +0000649 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000650
Brian Paule4b684c2000-09-12 21:07:40 +0000651 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000652 ss->TexObjects = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000653#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +0000654 ss->Programs = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000655#endif
jtgafb833d1999-08-19 00:55:39 +0000656
Brian Paula3f13702003-04-01 16:41:50 +0000657 ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
658 if (!ss->Default1D)
659 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000660
Brian Paula3f13702003-04-01 16:41:50 +0000661 ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
662 if (!ss->Default2D)
663 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +0000664
Brian Paula3f13702003-04-01 16:41:50 +0000665 ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
666 if (!ss->Default3D)
667 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000668
Brian Paula3f13702003-04-01 16:41:50 +0000669 ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
670 if (!ss->DefaultCubeMap)
671 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000672
Brian Paula3f13702003-04-01 16:41:50 +0000673 ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
674 if (!ss->DefaultRect)
675 goto cleanup;
Brian Paul413d6a22000-05-26 14:44:59 +0000676
Brian Paula3f13702003-04-01 16:41:50 +0000677#if 0
678 _mesa_save_texture_object(ctx, ss->Default1D);
679 _mesa_save_texture_object(ctx, ss->Default2D);
680 _mesa_save_texture_object(ctx, ss->Default3D);
681 _mesa_save_texture_object(ctx, ss->DefaultCubeMap);
682 _mesa_save_texture_object(ctx, ss->DefaultRect);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000683#endif
Brian Paula3f13702003-04-01 16:41:50 +0000684
685 /* Effectively bind the default textures to all texture units */
686 ss->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
687 ss->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
688 ss->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
689 ss->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
690 ss->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
691
692 return GL_TRUE;
693
694 cleanup:
695 /* Ran out of memory at some point. Free everything and return NULL */
696 if (ss->DisplayList)
697 _mesa_DeleteHashTable(ss->DisplayList);
698 if (ss->TexObjects)
699 _mesa_DeleteHashTable(ss->TexObjects);
700#if FEATURE_NV_vertex_program
701 if (ss->Programs)
702 _mesa_DeleteHashTable(ss->Programs);
703#endif
704 if (ss->Default1D)
705 (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
706 if (ss->Default2D)
707 (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
708 if (ss->Default3D)
709 (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
710 if (ss->DefaultCubeMap)
711 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
712 if (ss->DefaultRect)
713 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
714 if (ss)
715 _mesa_free(ss);
716 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000717}
718
719
720/*
721 * Deallocate a shared state context and all children structures.
722 */
Brian Paul178a1c52000-04-22 01:05:00 +0000723static void
724free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000725{
726 /* Free display lists */
727 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000728 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000729 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000730 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000731 }
732 else {
733 break;
734 }
735 }
Brian Paulbb797902000-01-24 16:19:54 +0000736 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000737
738 /* Free texture objects */
Brian Paula3f13702003-04-01 16:41:50 +0000739 ASSERT(ctx->Driver.DeleteTexture);
740 while (1) {
741 GLuint texName = _mesa_HashFirstEntry(ss->TexObjects);
742 if (texName) {
743 struct gl_texture_object *texObj = (struct gl_texture_object *)
744 _mesa_HashLookup(ss->TexObjects, texName);
745 ASSERT(texObj);
746 (*ctx->Driver.DeleteTexture)(ctx, texObj);
747 _mesa_HashRemove(ss->TexObjects, texName);
748 }
749 else {
750 break;
751 }
jtgafb833d1999-08-19 00:55:39 +0000752 }
Brian Paulbb797902000-01-24 16:19:54 +0000753 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000754
Brian Paul8dfc5b92002-10-16 17:57:51 +0000755#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000756 /* Free vertex programs */
757 while (1) {
Brian Paul610d5992003-01-14 04:55:45 +0000758 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
Brian Paul30f51ae2001-12-18 04:06:44 +0000759 if (prog) {
760 _mesa_delete_program(ctx, prog);
761 }
762 else {
763 break;
764 }
765 }
Brian Paul610d5992003-01-14 04:55:45 +0000766 _mesa_DeleteHashTable(ss->Programs);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000767#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000768
Keith Whitwelle15fd852002-12-12 13:03:15 +0000769 _glthread_DESTROY_MUTEX(ss->Mutex);
770
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000771 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000772}
773
774
775
jtgafb833d1999-08-19 00:55:39 +0000776/*
777 * Initialize the nth light. Note that the defaults for light 0 are
778 * different than the other lights.
779 */
Brian Paul178a1c52000-04-22 01:05:00 +0000780static void
781init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000782{
783 make_empty_list( l );
784
785 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
786 if (n==0) {
787 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
788 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
789 }
790 else {
791 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
792 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
793 }
794 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
795 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
796 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000797 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000798 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000799 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000800 l->ConstantAttenuation = 1.0;
801 l->LinearAttenuation = 0.0;
802 l->QuadraticAttenuation = 0.0;
803 l->Enabled = GL_FALSE;
804}
805
806
807
Brian Paul178a1c52000-04-22 01:05:00 +0000808static void
809init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000810{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000811 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000812 lm->LocalViewer = GL_FALSE;
813 lm->TwoSide = GL_FALSE;
814 lm->ColorControl = GL_SINGLE_COLOR;
815}
816
817
Brian Paul178a1c52000-04-22 01:05:00 +0000818static void
819init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000820{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000821 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
822 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
823 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
824 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000825 m->Shininess = 0.0;
826 m->AmbientIndex = 0;
827 m->DiffuseIndex = 1;
828 m->SpecularIndex = 1;
829}
830
831
832
Brian Paul178a1c52000-04-22 01:05:00 +0000833static void
834init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000835{
836 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
837
838 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000839 texUnit->CombineModeRGB = GL_MODULATE;
840 texUnit->CombineModeA = GL_MODULATE;
841 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
842 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
843 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
844 texUnit->CombineSourceA[0] = GL_TEXTURE;
845 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
846 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
847 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
848 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
849 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
850 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
851 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
852 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
853 texUnit->CombineScaleShiftRGB = 0;
854 texUnit->CombineScaleShiftA = 0;
855
jtgafb833d1999-08-19 00:55:39 +0000856 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
857 texUnit->TexGenEnabled = 0;
858 texUnit->GenModeS = GL_EYE_LINEAR;
859 texUnit->GenModeT = GL_EYE_LINEAR;
860 texUnit->GenModeR = GL_EYE_LINEAR;
861 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000862 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
863 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
864 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
865 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000866
jtgafb833d1999-08-19 00:55:39 +0000867 /* Yes, these plane coefficients are correct! */
868 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
869 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
870 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
871 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
872 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
873 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
874 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
875 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
876
Brian Paula8523782000-11-19 23:10:25 +0000877 texUnit->Current1D = ctx->Shared->Default1D;
878 texUnit->Current2D = ctx->Shared->Default2D;
879 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000880 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000881 texUnit->CurrentRect = ctx->Shared->DefaultRect;
Brian Paul45b47d02003-01-26 14:37:15 +0000882
883 /* GL_SGI_texture_color_table */
884 texUnit->ColorTableEnabled = GL_FALSE;
885 _mesa_init_colortable(&texUnit->ColorTable);
886 _mesa_init_colortable(&texUnit->ProxyColorTable);
jtgafb833d1999-08-19 00:55:39 +0000887}
888
889
jtgafb833d1999-08-19 00:55:39 +0000890
Brian Paul4d053dd2000-01-14 04:45:47 +0000891
jtgafb833d1999-08-19 00:55:39 +0000892/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000893static void
894init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000895{
896 map->Order = 1;
897 map->u1 = 0.0;
898 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000899 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000900 if (map->Points) {
901 GLint i;
902 for (i=0;i<n;i++)
903 map->Points[i] = initial[i];
904 }
jtgafb833d1999-08-19 00:55:39 +0000905}
906
907
908/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000909static void
910init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000911{
912 map->Uorder = 1;
913 map->Vorder = 1;
914 map->u1 = 0.0;
915 map->u2 = 1.0;
916 map->v1 = 0.0;
917 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000918 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000919 if (map->Points) {
920 GLint i;
921 for (i=0;i<n;i++)
922 map->Points[i] = initial[i];
923 }
jtgafb833d1999-08-19 00:55:39 +0000924}
925
926
jtgafb833d1999-08-19 00:55:39 +0000927/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000928 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000929 */
Brian Paul178a1c52000-04-22 01:05:00 +0000930static void
931init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000932{
Brian Paul30f51ae2001-12-18 04:06:44 +0000933 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000934
Brian Paul4d053dd2000-01-14 04:45:47 +0000935 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000936
Brian Paulcd1cefa2001-06-13 14:56:14 +0000937 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
938 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
939
Brian Paul539cce52000-02-03 19:40:07 +0000940 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000941 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000942 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
943 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000944 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000945 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Brian Paul610d5992003-01-14 04:55:45 +0000946 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
947 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000948 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000949 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000950 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000951 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
952 ctx->Const.MinPointSize = MIN_POINT_SIZE;
953 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
954 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
955 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000956 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000957 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
958 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
959 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
960 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000961 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000962 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000963 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000964 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
965 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000966 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
967 ctx->Const.MaxLights = MAX_LIGHTS;
jtgafb833d1999-08-19 00:55:39 +0000968
Brian Paul30f51ae2001-12-18 04:06:44 +0000969 /* Initialize matrix stacks */
970 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
971 _NEW_MODELVIEW);
972 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
973 _NEW_PROJECTION);
974 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
975 _NEW_COLOR_MATRIX);
Brian Paul610d5992003-01-14 04:55:45 +0000976 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +0000977 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
978 _NEW_TEXTURE_MATRIX);
979 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
980 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
981 _NEW_TRACK_MATRIX);
982 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +0000983
Brian Paul30f51ae2001-12-18 04:06:44 +0000984 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +0000985 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
986
Brian Paul4d053dd2000-01-14 04:45:47 +0000987 /* Accumulate buffer group */
988 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000989
Brian Paul4d053dd2000-01-14 04:45:47 +0000990 /* Color buffer group */
991 ctx->Color.IndexMask = 0xffffffff;
992 ctx->Color.ColorMask[0] = 0xff;
993 ctx->Color.ColorMask[1] = 0xff;
994 ctx->Color.ColorMask[2] = 0xff;
995 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000996 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +0000997 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000998 ctx->Color.DrawBuffer = GL_FRONT;
999 ctx->Color.AlphaEnabled = GL_FALSE;
1000 ctx->Color.AlphaFunc = GL_ALWAYS;
1001 ctx->Color.AlphaRef = 0;
1002 ctx->Color.BlendEnabled = GL_FALSE;
1003 ctx->Color.BlendSrcRGB = GL_ONE;
1004 ctx->Color.BlendDstRGB = GL_ZERO;
1005 ctx->Color.BlendSrcA = GL_ONE;
1006 ctx->Color.BlendDstA = GL_ZERO;
1007 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +00001008 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
1009 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
1010 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001011 ctx->Color.LogicOp = GL_COPY;
1012 ctx->Color.DitherFlag = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001013
Brian Paul4d053dd2000-01-14 04:45:47 +00001014 /* Current group */
Brian Pauldd26d022003-04-01 22:20:42 +00001015 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
1016 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
1017 }
1018 /* special cases: */
1019 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 1.0 );
1020 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
Brian Paul86b84272001-12-14 02:50:01 +00001021 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001022 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +00001023 ctx->Current.EdgeFlag = GL_TRUE;
1024
Brian Paul4d053dd2000-01-14 04:45:47 +00001025 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
1026 ctx->Current.RasterDistance = 0.0;
1027 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
Brian Pauldd26d022003-04-01 22:20:42 +00001028 ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 0.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001029 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001030 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001031 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001032 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001033
jtgafb833d1999-08-19 00:55:39 +00001034
Brian Paul4d053dd2000-01-14 04:45:47 +00001035 /* Depth buffer group */
1036 ctx->Depth.Test = GL_FALSE;
1037 ctx->Depth.Clear = 1.0;
1038 ctx->Depth.Func = GL_LESS;
1039 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001040 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001041
Brian Paul4d053dd2000-01-14 04:45:47 +00001042 /* Evaluators group */
1043 ctx->Eval.Map1Color4 = GL_FALSE;
1044 ctx->Eval.Map1Index = GL_FALSE;
1045 ctx->Eval.Map1Normal = GL_FALSE;
1046 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1047 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1048 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1049 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1050 ctx->Eval.Map1Vertex3 = GL_FALSE;
1051 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001052 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001053 ctx->Eval.Map2Color4 = GL_FALSE;
1054 ctx->Eval.Map2Index = GL_FALSE;
1055 ctx->Eval.Map2Normal = GL_FALSE;
1056 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1057 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1058 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1059 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1060 ctx->Eval.Map2Vertex3 = GL_FALSE;
1061 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001062 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001063 ctx->Eval.AutoNormal = GL_FALSE;
1064 ctx->Eval.MapGrid1un = 1;
1065 ctx->Eval.MapGrid1u1 = 0.0;
1066 ctx->Eval.MapGrid1u2 = 1.0;
1067 ctx->Eval.MapGrid2un = 1;
1068 ctx->Eval.MapGrid2vn = 1;
1069 ctx->Eval.MapGrid2u1 = 0.0;
1070 ctx->Eval.MapGrid2u2 = 1.0;
1071 ctx->Eval.MapGrid2v1 = 0.0;
1072 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001073
Brian Paul4d053dd2000-01-14 04:45:47 +00001074 /* Evaluator data */
1075 {
1076 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1077 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1078 static GLfloat index[1] = { 1.0 };
1079 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1080 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001081 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001082
Brian Paul4d053dd2000-01-14 04:45:47 +00001083 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1084 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1085 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1086 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1087 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1088 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1089 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1090 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1091 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001092 for (i = 0; i < 16; i++)
1093 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001094
Brian Paul4d053dd2000-01-14 04:45:47 +00001095 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1096 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1097 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1098 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1099 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1100 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1101 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1102 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1103 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001104 for (i = 0; i < 16; i++)
1105 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001106 }
jtgafb833d1999-08-19 00:55:39 +00001107
Brian Paul4d053dd2000-01-14 04:45:47 +00001108 /* Fog group */
1109 ctx->Fog.Enabled = GL_FALSE;
1110 ctx->Fog.Mode = GL_EXP;
1111 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1112 ctx->Fog.Index = 0.0;
1113 ctx->Fog.Density = 1.0;
1114 ctx->Fog.Start = 0.0;
1115 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001116 ctx->Fog.ColorSumEnabled = GL_FALSE;
1117 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001118
Brian Paul4d053dd2000-01-14 04:45:47 +00001119 /* Hint group */
1120 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1121 ctx->Hint.PointSmooth = GL_DONT_CARE;
1122 ctx->Hint.LineSmooth = GL_DONT_CARE;
1123 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1124 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001125 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1126 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001127 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001128
Brian Paul0771d152000-04-07 00:19:41 +00001129 /* Histogram group */
1130 ctx->Histogram.Width = 0;
1131 ctx->Histogram.Format = GL_RGBA;
1132 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001133 ctx->Histogram.RedSize = 0;
1134 ctx->Histogram.GreenSize = 0;
1135 ctx->Histogram.BlueSize = 0;
1136 ctx->Histogram.AlphaSize = 0;
1137 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001138 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1139 ctx->Histogram.Count[i][0] = 0;
1140 ctx->Histogram.Count[i][1] = 0;
1141 ctx->Histogram.Count[i][2] = 0;
1142 ctx->Histogram.Count[i][3] = 0;
1143 }
1144
1145 /* Min/Max group */
1146 ctx->MinMax.Format = GL_RGBA;
1147 ctx->MinMax.Sink = GL_FALSE;
1148 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1149 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1150 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1151 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1152
Brian Paul4d053dd2000-01-14 04:45:47 +00001153 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001154 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001155
Brian Paul4d053dd2000-01-14 04:45:47 +00001156 /* Lighting group */
1157 for (i=0;i<MAX_LIGHTS;i++) {
1158 init_light( &ctx->Light.Light[i], i );
1159 }
1160 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001161
Brian Paul4d053dd2000-01-14 04:45:47 +00001162 init_lightmodel( &ctx->Light.Model );
1163 init_material( &ctx->Light.Material[0] );
1164 init_material( &ctx->Light.Material[1] );
1165 ctx->Light.ShadeModel = GL_SMOOTH;
1166 ctx->Light.Enabled = GL_FALSE;
1167 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1168 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001169 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1170 GL_FRONT_AND_BACK,
1171 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001172
Brian Paul4d053dd2000-01-14 04:45:47 +00001173 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001174
Brian Paul4d053dd2000-01-14 04:45:47 +00001175 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001176 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1177 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001178 for (i = 0 ; i < 10 ; i++) {
1179 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1180 s->shininess = -1;
1181 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001182 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001183 }
Brian Paul77d61af2000-06-28 04:20:21 +00001184
jtgafb833d1999-08-19 00:55:39 +00001185
Brian Paul4d053dd2000-01-14 04:45:47 +00001186 /* Line group */
1187 ctx->Line.SmoothFlag = GL_FALSE;
1188 ctx->Line.StippleFlag = GL_FALSE;
1189 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001190 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001191 ctx->Line.StipplePattern = 0xffff;
1192 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001193
Brian Paul4d053dd2000-01-14 04:45:47 +00001194 /* Display List group */
1195 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001196
Brian Paul736fcbe2001-05-29 15:23:48 +00001197 /* Multisample */
1198 ctx->Multisample.Enabled = GL_FALSE;
1199 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1200 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1201 ctx->Multisample.SampleCoverage = GL_FALSE;
1202 ctx->Multisample.SampleCoverageValue = 1.0;
1203 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1204
Brian Paul4d053dd2000-01-14 04:45:47 +00001205 /* Pixel group */
1206 ctx->Pixel.RedBias = 0.0;
1207 ctx->Pixel.RedScale = 1.0;
1208 ctx->Pixel.GreenBias = 0.0;
1209 ctx->Pixel.GreenScale = 1.0;
1210 ctx->Pixel.BlueBias = 0.0;
1211 ctx->Pixel.BlueScale = 1.0;
1212 ctx->Pixel.AlphaBias = 0.0;
1213 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001214 ctx->Pixel.DepthBias = 0.0;
1215 ctx->Pixel.DepthScale = 1.0;
1216 ctx->Pixel.IndexOffset = 0;
1217 ctx->Pixel.IndexShift = 0;
1218 ctx->Pixel.ZoomX = 1.0;
1219 ctx->Pixel.ZoomY = 1.0;
1220 ctx->Pixel.MapColorFlag = GL_FALSE;
1221 ctx->Pixel.MapStencilFlag = GL_FALSE;
1222 ctx->Pixel.MapStoSsize = 1;
1223 ctx->Pixel.MapItoIsize = 1;
1224 ctx->Pixel.MapItoRsize = 1;
1225 ctx->Pixel.MapItoGsize = 1;
1226 ctx->Pixel.MapItoBsize = 1;
1227 ctx->Pixel.MapItoAsize = 1;
1228 ctx->Pixel.MapRtoRsize = 1;
1229 ctx->Pixel.MapGtoGsize = 1;
1230 ctx->Pixel.MapBtoBsize = 1;
1231 ctx->Pixel.MapAtoAsize = 1;
1232 ctx->Pixel.MapStoS[0] = 0;
1233 ctx->Pixel.MapItoI[0] = 0;
1234 ctx->Pixel.MapItoR[0] = 0.0;
1235 ctx->Pixel.MapItoG[0] = 0.0;
1236 ctx->Pixel.MapItoB[0] = 0.0;
1237 ctx->Pixel.MapItoA[0] = 0.0;
1238 ctx->Pixel.MapItoR8[0] = 0;
1239 ctx->Pixel.MapItoG8[0] = 0;
1240 ctx->Pixel.MapItoB8[0] = 0;
1241 ctx->Pixel.MapItoA8[0] = 0;
1242 ctx->Pixel.MapRtoR[0] = 0.0;
1243 ctx->Pixel.MapGtoG[0] = 0.0;
1244 ctx->Pixel.MapBtoB[0] = 0.0;
1245 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001246 ctx->Pixel.HistogramEnabled = GL_FALSE;
1247 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1248 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1249 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1250 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001251 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1252 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1253 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1254 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001255 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1256 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1257 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1258 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001259 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1260 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1261 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001262 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1263 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1264 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1265 for (i = 0; i < 3; i++) {
1266 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1267 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1268 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1269 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1270 }
Brian Paul67adba12000-12-09 20:35:54 +00001271 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1272 ctx->Convolution1D.Filter[i] = 0.0;
1273 ctx->Convolution2D.Filter[i] = 0.0;
1274 ctx->Separable2D.Filter[i] = 0.0;
1275 }
Brian Paul82b02f02000-05-07 20:37:40 +00001276 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1277 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001278 /* GL_SGI_texture_color_table */
1279 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1280 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001281
Brian Paul4d053dd2000-01-14 04:45:47 +00001282 /* Point group */
1283 ctx->Point.SmoothFlag = GL_FALSE;
1284 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001285 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001286 ctx->Point.Params[0] = 1.0;
1287 ctx->Point.Params[1] = 0.0;
1288 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001289 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001290 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001291 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001292 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001293 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1294 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001295 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001296 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1297 }
jtgafb833d1999-08-19 00:55:39 +00001298
Brian Paul4d053dd2000-01-14 04:45:47 +00001299 /* Polygon group */
1300 ctx->Polygon.CullFlag = GL_FALSE;
1301 ctx->Polygon.CullFaceMode = GL_BACK;
1302 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001303 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001304 ctx->Polygon.FrontMode = GL_FILL;
1305 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001306 ctx->Polygon.SmoothFlag = GL_FALSE;
1307 ctx->Polygon.StippleFlag = GL_FALSE;
1308 ctx->Polygon.OffsetFactor = 0.0F;
1309 ctx->Polygon.OffsetUnits = 0.0F;
1310 ctx->Polygon.OffsetPoint = GL_FALSE;
1311 ctx->Polygon.OffsetLine = GL_FALSE;
1312 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001313
Brian Paul4d053dd2000-01-14 04:45:47 +00001314 /* Polygon Stipple group */
1315 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001316
Brian Paul4d053dd2000-01-14 04:45:47 +00001317 /* Scissor group */
1318 ctx->Scissor.Enabled = GL_FALSE;
1319 ctx->Scissor.X = 0;
1320 ctx->Scissor.Y = 0;
1321 ctx->Scissor.Width = 0;
1322 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001323
Brian Paul4d053dd2000-01-14 04:45:47 +00001324 /* Stencil group */
1325 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001326 ctx->Stencil.TestTwoSide = GL_FALSE;
1327 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1328 ctx->Stencil.Function[0] = GL_ALWAYS;
1329 ctx->Stencil.Function[1] = GL_ALWAYS;
1330 ctx->Stencil.FailFunc[0] = GL_KEEP;
1331 ctx->Stencil.FailFunc[1] = GL_KEEP;
1332 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1333 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1334 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1335 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1336 ctx->Stencil.Ref[0] = 0;
1337 ctx->Stencil.Ref[1] = 0;
1338 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1339 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1340 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1341 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001342 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001343
Brian Paul4d053dd2000-01-14 04:45:47 +00001344 /* Texture group */
1345 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001346 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001347 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1348 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001349 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001350 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001351
Brian Paul4d053dd2000-01-14 04:45:47 +00001352 /* Transformation group */
1353 ctx->Transform.MatrixMode = GL_MODELVIEW;
1354 ctx->Transform.Normalize = GL_FALSE;
1355 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001356 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001357 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001358 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1359 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001360 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001361
Brian Paul4d053dd2000-01-14 04:45:47 +00001362 /* Viewport group */
1363 ctx->Viewport.X = 0;
1364 ctx->Viewport.Y = 0;
1365 ctx->Viewport.Width = 0;
1366 ctx->Viewport.Height = 0;
1367 ctx->Viewport.Near = 0.0;
1368 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001369 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001370
1371#define Sz 10
1372#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001373 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1374 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001375#undef Sz
1376#undef Tz
1377
Keith Whitwell14940c42000-11-05 18:40:57 +00001378 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1379 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001380
Brian Paul4d053dd2000-01-14 04:45:47 +00001381 /* Vertex arrays */
1382 ctx->Array.Vertex.Size = 4;
1383 ctx->Array.Vertex.Type = GL_FLOAT;
1384 ctx->Array.Vertex.Stride = 0;
1385 ctx->Array.Vertex.StrideB = 0;
1386 ctx->Array.Vertex.Ptr = NULL;
1387 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001388 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001389 ctx->Array.Normal.Type = GL_FLOAT;
1390 ctx->Array.Normal.Stride = 0;
1391 ctx->Array.Normal.StrideB = 0;
1392 ctx->Array.Normal.Ptr = NULL;
1393 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001394 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001395 ctx->Array.Color.Size = 4;
1396 ctx->Array.Color.Type = GL_FLOAT;
1397 ctx->Array.Color.Stride = 0;
1398 ctx->Array.Color.StrideB = 0;
1399 ctx->Array.Color.Ptr = NULL;
1400 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001401 ctx->Array.Color.Flags = CA_CLIENT_DATA;
Brian Paulb852f042003-04-01 18:57:36 +00001402 ctx->Array.SecondaryColor.Size = 3;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001403 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1404 ctx->Array.SecondaryColor.Stride = 0;
1405 ctx->Array.SecondaryColor.StrideB = 0;
1406 ctx->Array.SecondaryColor.Ptr = NULL;
1407 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1408 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1409 ctx->Array.FogCoord.Size = 1;
1410 ctx->Array.FogCoord.Type = GL_FLOAT;
1411 ctx->Array.FogCoord.Stride = 0;
1412 ctx->Array.FogCoord.StrideB = 0;
1413 ctx->Array.FogCoord.Ptr = NULL;
1414 ctx->Array.FogCoord.Enabled = GL_FALSE;
1415 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001416 ctx->Array.Index.Type = GL_FLOAT;
1417 ctx->Array.Index.Stride = 0;
1418 ctx->Array.Index.StrideB = 0;
1419 ctx->Array.Index.Ptr = NULL;
1420 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001421 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001422 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001423 ctx->Array.TexCoord[i].Size = 4;
1424 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1425 ctx->Array.TexCoord[i].Stride = 0;
1426 ctx->Array.TexCoord[i].StrideB = 0;
1427 ctx->Array.TexCoord[i].Ptr = NULL;
1428 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001429 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001430 }
1431 ctx->Array.TexCoordInterleaveFactor = 1;
1432 ctx->Array.EdgeFlag.Stride = 0;
1433 ctx->Array.EdgeFlag.StrideB = 0;
1434 ctx->Array.EdgeFlag.Ptr = NULL;
1435 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001436 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001437 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1438
1439 /* Pixel transfer */
1440 ctx->Pack.Alignment = 4;
1441 ctx->Pack.RowLength = 0;
1442 ctx->Pack.ImageHeight = 0;
1443 ctx->Pack.SkipPixels = 0;
1444 ctx->Pack.SkipRows = 0;
1445 ctx->Pack.SkipImages = 0;
1446 ctx->Pack.SwapBytes = GL_FALSE;
1447 ctx->Pack.LsbFirst = GL_FALSE;
1448 ctx->Unpack.Alignment = 4;
1449 ctx->Unpack.RowLength = 0;
1450 ctx->Unpack.ImageHeight = 0;
1451 ctx->Unpack.SkipPixels = 0;
1452 ctx->Unpack.SkipRows = 0;
1453 ctx->Unpack.SkipImages = 0;
1454 ctx->Unpack.SwapBytes = GL_FALSE;
1455 ctx->Unpack.LsbFirst = GL_FALSE;
1456
1457 /* Feedback */
1458 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1459 ctx->Feedback.Buffer = NULL;
1460 ctx->Feedback.BufferSize = 0;
1461 ctx->Feedback.Count = 0;
1462
1463 /* Selection/picking */
1464 ctx->Select.Buffer = NULL;
1465 ctx->Select.BufferSize = 0;
1466 ctx->Select.BufferCount = 0;
1467 ctx->Select.Hits = 0;
1468 ctx->Select.NameStackDepth = 0;
1469
Brian Paul4d053dd2000-01-14 04:45:47 +00001470 /* Renderer and client attribute stacks */
1471 ctx->AttribStackDepth = 0;
1472 ctx->ClientAttribStackDepth = 0;
1473
Brian Paul13811372000-04-12 00:27:37 +00001474 /* Display list */
1475 ctx->CallDepth = 0;
1476 ctx->ExecuteFlag = GL_TRUE;
1477 ctx->CompileFlag = GL_FALSE;
1478 ctx->CurrentListPtr = NULL;
1479 ctx->CurrentBlock = NULL;
1480 ctx->CurrentListNum = 0;
1481 ctx->CurrentPos = 0;
1482
1483 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001484 _mesa_init_colortable(&ctx->ColorTable);
1485 _mesa_init_colortable(&ctx->ProxyColorTable);
1486 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1487 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1488 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1489 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001490
Brian Paul610d5992003-01-14 04:55:45 +00001491 /* Vertex/fragment programs */
1492 ctx->Program.ErrorPos = -1;
1493 ctx->Program.ErrorString = _mesa_strdup("");
1494#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001495 ctx->VertexProgram.Enabled = GL_FALSE;
1496 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1497 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001498 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001499 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1500 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1501 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1502 }
Brian Paul610d5992003-01-14 04:55:45 +00001503#endif
1504#if FEATURE_NV_fragment_program
1505 ctx->FragmentProgram.Enabled = GL_FALSE;
1506 ctx->FragmentProgram.Current = NULL;
1507#endif
Brian Paul86b84272001-12-14 02:50:01 +00001508
Brian Paul4d053dd2000-01-14 04:45:47 +00001509 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001510 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001511 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001512 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001513
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001514 ctx->_NeedNormals = 0;
1515 ctx->_NeedEyeCoords = 0;
1516 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001517
Brian Paul4d053dd2000-01-14 04:45:47 +00001518 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1519
1520 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001521 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001522 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001523 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001524
1525 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001526 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001527 ctx->FirstTimeCurrent = GL_TRUE;
1528
1529 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001530 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001531 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001532 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001533 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001534 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001535 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001536 }
1537}
1538
1539
1540
1541
Brian Paula3f13702003-04-01 16:41:50 +00001542/**
1543 * Allocate the proxy textures for the given context.
1544 * \param ctx the context to allocate proxies for.
1545 * \return GL_TRUE if success, GL_FALSE if failure.
jtgafb833d1999-08-19 00:55:39 +00001546 */
Brian Paul178a1c52000-04-22 01:05:00 +00001547static GLboolean
1548alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001549{
Brian Paula3f13702003-04-01 16:41:50 +00001550 ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
1551 if (!ctx->Texture.Proxy1D)
1552 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001553
Brian Paula3f13702003-04-01 16:41:50 +00001554 ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
1555 if (!ctx->Texture.Proxy2D)
1556 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001557
Brian Paula3f13702003-04-01 16:41:50 +00001558 ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
1559 if (!ctx->Texture.Proxy3D)
1560 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001561
Brian Paula3f13702003-04-01 16:41:50 +00001562 ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
1563 if (!ctx->Texture.ProxyCubeMap)
1564 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +00001565
Brian Paula3f13702003-04-01 16:41:50 +00001566 ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
1567 if (!ctx->Texture.ProxyRect)
1568 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001569
Brian Paula3f13702003-04-01 16:41:50 +00001570 return GL_TRUE;
Brian Paul8afe7de2002-06-15 03:03:06 +00001571
Brian Paula3f13702003-04-01 16:41:50 +00001572 cleanup:
1573 if (ctx->Texture.Proxy1D)
1574 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
1575 if (ctx->Texture.Proxy2D)
1576 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
1577 if (ctx->Texture.Proxy3D)
1578 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
1579 if (ctx->Texture.ProxyCubeMap)
1580 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
1581 if (ctx->Texture.ProxyRect)
1582 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
1583 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001584}
1585
1586
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001587static void add_debug_flags( const char *debug )
1588{
1589#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001590 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001591 MESA_VERBOSE |= VERBOSE_VARRAY;
1592
Brian Paul3c634522002-10-24 23:57:19 +00001593 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001594 MESA_VERBOSE |= VERBOSE_TEXTURE;
1595
Brian Paul3c634522002-10-24 23:57:19 +00001596 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001597 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1598
Brian Paul3c634522002-10-24 23:57:19 +00001599 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001600 MESA_VERBOSE |= VERBOSE_PIPELINE;
1601
Brian Paul3c634522002-10-24 23:57:19 +00001602 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001603 MESA_VERBOSE |= VERBOSE_DRIVER;
1604
Brian Paul3c634522002-10-24 23:57:19 +00001605 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001606 MESA_VERBOSE |= VERBOSE_STATE;
1607
Brian Paul3c634522002-10-24 23:57:19 +00001608 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001609 MESA_VERBOSE |= VERBOSE_API;
1610
Brian Paul3c634522002-10-24 23:57:19 +00001611 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001612 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1613
Brian Paul3c634522002-10-24 23:57:19 +00001614 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001615 MESA_VERBOSE |= VERBOSE_LIGHTING;
1616
1617 /* Debug flag:
1618 */
Brian Paul3c634522002-10-24 23:57:19 +00001619 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001620 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1621#endif
1622}
1623
1624
jtgafb833d1999-08-19 00:55:39 +00001625/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001626 * Initialize a GLcontext struct. This includes allocating all the
1627 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001628 */
Brian Paul178a1c52000-04-22 01:05:00 +00001629GLboolean
1630_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001631 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001632 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001633 void *driver_ctx,
1634 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001635{
Brian Paul5fb84d22000-05-24 15:04:45 +00001636 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001637 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001638
Brian Paul3c634522002-10-24 23:57:19 +00001639 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001640
Brian Paul3c634522002-10-24 23:57:19 +00001641 /* If the driver wants core Mesa to use special imports, it'll have to
1642 * override these defaults.
1643 */
1644 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001645
Brian Paul9a33a112002-06-13 04:28:29 +00001646 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001647 _mesa_init_default_exports( &(ctx->exports) );
1648
1649 /* misc one-time initializations */
1650 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001651
Brian Paul3c634522002-10-24 23:57:19 +00001652 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001653 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001654 ctx->DrawBuffer = NULL;
1655 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001656
Brian Paula3f13702003-04-01 16:41:50 +00001657 /* Set these pointers to defaults now in case they're not set since
1658 * we need them while creating the default textures.
1659 */
1660 if (!ctx->Driver.NewTextureObject)
1661 ctx->Driver.NewTextureObject = _mesa_new_texture_object;
1662 if (!ctx->Driver.DeleteTexture)
1663 ctx->Driver.DeleteTexture = _mesa_delete_texture_object;
1664 if (!ctx->Driver.NewTextureImage)
1665 ctx->Driver.NewTextureImage = _mesa_new_texture_image;
1666
jtgafb833d1999-08-19 00:55:39 +00001667 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001668 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001669 ctx->Shared = share_list->Shared;
1670 }
1671 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001672 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001673 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001674 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001675 }
1676 }
Brian Paul9560f052000-01-31 23:11:39 +00001677 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001678 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001679 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001680
Brian Paul4d053dd2000-01-14 04:45:47 +00001681 init_attrib_groups( ctx );
1682
Brian Paulb6bcae52001-01-23 23:39:36 +00001683 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001684 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001685 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001686 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001687 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001688 }
1689 else {
1690 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001691 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001692 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001693 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001694 }
1695
jtgafb833d1999-08-19 00:55:39 +00001696 if (!alloc_proxy_textures(ctx)) {
1697 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001698 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001699 }
jtgafb833d1999-08-19 00:55:39 +00001700
Brian Paul8ad10762002-10-11 17:41:03 +00001701 /*
1702 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1703 * Basically, we should add all extension functions above offset 577.
1704 * This enables older libGL libraries to work with newer drivers that
1705 * have newer extensions.
1706 */
1707 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1708 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1709 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1710 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1711 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1712 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1713 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1714 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1715 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1716 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1717 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1718 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1719 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1720 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1721 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1722 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1723 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1724 /* new extension functions */
1725 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1726 _glapi_add_entrypoint("glBindProgramNV", 579);
1727 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1728 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1729 _glapi_add_entrypoint("glGenProgramsNV", 582);
1730 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1731 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1732 _glapi_add_entrypoint("glGetProgramivNV", 585);
1733 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1734 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1735 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1736 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1737 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1738 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1739 _glapi_add_entrypoint("glIsProgramNV", 592);
1740 _glapi_add_entrypoint("glLoadProgramNV", 593);
1741 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1742 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1743 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1744 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1745 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1746 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1747 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1748 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1749 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1750 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1751 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1752 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1753 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1754 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1755 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1756 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1757 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1758 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1759 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1760 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1761 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1762 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1763 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1764 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1765 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1766 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1767 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1768 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1769 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1770 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1771 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1772 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1773 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1774 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1775 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1776 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1777 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1778 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1779 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1780 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1781 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1782 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1783 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1784 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1785 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1786 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1787 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1788 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1789 _glapi_add_entrypoint("glPointParameteriNV", 642);
1790 _glapi_add_entrypoint("glPointParameterivNV", 643);
1791 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1792 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1793 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1794 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1795 _glapi_add_entrypoint("glGenFencesNV", 648);
1796 _glapi_add_entrypoint("glIsFenceNV", 649);
1797 _glapi_add_entrypoint("glTestFenceNV", 650);
1798 _glapi_add_entrypoint("glGetFenceivNV", 651);
1799 _glapi_add_entrypoint("glFinishFenceNV", 652);
1800 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paula3f13702003-04-01 16:41:50 +00001801 /* XXX add NV_fragment_program and ARB_vertex_program functions */
Brian Paulf59afc92000-05-23 23:23:00 +00001802
Brian Paul5fb84d22000-05-24 15:04:45 +00001803 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1804 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1805 * Mesa we do this to accomodate different versions of libGL and various
1806 * DRI drivers.
1807 */
1808 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1809 sizeof(struct _glapi_table) / sizeof(void *));
1810
Brian Paulfbd8f211999-11-11 01:22:25 +00001811 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001812 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1813 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001814 if (!ctx->Exec || !ctx->Save) {
1815 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001816 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001817 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001818 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001819 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1820 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001821 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001822
Keith Whitwellad2ac212000-11-24 10:25:05 +00001823 ctx->ExecPrefersFloat = GL_FALSE;
1824 ctx->SavePrefersFloat = GL_FALSE;
1825
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001826 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001827 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001828 ctx->TnlModule.Current = NULL;
1829 ctx->TnlModule.SwapCount = 0;
1830
Brian Paulb6bcae52001-01-23 23:39:36 +00001831 /* Z buffer stuff */
1832 if (ctx->Visual.depthBits == 0) {
1833 /* Special case. Even if we don't have a depth buffer we need
1834 * good values for DepthMax for Z vertex transformation purposes
1835 * and for per-fragment fog computation.
1836 */
1837 ctx->DepthMax = 1 << 16;
1838 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1839 }
1840 else if (ctx->Visual.depthBits < 32) {
1841 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1842 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1843 }
1844 else {
1845 /* Special case since shift values greater than or equal to the
1846 * number of bits in the left hand expression's type are undefined.
1847 */
1848 ctx->DepthMax = 0xffffffff;
1849 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1850 }
Brian Paulbc920f02001-05-07 16:32:51 +00001851 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001852
Brian Paul3c634522002-10-24 23:57:19 +00001853 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001854 if (c)
1855 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001856
Brian Paul3c634522002-10-24 23:57:19 +00001857 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001858 if (c)
1859 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001860
Brian Paul4d053dd2000-01-14 04:45:47 +00001861 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001862}
1863
jtgafb833d1999-08-19 00:55:39 +00001864
1865
1866/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001867 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001868 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001869 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001870 * driver_ctx - pointer to device driver's context state struct
1871 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001872 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001873 */
Brian Paul178a1c52000-04-22 01:05:00 +00001874GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001875_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001876 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001877 void *driver_ctx,
1878 GLboolean direct )
1879
Brian Paul4d053dd2000-01-14 04:45:47 +00001880{
Brian Paul4753d602002-06-15 02:38:15 +00001881 GLcontext *ctx;
1882
1883 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001884 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001885
Brian Paul3c634522002-10-24 23:57:19 +00001886 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001887 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001888 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001889
Brian Paul3c634522002-10-24 23:57:19 +00001890 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001891 return ctx;
1892 }
1893 else {
Brian Paul3c634522002-10-24 23:57:19 +00001894 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001895 return NULL;
1896 }
1897}
1898
1899
1900
1901/*
1902 * Free the data associated with the given context.
1903 * But don't free() the GLcontext struct itself!
1904 */
Brian Paul178a1c52000-04-22 01:05:00 +00001905void
Brian Paulb1394fa2000-09-26 20:53:53 +00001906_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001907{
Brian Paul4d053dd2000-01-14 04:45:47 +00001908 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001909 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001910
1911 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001912 if (ctx == _mesa_get_current_context()) {
1913 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001914 }
1915
Brian Paul30f51ae2001-12-18 04:06:44 +00001916 /*
1917 * Free transformation matrix stacks
1918 */
1919 free_matrix_stack(&ctx->ModelviewMatrixStack);
1920 free_matrix_stack(&ctx->ProjectionMatrixStack);
1921 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001922 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001923 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1924 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1925 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1926 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001927 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1928
Brian Paul30f51ae2001-12-18 04:06:44 +00001929
Brian Paul8dfc5b92002-10-16 17:57:51 +00001930#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001931 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001932 ctx->VertexProgram.Current->Base.RefCount--;
1933 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
1934 _mesa_delete_program(ctx, ctx->VertexProgram.Current->Base.Id);
1935 }
1936#endif
1937#if FEATURE_NV_fragment_program
1938 if (ctx->FragmentProgram.Current) {
1939 ctx->FragmentProgram.Current->Base.RefCount--;
1940 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
1941 _mesa_delete_program(ctx, ctx->FragmentProgram.Current->Base.Id);
Brian Paulfd284452001-07-19 15:54:34 +00001942 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001943#endif
Brian Paulfd284452001-07-19 15:54:34 +00001944
Brian Paul30f51ae2001-12-18 04:06:44 +00001945 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001946 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001947 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001948 assert(ctx->Shared->RefCount >= 0);
1949 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1950 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001951 /* free shared state */
1952 free_shared_state( ctx, ctx->Shared );
1953 }
1954
Brian Paul30f51ae2001-12-18 04:06:44 +00001955 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001956 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001957 FREE( s );
1958 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001959 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001960
1961 /* Free proxy texture objects */
Brian Paula3f13702003-04-01 16:41:50 +00001962 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
1963 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
1964 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
1965 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
1966 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00001967
Brian Paul45b47d02003-01-26 14:37:15 +00001968 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
1969 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
1970
Brian Paul4d053dd2000-01-14 04:45:47 +00001971 /* Free evaluator data */
1972 if (ctx->EvalMap.Map1Vertex3.Points)
1973 FREE( ctx->EvalMap.Map1Vertex3.Points );
1974 if (ctx->EvalMap.Map1Vertex4.Points)
1975 FREE( ctx->EvalMap.Map1Vertex4.Points );
1976 if (ctx->EvalMap.Map1Index.Points)
1977 FREE( ctx->EvalMap.Map1Index.Points );
1978 if (ctx->EvalMap.Map1Color4.Points)
1979 FREE( ctx->EvalMap.Map1Color4.Points );
1980 if (ctx->EvalMap.Map1Normal.Points)
1981 FREE( ctx->EvalMap.Map1Normal.Points );
1982 if (ctx->EvalMap.Map1Texture1.Points)
1983 FREE( ctx->EvalMap.Map1Texture1.Points );
1984 if (ctx->EvalMap.Map1Texture2.Points)
1985 FREE( ctx->EvalMap.Map1Texture2.Points );
1986 if (ctx->EvalMap.Map1Texture3.Points)
1987 FREE( ctx->EvalMap.Map1Texture3.Points );
1988 if (ctx->EvalMap.Map1Texture4.Points)
1989 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001990 for (i = 0; i < 16; i++)
1991 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00001992
1993 if (ctx->EvalMap.Map2Vertex3.Points)
1994 FREE( ctx->EvalMap.Map2Vertex3.Points );
1995 if (ctx->EvalMap.Map2Vertex4.Points)
1996 FREE( ctx->EvalMap.Map2Vertex4.Points );
1997 if (ctx->EvalMap.Map2Index.Points)
1998 FREE( ctx->EvalMap.Map2Index.Points );
1999 if (ctx->EvalMap.Map2Color4.Points)
2000 FREE( ctx->EvalMap.Map2Color4.Points );
2001 if (ctx->EvalMap.Map2Normal.Points)
2002 FREE( ctx->EvalMap.Map2Normal.Points );
2003 if (ctx->EvalMap.Map2Texture1.Points)
2004 FREE( ctx->EvalMap.Map2Texture1.Points );
2005 if (ctx->EvalMap.Map2Texture2.Points)
2006 FREE( ctx->EvalMap.Map2Texture2.Points );
2007 if (ctx->EvalMap.Map2Texture3.Points)
2008 FREE( ctx->EvalMap.Map2Texture3.Points );
2009 if (ctx->EvalMap.Map2Texture4.Points)
2010 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002011 for (i = 0; i < 16; i++)
2012 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002013
Brian Paul4bdcfe52000-04-17 17:57:04 +00002014 _mesa_free_colortable_data( &ctx->ColorTable );
2015 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2016 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2017 _mesa_free_colortable_data( &ctx->Texture.Palette );
2018
Brian Paulfd284452001-07-19 15:54:34 +00002019 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2020
Brian Paul69755402001-02-26 23:58:12 +00002021 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002022
2023 FREE(ctx->Exec);
2024 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002025}
2026
2027
2028
2029/*
2030 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002031 */
Brian Paul178a1c52000-04-22 01:05:00 +00002032void
Brian Paulb1394fa2000-09-26 20:53:53 +00002033_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002034{
2035 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002036 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002037 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002038 }
2039}
2040
2041
2042
2043/*
jtgafb833d1999-08-19 00:55:39 +00002044 * Copy attribute groups from one context to another.
2045 * Input: src - source context
2046 * dst - destination context
2047 * mask - bitwise OR of GL_*_BIT flags
2048 */
Brian Paul178a1c52000-04-22 01:05:00 +00002049void
Brian Paulb1394fa2000-09-26 20:53:53 +00002050_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002051{
2052 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002053 /* OK to memcpy */
2054 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002055 }
2056 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002057 /* OK to memcpy */
2058 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002059 }
2060 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002061 /* OK to memcpy */
2062 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002063 }
2064 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002065 /* OK to memcpy */
2066 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002067 }
2068 if (mask & GL_ENABLE_BIT) {
2069 /* no op */
2070 }
2071 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002072 /* OK to memcpy */
2073 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002074 }
2075 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002076 /* OK to memcpy */
2077 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002078 }
2079 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002080 /* OK to memcpy */
2081 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002082 }
2083 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002084 GLuint i;
2085 /* begin with memcpy */
2086 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2087 /* fixup linked lists to prevent pointer insanity */
2088 make_empty_list( &(dst->Light.EnabledList) );
2089 for (i = 0; i < MAX_LIGHTS; i++) {
2090 if (dst->Light.Light[i].Enabled) {
2091 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2092 }
2093 }
jtgafb833d1999-08-19 00:55:39 +00002094 }
2095 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002096 /* OK to memcpy */
2097 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002098 }
2099 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002100 /* OK to memcpy */
2101 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002102 }
2103 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002104 /* OK to memcpy */
2105 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002106 }
2107 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002108 /* OK to memcpy */
2109 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002110 }
2111 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002112 /* OK to memcpy */
2113 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002114 }
2115 if (mask & GL_POLYGON_STIPPLE_BIT) {
2116 /* Use loop instead of MEMCPY due to problem with Portland Group's
2117 * C compiler. Reported by John Stone.
2118 */
Brian Paul85d81602002-06-17 23:36:31 +00002119 GLuint i;
2120 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002121 dst->PolygonStipple[i] = src->PolygonStipple[i];
2122 }
2123 }
2124 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002125 /* OK to memcpy */
2126 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002127 }
2128 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002129 /* OK to memcpy */
2130 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002131 }
2132 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002133 /* Cannot memcpy because of pointers */
2134 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002135 }
2136 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002137 /* OK to memcpy */
2138 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002139 }
2140 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002141 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2142 dst->Viewport.X = src->Viewport.X;
2143 dst->Viewport.Y = src->Viewport.Y;
2144 dst->Viewport.Width = src->Viewport.Width;
2145 dst->Viewport.Height = src->Viewport.Height;
2146 dst->Viewport.Near = src->Viewport.Near;
2147 dst->Viewport.Far = src->Viewport.Far;
2148 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002149 }
Brian Paul85d81602002-06-17 23:36:31 +00002150
Keith Whitwella96308c2000-10-30 13:31:59 +00002151 /* XXX FIXME: Call callbacks?
2152 */
2153 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002154}
2155
2156
Brian Paul00037781999-12-17 14:52:35 +00002157
Keith Whitwell23caf202000-11-16 21:05:34 +00002158static void print_info( void )
2159{
Brian Paul4e9676f2002-06-29 19:48:15 +00002160 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002161 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002162 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002163 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002164 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002165 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002166 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002167 (char *) _mesa_GetString(GL_EXTENSIONS));
2168#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002169 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002170#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002171 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002172#endif
2173#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002174 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002175#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002176 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002177#endif
davem69e4f84b42001-06-05 03:58:20 +00002178#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002179 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002180#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002181 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002182#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002183}
2184
2185
Brian Paul00037781999-12-17 14:52:35 +00002186/*
Brian Paul9a33a112002-06-13 04:28:29 +00002187 * Set the current context, binding the given frame buffer to the context.
2188 */
2189void
2190_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2191{
2192 _mesa_make_current2( newCtx, buffer, buffer );
2193}
2194
2195
2196/*
Brian Paul00037781999-12-17 14:52:35 +00002197 * Bind the given context to the given draw-buffer and read-buffer
2198 * and make it the current context for this thread.
2199 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002200void
2201_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2202 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002203{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002204 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002205 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002206
Brian Paulbe3602d2001-02-28 00:27:48 +00002207 /* Check that the context's and framebuffer's visuals are compatible.
2208 * We could do a lot more checking here but this'll catch obvious
2209 * problems.
2210 */
2211 if (newCtx && drawBuffer && readBuffer) {
2212 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2213 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2214 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2215 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2216 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2217 return; /* incompatible */
2218 }
2219 }
2220
Brian Paul00037781999-12-17 14:52:35 +00002221 /* We call this function periodically (just here for now) in
2222 * order to detect when multithreading has begun.
2223 */
2224 _glapi_check_multithread();
2225
Brian Paulf9b97d92000-01-28 20:17:42 +00002226 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002227 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002228
2229
2230 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002231 _glapi_set_dispatch(NULL); /* none current */
2232 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002233 else {
2234 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002235
Keith Whitwell23caf202000-11-16 21:05:34 +00002236 if (drawBuffer && readBuffer) {
2237 /* TODO: check if newCtx and buffer's visual match??? */
2238 newCtx->DrawBuffer = drawBuffer;
2239 newCtx->ReadBuffer = readBuffer;
2240 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002241
2242 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2243 /* get initial window size */
2244 GLuint bufWidth, bufHeight;
2245
2246 /* ask device driver for size of output buffer */
2247 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2248
2249 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2250 return; /* size is as expected */
2251
2252 drawBuffer->Width = bufWidth;
2253 drawBuffer->Height = bufHeight;
2254
2255 newCtx->Driver.ResizeBuffers( drawBuffer );
2256 }
2257
2258 if (readBuffer != drawBuffer &&
2259 readBuffer->Width == 0 && readBuffer->Height == 0) {
2260 /* get initial window size */
2261 GLuint bufWidth, bufHeight;
2262
2263 /* ask device driver for size of output buffer */
2264 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2265
2266 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2267 return; /* size is as expected */
2268
2269 readBuffer->Width = bufWidth;
2270 readBuffer->Height = bufHeight;
2271
2272 newCtx->Driver.ResizeBuffers( readBuffer );
2273 }
Brian Paul00037781999-12-17 14:52:35 +00002274 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002275
Brian Paul8816c702002-06-16 01:10:41 +00002276 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002277 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002278 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2279
2280 /* We can use this to help debug user's problems. Tell them to set
2281 * the MESA_INFO env variable before running their app. Then the
2282 * first time each context is made current we'll print some useful
2283 * information.
2284 */
2285 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002286 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002287 print_info();
2288 }
2289 newCtx->FirstTimeCurrent = GL_FALSE;
2290 }
Brian Paul00037781999-12-17 14:52:35 +00002291 }
2292}
2293
2294
2295
2296/*
2297 * Return current context handle for the calling thread.
2298 * This isn't the fastest way to get the current context.
2299 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2300 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002301GLcontext *
2302_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002303{
Brian Paulf9b97d92000-01-28 20:17:42 +00002304 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002305}
2306
2307
Brian Paulfbd8f211999-11-11 01:22:25 +00002308/*
2309 * Return pointer to this context's current API dispatch table.
2310 * It'll either be the immediate-mode execute dispatcher or the
2311 * display list compile dispatcher.
2312 */
2313struct _glapi_table *
2314_mesa_get_dispatch(GLcontext *ctx)
2315{
2316 return ctx->CurrentDispatch;
2317}
2318
2319
2320
jtgafb833d1999-08-19 00:55:39 +00002321/**********************************************************************/
2322/***** Miscellaneous functions *****/
2323/**********************************************************************/
2324
2325
2326/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002327 * Record the given error code and call the driver's Error function if defined.
2328 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002329 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002330void
Brian Paul4e9676f2002-06-29 19:48:15 +00002331_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002332{
Brian Paul18a285a2002-03-16 00:53:15 +00002333 if (!ctx)
2334 return;
2335
Brian Paul7eb06032000-07-14 04:13:40 +00002336 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002337 ctx->ErrorValue = error;
2338 }
2339
2340 /* Call device driver's error handler, if any. This is used on the Mac. */
2341 if (ctx->Driver.Error) {
2342 (*ctx->Driver.Error)( ctx );
2343 }
2344}
2345
2346
Brian Paulfa9df402000-02-02 19:16:46 +00002347void
2348_mesa_Finish( 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.Finish) {
2353 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002354 }
2355}
2356
2357
2358
Brian Paulfa9df402000-02-02 19:16:46 +00002359void
2360_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002361{
Brian Paulfa9df402000-02-02 19:16:46 +00002362 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002363 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002364 if (ctx->Driver.Flush) {
2365 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002366 }
jtgafb833d1999-08-19 00:55:39 +00002367}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002368
2369
2370
Keith Whitwellcab974c2000-12-26 05:09:27 +00002371const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002372 "GL_POINTS",
2373 "GL_LINES",
2374 "GL_LINE_LOOP",
2375 "GL_LINE_STRIP",
2376 "GL_TRIANGLES",
2377 "GL_TRIANGLE_STRIP",
2378 "GL_TRIANGLE_FAN",
2379 "GL_QUADS",
2380 "GL_QUAD_STRIP",
2381 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002382 "outside begin/end",
2383 "inside unkown primitive",
2384 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002385};