blob: 7c8befc0a801cf773eb69f3b11ca4151fd4930b8 [file] [log] [blame]
Brian Paula3f13702003-04-01 16:41:50 +00001/* $Id: context.c,v 1.195 2003/04/01 16:41:50 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 Paul86b84272001-12-14 02:50:01 +00001015 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
1016 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
1017 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
1018 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
1019 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
Brian Paul610d5992003-01-14 04:55:45 +00001020 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul86b84272001-12-14 02:50:01 +00001021 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.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 );
1028 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001029 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001030 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001031 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001032
jtgafb833d1999-08-19 00:55:39 +00001033
Brian Paul4d053dd2000-01-14 04:45:47 +00001034 /* Depth buffer group */
1035 ctx->Depth.Test = GL_FALSE;
1036 ctx->Depth.Clear = 1.0;
1037 ctx->Depth.Func = GL_LESS;
1038 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001039 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001040
Brian Paul4d053dd2000-01-14 04:45:47 +00001041 /* Evaluators group */
1042 ctx->Eval.Map1Color4 = GL_FALSE;
1043 ctx->Eval.Map1Index = GL_FALSE;
1044 ctx->Eval.Map1Normal = GL_FALSE;
1045 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1046 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1047 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1048 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1049 ctx->Eval.Map1Vertex3 = GL_FALSE;
1050 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001051 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001052 ctx->Eval.Map2Color4 = GL_FALSE;
1053 ctx->Eval.Map2Index = GL_FALSE;
1054 ctx->Eval.Map2Normal = GL_FALSE;
1055 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1056 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1057 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1058 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1059 ctx->Eval.Map2Vertex3 = GL_FALSE;
1060 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001061 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001062 ctx->Eval.AutoNormal = GL_FALSE;
1063 ctx->Eval.MapGrid1un = 1;
1064 ctx->Eval.MapGrid1u1 = 0.0;
1065 ctx->Eval.MapGrid1u2 = 1.0;
1066 ctx->Eval.MapGrid2un = 1;
1067 ctx->Eval.MapGrid2vn = 1;
1068 ctx->Eval.MapGrid2u1 = 0.0;
1069 ctx->Eval.MapGrid2u2 = 1.0;
1070 ctx->Eval.MapGrid2v1 = 0.0;
1071 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001072
Brian Paul4d053dd2000-01-14 04:45:47 +00001073 /* Evaluator data */
1074 {
1075 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1076 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1077 static GLfloat index[1] = { 1.0 };
1078 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1079 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001080 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001081
Brian Paul4d053dd2000-01-14 04:45:47 +00001082 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1083 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1084 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1085 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1086 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1087 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1088 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1089 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1090 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001091 for (i = 0; i < 16; i++)
1092 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001093
Brian Paul4d053dd2000-01-14 04:45:47 +00001094 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1095 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1096 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1097 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1098 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1099 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1100 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1101 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1102 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001103 for (i = 0; i < 16; i++)
1104 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001105 }
jtgafb833d1999-08-19 00:55:39 +00001106
Brian Paul4d053dd2000-01-14 04:45:47 +00001107 /* Fog group */
1108 ctx->Fog.Enabled = GL_FALSE;
1109 ctx->Fog.Mode = GL_EXP;
1110 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1111 ctx->Fog.Index = 0.0;
1112 ctx->Fog.Density = 1.0;
1113 ctx->Fog.Start = 0.0;
1114 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001115 ctx->Fog.ColorSumEnabled = GL_FALSE;
1116 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001117
Brian Paul4d053dd2000-01-14 04:45:47 +00001118 /* Hint group */
1119 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1120 ctx->Hint.PointSmooth = GL_DONT_CARE;
1121 ctx->Hint.LineSmooth = GL_DONT_CARE;
1122 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1123 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001124 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1125 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001126 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001127
Brian Paul0771d152000-04-07 00:19:41 +00001128 /* Histogram group */
1129 ctx->Histogram.Width = 0;
1130 ctx->Histogram.Format = GL_RGBA;
1131 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001132 ctx->Histogram.RedSize = 0;
1133 ctx->Histogram.GreenSize = 0;
1134 ctx->Histogram.BlueSize = 0;
1135 ctx->Histogram.AlphaSize = 0;
1136 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001137 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1138 ctx->Histogram.Count[i][0] = 0;
1139 ctx->Histogram.Count[i][1] = 0;
1140 ctx->Histogram.Count[i][2] = 0;
1141 ctx->Histogram.Count[i][3] = 0;
1142 }
1143
1144 /* Min/Max group */
1145 ctx->MinMax.Format = GL_RGBA;
1146 ctx->MinMax.Sink = GL_FALSE;
1147 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1148 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1149 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1150 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1151
Brian Paul4d053dd2000-01-14 04:45:47 +00001152 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001153 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001154
Brian Paul4d053dd2000-01-14 04:45:47 +00001155 /* Lighting group */
1156 for (i=0;i<MAX_LIGHTS;i++) {
1157 init_light( &ctx->Light.Light[i], i );
1158 }
1159 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001160
Brian Paul4d053dd2000-01-14 04:45:47 +00001161 init_lightmodel( &ctx->Light.Model );
1162 init_material( &ctx->Light.Material[0] );
1163 init_material( &ctx->Light.Material[1] );
1164 ctx->Light.ShadeModel = GL_SMOOTH;
1165 ctx->Light.Enabled = GL_FALSE;
1166 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1167 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001168 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1169 GL_FRONT_AND_BACK,
1170 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001171
Brian Paul4d053dd2000-01-14 04:45:47 +00001172 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001173
Brian Paul4d053dd2000-01-14 04:45:47 +00001174 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001175 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1176 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001177 for (i = 0 ; i < 10 ; i++) {
1178 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1179 s->shininess = -1;
1180 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001181 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001182 }
Brian Paul77d61af2000-06-28 04:20:21 +00001183
jtgafb833d1999-08-19 00:55:39 +00001184
Brian Paul4d053dd2000-01-14 04:45:47 +00001185 /* Line group */
1186 ctx->Line.SmoothFlag = GL_FALSE;
1187 ctx->Line.StippleFlag = GL_FALSE;
1188 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001189 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001190 ctx->Line.StipplePattern = 0xffff;
1191 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001192
Brian Paul4d053dd2000-01-14 04:45:47 +00001193 /* Display List group */
1194 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001195
Brian Paul736fcbe2001-05-29 15:23:48 +00001196 /* Multisample */
1197 ctx->Multisample.Enabled = GL_FALSE;
1198 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1199 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1200 ctx->Multisample.SampleCoverage = GL_FALSE;
1201 ctx->Multisample.SampleCoverageValue = 1.0;
1202 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1203
Brian Paul4d053dd2000-01-14 04:45:47 +00001204 /* Pixel group */
1205 ctx->Pixel.RedBias = 0.0;
1206 ctx->Pixel.RedScale = 1.0;
1207 ctx->Pixel.GreenBias = 0.0;
1208 ctx->Pixel.GreenScale = 1.0;
1209 ctx->Pixel.BlueBias = 0.0;
1210 ctx->Pixel.BlueScale = 1.0;
1211 ctx->Pixel.AlphaBias = 0.0;
1212 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001213 ctx->Pixel.DepthBias = 0.0;
1214 ctx->Pixel.DepthScale = 1.0;
1215 ctx->Pixel.IndexOffset = 0;
1216 ctx->Pixel.IndexShift = 0;
1217 ctx->Pixel.ZoomX = 1.0;
1218 ctx->Pixel.ZoomY = 1.0;
1219 ctx->Pixel.MapColorFlag = GL_FALSE;
1220 ctx->Pixel.MapStencilFlag = GL_FALSE;
1221 ctx->Pixel.MapStoSsize = 1;
1222 ctx->Pixel.MapItoIsize = 1;
1223 ctx->Pixel.MapItoRsize = 1;
1224 ctx->Pixel.MapItoGsize = 1;
1225 ctx->Pixel.MapItoBsize = 1;
1226 ctx->Pixel.MapItoAsize = 1;
1227 ctx->Pixel.MapRtoRsize = 1;
1228 ctx->Pixel.MapGtoGsize = 1;
1229 ctx->Pixel.MapBtoBsize = 1;
1230 ctx->Pixel.MapAtoAsize = 1;
1231 ctx->Pixel.MapStoS[0] = 0;
1232 ctx->Pixel.MapItoI[0] = 0;
1233 ctx->Pixel.MapItoR[0] = 0.0;
1234 ctx->Pixel.MapItoG[0] = 0.0;
1235 ctx->Pixel.MapItoB[0] = 0.0;
1236 ctx->Pixel.MapItoA[0] = 0.0;
1237 ctx->Pixel.MapItoR8[0] = 0;
1238 ctx->Pixel.MapItoG8[0] = 0;
1239 ctx->Pixel.MapItoB8[0] = 0;
1240 ctx->Pixel.MapItoA8[0] = 0;
1241 ctx->Pixel.MapRtoR[0] = 0.0;
1242 ctx->Pixel.MapGtoG[0] = 0.0;
1243 ctx->Pixel.MapBtoB[0] = 0.0;
1244 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001245 ctx->Pixel.HistogramEnabled = GL_FALSE;
1246 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1247 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1248 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1249 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001250 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1251 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1252 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1253 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001254 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1255 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1256 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1257 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001258 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1259 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1260 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001261 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1262 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1263 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1264 for (i = 0; i < 3; i++) {
1265 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1266 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1267 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1268 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1269 }
Brian Paul67adba12000-12-09 20:35:54 +00001270 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1271 ctx->Convolution1D.Filter[i] = 0.0;
1272 ctx->Convolution2D.Filter[i] = 0.0;
1273 ctx->Separable2D.Filter[i] = 0.0;
1274 }
Brian Paul82b02f02000-05-07 20:37:40 +00001275 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1276 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001277 /* GL_SGI_texture_color_table */
1278 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1279 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001280
Brian Paul4d053dd2000-01-14 04:45:47 +00001281 /* Point group */
1282 ctx->Point.SmoothFlag = GL_FALSE;
1283 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001284 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001285 ctx->Point.Params[0] = 1.0;
1286 ctx->Point.Params[1] = 0.0;
1287 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001288 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001289 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001290 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001291 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001292 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1293 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001294 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001295 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1296 }
jtgafb833d1999-08-19 00:55:39 +00001297
Brian Paul4d053dd2000-01-14 04:45:47 +00001298 /* Polygon group */
1299 ctx->Polygon.CullFlag = GL_FALSE;
1300 ctx->Polygon.CullFaceMode = GL_BACK;
1301 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001302 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001303 ctx->Polygon.FrontMode = GL_FILL;
1304 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001305 ctx->Polygon.SmoothFlag = GL_FALSE;
1306 ctx->Polygon.StippleFlag = GL_FALSE;
1307 ctx->Polygon.OffsetFactor = 0.0F;
1308 ctx->Polygon.OffsetUnits = 0.0F;
1309 ctx->Polygon.OffsetPoint = GL_FALSE;
1310 ctx->Polygon.OffsetLine = GL_FALSE;
1311 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001312
Brian Paul4d053dd2000-01-14 04:45:47 +00001313 /* Polygon Stipple group */
1314 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001315
Brian Paul4d053dd2000-01-14 04:45:47 +00001316 /* Scissor group */
1317 ctx->Scissor.Enabled = GL_FALSE;
1318 ctx->Scissor.X = 0;
1319 ctx->Scissor.Y = 0;
1320 ctx->Scissor.Width = 0;
1321 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001322
Brian Paul4d053dd2000-01-14 04:45:47 +00001323 /* Stencil group */
1324 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001325 ctx->Stencil.TestTwoSide = GL_FALSE;
1326 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1327 ctx->Stencil.Function[0] = GL_ALWAYS;
1328 ctx->Stencil.Function[1] = GL_ALWAYS;
1329 ctx->Stencil.FailFunc[0] = GL_KEEP;
1330 ctx->Stencil.FailFunc[1] = GL_KEEP;
1331 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1332 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1333 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1334 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1335 ctx->Stencil.Ref[0] = 0;
1336 ctx->Stencil.Ref[1] = 0;
1337 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1338 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1339 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1340 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001341 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001342
Brian Paul4d053dd2000-01-14 04:45:47 +00001343 /* Texture group */
1344 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001345 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001346 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1347 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001348 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001349 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001350
Brian Paul4d053dd2000-01-14 04:45:47 +00001351 /* Transformation group */
1352 ctx->Transform.MatrixMode = GL_MODELVIEW;
1353 ctx->Transform.Normalize = GL_FALSE;
1354 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001355 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001356 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001357 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1358 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001359 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001360
Brian Paul4d053dd2000-01-14 04:45:47 +00001361 /* Viewport group */
1362 ctx->Viewport.X = 0;
1363 ctx->Viewport.Y = 0;
1364 ctx->Viewport.Width = 0;
1365 ctx->Viewport.Height = 0;
1366 ctx->Viewport.Near = 0.0;
1367 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001368 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001369
1370#define Sz 10
1371#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001372 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1373 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001374#undef Sz
1375#undef Tz
1376
Keith Whitwell14940c42000-11-05 18:40:57 +00001377 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1378 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001379
Brian Paul4d053dd2000-01-14 04:45:47 +00001380 /* Vertex arrays */
1381 ctx->Array.Vertex.Size = 4;
1382 ctx->Array.Vertex.Type = GL_FLOAT;
1383 ctx->Array.Vertex.Stride = 0;
1384 ctx->Array.Vertex.StrideB = 0;
1385 ctx->Array.Vertex.Ptr = NULL;
1386 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001387 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001388 ctx->Array.Normal.Type = GL_FLOAT;
1389 ctx->Array.Normal.Stride = 0;
1390 ctx->Array.Normal.StrideB = 0;
1391 ctx->Array.Normal.Ptr = NULL;
1392 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001393 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001394 ctx->Array.Color.Size = 4;
1395 ctx->Array.Color.Type = GL_FLOAT;
1396 ctx->Array.Color.Stride = 0;
1397 ctx->Array.Color.StrideB = 0;
1398 ctx->Array.Color.Ptr = NULL;
1399 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001400 ctx->Array.Color.Flags = CA_CLIENT_DATA;
1401 ctx->Array.SecondaryColor.Size = 4;
1402 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1403 ctx->Array.SecondaryColor.Stride = 0;
1404 ctx->Array.SecondaryColor.StrideB = 0;
1405 ctx->Array.SecondaryColor.Ptr = NULL;
1406 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1407 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1408 ctx->Array.FogCoord.Size = 1;
1409 ctx->Array.FogCoord.Type = GL_FLOAT;
1410 ctx->Array.FogCoord.Stride = 0;
1411 ctx->Array.FogCoord.StrideB = 0;
1412 ctx->Array.FogCoord.Ptr = NULL;
1413 ctx->Array.FogCoord.Enabled = GL_FALSE;
1414 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001415 ctx->Array.Index.Type = GL_FLOAT;
1416 ctx->Array.Index.Stride = 0;
1417 ctx->Array.Index.StrideB = 0;
1418 ctx->Array.Index.Ptr = NULL;
1419 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001420 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001421 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001422 ctx->Array.TexCoord[i].Size = 4;
1423 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1424 ctx->Array.TexCoord[i].Stride = 0;
1425 ctx->Array.TexCoord[i].StrideB = 0;
1426 ctx->Array.TexCoord[i].Ptr = NULL;
1427 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001428 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001429 }
1430 ctx->Array.TexCoordInterleaveFactor = 1;
1431 ctx->Array.EdgeFlag.Stride = 0;
1432 ctx->Array.EdgeFlag.StrideB = 0;
1433 ctx->Array.EdgeFlag.Ptr = NULL;
1434 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001435 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001436 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1437
1438 /* Pixel transfer */
1439 ctx->Pack.Alignment = 4;
1440 ctx->Pack.RowLength = 0;
1441 ctx->Pack.ImageHeight = 0;
1442 ctx->Pack.SkipPixels = 0;
1443 ctx->Pack.SkipRows = 0;
1444 ctx->Pack.SkipImages = 0;
1445 ctx->Pack.SwapBytes = GL_FALSE;
1446 ctx->Pack.LsbFirst = GL_FALSE;
1447 ctx->Unpack.Alignment = 4;
1448 ctx->Unpack.RowLength = 0;
1449 ctx->Unpack.ImageHeight = 0;
1450 ctx->Unpack.SkipPixels = 0;
1451 ctx->Unpack.SkipRows = 0;
1452 ctx->Unpack.SkipImages = 0;
1453 ctx->Unpack.SwapBytes = GL_FALSE;
1454 ctx->Unpack.LsbFirst = GL_FALSE;
1455
1456 /* Feedback */
1457 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1458 ctx->Feedback.Buffer = NULL;
1459 ctx->Feedback.BufferSize = 0;
1460 ctx->Feedback.Count = 0;
1461
1462 /* Selection/picking */
1463 ctx->Select.Buffer = NULL;
1464 ctx->Select.BufferSize = 0;
1465 ctx->Select.BufferCount = 0;
1466 ctx->Select.Hits = 0;
1467 ctx->Select.NameStackDepth = 0;
1468
Brian Paul4d053dd2000-01-14 04:45:47 +00001469 /* Renderer and client attribute stacks */
1470 ctx->AttribStackDepth = 0;
1471 ctx->ClientAttribStackDepth = 0;
1472
Brian Paul13811372000-04-12 00:27:37 +00001473 /* Display list */
1474 ctx->CallDepth = 0;
1475 ctx->ExecuteFlag = GL_TRUE;
1476 ctx->CompileFlag = GL_FALSE;
1477 ctx->CurrentListPtr = NULL;
1478 ctx->CurrentBlock = NULL;
1479 ctx->CurrentListNum = 0;
1480 ctx->CurrentPos = 0;
1481
1482 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001483 _mesa_init_colortable(&ctx->ColorTable);
1484 _mesa_init_colortable(&ctx->ProxyColorTable);
1485 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1486 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1487 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1488 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001489
Brian Paul610d5992003-01-14 04:55:45 +00001490 /* Vertex/fragment programs */
1491 ctx->Program.ErrorPos = -1;
1492 ctx->Program.ErrorString = _mesa_strdup("");
1493#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001494 ctx->VertexProgram.Enabled = GL_FALSE;
1495 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1496 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001497 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001498 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1499 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1500 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1501 }
Brian Paul610d5992003-01-14 04:55:45 +00001502#endif
1503#if FEATURE_NV_fragment_program
1504 ctx->FragmentProgram.Enabled = GL_FALSE;
1505 ctx->FragmentProgram.Current = NULL;
1506#endif
Brian Paul86b84272001-12-14 02:50:01 +00001507
Brian Paul4d053dd2000-01-14 04:45:47 +00001508 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001509 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001510 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001511 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001512
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001513 ctx->_NeedNormals = 0;
1514 ctx->_NeedEyeCoords = 0;
1515 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001516
Brian Paul4d053dd2000-01-14 04:45:47 +00001517 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1518
1519 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001520 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001521 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001522 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001523
1524 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001525 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001526 ctx->FirstTimeCurrent = GL_TRUE;
1527
1528 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001529 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001530 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001531 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001532 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001533 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001534 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001535 }
1536}
1537
1538
1539
1540
Brian Paula3f13702003-04-01 16:41:50 +00001541/**
1542 * Allocate the proxy textures for the given context.
1543 * \param ctx the context to allocate proxies for.
1544 * \return GL_TRUE if success, GL_FALSE if failure.
jtgafb833d1999-08-19 00:55:39 +00001545 */
Brian Paul178a1c52000-04-22 01:05:00 +00001546static GLboolean
1547alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001548{
Brian Paula3f13702003-04-01 16:41:50 +00001549 ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
1550 if (!ctx->Texture.Proxy1D)
1551 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001552
Brian Paula3f13702003-04-01 16:41:50 +00001553 ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
1554 if (!ctx->Texture.Proxy2D)
1555 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001556
Brian Paula3f13702003-04-01 16:41:50 +00001557 ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
1558 if (!ctx->Texture.Proxy3D)
1559 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001560
Brian Paula3f13702003-04-01 16:41:50 +00001561 ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
1562 if (!ctx->Texture.ProxyCubeMap)
1563 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +00001564
Brian Paula3f13702003-04-01 16:41:50 +00001565 ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
1566 if (!ctx->Texture.ProxyRect)
1567 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001568
Brian Paula3f13702003-04-01 16:41:50 +00001569 return GL_TRUE;
Brian Paul8afe7de2002-06-15 03:03:06 +00001570
Brian Paula3f13702003-04-01 16:41:50 +00001571 cleanup:
1572 if (ctx->Texture.Proxy1D)
1573 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
1574 if (ctx->Texture.Proxy2D)
1575 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
1576 if (ctx->Texture.Proxy3D)
1577 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
1578 if (ctx->Texture.ProxyCubeMap)
1579 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
1580 if (ctx->Texture.ProxyRect)
1581 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
1582 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001583}
1584
1585
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001586static void add_debug_flags( const char *debug )
1587{
1588#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001589 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001590 MESA_VERBOSE |= VERBOSE_VARRAY;
1591
Brian Paul3c634522002-10-24 23:57:19 +00001592 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001593 MESA_VERBOSE |= VERBOSE_TEXTURE;
1594
Brian Paul3c634522002-10-24 23:57:19 +00001595 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001596 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1597
Brian Paul3c634522002-10-24 23:57:19 +00001598 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001599 MESA_VERBOSE |= VERBOSE_PIPELINE;
1600
Brian Paul3c634522002-10-24 23:57:19 +00001601 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001602 MESA_VERBOSE |= VERBOSE_DRIVER;
1603
Brian Paul3c634522002-10-24 23:57:19 +00001604 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001605 MESA_VERBOSE |= VERBOSE_STATE;
1606
Brian Paul3c634522002-10-24 23:57:19 +00001607 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001608 MESA_VERBOSE |= VERBOSE_API;
1609
Brian Paul3c634522002-10-24 23:57:19 +00001610 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001611 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1612
Brian Paul3c634522002-10-24 23:57:19 +00001613 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001614 MESA_VERBOSE |= VERBOSE_LIGHTING;
1615
1616 /* Debug flag:
1617 */
Brian Paul3c634522002-10-24 23:57:19 +00001618 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001619 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1620#endif
1621}
1622
1623
jtgafb833d1999-08-19 00:55:39 +00001624/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001625 * Initialize a GLcontext struct. This includes allocating all the
1626 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001627 */
Brian Paul178a1c52000-04-22 01:05:00 +00001628GLboolean
1629_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001630 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001631 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001632 void *driver_ctx,
1633 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001634{
Brian Paul5fb84d22000-05-24 15:04:45 +00001635 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001636 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001637
Brian Paul3c634522002-10-24 23:57:19 +00001638 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001639
Brian Paul3c634522002-10-24 23:57:19 +00001640 /* If the driver wants core Mesa to use special imports, it'll have to
1641 * override these defaults.
1642 */
1643 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001644
Brian Paul9a33a112002-06-13 04:28:29 +00001645 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001646 _mesa_init_default_exports( &(ctx->exports) );
1647
1648 /* misc one-time initializations */
1649 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001650
Brian Paul3c634522002-10-24 23:57:19 +00001651 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001652 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001653 ctx->DrawBuffer = NULL;
1654 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001655
Brian Paula3f13702003-04-01 16:41:50 +00001656 /* Set these pointers to defaults now in case they're not set since
1657 * we need them while creating the default textures.
1658 */
1659 if (!ctx->Driver.NewTextureObject)
1660 ctx->Driver.NewTextureObject = _mesa_new_texture_object;
1661 if (!ctx->Driver.DeleteTexture)
1662 ctx->Driver.DeleteTexture = _mesa_delete_texture_object;
1663 if (!ctx->Driver.NewTextureImage)
1664 ctx->Driver.NewTextureImage = _mesa_new_texture_image;
1665
jtgafb833d1999-08-19 00:55:39 +00001666 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001667 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001668 ctx->Shared = share_list->Shared;
1669 }
1670 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001671 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001672 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001673 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001674 }
1675 }
Brian Paul9560f052000-01-31 23:11:39 +00001676 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001677 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001678 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001679
Brian Paul4d053dd2000-01-14 04:45:47 +00001680 init_attrib_groups( ctx );
1681
Brian Paulb6bcae52001-01-23 23:39:36 +00001682 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001683 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001684 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001685 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001686 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001687 }
1688 else {
1689 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001690 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001691 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001692 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001693 }
1694
jtgafb833d1999-08-19 00:55:39 +00001695 if (!alloc_proxy_textures(ctx)) {
1696 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001697 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001698 }
jtgafb833d1999-08-19 00:55:39 +00001699
Brian Paul8ad10762002-10-11 17:41:03 +00001700 /*
1701 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1702 * Basically, we should add all extension functions above offset 577.
1703 * This enables older libGL libraries to work with newer drivers that
1704 * have newer extensions.
1705 */
1706 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1707 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1708 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1709 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1710 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1711 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1712 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1713 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1714 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1715 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1716 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1717 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1718 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1719 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1720 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1721 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1722 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1723 /* new extension functions */
1724 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1725 _glapi_add_entrypoint("glBindProgramNV", 579);
1726 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1727 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1728 _glapi_add_entrypoint("glGenProgramsNV", 582);
1729 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1730 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1731 _glapi_add_entrypoint("glGetProgramivNV", 585);
1732 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1733 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1734 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1735 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1736 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1737 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1738 _glapi_add_entrypoint("glIsProgramNV", 592);
1739 _glapi_add_entrypoint("glLoadProgramNV", 593);
1740 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1741 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1742 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1743 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1744 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1745 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1746 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1747 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1748 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1749 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1750 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1751 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1752 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1753 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1754 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1755 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1756 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1757 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1758 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1759 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1760 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1761 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1762 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1763 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1764 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1765 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1766 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1767 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1768 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1769 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1770 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1771 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1772 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1773 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1774 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1775 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1776 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1777 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1778 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1779 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1780 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1781 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1782 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1783 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1784 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1785 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1786 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1787 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1788 _glapi_add_entrypoint("glPointParameteriNV", 642);
1789 _glapi_add_entrypoint("glPointParameterivNV", 643);
1790 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1791 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1792 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1793 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1794 _glapi_add_entrypoint("glGenFencesNV", 648);
1795 _glapi_add_entrypoint("glIsFenceNV", 649);
1796 _glapi_add_entrypoint("glTestFenceNV", 650);
1797 _glapi_add_entrypoint("glGetFenceivNV", 651);
1798 _glapi_add_entrypoint("glFinishFenceNV", 652);
1799 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paula3f13702003-04-01 16:41:50 +00001800 /* XXX add NV_fragment_program and ARB_vertex_program functions */
Brian Paulf59afc92000-05-23 23:23:00 +00001801
Brian Paul5fb84d22000-05-24 15:04:45 +00001802 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1803 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1804 * Mesa we do this to accomodate different versions of libGL and various
1805 * DRI drivers.
1806 */
1807 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1808 sizeof(struct _glapi_table) / sizeof(void *));
1809
Brian Paulfbd8f211999-11-11 01:22:25 +00001810 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001811 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1812 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001813 if (!ctx->Exec || !ctx->Save) {
1814 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001815 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001816 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001817 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001818 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1819 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001820 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001821
Keith Whitwellad2ac212000-11-24 10:25:05 +00001822 ctx->ExecPrefersFloat = GL_FALSE;
1823 ctx->SavePrefersFloat = GL_FALSE;
1824
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001825 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001826 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001827 ctx->TnlModule.Current = NULL;
1828 ctx->TnlModule.SwapCount = 0;
1829
Brian Paulb6bcae52001-01-23 23:39:36 +00001830 /* Z buffer stuff */
1831 if (ctx->Visual.depthBits == 0) {
1832 /* Special case. Even if we don't have a depth buffer we need
1833 * good values for DepthMax for Z vertex transformation purposes
1834 * and for per-fragment fog computation.
1835 */
1836 ctx->DepthMax = 1 << 16;
1837 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1838 }
1839 else if (ctx->Visual.depthBits < 32) {
1840 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1841 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1842 }
1843 else {
1844 /* Special case since shift values greater than or equal to the
1845 * number of bits in the left hand expression's type are undefined.
1846 */
1847 ctx->DepthMax = 0xffffffff;
1848 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1849 }
Brian Paulbc920f02001-05-07 16:32:51 +00001850 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001851
Brian Paul3c634522002-10-24 23:57:19 +00001852 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001853 if (c)
1854 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001855
Brian Paul3c634522002-10-24 23:57:19 +00001856 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001857 if (c)
1858 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001859
Brian Paul4d053dd2000-01-14 04:45:47 +00001860 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001861}
1862
jtgafb833d1999-08-19 00:55:39 +00001863
1864
1865/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001866 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001867 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001868 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001869 * driver_ctx - pointer to device driver's context state struct
1870 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001871 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001872 */
Brian Paul178a1c52000-04-22 01:05:00 +00001873GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001874_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001875 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001876 void *driver_ctx,
1877 GLboolean direct )
1878
Brian Paul4d053dd2000-01-14 04:45:47 +00001879{
Brian Paul4753d602002-06-15 02:38:15 +00001880 GLcontext *ctx;
1881
1882 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001883 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001884
Brian Paul3c634522002-10-24 23:57:19 +00001885 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001886 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001887 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001888
Brian Paul3c634522002-10-24 23:57:19 +00001889 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001890 return ctx;
1891 }
1892 else {
Brian Paul3c634522002-10-24 23:57:19 +00001893 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001894 return NULL;
1895 }
1896}
1897
1898
1899
1900/*
1901 * Free the data associated with the given context.
1902 * But don't free() the GLcontext struct itself!
1903 */
Brian Paul178a1c52000-04-22 01:05:00 +00001904void
Brian Paulb1394fa2000-09-26 20:53:53 +00001905_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001906{
Brian Paul4d053dd2000-01-14 04:45:47 +00001907 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001908 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001909
1910 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001911 if (ctx == _mesa_get_current_context()) {
1912 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001913 }
1914
Brian Paul30f51ae2001-12-18 04:06:44 +00001915 /*
1916 * Free transformation matrix stacks
1917 */
1918 free_matrix_stack(&ctx->ModelviewMatrixStack);
1919 free_matrix_stack(&ctx->ProjectionMatrixStack);
1920 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001921 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001922 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1923 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1924 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1925 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001926 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1927
Brian Paul30f51ae2001-12-18 04:06:44 +00001928
Brian Paul8dfc5b92002-10-16 17:57:51 +00001929#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001930 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001931 ctx->VertexProgram.Current->Base.RefCount--;
1932 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
1933 _mesa_delete_program(ctx, ctx->VertexProgram.Current->Base.Id);
1934 }
1935#endif
1936#if FEATURE_NV_fragment_program
1937 if (ctx->FragmentProgram.Current) {
1938 ctx->FragmentProgram.Current->Base.RefCount--;
1939 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
1940 _mesa_delete_program(ctx, ctx->FragmentProgram.Current->Base.Id);
Brian Paulfd284452001-07-19 15:54:34 +00001941 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001942#endif
Brian Paulfd284452001-07-19 15:54:34 +00001943
Brian Paul30f51ae2001-12-18 04:06:44 +00001944 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001945 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001946 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001947 assert(ctx->Shared->RefCount >= 0);
1948 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1949 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001950 /* free shared state */
1951 free_shared_state( ctx, ctx->Shared );
1952 }
1953
Brian Paul30f51ae2001-12-18 04:06:44 +00001954 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001955 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001956 FREE( s );
1957 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001958 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001959
1960 /* Free proxy texture objects */
Brian Paula3f13702003-04-01 16:41:50 +00001961 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
1962 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
1963 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
1964 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
1965 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00001966
Brian Paul45b47d02003-01-26 14:37:15 +00001967 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
1968 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
1969
Brian Paul4d053dd2000-01-14 04:45:47 +00001970 /* Free evaluator data */
1971 if (ctx->EvalMap.Map1Vertex3.Points)
1972 FREE( ctx->EvalMap.Map1Vertex3.Points );
1973 if (ctx->EvalMap.Map1Vertex4.Points)
1974 FREE( ctx->EvalMap.Map1Vertex4.Points );
1975 if (ctx->EvalMap.Map1Index.Points)
1976 FREE( ctx->EvalMap.Map1Index.Points );
1977 if (ctx->EvalMap.Map1Color4.Points)
1978 FREE( ctx->EvalMap.Map1Color4.Points );
1979 if (ctx->EvalMap.Map1Normal.Points)
1980 FREE( ctx->EvalMap.Map1Normal.Points );
1981 if (ctx->EvalMap.Map1Texture1.Points)
1982 FREE( ctx->EvalMap.Map1Texture1.Points );
1983 if (ctx->EvalMap.Map1Texture2.Points)
1984 FREE( ctx->EvalMap.Map1Texture2.Points );
1985 if (ctx->EvalMap.Map1Texture3.Points)
1986 FREE( ctx->EvalMap.Map1Texture3.Points );
1987 if (ctx->EvalMap.Map1Texture4.Points)
1988 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001989 for (i = 0; i < 16; i++)
1990 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00001991
1992 if (ctx->EvalMap.Map2Vertex3.Points)
1993 FREE( ctx->EvalMap.Map2Vertex3.Points );
1994 if (ctx->EvalMap.Map2Vertex4.Points)
1995 FREE( ctx->EvalMap.Map2Vertex4.Points );
1996 if (ctx->EvalMap.Map2Index.Points)
1997 FREE( ctx->EvalMap.Map2Index.Points );
1998 if (ctx->EvalMap.Map2Color4.Points)
1999 FREE( ctx->EvalMap.Map2Color4.Points );
2000 if (ctx->EvalMap.Map2Normal.Points)
2001 FREE( ctx->EvalMap.Map2Normal.Points );
2002 if (ctx->EvalMap.Map2Texture1.Points)
2003 FREE( ctx->EvalMap.Map2Texture1.Points );
2004 if (ctx->EvalMap.Map2Texture2.Points)
2005 FREE( ctx->EvalMap.Map2Texture2.Points );
2006 if (ctx->EvalMap.Map2Texture3.Points)
2007 FREE( ctx->EvalMap.Map2Texture3.Points );
2008 if (ctx->EvalMap.Map2Texture4.Points)
2009 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002010 for (i = 0; i < 16; i++)
2011 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002012
Brian Paul4bdcfe52000-04-17 17:57:04 +00002013 _mesa_free_colortable_data( &ctx->ColorTable );
2014 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2015 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2016 _mesa_free_colortable_data( &ctx->Texture.Palette );
2017
Brian Paulfd284452001-07-19 15:54:34 +00002018 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2019
Brian Paul69755402001-02-26 23:58:12 +00002020 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002021
2022 FREE(ctx->Exec);
2023 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002024}
2025
2026
2027
2028/*
2029 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002030 */
Brian Paul178a1c52000-04-22 01:05:00 +00002031void
Brian Paulb1394fa2000-09-26 20:53:53 +00002032_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002033{
2034 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002035 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002036 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002037 }
2038}
2039
2040
2041
2042/*
jtgafb833d1999-08-19 00:55:39 +00002043 * Copy attribute groups from one context to another.
2044 * Input: src - source context
2045 * dst - destination context
2046 * mask - bitwise OR of GL_*_BIT flags
2047 */
Brian Paul178a1c52000-04-22 01:05:00 +00002048void
Brian Paulb1394fa2000-09-26 20:53:53 +00002049_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002050{
2051 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002052 /* OK to memcpy */
2053 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002054 }
2055 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002056 /* OK to memcpy */
2057 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002058 }
2059 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002060 /* OK to memcpy */
2061 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002062 }
2063 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002064 /* OK to memcpy */
2065 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002066 }
2067 if (mask & GL_ENABLE_BIT) {
2068 /* no op */
2069 }
2070 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002071 /* OK to memcpy */
2072 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002073 }
2074 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002075 /* OK to memcpy */
2076 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002077 }
2078 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002079 /* OK to memcpy */
2080 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002081 }
2082 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002083 GLuint i;
2084 /* begin with memcpy */
2085 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2086 /* fixup linked lists to prevent pointer insanity */
2087 make_empty_list( &(dst->Light.EnabledList) );
2088 for (i = 0; i < MAX_LIGHTS; i++) {
2089 if (dst->Light.Light[i].Enabled) {
2090 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2091 }
2092 }
jtgafb833d1999-08-19 00:55:39 +00002093 }
2094 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002095 /* OK to memcpy */
2096 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002097 }
2098 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002099 /* OK to memcpy */
2100 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002101 }
2102 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002103 /* OK to memcpy */
2104 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002105 }
2106 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002107 /* OK to memcpy */
2108 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002109 }
2110 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002111 /* OK to memcpy */
2112 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002113 }
2114 if (mask & GL_POLYGON_STIPPLE_BIT) {
2115 /* Use loop instead of MEMCPY due to problem with Portland Group's
2116 * C compiler. Reported by John Stone.
2117 */
Brian Paul85d81602002-06-17 23:36:31 +00002118 GLuint i;
2119 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002120 dst->PolygonStipple[i] = src->PolygonStipple[i];
2121 }
2122 }
2123 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002124 /* OK to memcpy */
2125 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002126 }
2127 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002128 /* OK to memcpy */
2129 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002130 }
2131 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002132 /* Cannot memcpy because of pointers */
2133 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002134 }
2135 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002136 /* OK to memcpy */
2137 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002138 }
2139 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002140 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2141 dst->Viewport.X = src->Viewport.X;
2142 dst->Viewport.Y = src->Viewport.Y;
2143 dst->Viewport.Width = src->Viewport.Width;
2144 dst->Viewport.Height = src->Viewport.Height;
2145 dst->Viewport.Near = src->Viewport.Near;
2146 dst->Viewport.Far = src->Viewport.Far;
2147 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002148 }
Brian Paul85d81602002-06-17 23:36:31 +00002149
Keith Whitwella96308c2000-10-30 13:31:59 +00002150 /* XXX FIXME: Call callbacks?
2151 */
2152 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002153}
2154
2155
Brian Paul00037781999-12-17 14:52:35 +00002156
Keith Whitwell23caf202000-11-16 21:05:34 +00002157static void print_info( void )
2158{
Brian Paul4e9676f2002-06-29 19:48:15 +00002159 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002160 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002161 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002162 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002163 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002164 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002165 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002166 (char *) _mesa_GetString(GL_EXTENSIONS));
2167#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002168 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002169#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002170 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002171#endif
2172#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002173 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002174#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002175 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002176#endif
davem69e4f84b42001-06-05 03:58:20 +00002177#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002178 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002179#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002180 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002181#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002182}
2183
2184
Brian Paul00037781999-12-17 14:52:35 +00002185/*
Brian Paul9a33a112002-06-13 04:28:29 +00002186 * Set the current context, binding the given frame buffer to the context.
2187 */
2188void
2189_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2190{
2191 _mesa_make_current2( newCtx, buffer, buffer );
2192}
2193
2194
2195/*
Brian Paul00037781999-12-17 14:52:35 +00002196 * Bind the given context to the given draw-buffer and read-buffer
2197 * and make it the current context for this thread.
2198 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002199void
2200_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2201 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002202{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002203 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002204 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002205
Brian Paulbe3602d2001-02-28 00:27:48 +00002206 /* Check that the context's and framebuffer's visuals are compatible.
2207 * We could do a lot more checking here but this'll catch obvious
2208 * problems.
2209 */
2210 if (newCtx && drawBuffer && readBuffer) {
2211 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2212 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2213 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2214 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2215 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2216 return; /* incompatible */
2217 }
2218 }
2219
Brian Paul00037781999-12-17 14:52:35 +00002220 /* We call this function periodically (just here for now) in
2221 * order to detect when multithreading has begun.
2222 */
2223 _glapi_check_multithread();
2224
Brian Paulf9b97d92000-01-28 20:17:42 +00002225 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002226 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002227
2228
2229 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002230 _glapi_set_dispatch(NULL); /* none current */
2231 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002232 else {
2233 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002234
Keith Whitwell23caf202000-11-16 21:05:34 +00002235 if (drawBuffer && readBuffer) {
2236 /* TODO: check if newCtx and buffer's visual match??? */
2237 newCtx->DrawBuffer = drawBuffer;
2238 newCtx->ReadBuffer = readBuffer;
2239 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002240
2241 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2242 /* get initial window size */
2243 GLuint bufWidth, bufHeight;
2244
2245 /* ask device driver for size of output buffer */
2246 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2247
2248 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2249 return; /* size is as expected */
2250
2251 drawBuffer->Width = bufWidth;
2252 drawBuffer->Height = bufHeight;
2253
2254 newCtx->Driver.ResizeBuffers( drawBuffer );
2255 }
2256
2257 if (readBuffer != drawBuffer &&
2258 readBuffer->Width == 0 && readBuffer->Height == 0) {
2259 /* get initial window size */
2260 GLuint bufWidth, bufHeight;
2261
2262 /* ask device driver for size of output buffer */
2263 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2264
2265 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2266 return; /* size is as expected */
2267
2268 readBuffer->Width = bufWidth;
2269 readBuffer->Height = bufHeight;
2270
2271 newCtx->Driver.ResizeBuffers( readBuffer );
2272 }
Brian Paul00037781999-12-17 14:52:35 +00002273 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002274
Brian Paul8816c702002-06-16 01:10:41 +00002275 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002276 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002277 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2278
2279 /* We can use this to help debug user's problems. Tell them to set
2280 * the MESA_INFO env variable before running their app. Then the
2281 * first time each context is made current we'll print some useful
2282 * information.
2283 */
2284 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002285 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002286 print_info();
2287 }
2288 newCtx->FirstTimeCurrent = GL_FALSE;
2289 }
Brian Paul00037781999-12-17 14:52:35 +00002290 }
2291}
2292
2293
2294
2295/*
2296 * Return current context handle for the calling thread.
2297 * This isn't the fastest way to get the current context.
2298 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2299 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002300GLcontext *
2301_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002302{
Brian Paulf9b97d92000-01-28 20:17:42 +00002303 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002304}
2305
2306
Brian Paulfbd8f211999-11-11 01:22:25 +00002307/*
2308 * Return pointer to this context's current API dispatch table.
2309 * It'll either be the immediate-mode execute dispatcher or the
2310 * display list compile dispatcher.
2311 */
2312struct _glapi_table *
2313_mesa_get_dispatch(GLcontext *ctx)
2314{
2315 return ctx->CurrentDispatch;
2316}
2317
2318
2319
jtgafb833d1999-08-19 00:55:39 +00002320/**********************************************************************/
2321/***** Miscellaneous functions *****/
2322/**********************************************************************/
2323
2324
2325/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002326 * Record the given error code and call the driver's Error function if defined.
2327 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002328 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002329void
Brian Paul4e9676f2002-06-29 19:48:15 +00002330_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002331{
Brian Paul18a285a2002-03-16 00:53:15 +00002332 if (!ctx)
2333 return;
2334
Brian Paul7eb06032000-07-14 04:13:40 +00002335 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002336 ctx->ErrorValue = error;
2337 }
2338
2339 /* Call device driver's error handler, if any. This is used on the Mac. */
2340 if (ctx->Driver.Error) {
2341 (*ctx->Driver.Error)( ctx );
2342 }
2343}
2344
2345
Brian Paulfa9df402000-02-02 19:16:46 +00002346void
2347_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002348{
Brian Paulfa9df402000-02-02 19:16:46 +00002349 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002350 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002351 if (ctx->Driver.Finish) {
2352 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002353 }
2354}
2355
2356
2357
Brian Paulfa9df402000-02-02 19:16:46 +00002358void
2359_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002360{
Brian Paulfa9df402000-02-02 19:16:46 +00002361 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002362 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002363 if (ctx->Driver.Flush) {
2364 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002365 }
jtgafb833d1999-08-19 00:55:39 +00002366}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002367
2368
2369
Keith Whitwellcab974c2000-12-26 05:09:27 +00002370const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002371 "GL_POINTS",
2372 "GL_LINES",
2373 "GL_LINE_LOOP",
2374 "GL_LINE_STRIP",
2375 "GL_TRIANGLES",
2376 "GL_TRIANGLE_STRIP",
2377 "GL_TRIANGLE_FAN",
2378 "GL_QUADS",
2379 "GL_QUAD_STRIP",
2380 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002381 "outside begin/end",
2382 "inside unkown primitive",
2383 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002384};