blob: 690aa29d4aaf4b86a7072d80c1d4817e3b1cae4c [file] [log] [blame]
Brian Paulb852f042003-04-01 18:57:36 +00001/* $Id: context.c,v 1.196 2003/04/01 18:57:36 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 Paulb852f042003-04-01 18:57:36 +00001020 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_SIX], 0.0, 0.0, 0.0, 1.0 );
1021 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_SEVEN], 0.0, 0.0, 0.0, 1.0 );
Brian Paul610d5992003-01-14 04:55:45 +00001022 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul86b84272001-12-14 02:50:01 +00001023 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001024 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +00001025 ctx->Current.EdgeFlag = GL_TRUE;
1026
Brian Paul4d053dd2000-01-14 04:45:47 +00001027 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
1028 ctx->Current.RasterDistance = 0.0;
1029 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
1030 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001031 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001032 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001033 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001034
jtgafb833d1999-08-19 00:55:39 +00001035
Brian Paul4d053dd2000-01-14 04:45:47 +00001036 /* Depth buffer group */
1037 ctx->Depth.Test = GL_FALSE;
1038 ctx->Depth.Clear = 1.0;
1039 ctx->Depth.Func = GL_LESS;
1040 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001041 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001042
Brian Paul4d053dd2000-01-14 04:45:47 +00001043 /* Evaluators group */
1044 ctx->Eval.Map1Color4 = GL_FALSE;
1045 ctx->Eval.Map1Index = GL_FALSE;
1046 ctx->Eval.Map1Normal = GL_FALSE;
1047 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1048 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1049 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1050 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1051 ctx->Eval.Map1Vertex3 = GL_FALSE;
1052 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001053 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001054 ctx->Eval.Map2Color4 = GL_FALSE;
1055 ctx->Eval.Map2Index = GL_FALSE;
1056 ctx->Eval.Map2Normal = GL_FALSE;
1057 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1058 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1059 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1060 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1061 ctx->Eval.Map2Vertex3 = GL_FALSE;
1062 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001063 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001064 ctx->Eval.AutoNormal = GL_FALSE;
1065 ctx->Eval.MapGrid1un = 1;
1066 ctx->Eval.MapGrid1u1 = 0.0;
1067 ctx->Eval.MapGrid1u2 = 1.0;
1068 ctx->Eval.MapGrid2un = 1;
1069 ctx->Eval.MapGrid2vn = 1;
1070 ctx->Eval.MapGrid2u1 = 0.0;
1071 ctx->Eval.MapGrid2u2 = 1.0;
1072 ctx->Eval.MapGrid2v1 = 0.0;
1073 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001074
Brian Paul4d053dd2000-01-14 04:45:47 +00001075 /* Evaluator data */
1076 {
1077 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1078 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1079 static GLfloat index[1] = { 1.0 };
1080 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1081 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001082 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001083
Brian Paul4d053dd2000-01-14 04:45:47 +00001084 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1085 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1086 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1087 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1088 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1089 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1090 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1091 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1092 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001093 for (i = 0; i < 16; i++)
1094 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001095
Brian Paul4d053dd2000-01-14 04:45:47 +00001096 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1097 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1098 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1099 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1100 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1101 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1102 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1103 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1104 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001105 for (i = 0; i < 16; i++)
1106 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001107 }
jtgafb833d1999-08-19 00:55:39 +00001108
Brian Paul4d053dd2000-01-14 04:45:47 +00001109 /* Fog group */
1110 ctx->Fog.Enabled = GL_FALSE;
1111 ctx->Fog.Mode = GL_EXP;
1112 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1113 ctx->Fog.Index = 0.0;
1114 ctx->Fog.Density = 1.0;
1115 ctx->Fog.Start = 0.0;
1116 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001117 ctx->Fog.ColorSumEnabled = GL_FALSE;
1118 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001119
Brian Paul4d053dd2000-01-14 04:45:47 +00001120 /* Hint group */
1121 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1122 ctx->Hint.PointSmooth = GL_DONT_CARE;
1123 ctx->Hint.LineSmooth = GL_DONT_CARE;
1124 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1125 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001126 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1127 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001128 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001129
Brian Paul0771d152000-04-07 00:19:41 +00001130 /* Histogram group */
1131 ctx->Histogram.Width = 0;
1132 ctx->Histogram.Format = GL_RGBA;
1133 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001134 ctx->Histogram.RedSize = 0;
1135 ctx->Histogram.GreenSize = 0;
1136 ctx->Histogram.BlueSize = 0;
1137 ctx->Histogram.AlphaSize = 0;
1138 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001139 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1140 ctx->Histogram.Count[i][0] = 0;
1141 ctx->Histogram.Count[i][1] = 0;
1142 ctx->Histogram.Count[i][2] = 0;
1143 ctx->Histogram.Count[i][3] = 0;
1144 }
1145
1146 /* Min/Max group */
1147 ctx->MinMax.Format = GL_RGBA;
1148 ctx->MinMax.Sink = GL_FALSE;
1149 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1150 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1151 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1152 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1153
Brian Paul4d053dd2000-01-14 04:45:47 +00001154 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001155 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001156
Brian Paul4d053dd2000-01-14 04:45:47 +00001157 /* Lighting group */
1158 for (i=0;i<MAX_LIGHTS;i++) {
1159 init_light( &ctx->Light.Light[i], i );
1160 }
1161 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001162
Brian Paul4d053dd2000-01-14 04:45:47 +00001163 init_lightmodel( &ctx->Light.Model );
1164 init_material( &ctx->Light.Material[0] );
1165 init_material( &ctx->Light.Material[1] );
1166 ctx->Light.ShadeModel = GL_SMOOTH;
1167 ctx->Light.Enabled = GL_FALSE;
1168 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1169 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001170 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1171 GL_FRONT_AND_BACK,
1172 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001173
Brian Paul4d053dd2000-01-14 04:45:47 +00001174 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001175
Brian Paul4d053dd2000-01-14 04:45:47 +00001176 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001177 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1178 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001179 for (i = 0 ; i < 10 ; i++) {
1180 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1181 s->shininess = -1;
1182 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001183 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001184 }
Brian Paul77d61af2000-06-28 04:20:21 +00001185
jtgafb833d1999-08-19 00:55:39 +00001186
Brian Paul4d053dd2000-01-14 04:45:47 +00001187 /* Line group */
1188 ctx->Line.SmoothFlag = GL_FALSE;
1189 ctx->Line.StippleFlag = GL_FALSE;
1190 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001191 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001192 ctx->Line.StipplePattern = 0xffff;
1193 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001194
Brian Paul4d053dd2000-01-14 04:45:47 +00001195 /* Display List group */
1196 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001197
Brian Paul736fcbe2001-05-29 15:23:48 +00001198 /* Multisample */
1199 ctx->Multisample.Enabled = GL_FALSE;
1200 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1201 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1202 ctx->Multisample.SampleCoverage = GL_FALSE;
1203 ctx->Multisample.SampleCoverageValue = 1.0;
1204 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1205
Brian Paul4d053dd2000-01-14 04:45:47 +00001206 /* Pixel group */
1207 ctx->Pixel.RedBias = 0.0;
1208 ctx->Pixel.RedScale = 1.0;
1209 ctx->Pixel.GreenBias = 0.0;
1210 ctx->Pixel.GreenScale = 1.0;
1211 ctx->Pixel.BlueBias = 0.0;
1212 ctx->Pixel.BlueScale = 1.0;
1213 ctx->Pixel.AlphaBias = 0.0;
1214 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001215 ctx->Pixel.DepthBias = 0.0;
1216 ctx->Pixel.DepthScale = 1.0;
1217 ctx->Pixel.IndexOffset = 0;
1218 ctx->Pixel.IndexShift = 0;
1219 ctx->Pixel.ZoomX = 1.0;
1220 ctx->Pixel.ZoomY = 1.0;
1221 ctx->Pixel.MapColorFlag = GL_FALSE;
1222 ctx->Pixel.MapStencilFlag = GL_FALSE;
1223 ctx->Pixel.MapStoSsize = 1;
1224 ctx->Pixel.MapItoIsize = 1;
1225 ctx->Pixel.MapItoRsize = 1;
1226 ctx->Pixel.MapItoGsize = 1;
1227 ctx->Pixel.MapItoBsize = 1;
1228 ctx->Pixel.MapItoAsize = 1;
1229 ctx->Pixel.MapRtoRsize = 1;
1230 ctx->Pixel.MapGtoGsize = 1;
1231 ctx->Pixel.MapBtoBsize = 1;
1232 ctx->Pixel.MapAtoAsize = 1;
1233 ctx->Pixel.MapStoS[0] = 0;
1234 ctx->Pixel.MapItoI[0] = 0;
1235 ctx->Pixel.MapItoR[0] = 0.0;
1236 ctx->Pixel.MapItoG[0] = 0.0;
1237 ctx->Pixel.MapItoB[0] = 0.0;
1238 ctx->Pixel.MapItoA[0] = 0.0;
1239 ctx->Pixel.MapItoR8[0] = 0;
1240 ctx->Pixel.MapItoG8[0] = 0;
1241 ctx->Pixel.MapItoB8[0] = 0;
1242 ctx->Pixel.MapItoA8[0] = 0;
1243 ctx->Pixel.MapRtoR[0] = 0.0;
1244 ctx->Pixel.MapGtoG[0] = 0.0;
1245 ctx->Pixel.MapBtoB[0] = 0.0;
1246 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001247 ctx->Pixel.HistogramEnabled = GL_FALSE;
1248 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1249 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1250 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1251 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001252 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1253 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1254 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1255 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001256 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1257 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1258 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1259 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001260 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1261 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1262 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001263 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1264 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1265 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1266 for (i = 0; i < 3; i++) {
1267 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1268 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1269 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1270 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1271 }
Brian Paul67adba12000-12-09 20:35:54 +00001272 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1273 ctx->Convolution1D.Filter[i] = 0.0;
1274 ctx->Convolution2D.Filter[i] = 0.0;
1275 ctx->Separable2D.Filter[i] = 0.0;
1276 }
Brian Paul82b02f02000-05-07 20:37:40 +00001277 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1278 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001279 /* GL_SGI_texture_color_table */
1280 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1281 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001282
Brian Paul4d053dd2000-01-14 04:45:47 +00001283 /* Point group */
1284 ctx->Point.SmoothFlag = GL_FALSE;
1285 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001286 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001287 ctx->Point.Params[0] = 1.0;
1288 ctx->Point.Params[1] = 0.0;
1289 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001290 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001291 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001292 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001293 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001294 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1295 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001296 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001297 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1298 }
jtgafb833d1999-08-19 00:55:39 +00001299
Brian Paul4d053dd2000-01-14 04:45:47 +00001300 /* Polygon group */
1301 ctx->Polygon.CullFlag = GL_FALSE;
1302 ctx->Polygon.CullFaceMode = GL_BACK;
1303 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001304 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001305 ctx->Polygon.FrontMode = GL_FILL;
1306 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001307 ctx->Polygon.SmoothFlag = GL_FALSE;
1308 ctx->Polygon.StippleFlag = GL_FALSE;
1309 ctx->Polygon.OffsetFactor = 0.0F;
1310 ctx->Polygon.OffsetUnits = 0.0F;
1311 ctx->Polygon.OffsetPoint = GL_FALSE;
1312 ctx->Polygon.OffsetLine = GL_FALSE;
1313 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001314
Brian Paul4d053dd2000-01-14 04:45:47 +00001315 /* Polygon Stipple group */
1316 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001317
Brian Paul4d053dd2000-01-14 04:45:47 +00001318 /* Scissor group */
1319 ctx->Scissor.Enabled = GL_FALSE;
1320 ctx->Scissor.X = 0;
1321 ctx->Scissor.Y = 0;
1322 ctx->Scissor.Width = 0;
1323 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001324
Brian Paul4d053dd2000-01-14 04:45:47 +00001325 /* Stencil group */
1326 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001327 ctx->Stencil.TestTwoSide = GL_FALSE;
1328 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1329 ctx->Stencil.Function[0] = GL_ALWAYS;
1330 ctx->Stencil.Function[1] = GL_ALWAYS;
1331 ctx->Stencil.FailFunc[0] = GL_KEEP;
1332 ctx->Stencil.FailFunc[1] = GL_KEEP;
1333 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1334 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1335 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1336 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1337 ctx->Stencil.Ref[0] = 0;
1338 ctx->Stencil.Ref[1] = 0;
1339 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1340 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1341 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1342 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001343 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001344
Brian Paul4d053dd2000-01-14 04:45:47 +00001345 /* Texture group */
1346 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001347 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001348 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1349 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001350 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001351 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001352
Brian Paul4d053dd2000-01-14 04:45:47 +00001353 /* Transformation group */
1354 ctx->Transform.MatrixMode = GL_MODELVIEW;
1355 ctx->Transform.Normalize = GL_FALSE;
1356 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001357 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001358 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001359 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1360 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001361 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001362
Brian Paul4d053dd2000-01-14 04:45:47 +00001363 /* Viewport group */
1364 ctx->Viewport.X = 0;
1365 ctx->Viewport.Y = 0;
1366 ctx->Viewport.Width = 0;
1367 ctx->Viewport.Height = 0;
1368 ctx->Viewport.Near = 0.0;
1369 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001370 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001371
1372#define Sz 10
1373#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001374 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1375 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001376#undef Sz
1377#undef Tz
1378
Keith Whitwell14940c42000-11-05 18:40:57 +00001379 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1380 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001381
Brian Paul4d053dd2000-01-14 04:45:47 +00001382 /* Vertex arrays */
1383 ctx->Array.Vertex.Size = 4;
1384 ctx->Array.Vertex.Type = GL_FLOAT;
1385 ctx->Array.Vertex.Stride = 0;
1386 ctx->Array.Vertex.StrideB = 0;
1387 ctx->Array.Vertex.Ptr = NULL;
1388 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001389 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001390 ctx->Array.Normal.Type = GL_FLOAT;
1391 ctx->Array.Normal.Stride = 0;
1392 ctx->Array.Normal.StrideB = 0;
1393 ctx->Array.Normal.Ptr = NULL;
1394 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001395 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001396 ctx->Array.Color.Size = 4;
1397 ctx->Array.Color.Type = GL_FLOAT;
1398 ctx->Array.Color.Stride = 0;
1399 ctx->Array.Color.StrideB = 0;
1400 ctx->Array.Color.Ptr = NULL;
1401 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001402 ctx->Array.Color.Flags = CA_CLIENT_DATA;
Brian Paulb852f042003-04-01 18:57:36 +00001403 ctx->Array.SecondaryColor.Size = 3;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001404 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1405 ctx->Array.SecondaryColor.Stride = 0;
1406 ctx->Array.SecondaryColor.StrideB = 0;
1407 ctx->Array.SecondaryColor.Ptr = NULL;
1408 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1409 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1410 ctx->Array.FogCoord.Size = 1;
1411 ctx->Array.FogCoord.Type = GL_FLOAT;
1412 ctx->Array.FogCoord.Stride = 0;
1413 ctx->Array.FogCoord.StrideB = 0;
1414 ctx->Array.FogCoord.Ptr = NULL;
1415 ctx->Array.FogCoord.Enabled = GL_FALSE;
1416 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001417 ctx->Array.Index.Type = GL_FLOAT;
1418 ctx->Array.Index.Stride = 0;
1419 ctx->Array.Index.StrideB = 0;
1420 ctx->Array.Index.Ptr = NULL;
1421 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001422 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001423 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001424 ctx->Array.TexCoord[i].Size = 4;
1425 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1426 ctx->Array.TexCoord[i].Stride = 0;
1427 ctx->Array.TexCoord[i].StrideB = 0;
1428 ctx->Array.TexCoord[i].Ptr = NULL;
1429 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001430 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001431 }
1432 ctx->Array.TexCoordInterleaveFactor = 1;
1433 ctx->Array.EdgeFlag.Stride = 0;
1434 ctx->Array.EdgeFlag.StrideB = 0;
1435 ctx->Array.EdgeFlag.Ptr = NULL;
1436 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001437 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001438 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1439
1440 /* Pixel transfer */
1441 ctx->Pack.Alignment = 4;
1442 ctx->Pack.RowLength = 0;
1443 ctx->Pack.ImageHeight = 0;
1444 ctx->Pack.SkipPixels = 0;
1445 ctx->Pack.SkipRows = 0;
1446 ctx->Pack.SkipImages = 0;
1447 ctx->Pack.SwapBytes = GL_FALSE;
1448 ctx->Pack.LsbFirst = GL_FALSE;
1449 ctx->Unpack.Alignment = 4;
1450 ctx->Unpack.RowLength = 0;
1451 ctx->Unpack.ImageHeight = 0;
1452 ctx->Unpack.SkipPixels = 0;
1453 ctx->Unpack.SkipRows = 0;
1454 ctx->Unpack.SkipImages = 0;
1455 ctx->Unpack.SwapBytes = GL_FALSE;
1456 ctx->Unpack.LsbFirst = GL_FALSE;
1457
1458 /* Feedback */
1459 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1460 ctx->Feedback.Buffer = NULL;
1461 ctx->Feedback.BufferSize = 0;
1462 ctx->Feedback.Count = 0;
1463
1464 /* Selection/picking */
1465 ctx->Select.Buffer = NULL;
1466 ctx->Select.BufferSize = 0;
1467 ctx->Select.BufferCount = 0;
1468 ctx->Select.Hits = 0;
1469 ctx->Select.NameStackDepth = 0;
1470
Brian Paul4d053dd2000-01-14 04:45:47 +00001471 /* Renderer and client attribute stacks */
1472 ctx->AttribStackDepth = 0;
1473 ctx->ClientAttribStackDepth = 0;
1474
Brian Paul13811372000-04-12 00:27:37 +00001475 /* Display list */
1476 ctx->CallDepth = 0;
1477 ctx->ExecuteFlag = GL_TRUE;
1478 ctx->CompileFlag = GL_FALSE;
1479 ctx->CurrentListPtr = NULL;
1480 ctx->CurrentBlock = NULL;
1481 ctx->CurrentListNum = 0;
1482 ctx->CurrentPos = 0;
1483
1484 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001485 _mesa_init_colortable(&ctx->ColorTable);
1486 _mesa_init_colortable(&ctx->ProxyColorTable);
1487 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1488 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1489 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1490 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001491
Brian Paul610d5992003-01-14 04:55:45 +00001492 /* Vertex/fragment programs */
1493 ctx->Program.ErrorPos = -1;
1494 ctx->Program.ErrorString = _mesa_strdup("");
1495#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001496 ctx->VertexProgram.Enabled = GL_FALSE;
1497 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1498 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001499 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001500 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1501 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1502 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1503 }
Brian Paul610d5992003-01-14 04:55:45 +00001504#endif
1505#if FEATURE_NV_fragment_program
1506 ctx->FragmentProgram.Enabled = GL_FALSE;
1507 ctx->FragmentProgram.Current = NULL;
1508#endif
Brian Paul86b84272001-12-14 02:50:01 +00001509
Brian Paul4d053dd2000-01-14 04:45:47 +00001510 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001511 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001512 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001513 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001514
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001515 ctx->_NeedNormals = 0;
1516 ctx->_NeedEyeCoords = 0;
1517 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001518
Brian Paul4d053dd2000-01-14 04:45:47 +00001519 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1520
1521 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001522 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001523 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001524 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001525
1526 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001527 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001528 ctx->FirstTimeCurrent = GL_TRUE;
1529
1530 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001531 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001532 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001533 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001534 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001535 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001536 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001537 }
1538}
1539
1540
1541
1542
Brian Paula3f13702003-04-01 16:41:50 +00001543/**
1544 * Allocate the proxy textures for the given context.
1545 * \param ctx the context to allocate proxies for.
1546 * \return GL_TRUE if success, GL_FALSE if failure.
jtgafb833d1999-08-19 00:55:39 +00001547 */
Brian Paul178a1c52000-04-22 01:05:00 +00001548static GLboolean
1549alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001550{
Brian Paula3f13702003-04-01 16:41:50 +00001551 ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
1552 if (!ctx->Texture.Proxy1D)
1553 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001554
Brian Paula3f13702003-04-01 16:41:50 +00001555 ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
1556 if (!ctx->Texture.Proxy2D)
1557 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001558
Brian Paula3f13702003-04-01 16:41:50 +00001559 ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
1560 if (!ctx->Texture.Proxy3D)
1561 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001562
Brian Paula3f13702003-04-01 16:41:50 +00001563 ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
1564 if (!ctx->Texture.ProxyCubeMap)
1565 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +00001566
Brian Paula3f13702003-04-01 16:41:50 +00001567 ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
1568 if (!ctx->Texture.ProxyRect)
1569 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001570
Brian Paula3f13702003-04-01 16:41:50 +00001571 return GL_TRUE;
Brian Paul8afe7de2002-06-15 03:03:06 +00001572
Brian Paula3f13702003-04-01 16:41:50 +00001573 cleanup:
1574 if (ctx->Texture.Proxy1D)
1575 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
1576 if (ctx->Texture.Proxy2D)
1577 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
1578 if (ctx->Texture.Proxy3D)
1579 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
1580 if (ctx->Texture.ProxyCubeMap)
1581 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
1582 if (ctx->Texture.ProxyRect)
1583 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
1584 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001585}
1586
1587
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001588static void add_debug_flags( const char *debug )
1589{
1590#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001591 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001592 MESA_VERBOSE |= VERBOSE_VARRAY;
1593
Brian Paul3c634522002-10-24 23:57:19 +00001594 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001595 MESA_VERBOSE |= VERBOSE_TEXTURE;
1596
Brian Paul3c634522002-10-24 23:57:19 +00001597 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001598 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1599
Brian Paul3c634522002-10-24 23:57:19 +00001600 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001601 MESA_VERBOSE |= VERBOSE_PIPELINE;
1602
Brian Paul3c634522002-10-24 23:57:19 +00001603 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001604 MESA_VERBOSE |= VERBOSE_DRIVER;
1605
Brian Paul3c634522002-10-24 23:57:19 +00001606 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001607 MESA_VERBOSE |= VERBOSE_STATE;
1608
Brian Paul3c634522002-10-24 23:57:19 +00001609 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001610 MESA_VERBOSE |= VERBOSE_API;
1611
Brian Paul3c634522002-10-24 23:57:19 +00001612 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001613 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1614
Brian Paul3c634522002-10-24 23:57:19 +00001615 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001616 MESA_VERBOSE |= VERBOSE_LIGHTING;
1617
1618 /* Debug flag:
1619 */
Brian Paul3c634522002-10-24 23:57:19 +00001620 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001621 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1622#endif
1623}
1624
1625
jtgafb833d1999-08-19 00:55:39 +00001626/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001627 * Initialize a GLcontext struct. This includes allocating all the
1628 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001629 */
Brian Paul178a1c52000-04-22 01:05:00 +00001630GLboolean
1631_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001632 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001633 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001634 void *driver_ctx,
1635 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001636{
Brian Paul5fb84d22000-05-24 15:04:45 +00001637 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001638 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001639
Brian Paul3c634522002-10-24 23:57:19 +00001640 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001641
Brian Paul3c634522002-10-24 23:57:19 +00001642 /* If the driver wants core Mesa to use special imports, it'll have to
1643 * override these defaults.
1644 */
1645 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001646
Brian Paul9a33a112002-06-13 04:28:29 +00001647 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001648 _mesa_init_default_exports( &(ctx->exports) );
1649
1650 /* misc one-time initializations */
1651 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001652
Brian Paul3c634522002-10-24 23:57:19 +00001653 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001654 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001655 ctx->DrawBuffer = NULL;
1656 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001657
Brian Paula3f13702003-04-01 16:41:50 +00001658 /* Set these pointers to defaults now in case they're not set since
1659 * we need them while creating the default textures.
1660 */
1661 if (!ctx->Driver.NewTextureObject)
1662 ctx->Driver.NewTextureObject = _mesa_new_texture_object;
1663 if (!ctx->Driver.DeleteTexture)
1664 ctx->Driver.DeleteTexture = _mesa_delete_texture_object;
1665 if (!ctx->Driver.NewTextureImage)
1666 ctx->Driver.NewTextureImage = _mesa_new_texture_image;
1667
jtgafb833d1999-08-19 00:55:39 +00001668 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001669 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001670 ctx->Shared = share_list->Shared;
1671 }
1672 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001673 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001674 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001675 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001676 }
1677 }
Brian Paul9560f052000-01-31 23:11:39 +00001678 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001679 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001680 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001681
Brian Paul4d053dd2000-01-14 04:45:47 +00001682 init_attrib_groups( ctx );
1683
Brian Paulb6bcae52001-01-23 23:39:36 +00001684 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001685 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001686 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001687 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001688 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001689 }
1690 else {
1691 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001692 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001693 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001694 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001695 }
1696
jtgafb833d1999-08-19 00:55:39 +00001697 if (!alloc_proxy_textures(ctx)) {
1698 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001699 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001700 }
jtgafb833d1999-08-19 00:55:39 +00001701
Brian Paul8ad10762002-10-11 17:41:03 +00001702 /*
1703 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1704 * Basically, we should add all extension functions above offset 577.
1705 * This enables older libGL libraries to work with newer drivers that
1706 * have newer extensions.
1707 */
1708 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1709 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1710 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1711 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1712 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1713 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1714 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1715 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1716 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1717 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1718 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1719 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1720 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1721 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1722 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1723 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1724 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1725 /* new extension functions */
1726 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1727 _glapi_add_entrypoint("glBindProgramNV", 579);
1728 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1729 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1730 _glapi_add_entrypoint("glGenProgramsNV", 582);
1731 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1732 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1733 _glapi_add_entrypoint("glGetProgramivNV", 585);
1734 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1735 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1736 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1737 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1738 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1739 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1740 _glapi_add_entrypoint("glIsProgramNV", 592);
1741 _glapi_add_entrypoint("glLoadProgramNV", 593);
1742 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1743 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1744 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1745 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1746 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1747 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1748 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1749 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1750 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1751 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1752 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1753 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1754 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1755 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1756 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1757 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1758 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1759 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1760 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1761 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1762 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1763 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1764 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1765 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1766 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1767 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1768 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1769 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1770 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1771 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1772 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1773 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1774 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1775 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1776 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1777 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1778 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1779 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1780 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1781 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1782 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1783 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1784 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1785 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1786 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1787 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1788 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1789 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1790 _glapi_add_entrypoint("glPointParameteriNV", 642);
1791 _glapi_add_entrypoint("glPointParameterivNV", 643);
1792 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1793 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1794 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1795 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1796 _glapi_add_entrypoint("glGenFencesNV", 648);
1797 _glapi_add_entrypoint("glIsFenceNV", 649);
1798 _glapi_add_entrypoint("glTestFenceNV", 650);
1799 _glapi_add_entrypoint("glGetFenceivNV", 651);
1800 _glapi_add_entrypoint("glFinishFenceNV", 652);
1801 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paula3f13702003-04-01 16:41:50 +00001802 /* XXX add NV_fragment_program and ARB_vertex_program functions */
Brian Paulf59afc92000-05-23 23:23:00 +00001803
Brian Paul5fb84d22000-05-24 15:04:45 +00001804 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1805 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1806 * Mesa we do this to accomodate different versions of libGL and various
1807 * DRI drivers.
1808 */
1809 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1810 sizeof(struct _glapi_table) / sizeof(void *));
1811
Brian Paulfbd8f211999-11-11 01:22:25 +00001812 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001813 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1814 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001815 if (!ctx->Exec || !ctx->Save) {
1816 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001817 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001818 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001819 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001820 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1821 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001822 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001823
Keith Whitwellad2ac212000-11-24 10:25:05 +00001824 ctx->ExecPrefersFloat = GL_FALSE;
1825 ctx->SavePrefersFloat = GL_FALSE;
1826
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001827 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001828 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001829 ctx->TnlModule.Current = NULL;
1830 ctx->TnlModule.SwapCount = 0;
1831
Brian Paulb6bcae52001-01-23 23:39:36 +00001832 /* Z buffer stuff */
1833 if (ctx->Visual.depthBits == 0) {
1834 /* Special case. Even if we don't have a depth buffer we need
1835 * good values for DepthMax for Z vertex transformation purposes
1836 * and for per-fragment fog computation.
1837 */
1838 ctx->DepthMax = 1 << 16;
1839 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1840 }
1841 else if (ctx->Visual.depthBits < 32) {
1842 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1843 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1844 }
1845 else {
1846 /* Special case since shift values greater than or equal to the
1847 * number of bits in the left hand expression's type are undefined.
1848 */
1849 ctx->DepthMax = 0xffffffff;
1850 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1851 }
Brian Paulbc920f02001-05-07 16:32:51 +00001852 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001853
Brian Paul3c634522002-10-24 23:57:19 +00001854 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001855 if (c)
1856 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001857
Brian Paul3c634522002-10-24 23:57:19 +00001858 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001859 if (c)
1860 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001861
Brian Paul4d053dd2000-01-14 04:45:47 +00001862 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001863}
1864
jtgafb833d1999-08-19 00:55:39 +00001865
1866
1867/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001868 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001869 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001870 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001871 * driver_ctx - pointer to device driver's context state struct
1872 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001873 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001874 */
Brian Paul178a1c52000-04-22 01:05:00 +00001875GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001876_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001877 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001878 void *driver_ctx,
1879 GLboolean direct )
1880
Brian Paul4d053dd2000-01-14 04:45:47 +00001881{
Brian Paul4753d602002-06-15 02:38:15 +00001882 GLcontext *ctx;
1883
1884 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001885 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001886
Brian Paul3c634522002-10-24 23:57:19 +00001887 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001888 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001889 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001890
Brian Paul3c634522002-10-24 23:57:19 +00001891 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001892 return ctx;
1893 }
1894 else {
Brian Paul3c634522002-10-24 23:57:19 +00001895 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001896 return NULL;
1897 }
1898}
1899
1900
1901
1902/*
1903 * Free the data associated with the given context.
1904 * But don't free() the GLcontext struct itself!
1905 */
Brian Paul178a1c52000-04-22 01:05:00 +00001906void
Brian Paulb1394fa2000-09-26 20:53:53 +00001907_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001908{
Brian Paul4d053dd2000-01-14 04:45:47 +00001909 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001910 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001911
1912 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001913 if (ctx == _mesa_get_current_context()) {
1914 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001915 }
1916
Brian Paul30f51ae2001-12-18 04:06:44 +00001917 /*
1918 * Free transformation matrix stacks
1919 */
1920 free_matrix_stack(&ctx->ModelviewMatrixStack);
1921 free_matrix_stack(&ctx->ProjectionMatrixStack);
1922 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001923 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001924 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1925 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1926 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1927 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001928 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1929
Brian Paul30f51ae2001-12-18 04:06:44 +00001930
Brian Paul8dfc5b92002-10-16 17:57:51 +00001931#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001932 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001933 ctx->VertexProgram.Current->Base.RefCount--;
1934 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
1935 _mesa_delete_program(ctx, ctx->VertexProgram.Current->Base.Id);
1936 }
1937#endif
1938#if FEATURE_NV_fragment_program
1939 if (ctx->FragmentProgram.Current) {
1940 ctx->FragmentProgram.Current->Base.RefCount--;
1941 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
1942 _mesa_delete_program(ctx, ctx->FragmentProgram.Current->Base.Id);
Brian Paulfd284452001-07-19 15:54:34 +00001943 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001944#endif
Brian Paulfd284452001-07-19 15:54:34 +00001945
Brian Paul30f51ae2001-12-18 04:06:44 +00001946 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001947 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001948 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001949 assert(ctx->Shared->RefCount >= 0);
1950 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1951 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001952 /* free shared state */
1953 free_shared_state( ctx, ctx->Shared );
1954 }
1955
Brian Paul30f51ae2001-12-18 04:06:44 +00001956 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001957 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001958 FREE( s );
1959 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001960 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001961
1962 /* Free proxy texture objects */
Brian Paula3f13702003-04-01 16:41:50 +00001963 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
1964 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
1965 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
1966 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
1967 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00001968
Brian Paul45b47d02003-01-26 14:37:15 +00001969 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
1970 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
1971
Brian Paul4d053dd2000-01-14 04:45:47 +00001972 /* Free evaluator data */
1973 if (ctx->EvalMap.Map1Vertex3.Points)
1974 FREE( ctx->EvalMap.Map1Vertex3.Points );
1975 if (ctx->EvalMap.Map1Vertex4.Points)
1976 FREE( ctx->EvalMap.Map1Vertex4.Points );
1977 if (ctx->EvalMap.Map1Index.Points)
1978 FREE( ctx->EvalMap.Map1Index.Points );
1979 if (ctx->EvalMap.Map1Color4.Points)
1980 FREE( ctx->EvalMap.Map1Color4.Points );
1981 if (ctx->EvalMap.Map1Normal.Points)
1982 FREE( ctx->EvalMap.Map1Normal.Points );
1983 if (ctx->EvalMap.Map1Texture1.Points)
1984 FREE( ctx->EvalMap.Map1Texture1.Points );
1985 if (ctx->EvalMap.Map1Texture2.Points)
1986 FREE( ctx->EvalMap.Map1Texture2.Points );
1987 if (ctx->EvalMap.Map1Texture3.Points)
1988 FREE( ctx->EvalMap.Map1Texture3.Points );
1989 if (ctx->EvalMap.Map1Texture4.Points)
1990 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001991 for (i = 0; i < 16; i++)
1992 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00001993
1994 if (ctx->EvalMap.Map2Vertex3.Points)
1995 FREE( ctx->EvalMap.Map2Vertex3.Points );
1996 if (ctx->EvalMap.Map2Vertex4.Points)
1997 FREE( ctx->EvalMap.Map2Vertex4.Points );
1998 if (ctx->EvalMap.Map2Index.Points)
1999 FREE( ctx->EvalMap.Map2Index.Points );
2000 if (ctx->EvalMap.Map2Color4.Points)
2001 FREE( ctx->EvalMap.Map2Color4.Points );
2002 if (ctx->EvalMap.Map2Normal.Points)
2003 FREE( ctx->EvalMap.Map2Normal.Points );
2004 if (ctx->EvalMap.Map2Texture1.Points)
2005 FREE( ctx->EvalMap.Map2Texture1.Points );
2006 if (ctx->EvalMap.Map2Texture2.Points)
2007 FREE( ctx->EvalMap.Map2Texture2.Points );
2008 if (ctx->EvalMap.Map2Texture3.Points)
2009 FREE( ctx->EvalMap.Map2Texture3.Points );
2010 if (ctx->EvalMap.Map2Texture4.Points)
2011 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002012 for (i = 0; i < 16; i++)
2013 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002014
Brian Paul4bdcfe52000-04-17 17:57:04 +00002015 _mesa_free_colortable_data( &ctx->ColorTable );
2016 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2017 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2018 _mesa_free_colortable_data( &ctx->Texture.Palette );
2019
Brian Paulfd284452001-07-19 15:54:34 +00002020 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2021
Brian Paul69755402001-02-26 23:58:12 +00002022 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002023
2024 FREE(ctx->Exec);
2025 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002026}
2027
2028
2029
2030/*
2031 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002032 */
Brian Paul178a1c52000-04-22 01:05:00 +00002033void
Brian Paulb1394fa2000-09-26 20:53:53 +00002034_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002035{
2036 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002037 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002038 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002039 }
2040}
2041
2042
2043
2044/*
jtgafb833d1999-08-19 00:55:39 +00002045 * Copy attribute groups from one context to another.
2046 * Input: src - source context
2047 * dst - destination context
2048 * mask - bitwise OR of GL_*_BIT flags
2049 */
Brian Paul178a1c52000-04-22 01:05:00 +00002050void
Brian Paulb1394fa2000-09-26 20:53:53 +00002051_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002052{
2053 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002054 /* OK to memcpy */
2055 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002056 }
2057 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002058 /* OK to memcpy */
2059 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002060 }
2061 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002062 /* OK to memcpy */
2063 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002064 }
2065 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002066 /* OK to memcpy */
2067 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002068 }
2069 if (mask & GL_ENABLE_BIT) {
2070 /* no op */
2071 }
2072 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002073 /* OK to memcpy */
2074 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002075 }
2076 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002077 /* OK to memcpy */
2078 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002079 }
2080 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002081 /* OK to memcpy */
2082 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002083 }
2084 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002085 GLuint i;
2086 /* begin with memcpy */
2087 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2088 /* fixup linked lists to prevent pointer insanity */
2089 make_empty_list( &(dst->Light.EnabledList) );
2090 for (i = 0; i < MAX_LIGHTS; i++) {
2091 if (dst->Light.Light[i].Enabled) {
2092 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2093 }
2094 }
jtgafb833d1999-08-19 00:55:39 +00002095 }
2096 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002097 /* OK to memcpy */
2098 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002099 }
2100 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002101 /* OK to memcpy */
2102 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002103 }
2104 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002105 /* OK to memcpy */
2106 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002107 }
2108 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002109 /* OK to memcpy */
2110 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002111 }
2112 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002113 /* OK to memcpy */
2114 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002115 }
2116 if (mask & GL_POLYGON_STIPPLE_BIT) {
2117 /* Use loop instead of MEMCPY due to problem with Portland Group's
2118 * C compiler. Reported by John Stone.
2119 */
Brian Paul85d81602002-06-17 23:36:31 +00002120 GLuint i;
2121 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002122 dst->PolygonStipple[i] = src->PolygonStipple[i];
2123 }
2124 }
2125 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002126 /* OK to memcpy */
2127 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002128 }
2129 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002130 /* OK to memcpy */
2131 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002132 }
2133 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002134 /* Cannot memcpy because of pointers */
2135 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002136 }
2137 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002138 /* OK to memcpy */
2139 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002140 }
2141 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002142 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2143 dst->Viewport.X = src->Viewport.X;
2144 dst->Viewport.Y = src->Viewport.Y;
2145 dst->Viewport.Width = src->Viewport.Width;
2146 dst->Viewport.Height = src->Viewport.Height;
2147 dst->Viewport.Near = src->Viewport.Near;
2148 dst->Viewport.Far = src->Viewport.Far;
2149 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002150 }
Brian Paul85d81602002-06-17 23:36:31 +00002151
Keith Whitwella96308c2000-10-30 13:31:59 +00002152 /* XXX FIXME: Call callbacks?
2153 */
2154 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002155}
2156
2157
Brian Paul00037781999-12-17 14:52:35 +00002158
Keith Whitwell23caf202000-11-16 21:05:34 +00002159static void print_info( void )
2160{
Brian Paul4e9676f2002-06-29 19:48:15 +00002161 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002162 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002163 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002164 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002165 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002166 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002167 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002168 (char *) _mesa_GetString(GL_EXTENSIONS));
2169#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002170 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002171#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002172 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002173#endif
2174#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002175 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002176#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002177 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002178#endif
davem69e4f84b42001-06-05 03:58:20 +00002179#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002180 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002181#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002182 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002183#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002184}
2185
2186
Brian Paul00037781999-12-17 14:52:35 +00002187/*
Brian Paul9a33a112002-06-13 04:28:29 +00002188 * Set the current context, binding the given frame buffer to the context.
2189 */
2190void
2191_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2192{
2193 _mesa_make_current2( newCtx, buffer, buffer );
2194}
2195
2196
2197/*
Brian Paul00037781999-12-17 14:52:35 +00002198 * Bind the given context to the given draw-buffer and read-buffer
2199 * and make it the current context for this thread.
2200 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002201void
2202_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2203 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002204{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002205 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002206 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002207
Brian Paulbe3602d2001-02-28 00:27:48 +00002208 /* Check that the context's and framebuffer's visuals are compatible.
2209 * We could do a lot more checking here but this'll catch obvious
2210 * problems.
2211 */
2212 if (newCtx && drawBuffer && readBuffer) {
2213 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2214 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2215 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2216 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2217 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2218 return; /* incompatible */
2219 }
2220 }
2221
Brian Paul00037781999-12-17 14:52:35 +00002222 /* We call this function periodically (just here for now) in
2223 * order to detect when multithreading has begun.
2224 */
2225 _glapi_check_multithread();
2226
Brian Paulf9b97d92000-01-28 20:17:42 +00002227 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002228 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002229
2230
2231 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002232 _glapi_set_dispatch(NULL); /* none current */
2233 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002234 else {
2235 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002236
Keith Whitwell23caf202000-11-16 21:05:34 +00002237 if (drawBuffer && readBuffer) {
2238 /* TODO: check if newCtx and buffer's visual match??? */
2239 newCtx->DrawBuffer = drawBuffer;
2240 newCtx->ReadBuffer = readBuffer;
2241 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002242
2243 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2244 /* get initial window size */
2245 GLuint bufWidth, bufHeight;
2246
2247 /* ask device driver for size of output buffer */
2248 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2249
2250 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2251 return; /* size is as expected */
2252
2253 drawBuffer->Width = bufWidth;
2254 drawBuffer->Height = bufHeight;
2255
2256 newCtx->Driver.ResizeBuffers( drawBuffer );
2257 }
2258
2259 if (readBuffer != drawBuffer &&
2260 readBuffer->Width == 0 && readBuffer->Height == 0) {
2261 /* get initial window size */
2262 GLuint bufWidth, bufHeight;
2263
2264 /* ask device driver for size of output buffer */
2265 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2266
2267 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2268 return; /* size is as expected */
2269
2270 readBuffer->Width = bufWidth;
2271 readBuffer->Height = bufHeight;
2272
2273 newCtx->Driver.ResizeBuffers( readBuffer );
2274 }
Brian Paul00037781999-12-17 14:52:35 +00002275 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002276
Brian Paul8816c702002-06-16 01:10:41 +00002277 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002278 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002279 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2280
2281 /* We can use this to help debug user's problems. Tell them to set
2282 * the MESA_INFO env variable before running their app. Then the
2283 * first time each context is made current we'll print some useful
2284 * information.
2285 */
2286 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002287 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002288 print_info();
2289 }
2290 newCtx->FirstTimeCurrent = GL_FALSE;
2291 }
Brian Paul00037781999-12-17 14:52:35 +00002292 }
2293}
2294
2295
2296
2297/*
2298 * Return current context handle for the calling thread.
2299 * This isn't the fastest way to get the current context.
2300 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2301 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002302GLcontext *
2303_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002304{
Brian Paulf9b97d92000-01-28 20:17:42 +00002305 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002306}
2307
2308
Brian Paulfbd8f211999-11-11 01:22:25 +00002309/*
2310 * Return pointer to this context's current API dispatch table.
2311 * It'll either be the immediate-mode execute dispatcher or the
2312 * display list compile dispatcher.
2313 */
2314struct _glapi_table *
2315_mesa_get_dispatch(GLcontext *ctx)
2316{
2317 return ctx->CurrentDispatch;
2318}
2319
2320
2321
jtgafb833d1999-08-19 00:55:39 +00002322/**********************************************************************/
2323/***** Miscellaneous functions *****/
2324/**********************************************************************/
2325
2326
2327/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002328 * Record the given error code and call the driver's Error function if defined.
2329 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002330 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002331void
Brian Paul4e9676f2002-06-29 19:48:15 +00002332_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002333{
Brian Paul18a285a2002-03-16 00:53:15 +00002334 if (!ctx)
2335 return;
2336
Brian Paul7eb06032000-07-14 04:13:40 +00002337 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002338 ctx->ErrorValue = error;
2339 }
2340
2341 /* Call device driver's error handler, if any. This is used on the Mac. */
2342 if (ctx->Driver.Error) {
2343 (*ctx->Driver.Error)( ctx );
2344 }
2345}
2346
2347
Brian Paulfa9df402000-02-02 19:16:46 +00002348void
2349_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002350{
Brian Paulfa9df402000-02-02 19:16:46 +00002351 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002352 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002353 if (ctx->Driver.Finish) {
2354 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002355 }
2356}
2357
2358
2359
Brian Paulfa9df402000-02-02 19:16:46 +00002360void
2361_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002362{
Brian Paulfa9df402000-02-02 19:16:46 +00002363 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002364 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002365 if (ctx->Driver.Flush) {
2366 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002367 }
jtgafb833d1999-08-19 00:55:39 +00002368}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002369
2370
2371
Keith Whitwellcab974c2000-12-26 05:09:27 +00002372const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002373 "GL_POINTS",
2374 "GL_LINES",
2375 "GL_LINE_LOOP",
2376 "GL_LINE_STRIP",
2377 "GL_TRIANGLES",
2378 "GL_TRIANGLE_STRIP",
2379 "GL_TRIANGLE_FAN",
2380 "GL_QUADS",
2381 "GL_QUAD_STRIP",
2382 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002383 "outside begin/end",
2384 "inside unkown primitive",
2385 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002386};