blob: 88dea9e1db5fa188abb16c3a7b1a52ad1015af58 [file] [log] [blame]
Brian Paul451f3102003-04-17 01:48:19 +00001/* $Id: context.c,v 1.199 2003/04/17 01:48:20 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paul3a212032002-11-19 15:25:00 +00005 * Version: 5.1
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paulbc42c192002-01-05 21:53:20 +00007 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
Brian Paulfbd8f211999-11-11 01:22:25 +000028#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000029#include "imports.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000030#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000032#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000034#include "dlist.h"
35#include "eval.h"
36#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000037#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000038#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000039#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000040#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "hash.h"
42#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "macros.h"
jtgafb833d1999-08-19 00:55:39 +000044#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000045#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000046#include "teximage.h"
47#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000048#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000049#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000050#include "varray.h"
Brian Paul3a212032002-11-19 15:25:00 +000051#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +000052#include "nvprogram.h"
53#include "nvvertprog.h"
54#endif
55#if FEATURE_NV_fragment_program
56#include "nvfragprog.h"
Brian Paul3a212032002-11-19 15:25:00 +000057#endif
Gareth Hughesd4eb6652001-03-12 01:32:20 +000058#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000059#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000060#include "math/m_matrix.h"
61#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000062#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000063
jtgafb833d1999-08-19 00:55:39 +000064
Brian Paul3b18a362000-09-26 15:27:20 +000065#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000066#include "Trace/tr_context.h"
67#include "Trace/tr_wrapper.h"
68#endif
69
davem69775355a2001-06-05 23:54:00 +000070#ifdef USE_SPARC_ASM
71#include "SPARC/sparc.h"
72#endif
jtgafb833d1999-08-19 00:55:39 +000073
Keith Whitwell23caf202000-11-16 21:05:34 +000074#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000075int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000076#endif
77
78#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000079int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000080#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000081
Brian Paul86b84272001-12-14 02:50:01 +000082
Brian Paul27558a12003-03-01 01:50:20 +000083/* ubyte -> float conversion */
84GLfloat _mesa_ubyte_to_float_color_tab[256];
85
Brian Paul9a33a112002-06-13 04:28:29 +000086static void
87free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
88
Brian Paul86b84272001-12-14 02:50:01 +000089
Brian Paulb1394fa2000-09-26 20:53:53 +000090/**********************************************************************/
91/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
92/**********************************************************************/
93
Brian Paul9a33a112002-06-13 04:28:29 +000094/* Called by window system/device driver (via gc->exports.destroyCurrent())
95 * when the rendering context is to be destroyed.
96 */
97GLboolean
98_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000099{
100 if (gc) {
101 _mesa_free_context_data(gc);
Brian Paul3c634522002-10-24 23:57:19 +0000102 _mesa_free(gc);
Brian Paulb1394fa2000-09-26 20:53:53 +0000103 }
104 return GL_TRUE;
105}
106
Brian Paul9a33a112002-06-13 04:28:29 +0000107/* Called by window system/device driver (via gc->exports.loseCurrent())
108 * when the rendering context is made non-current.
109 */
110GLboolean
111_mesa_loseCurrent(__GLcontext *gc)
112{
113 /* XXX unbind context from thread */
114 return GL_TRUE;
115}
116
117/* Called by window system/device driver (via gc->exports.makeCurrent())
118 * when the rendering context is made current.
119 */
120GLboolean
121_mesa_makeCurrent(__GLcontext *gc)
122{
123 /* XXX bind context to thread */
124 return GL_TRUE;
125}
126
127/* Called by window system/device driver - yadda, yadda, yadda.
128 * See above comments.
129 */
130GLboolean
131_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
132{
133 if (gc && gcShare && gc->Shared && gcShare->Shared) {
134 gc->Shared->RefCount--;
135 if (gc->Shared->RefCount == 0) {
136 free_shared_state(gc, gc->Shared);
137 }
138 gc->Shared = gcShare->Shared;
139 gc->Shared->RefCount++;
140 return GL_TRUE;
141 }
142 else {
143 return GL_FALSE;
144 }
145}
146
147GLboolean
148_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
149{
150 if (dst && src) {
151 _mesa_copy_context( src, dst, mask );
152 return GL_TRUE;
153 }
154 else {
155 return GL_FALSE;
156 }
157}
158
159GLboolean
160_mesa_forceCurrent(__GLcontext *gc)
161{
162 return GL_TRUE;
163}
164
165GLboolean
166_mesa_notifyResize(__GLcontext *gc)
167{
168 GLint x, y;
169 GLuint width, height;
170 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
171 if (!d || !d->getDrawableSize)
172 return GL_FALSE;
173 d->getDrawableSize( d, &x, &y, &width, &height );
174 /* update viewport, resize software buffers, etc. */
175 return GL_TRUE;
176}
177
178void
179_mesa_notifyDestroy(__GLcontext *gc)
180{
Brian Paul60b6e4f2002-10-14 17:08:17 +0000181 /* Called when the context's window/buffer is going to be destroyed. */
182 /* Unbind from it. */
Brian Paul9a33a112002-06-13 04:28:29 +0000183}
184
185/* Called by window system just before swapping buffers.
186 * We have to finish any pending rendering.
187 */
188void
189_mesa_notifySwapBuffers(__GLcontext *gc)
190{
191 FLUSH_VERTICES( gc, 0 );
192}
193
194struct __GLdispatchStateRec *
195_mesa_dispatchExec(__GLcontext *gc)
196{
197 return NULL;
198}
199
200void
201_mesa_beginDispatchOverride(__GLcontext *gc)
202{
203}
204
205void
206_mesa_endDispatchOverride(__GLcontext *gc)
207{
208}
209
210/* Setup the exports. The window system will call these functions
211 * when it needs Mesa to do something.
212 * NOTE: Device drivers should override these functions! For example,
213 * the Xlib driver should plug in the XMesa*-style functions into this
214 * structure. The XMesa-style functions should then call the _mesa_*
215 * version of these functions. This is an approximation to OO design
216 * (inheritance and virtual functions).
217 */
218static void
219_mesa_init_default_exports(__GLexports *exports)
220{
221 exports->destroyContext = _mesa_destroyContext;
222 exports->loseCurrent = _mesa_loseCurrent;
223 exports->makeCurrent = _mesa_makeCurrent;
224 exports->shareContext = _mesa_shareContext;
225 exports->copyContext = _mesa_copyContext;
226 exports->forceCurrent = _mesa_forceCurrent;
227 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000228 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000229 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
230 exports->dispatchExec = _mesa_dispatchExec;
231 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
232 exports->endDispatchOverride = _mesa_endDispatchOverride;
233}
234
235
Brian Paulb1394fa2000-09-26 20:53:53 +0000236
237/* exported OpenGL SI interface */
238__GLcontext *
239__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
240{
241 GLcontext *ctx;
242
Brian Paul4753d602002-06-15 02:38:15 +0000243 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000244 if (ctx == NULL) {
245 return NULL;
246 }
Brian Paul60b6e4f2002-10-14 17:08:17 +0000247
Brian Paul3c634522002-10-24 23:57:19 +0000248 _mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000249 ctx->imports = *imports;
Brian Paulb1394fa2000-09-26 20:53:53 +0000250
251 return ctx;
252}
253
254
255/* exported OpenGL SI interface */
256void
257__glCoreNopDispatch(void)
258{
259#if 0
260 /* SI */
261 __gl_dispatch = __glNopDispatchState;
262#else
263 /* Mesa */
264 _glapi_set_dispatch(NULL);
265#endif
266}
267
268
jtgafb833d1999-08-19 00:55:39 +0000269/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000270/***** GL Visual allocation/destruction *****/
271/**********************************************************************/
272
273
274/*
275 * Allocate a new GLvisual object.
276 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000277 * dbFlag - double buffering?
278 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000279 * depthBits - requested bits per depth buffer value
280 * Any value in [0, 32] is acceptable but the actual
281 * depth type will be GLushort or GLuint as needed.
282 * stencilBits - requested minimum bits per stencil buffer value
283 * accumBits - requested minimum bits per accum buffer component
284 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
285 * red/green/blue/alphaBits - number of bits per color component
286 * in frame buffer for RGB(A) mode.
287 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000288 * Return: pointer to new GLvisual or NULL if requested parameters can't
289 * be met.
290 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000291GLvisual *
292_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000293 GLboolean dbFlag,
294 GLboolean stereoFlag,
295 GLint redBits,
296 GLint greenBits,
297 GLint blueBits,
298 GLint alphaBits,
299 GLint indexBits,
300 GLint depthBits,
301 GLint stencilBits,
302 GLint accumRedBits,
303 GLint accumGreenBits,
304 GLint accumBlueBits,
305 GLint accumAlphaBits,
306 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000307{
Brian Paul178a1c52000-04-22 01:05:00 +0000308 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
309 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000310 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000311 redBits, greenBits, blueBits, alphaBits,
312 indexBits, depthBits, stencilBits,
313 accumRedBits, accumGreenBits,
314 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000315 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000316 FREE(vis);
317 return NULL;
318 }
319 }
320 return vis;
321}
322
323
324/*
325 * Initialize the fields of the given GLvisual.
326 * Input: see _mesa_create_visual() above.
327 * Return: GL_TRUE = success
328 * GL_FALSE = failure.
329 */
330GLboolean
331_mesa_initialize_visual( GLvisual *vis,
332 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000333 GLboolean dbFlag,
334 GLboolean stereoFlag,
335 GLint redBits,
336 GLint greenBits,
337 GLint blueBits,
338 GLint alphaBits,
339 GLint indexBits,
340 GLint depthBits,
341 GLint stencilBits,
342 GLint accumRedBits,
343 GLint accumGreenBits,
344 GLint accumBlueBits,
345 GLint accumAlphaBits,
346 GLint numSamples )
347{
Brian Paulb6bcae52001-01-23 23:39:36 +0000348 (void) numSamples;
349
Brian Paul178a1c52000-04-22 01:05:00 +0000350 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000351
Brian Pauled30dfa2000-03-03 17:47:39 +0000352 /* This is to catch bad values from device drivers not updated for
353 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
354 * bad value now (a 1-bit depth buffer!?!).
355 */
356 assert(depthBits == 0 || depthBits > 1);
357
358 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000359 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000360 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000361 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000362 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000363 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000364 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000365 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000366 }
367 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000368 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000369 }
370 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000371 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000372 }
373 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000374 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000375 }
376
Brian Paulb6bcae52001-01-23 23:39:36 +0000377 vis->rgbMode = rgbFlag;
378 vis->doubleBufferMode = dbFlag;
379 vis->stereoMode = stereoFlag;
Brian Paul153f1542002-10-29 15:04:35 +0000380
Brian Paulb6bcae52001-01-23 23:39:36 +0000381 vis->redBits = redBits;
382 vis->greenBits = greenBits;
383 vis->blueBits = blueBits;
384 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000385
Brian Paulb6bcae52001-01-23 23:39:36 +0000386 vis->indexBits = indexBits;
387 vis->depthBits = depthBits;
388 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
389 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
390 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
391 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
392 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000393
Brian Paul153f1542002-10-29 15:04:35 +0000394 vis->haveAccumBuffer = accumRedBits > 0;
395 vis->haveDepthBuffer = depthBits > 0;
396 vis->haveStencilBuffer = stencilBits > 0;
397
398 vis->numAuxBuffers = 0;
399 vis->level = 0;
400 vis->pixmapMode = 0;
401
Brian Paul178a1c52000-04-22 01:05:00 +0000402 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000403}
404
405
Brian Paulb371e0d2000-03-31 01:05:51 +0000406void
407_mesa_destroy_visual( GLvisual *vis )
408{
409 FREE(vis);
410}
411
412
Brian Paul4d053dd2000-01-14 04:45:47 +0000413/**********************************************************************/
414/***** GL Framebuffer allocation/destruction *****/
415/**********************************************************************/
416
417
418/*
419 * Create a new framebuffer. A GLframebuffer is a struct which
420 * encapsulates the depth, stencil and accum buffers and related
421 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000422 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000423 * softwareDepth - create/use a software depth buffer?
424 * softwareStencil - create/use a software stencil buffer?
425 * softwareAccum - create/use a software accum buffer?
426 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000427 * Return: pointer to new GLframebuffer struct or NULL if error.
428 */
Brian Paul178a1c52000-04-22 01:05:00 +0000429GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000430_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000431 GLboolean softwareDepth,
432 GLboolean softwareStencil,
433 GLboolean softwareAccum,
434 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000435{
Brian Paul178a1c52000-04-22 01:05:00 +0000436 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
437 assert(visual);
438 if (buffer) {
439 _mesa_initialize_framebuffer(buffer, visual,
440 softwareDepth, softwareStencil,
441 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000442 }
Brian Paul178a1c52000-04-22 01:05:00 +0000443 return buffer;
444}
445
446
447/*
448 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000449 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000450 */
451void
452_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000453 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000454 GLboolean softwareDepth,
455 GLboolean softwareStencil,
456 GLboolean softwareAccum,
457 GLboolean softwareAlpha )
458{
459 assert(buffer);
460 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000461
Brian Paul6ec6b842002-10-30 19:49:29 +0000462 _mesa_bzero(buffer, sizeof(GLframebuffer));
Brian Paul85d81602002-06-17 23:36:31 +0000463
Brian Paul4d053dd2000-01-14 04:45:47 +0000464 /* sanity checks */
465 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000466 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000467 }
468 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000469 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000470 }
471 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000472 assert(visual->rgbMode);
473 assert(visual->accumRedBits > 0);
474 assert(visual->accumGreenBits > 0);
475 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000476 }
477 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000478 assert(visual->rgbMode);
479 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000480 }
481
Brian Paul75978bd2001-04-27 21:17:20 +0000482 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000483 buffer->UseSoftwareDepthBuffer = softwareDepth;
484 buffer->UseSoftwareStencilBuffer = softwareStencil;
485 buffer->UseSoftwareAccumBuffer = softwareAccum;
486 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000487}
488
489
Brian Paul4d053dd2000-01-14 04:45:47 +0000490/*
491 * Free a framebuffer struct and its buffers.
492 */
Brian Paul178a1c52000-04-22 01:05:00 +0000493void
Brian Paulb1394fa2000-09-26 20:53:53 +0000494_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000495{
496 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000497 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000498 FREE(buffer);
499 }
500}
501
502
Brian Paul75978bd2001-04-27 21:17:20 +0000503/*
504 * Free the data hanging off of <buffer>, but not <buffer> itself.
505 */
506void
507_mesa_free_framebuffer_data( GLframebuffer *buffer )
508{
509 if (!buffer)
510 return;
511
512 if (buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000513 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000514 buffer->DepthBuffer = NULL;
515 }
516 if (buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000517 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000518 buffer->Accum = NULL;
519 }
520 if (buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000521 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000522 buffer->Stencil = NULL;
523 }
524 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000525 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000526 buffer->FrontLeftAlpha = NULL;
527 }
528 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000529 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000530 buffer->BackLeftAlpha = NULL;
531 }
532 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000533 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000534 buffer->FrontRightAlpha = NULL;
535 }
536 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000537 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000538 buffer->BackRightAlpha = NULL;
539 }
540}
541
542
Brian Paul4d053dd2000-01-14 04:45:47 +0000543
544/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000545/***** Context allocation, initialization, destroying *****/
546/**********************************************************************/
547
548
Brian Paul9560f052000-01-31 23:11:39 +0000549_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
550
551
jtgafb833d1999-08-19 00:55:39 +0000552/*
553 * This function just calls all the various one-time-init functions in Mesa.
554 */
Brian Paul178a1c52000-04-22 01:05:00 +0000555static void
Brian Paul4753d602002-06-15 02:38:15 +0000556one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000557{
558 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000559 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000560 if (!alreadyCalled) {
Brian Paul27558a12003-03-01 01:50:20 +0000561 GLuint i;
562
Brian Paul4d053dd2000-01-14 04:45:47 +0000563 /* do some implementation tests */
564 assert( sizeof(GLbyte) == 1 );
565 assert( sizeof(GLshort) >= 2 );
566 assert( sizeof(GLint) >= 4 );
567 assert( sizeof(GLubyte) == 1 );
568 assert( sizeof(GLushort) >= 2 );
569 assert( sizeof(GLuint) >= 4 );
570
Brian Paul08836342001-03-03 20:33:27 +0000571 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000572
Keith Whitwell23caf202000-11-16 21:05:34 +0000573 _math_init();
Brian Paul27558a12003-03-01 01:50:20 +0000574
575 for (i = 0; i < 256; i++) {
576 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
577 }
Brian Paul68ee4bc2000-01-28 19:02:22 +0000578
davem69775355a2001-06-05 23:54:00 +0000579#ifdef USE_SPARC_ASM
580 _mesa_init_sparc_glapi_relocs();
581#endif
Brian Paul3c634522002-10-24 23:57:19 +0000582 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000583 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000584#ifndef GLX_DIRECT_RENDERING
585 /* libGL from before 2002/06/28 don't have this function. Someday,
586 * when newer libGL libs are common, remove the #ifdef test. This
587 * only serves to print warnings when calling undefined GL functions.
588 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000589 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000590#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000591 }
592 else {
593 _glapi_noop_enable_warnings(GL_FALSE);
594 }
595
jtgafb833d1999-08-19 00:55:39 +0000596#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000597 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000598#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000599
600 alreadyCalled = GL_TRUE;
601 }
Brian Paul9560f052000-01-31 23:11:39 +0000602 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000603}
604
605
Brian Paul86b84272001-12-14 02:50:01 +0000606static void
607init_matrix_stack( struct matrix_stack *stack,
608 GLuint maxDepth, GLuint dirtyFlag )
609{
610 GLuint i;
611
612 stack->Depth = 0;
613 stack->MaxDepth = maxDepth;
614 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000615 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000616 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000617 for (i = 0; i < maxDepth; i++) {
618 _math_matrix_ctr(&stack->Stack[i]);
619 _math_matrix_alloc_inv(&stack->Stack[i]);
620 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000621 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000622}
623
624
625static void
626free_matrix_stack( struct matrix_stack *stack )
627{
628 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000629 for (i = 0; i < stack->MaxDepth; i++) {
630 _math_matrix_dtr(&stack->Stack[i]);
631 }
Brian Paulc4afba32002-02-05 23:21:45 +0000632 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000633 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000634}
635
Brian Paul4d053dd2000-01-14 04:45:47 +0000636
jtgafb833d1999-08-19 00:55:39 +0000637/*
638 * Allocate and initialize a shared context state structure.
639 */
Brian 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 Paul451f3102003-04-17 01:48:19 +0000653#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_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 Paul451f3102003-04-17 01:48:19 +0000657#if FEATURE_ARB_vertex_program
658 ss->DefaultVertexProgram = _mesa_alloc_program(ctx, GL_VERTEX_PROGRAM_ARB, 0);
659 if (!ss->DefaultVertexProgram)
660 goto cleanup;
661#endif
662#if FEATURE_ARB_fragment_program
663 ss->DefaultFragmentProgram = _mesa_alloc_program(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
664 if (!ss->DefaultFragmentProgram)
665 goto cleanup;
666#endif
667
Brian Paula3f13702003-04-01 16:41:50 +0000668 ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
669 if (!ss->Default1D)
670 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000671
Brian Paula3f13702003-04-01 16:41:50 +0000672 ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
673 if (!ss->Default2D)
674 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +0000675
Brian Paula3f13702003-04-01 16:41:50 +0000676 ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
677 if (!ss->Default3D)
678 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000679
Brian Paula3f13702003-04-01 16:41:50 +0000680 ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
681 if (!ss->DefaultCubeMap)
682 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000683
Brian Paula3f13702003-04-01 16:41:50 +0000684 ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
685 if (!ss->DefaultRect)
686 goto cleanup;
Brian Paul413d6a22000-05-26 14:44:59 +0000687
Brian Paula3f13702003-04-01 16:41:50 +0000688#if 0
689 _mesa_save_texture_object(ctx, ss->Default1D);
690 _mesa_save_texture_object(ctx, ss->Default2D);
691 _mesa_save_texture_object(ctx, ss->Default3D);
692 _mesa_save_texture_object(ctx, ss->DefaultCubeMap);
693 _mesa_save_texture_object(ctx, ss->DefaultRect);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000694#endif
Brian Paula3f13702003-04-01 16:41:50 +0000695
696 /* Effectively bind the default textures to all texture units */
697 ss->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
698 ss->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
699 ss->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
700 ss->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
701 ss->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
702
703 return GL_TRUE;
704
705 cleanup:
706 /* Ran out of memory at some point. Free everything and return NULL */
707 if (ss->DisplayList)
708 _mesa_DeleteHashTable(ss->DisplayList);
709 if (ss->TexObjects)
710 _mesa_DeleteHashTable(ss->TexObjects);
711#if FEATURE_NV_vertex_program
712 if (ss->Programs)
713 _mesa_DeleteHashTable(ss->Programs);
714#endif
Brian Paul451f3102003-04-17 01:48:19 +0000715#if FEATURE_ARB_vertex_program
716 if (ss->DefaultVertexProgram)
717 _mesa_delete_program(ctx, ss->DefaultVertexProgram);
718#endif
719#if FEATURE_ARB_fragment_program
720 if (ss->DefaultFragmentProgram)
721 _mesa_delete_program(ctx, ss->DefaultFragmentProgram);
722#endif
Brian Paula3f13702003-04-01 16:41:50 +0000723 if (ss->Default1D)
724 (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
725 if (ss->Default2D)
726 (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
727 if (ss->Default3D)
728 (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
729 if (ss->DefaultCubeMap)
730 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
731 if (ss->DefaultRect)
732 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
733 if (ss)
734 _mesa_free(ss);
735 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000736}
737
738
739/*
740 * Deallocate a shared state context and all children structures.
741 */
Brian Paul178a1c52000-04-22 01:05:00 +0000742static void
743free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000744{
745 /* Free display lists */
746 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000747 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000748 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000749 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000750 }
751 else {
752 break;
753 }
754 }
Brian Paulbb797902000-01-24 16:19:54 +0000755 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000756
757 /* Free texture objects */
Brian Paula3f13702003-04-01 16:41:50 +0000758 ASSERT(ctx->Driver.DeleteTexture);
759 while (1) {
760 GLuint texName = _mesa_HashFirstEntry(ss->TexObjects);
761 if (texName) {
762 struct gl_texture_object *texObj = (struct gl_texture_object *)
763 _mesa_HashLookup(ss->TexObjects, texName);
764 ASSERT(texObj);
765 (*ctx->Driver.DeleteTexture)(ctx, texObj);
766 _mesa_HashRemove(ss->TexObjects, texName);
767 }
768 else {
769 break;
770 }
jtgafb833d1999-08-19 00:55:39 +0000771 }
Brian Paulbb797902000-01-24 16:19:54 +0000772 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000773
Brian Paul8dfc5b92002-10-16 17:57:51 +0000774#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000775 /* Free vertex programs */
776 while (1) {
Brian Paul610d5992003-01-14 04:55:45 +0000777 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
Brian Paul30f51ae2001-12-18 04:06:44 +0000778 if (prog) {
Brian Paul451f3102003-04-17 01:48:19 +0000779 struct program *p = (struct program *) _mesa_HashLookup(ss->Programs,
780 prog);
781 ASSERT(p);
782 _mesa_delete_program(ctx, p);
783 _mesa_HashRemove(ss->Programs, prog);
Brian Paul30f51ae2001-12-18 04:06:44 +0000784 }
785 else {
786 break;
787 }
788 }
Brian Paul610d5992003-01-14 04:55:45 +0000789 _mesa_DeleteHashTable(ss->Programs);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000790#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000791
Keith Whitwelle15fd852002-12-12 13:03:15 +0000792 _glthread_DESTROY_MUTEX(ss->Mutex);
793
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000794 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000795}
796
797
798
jtgafb833d1999-08-19 00:55:39 +0000799/*
800 * Initialize the nth light. Note that the defaults for light 0 are
801 * different than the other lights.
802 */
Brian Paul178a1c52000-04-22 01:05:00 +0000803static void
804init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000805{
806 make_empty_list( l );
807
808 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
809 if (n==0) {
810 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
811 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
812 }
813 else {
814 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
815 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
816 }
817 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
818 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
819 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000820 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000821 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000822 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000823 l->ConstantAttenuation = 1.0;
824 l->LinearAttenuation = 0.0;
825 l->QuadraticAttenuation = 0.0;
826 l->Enabled = GL_FALSE;
827}
828
829
830
Brian Paul178a1c52000-04-22 01:05:00 +0000831static void
832init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000833{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000834 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000835 lm->LocalViewer = GL_FALSE;
836 lm->TwoSide = GL_FALSE;
837 lm->ColorControl = GL_SINGLE_COLOR;
838}
839
840
Brian Paul178a1c52000-04-22 01:05:00 +0000841static void
842init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000843{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000844 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
845 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
846 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
847 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000848 m->Shininess = 0.0;
849 m->AmbientIndex = 0;
850 m->DiffuseIndex = 1;
851 m->SpecularIndex = 1;
852}
853
854
855
Brian Paul178a1c52000-04-22 01:05:00 +0000856static void
857init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000858{
859 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
860
861 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000862 texUnit->CombineModeRGB = GL_MODULATE;
863 texUnit->CombineModeA = GL_MODULATE;
864 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
865 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
866 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
867 texUnit->CombineSourceA[0] = GL_TEXTURE;
868 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
869 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
870 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
871 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
872 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
873 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
874 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
875 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
876 texUnit->CombineScaleShiftRGB = 0;
877 texUnit->CombineScaleShiftA = 0;
878
jtgafb833d1999-08-19 00:55:39 +0000879 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
880 texUnit->TexGenEnabled = 0;
881 texUnit->GenModeS = GL_EYE_LINEAR;
882 texUnit->GenModeT = GL_EYE_LINEAR;
883 texUnit->GenModeR = GL_EYE_LINEAR;
884 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000885 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
886 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
887 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
888 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000889
jtgafb833d1999-08-19 00:55:39 +0000890 /* Yes, these plane coefficients are correct! */
891 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
892 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
893 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
894 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
895 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
896 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
897 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
898 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
899
Brian Paula8523782000-11-19 23:10:25 +0000900 texUnit->Current1D = ctx->Shared->Default1D;
901 texUnit->Current2D = ctx->Shared->Default2D;
902 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000903 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000904 texUnit->CurrentRect = ctx->Shared->DefaultRect;
Brian Paul45b47d02003-01-26 14:37:15 +0000905
906 /* GL_SGI_texture_color_table */
907 texUnit->ColorTableEnabled = GL_FALSE;
908 _mesa_init_colortable(&texUnit->ColorTable);
909 _mesa_init_colortable(&texUnit->ProxyColorTable);
jtgafb833d1999-08-19 00:55:39 +0000910}
911
912
jtgafb833d1999-08-19 00:55:39 +0000913
Brian Paul4d053dd2000-01-14 04:45:47 +0000914
jtgafb833d1999-08-19 00:55:39 +0000915/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000916static void
917init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000918{
919 map->Order = 1;
920 map->u1 = 0.0;
921 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000922 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000923 if (map->Points) {
924 GLint i;
925 for (i=0;i<n;i++)
926 map->Points[i] = initial[i];
927 }
jtgafb833d1999-08-19 00:55:39 +0000928}
929
930
931/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000932static void
933init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000934{
935 map->Uorder = 1;
936 map->Vorder = 1;
937 map->u1 = 0.0;
938 map->u2 = 1.0;
939 map->v1 = 0.0;
940 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000941 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000942 if (map->Points) {
943 GLint i;
944 for (i=0;i<n;i++)
945 map->Points[i] = initial[i];
946 }
jtgafb833d1999-08-19 00:55:39 +0000947}
948
949
jtgafb833d1999-08-19 00:55:39 +0000950/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000951 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000952 */
Brian Paul178a1c52000-04-22 01:05:00 +0000953static void
954init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000955{
Brian Paul30f51ae2001-12-18 04:06:44 +0000956 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000957
Brian Paul4d053dd2000-01-14 04:45:47 +0000958 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000959
Brian Paulcd1cefa2001-06-13 14:56:14 +0000960 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
961 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
962
Brian Paul539cce52000-02-03 19:40:07 +0000963 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000964 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000965 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
966 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000967 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000968 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Brian Paul610d5992003-01-14 04:55:45 +0000969 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
970 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000971 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000972 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000973 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000974 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
975 ctx->Const.MinPointSize = MIN_POINT_SIZE;
976 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
977 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
978 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000979 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000980 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
981 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
982 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
983 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000984 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000985 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000986 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000987 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
988 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000989 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
990 ctx->Const.MaxLights = MAX_LIGHTS;
Brian Pauld0492cf2003-04-11 01:20:06 +0000991#if FEATURE_ARB_vertex_program
Brian Pauld0492cf2003-04-11 01:20:06 +0000992 ctx->Const.MaxVertexProgramInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;
Brian Paul451f3102003-04-17 01:48:19 +0000993 ctx->Const.MaxVertexProgramAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
994 ctx->Const.MaxVertexProgramTemps = MAX_NV_VERTEX_PROGRAM_TEMPS;
995 ctx->Const.MaxVertexProgramLocalParams = MAX_NV_VERTEX_PROGRAM_PARAMS;
996 ctx->Const.MaxVertexProgramEnvParams = MAX_NV_VERTEX_PROGRAM_PARAMS;/*XXX*/
997 ctx->Const.MaxVertexProgramAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
Brian Pauld0492cf2003-04-11 01:20:06 +0000998#endif
999#if FEATURE_ARB_fragment_program
Brian Pauld0492cf2003-04-11 01:20:06 +00001000 ctx->Const.MaxFragmentProgramInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;
Brian Paul451f3102003-04-17 01:48:19 +00001001 ctx->Const.MaxFragmentProgramAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
1002 ctx->Const.MaxFragmentProgramTemps = MAX_NV_FRAGMENT_PROGRAM_TEMPS;
1003 ctx->Const.MaxFragmentProgramLocalParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
1004 ctx->Const.MaxFragmentProgramEnvParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;/*XXX*/
1005 ctx->Const.MaxFragmentProgramAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
1006 ctx->Const.MaxFragmentProgramAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;
1007 ctx->Const.MaxFragmentProgramTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
1008 ctx->Const.MaxFragmentProgramTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
Brian Pauld0492cf2003-04-11 01:20:06 +00001009#endif
1010
jtgafb833d1999-08-19 00:55:39 +00001011
Brian Paul30f51ae2001-12-18 04:06:44 +00001012 /* Initialize matrix stacks */
1013 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
1014 _NEW_MODELVIEW);
1015 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
1016 _NEW_PROJECTION);
1017 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
1018 _NEW_COLOR_MATRIX);
Brian Paul610d5992003-01-14 04:55:45 +00001019 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001020 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
1021 _NEW_TEXTURE_MATRIX);
1022 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1023 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
1024 _NEW_TRACK_MATRIX);
1025 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +00001026
Brian Paul30f51ae2001-12-18 04:06:44 +00001027 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +00001028 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
1029
Brian Paul4d053dd2000-01-14 04:45:47 +00001030 /* Accumulate buffer group */
1031 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +00001032
Brian Paul4d053dd2000-01-14 04:45:47 +00001033 /* Color buffer group */
1034 ctx->Color.IndexMask = 0xffffffff;
1035 ctx->Color.ColorMask[0] = 0xff;
1036 ctx->Color.ColorMask[1] = 0xff;
1037 ctx->Color.ColorMask[2] = 0xff;
1038 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +00001039 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +00001040 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001041 ctx->Color.DrawBuffer = GL_FRONT;
1042 ctx->Color.AlphaEnabled = GL_FALSE;
1043 ctx->Color.AlphaFunc = GL_ALWAYS;
1044 ctx->Color.AlphaRef = 0;
1045 ctx->Color.BlendEnabled = GL_FALSE;
1046 ctx->Color.BlendSrcRGB = GL_ONE;
1047 ctx->Color.BlendDstRGB = GL_ZERO;
1048 ctx->Color.BlendSrcA = GL_ONE;
1049 ctx->Color.BlendDstA = GL_ZERO;
1050 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +00001051 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
1052 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
1053 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001054 ctx->Color.LogicOp = GL_COPY;
1055 ctx->Color.DitherFlag = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001056
Brian Paul4d053dd2000-01-14 04:45:47 +00001057 /* Current group */
Brian Pauldd26d022003-04-01 22:20:42 +00001058 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
1059 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
1060 }
1061 /* special cases: */
1062 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 1.0 );
1063 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
Brian Paul86b84272001-12-14 02:50:01 +00001064 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001065 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +00001066 ctx->Current.EdgeFlag = GL_TRUE;
1067
Brian Paul4d053dd2000-01-14 04:45:47 +00001068 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
1069 ctx->Current.RasterDistance = 0.0;
1070 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
Brian Pauldd26d022003-04-01 22:20:42 +00001071 ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 0.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001072 ctx->Current.RasterIndex = 1;
Brian Paul610d5992003-01-14 04:55:45 +00001073 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +00001074 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +00001075 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001076
jtgafb833d1999-08-19 00:55:39 +00001077
Brian Paul4d053dd2000-01-14 04:45:47 +00001078 /* Depth buffer group */
1079 ctx->Depth.Test = GL_FALSE;
1080 ctx->Depth.Clear = 1.0;
1081 ctx->Depth.Func = GL_LESS;
1082 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001083 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001084
Brian Paul4d053dd2000-01-14 04:45:47 +00001085 /* Evaluators group */
1086 ctx->Eval.Map1Color4 = GL_FALSE;
1087 ctx->Eval.Map1Index = GL_FALSE;
1088 ctx->Eval.Map1Normal = GL_FALSE;
1089 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1090 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1091 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1092 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1093 ctx->Eval.Map1Vertex3 = GL_FALSE;
1094 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001095 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001096 ctx->Eval.Map2Color4 = GL_FALSE;
1097 ctx->Eval.Map2Index = GL_FALSE;
1098 ctx->Eval.Map2Normal = GL_FALSE;
1099 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1100 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1101 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1102 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1103 ctx->Eval.Map2Vertex3 = GL_FALSE;
1104 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001105 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001106 ctx->Eval.AutoNormal = GL_FALSE;
1107 ctx->Eval.MapGrid1un = 1;
1108 ctx->Eval.MapGrid1u1 = 0.0;
1109 ctx->Eval.MapGrid1u2 = 1.0;
1110 ctx->Eval.MapGrid2un = 1;
1111 ctx->Eval.MapGrid2vn = 1;
1112 ctx->Eval.MapGrid2u1 = 0.0;
1113 ctx->Eval.MapGrid2u2 = 1.0;
1114 ctx->Eval.MapGrid2v1 = 0.0;
1115 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001116
Brian Paul4d053dd2000-01-14 04:45:47 +00001117 /* Evaluator data */
1118 {
1119 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1120 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1121 static GLfloat index[1] = { 1.0 };
1122 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1123 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001124 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001125
Brian Paul4d053dd2000-01-14 04:45:47 +00001126 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1127 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1128 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1129 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1130 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1131 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1132 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1133 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1134 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001135 for (i = 0; i < 16; i++)
1136 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001137
Brian Paul4d053dd2000-01-14 04:45:47 +00001138 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1139 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1140 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1141 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1142 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1143 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1144 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1145 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1146 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001147 for (i = 0; i < 16; i++)
1148 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001149 }
jtgafb833d1999-08-19 00:55:39 +00001150
Brian Paul4d053dd2000-01-14 04:45:47 +00001151 /* Fog group */
1152 ctx->Fog.Enabled = GL_FALSE;
1153 ctx->Fog.Mode = GL_EXP;
1154 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1155 ctx->Fog.Index = 0.0;
1156 ctx->Fog.Density = 1.0;
1157 ctx->Fog.Start = 0.0;
1158 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001159 ctx->Fog.ColorSumEnabled = GL_FALSE;
1160 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001161
Brian Paul4d053dd2000-01-14 04:45:47 +00001162 /* Hint group */
1163 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1164 ctx->Hint.PointSmooth = GL_DONT_CARE;
1165 ctx->Hint.LineSmooth = GL_DONT_CARE;
1166 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1167 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001168 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1169 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001170 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001171
Brian Paul0771d152000-04-07 00:19:41 +00001172 /* Histogram group */
1173 ctx->Histogram.Width = 0;
1174 ctx->Histogram.Format = GL_RGBA;
1175 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001176 ctx->Histogram.RedSize = 0;
1177 ctx->Histogram.GreenSize = 0;
1178 ctx->Histogram.BlueSize = 0;
1179 ctx->Histogram.AlphaSize = 0;
1180 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001181 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1182 ctx->Histogram.Count[i][0] = 0;
1183 ctx->Histogram.Count[i][1] = 0;
1184 ctx->Histogram.Count[i][2] = 0;
1185 ctx->Histogram.Count[i][3] = 0;
1186 }
1187
1188 /* Min/Max group */
1189 ctx->MinMax.Format = GL_RGBA;
1190 ctx->MinMax.Sink = GL_FALSE;
1191 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1192 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1193 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1194 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1195
Brian Paul4d053dd2000-01-14 04:45:47 +00001196 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001197 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001198
Brian Paul4d053dd2000-01-14 04:45:47 +00001199 /* Lighting group */
1200 for (i=0;i<MAX_LIGHTS;i++) {
1201 init_light( &ctx->Light.Light[i], i );
1202 }
1203 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001204
Brian Paul4d053dd2000-01-14 04:45:47 +00001205 init_lightmodel( &ctx->Light.Model );
1206 init_material( &ctx->Light.Material[0] );
1207 init_material( &ctx->Light.Material[1] );
1208 ctx->Light.ShadeModel = GL_SMOOTH;
1209 ctx->Light.Enabled = GL_FALSE;
1210 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1211 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001212 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1213 GL_FRONT_AND_BACK,
1214 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001215
Brian Paul4d053dd2000-01-14 04:45:47 +00001216 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001217
Brian Paul4d053dd2000-01-14 04:45:47 +00001218 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001219 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1220 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001221 for (i = 0 ; i < 10 ; i++) {
1222 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1223 s->shininess = -1;
1224 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001225 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001226 }
Brian Paul77d61af2000-06-28 04:20:21 +00001227
jtgafb833d1999-08-19 00:55:39 +00001228
Brian Paul4d053dd2000-01-14 04:45:47 +00001229 /* Line group */
1230 ctx->Line.SmoothFlag = GL_FALSE;
1231 ctx->Line.StippleFlag = GL_FALSE;
1232 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001233 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001234 ctx->Line.StipplePattern = 0xffff;
1235 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001236
Brian Paul4d053dd2000-01-14 04:45:47 +00001237 /* Display List group */
1238 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001239
Brian Paul736fcbe2001-05-29 15:23:48 +00001240 /* Multisample */
1241 ctx->Multisample.Enabled = GL_FALSE;
1242 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1243 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1244 ctx->Multisample.SampleCoverage = GL_FALSE;
1245 ctx->Multisample.SampleCoverageValue = 1.0;
1246 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1247
Brian Paul4d053dd2000-01-14 04:45:47 +00001248 /* Pixel group */
1249 ctx->Pixel.RedBias = 0.0;
1250 ctx->Pixel.RedScale = 1.0;
1251 ctx->Pixel.GreenBias = 0.0;
1252 ctx->Pixel.GreenScale = 1.0;
1253 ctx->Pixel.BlueBias = 0.0;
1254 ctx->Pixel.BlueScale = 1.0;
1255 ctx->Pixel.AlphaBias = 0.0;
1256 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001257 ctx->Pixel.DepthBias = 0.0;
1258 ctx->Pixel.DepthScale = 1.0;
1259 ctx->Pixel.IndexOffset = 0;
1260 ctx->Pixel.IndexShift = 0;
1261 ctx->Pixel.ZoomX = 1.0;
1262 ctx->Pixel.ZoomY = 1.0;
1263 ctx->Pixel.MapColorFlag = GL_FALSE;
1264 ctx->Pixel.MapStencilFlag = GL_FALSE;
1265 ctx->Pixel.MapStoSsize = 1;
1266 ctx->Pixel.MapItoIsize = 1;
1267 ctx->Pixel.MapItoRsize = 1;
1268 ctx->Pixel.MapItoGsize = 1;
1269 ctx->Pixel.MapItoBsize = 1;
1270 ctx->Pixel.MapItoAsize = 1;
1271 ctx->Pixel.MapRtoRsize = 1;
1272 ctx->Pixel.MapGtoGsize = 1;
1273 ctx->Pixel.MapBtoBsize = 1;
1274 ctx->Pixel.MapAtoAsize = 1;
1275 ctx->Pixel.MapStoS[0] = 0;
1276 ctx->Pixel.MapItoI[0] = 0;
1277 ctx->Pixel.MapItoR[0] = 0.0;
1278 ctx->Pixel.MapItoG[0] = 0.0;
1279 ctx->Pixel.MapItoB[0] = 0.0;
1280 ctx->Pixel.MapItoA[0] = 0.0;
1281 ctx->Pixel.MapItoR8[0] = 0;
1282 ctx->Pixel.MapItoG8[0] = 0;
1283 ctx->Pixel.MapItoB8[0] = 0;
1284 ctx->Pixel.MapItoA8[0] = 0;
1285 ctx->Pixel.MapRtoR[0] = 0.0;
1286 ctx->Pixel.MapGtoG[0] = 0.0;
1287 ctx->Pixel.MapBtoB[0] = 0.0;
1288 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001289 ctx->Pixel.HistogramEnabled = GL_FALSE;
1290 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1291 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1292 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1293 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001294 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1295 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1296 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1297 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001298 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1299 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1300 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1301 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001302 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1303 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1304 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001305 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1306 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1307 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1308 for (i = 0; i < 3; i++) {
1309 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1310 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1311 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1312 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1313 }
Brian Paul67adba12000-12-09 20:35:54 +00001314 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1315 ctx->Convolution1D.Filter[i] = 0.0;
1316 ctx->Convolution2D.Filter[i] = 0.0;
1317 ctx->Separable2D.Filter[i] = 0.0;
1318 }
Brian Paul82b02f02000-05-07 20:37:40 +00001319 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1320 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001321 /* GL_SGI_texture_color_table */
1322 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1323 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001324
Brian Paul4d053dd2000-01-14 04:45:47 +00001325 /* Point group */
1326 ctx->Point.SmoothFlag = GL_FALSE;
1327 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001328 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001329 ctx->Point.Params[0] = 1.0;
1330 ctx->Point.Params[1] = 0.0;
1331 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001332 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001333 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001334 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001335 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001336 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1337 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001338 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001339 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1340 }
jtgafb833d1999-08-19 00:55:39 +00001341
Brian Paul4d053dd2000-01-14 04:45:47 +00001342 /* Polygon group */
1343 ctx->Polygon.CullFlag = GL_FALSE;
1344 ctx->Polygon.CullFaceMode = GL_BACK;
1345 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001346 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001347 ctx->Polygon.FrontMode = GL_FILL;
1348 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001349 ctx->Polygon.SmoothFlag = GL_FALSE;
1350 ctx->Polygon.StippleFlag = GL_FALSE;
1351 ctx->Polygon.OffsetFactor = 0.0F;
1352 ctx->Polygon.OffsetUnits = 0.0F;
1353 ctx->Polygon.OffsetPoint = GL_FALSE;
1354 ctx->Polygon.OffsetLine = GL_FALSE;
1355 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001356
Brian Paul4d053dd2000-01-14 04:45:47 +00001357 /* Polygon Stipple group */
1358 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001359
Brian Paul4d053dd2000-01-14 04:45:47 +00001360 /* Scissor group */
1361 ctx->Scissor.Enabled = GL_FALSE;
1362 ctx->Scissor.X = 0;
1363 ctx->Scissor.Y = 0;
1364 ctx->Scissor.Width = 0;
1365 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001366
Brian Paul4d053dd2000-01-14 04:45:47 +00001367 /* Stencil group */
1368 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001369 ctx->Stencil.TestTwoSide = GL_FALSE;
1370 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1371 ctx->Stencil.Function[0] = GL_ALWAYS;
1372 ctx->Stencil.Function[1] = GL_ALWAYS;
1373 ctx->Stencil.FailFunc[0] = GL_KEEP;
1374 ctx->Stencil.FailFunc[1] = GL_KEEP;
1375 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1376 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1377 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1378 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1379 ctx->Stencil.Ref[0] = 0;
1380 ctx->Stencil.Ref[1] = 0;
1381 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1382 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1383 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1384 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001385 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001386
Brian Paul4d053dd2000-01-14 04:45:47 +00001387 /* Texture group */
1388 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001389 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001390 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1391 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001392 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001393 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001394
Brian Paul4d053dd2000-01-14 04:45:47 +00001395 /* Transformation group */
1396 ctx->Transform.MatrixMode = GL_MODELVIEW;
1397 ctx->Transform.Normalize = GL_FALSE;
1398 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001399 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001400 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001401 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1402 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001403 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001404
Brian Paul4d053dd2000-01-14 04:45:47 +00001405 /* Viewport group */
1406 ctx->Viewport.X = 0;
1407 ctx->Viewport.Y = 0;
1408 ctx->Viewport.Width = 0;
1409 ctx->Viewport.Height = 0;
1410 ctx->Viewport.Near = 0.0;
1411 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001412 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001413
1414#define Sz 10
1415#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001416 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1417 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001418#undef Sz
1419#undef Tz
1420
Keith Whitwell14940c42000-11-05 18:40:57 +00001421 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1422 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001423
Brian Paul4d053dd2000-01-14 04:45:47 +00001424 /* Vertex arrays */
1425 ctx->Array.Vertex.Size = 4;
1426 ctx->Array.Vertex.Type = GL_FLOAT;
1427 ctx->Array.Vertex.Stride = 0;
1428 ctx->Array.Vertex.StrideB = 0;
1429 ctx->Array.Vertex.Ptr = NULL;
1430 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001431 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001432 ctx->Array.Normal.Type = GL_FLOAT;
1433 ctx->Array.Normal.Stride = 0;
1434 ctx->Array.Normal.StrideB = 0;
1435 ctx->Array.Normal.Ptr = NULL;
1436 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001437 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001438 ctx->Array.Color.Size = 4;
1439 ctx->Array.Color.Type = GL_FLOAT;
1440 ctx->Array.Color.Stride = 0;
1441 ctx->Array.Color.StrideB = 0;
1442 ctx->Array.Color.Ptr = NULL;
1443 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001444 ctx->Array.Color.Flags = CA_CLIENT_DATA;
Brian Paulb852f042003-04-01 18:57:36 +00001445 ctx->Array.SecondaryColor.Size = 3;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001446 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1447 ctx->Array.SecondaryColor.Stride = 0;
1448 ctx->Array.SecondaryColor.StrideB = 0;
1449 ctx->Array.SecondaryColor.Ptr = NULL;
1450 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1451 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1452 ctx->Array.FogCoord.Size = 1;
1453 ctx->Array.FogCoord.Type = GL_FLOAT;
1454 ctx->Array.FogCoord.Stride = 0;
1455 ctx->Array.FogCoord.StrideB = 0;
1456 ctx->Array.FogCoord.Ptr = NULL;
1457 ctx->Array.FogCoord.Enabled = GL_FALSE;
1458 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001459 ctx->Array.Index.Type = GL_FLOAT;
1460 ctx->Array.Index.Stride = 0;
1461 ctx->Array.Index.StrideB = 0;
1462 ctx->Array.Index.Ptr = NULL;
1463 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001464 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001465 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001466 ctx->Array.TexCoord[i].Size = 4;
1467 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1468 ctx->Array.TexCoord[i].Stride = 0;
1469 ctx->Array.TexCoord[i].StrideB = 0;
1470 ctx->Array.TexCoord[i].Ptr = NULL;
1471 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001472 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001473 }
1474 ctx->Array.TexCoordInterleaveFactor = 1;
1475 ctx->Array.EdgeFlag.Stride = 0;
1476 ctx->Array.EdgeFlag.StrideB = 0;
1477 ctx->Array.EdgeFlag.Ptr = NULL;
1478 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001479 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001480 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1481
1482 /* Pixel transfer */
1483 ctx->Pack.Alignment = 4;
1484 ctx->Pack.RowLength = 0;
1485 ctx->Pack.ImageHeight = 0;
1486 ctx->Pack.SkipPixels = 0;
1487 ctx->Pack.SkipRows = 0;
1488 ctx->Pack.SkipImages = 0;
1489 ctx->Pack.SwapBytes = GL_FALSE;
1490 ctx->Pack.LsbFirst = GL_FALSE;
1491 ctx->Unpack.Alignment = 4;
1492 ctx->Unpack.RowLength = 0;
1493 ctx->Unpack.ImageHeight = 0;
1494 ctx->Unpack.SkipPixels = 0;
1495 ctx->Unpack.SkipRows = 0;
1496 ctx->Unpack.SkipImages = 0;
1497 ctx->Unpack.SwapBytes = GL_FALSE;
1498 ctx->Unpack.LsbFirst = GL_FALSE;
1499
1500 /* Feedback */
1501 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1502 ctx->Feedback.Buffer = NULL;
1503 ctx->Feedback.BufferSize = 0;
1504 ctx->Feedback.Count = 0;
1505
1506 /* Selection/picking */
1507 ctx->Select.Buffer = NULL;
1508 ctx->Select.BufferSize = 0;
1509 ctx->Select.BufferCount = 0;
1510 ctx->Select.Hits = 0;
1511 ctx->Select.NameStackDepth = 0;
1512
Brian Paul4d053dd2000-01-14 04:45:47 +00001513 /* Renderer and client attribute stacks */
1514 ctx->AttribStackDepth = 0;
1515 ctx->ClientAttribStackDepth = 0;
1516
Brian Paul13811372000-04-12 00:27:37 +00001517 /* Display list */
1518 ctx->CallDepth = 0;
1519 ctx->ExecuteFlag = GL_TRUE;
1520 ctx->CompileFlag = GL_FALSE;
1521 ctx->CurrentListPtr = NULL;
1522 ctx->CurrentBlock = NULL;
1523 ctx->CurrentListNum = 0;
1524 ctx->CurrentPos = 0;
1525
1526 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001527 _mesa_init_colortable(&ctx->ColorTable);
1528 _mesa_init_colortable(&ctx->ProxyColorTable);
1529 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1530 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1531 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1532 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001533
Brian Paul610d5992003-01-14 04:55:45 +00001534 /* Vertex/fragment programs */
1535 ctx->Program.ErrorPos = -1;
1536 ctx->Program.ErrorString = _mesa_strdup("");
1537#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001538 ctx->VertexProgram.Enabled = GL_FALSE;
1539 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1540 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001541 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001542 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1543 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1544 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1545 }
Brian Paul610d5992003-01-14 04:55:45 +00001546#endif
1547#if FEATURE_NV_fragment_program
1548 ctx->FragmentProgram.Enabled = GL_FALSE;
1549 ctx->FragmentProgram.Current = NULL;
1550#endif
Brian Paul86b84272001-12-14 02:50:01 +00001551
Brian Paul4d053dd2000-01-14 04:45:47 +00001552 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001553 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001554 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001555 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001556
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001557 ctx->_NeedNormals = 0;
1558 ctx->_NeedEyeCoords = 0;
1559 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001560
Brian Paul4d053dd2000-01-14 04:45:47 +00001561 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1562
1563 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001564 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001565 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001566 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001567
1568 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001569 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001570 ctx->FirstTimeCurrent = GL_TRUE;
1571
1572 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001573 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001574 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001575 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001576 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001577 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001578 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001579 }
1580}
1581
1582
1583
1584
Brian Paula3f13702003-04-01 16:41:50 +00001585/**
1586 * Allocate the proxy textures for the given context.
1587 * \param ctx the context to allocate proxies for.
1588 * \return GL_TRUE if success, GL_FALSE if failure.
jtgafb833d1999-08-19 00:55:39 +00001589 */
Brian Paul178a1c52000-04-22 01:05:00 +00001590static GLboolean
1591alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001592{
Brian Paula3f13702003-04-01 16:41:50 +00001593 ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
1594 if (!ctx->Texture.Proxy1D)
1595 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001596
Brian Paula3f13702003-04-01 16:41:50 +00001597 ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
1598 if (!ctx->Texture.Proxy2D)
1599 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001600
Brian Paula3f13702003-04-01 16:41:50 +00001601 ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
1602 if (!ctx->Texture.Proxy3D)
1603 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001604
Brian Paula3f13702003-04-01 16:41:50 +00001605 ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
1606 if (!ctx->Texture.ProxyCubeMap)
1607 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +00001608
Brian Paula3f13702003-04-01 16:41:50 +00001609 ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
1610 if (!ctx->Texture.ProxyRect)
1611 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001612
Brian Paula3f13702003-04-01 16:41:50 +00001613 return GL_TRUE;
Brian Paul8afe7de2002-06-15 03:03:06 +00001614
Brian Paula3f13702003-04-01 16:41:50 +00001615 cleanup:
1616 if (ctx->Texture.Proxy1D)
1617 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
1618 if (ctx->Texture.Proxy2D)
1619 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
1620 if (ctx->Texture.Proxy3D)
1621 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
1622 if (ctx->Texture.ProxyCubeMap)
1623 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
1624 if (ctx->Texture.ProxyRect)
1625 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
1626 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001627}
1628
1629
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001630static void add_debug_flags( const char *debug )
1631{
1632#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001633 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001634 MESA_VERBOSE |= VERBOSE_VARRAY;
1635
Brian Paul3c634522002-10-24 23:57:19 +00001636 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001637 MESA_VERBOSE |= VERBOSE_TEXTURE;
1638
Brian Paul3c634522002-10-24 23:57:19 +00001639 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001640 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1641
Brian Paul3c634522002-10-24 23:57:19 +00001642 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001643 MESA_VERBOSE |= VERBOSE_PIPELINE;
1644
Brian Paul3c634522002-10-24 23:57:19 +00001645 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001646 MESA_VERBOSE |= VERBOSE_DRIVER;
1647
Brian Paul3c634522002-10-24 23:57:19 +00001648 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001649 MESA_VERBOSE |= VERBOSE_STATE;
1650
Brian Paul3c634522002-10-24 23:57:19 +00001651 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001652 MESA_VERBOSE |= VERBOSE_API;
1653
Brian Paul3c634522002-10-24 23:57:19 +00001654 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001655 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1656
Brian Paul3c634522002-10-24 23:57:19 +00001657 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001658 MESA_VERBOSE |= VERBOSE_LIGHTING;
1659
1660 /* Debug flag:
1661 */
Brian Paul3c634522002-10-24 23:57:19 +00001662 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001663 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1664#endif
1665}
1666
1667
jtgafb833d1999-08-19 00:55:39 +00001668/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001669 * Initialize a GLcontext struct. This includes allocating all the
1670 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001671 */
Brian Paul178a1c52000-04-22 01:05:00 +00001672GLboolean
1673_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001674 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001675 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001676 void *driver_ctx,
1677 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001678{
Brian Paul5fb84d22000-05-24 15:04:45 +00001679 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001680 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001681
Brian Paul3c634522002-10-24 23:57:19 +00001682 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001683
Brian Paul3c634522002-10-24 23:57:19 +00001684 /* If the driver wants core Mesa to use special imports, it'll have to
1685 * override these defaults.
1686 */
1687 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001688
Brian Paul9a33a112002-06-13 04:28:29 +00001689 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001690 _mesa_init_default_exports( &(ctx->exports) );
1691
1692 /* misc one-time initializations */
1693 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001694
Brian Paul3c634522002-10-24 23:57:19 +00001695 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001696 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001697 ctx->DrawBuffer = NULL;
1698 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001699
Brian Paula3f13702003-04-01 16:41:50 +00001700 /* Set these pointers to defaults now in case they're not set since
1701 * we need them while creating the default textures.
1702 */
1703 if (!ctx->Driver.NewTextureObject)
1704 ctx->Driver.NewTextureObject = _mesa_new_texture_object;
1705 if (!ctx->Driver.DeleteTexture)
1706 ctx->Driver.DeleteTexture = _mesa_delete_texture_object;
1707 if (!ctx->Driver.NewTextureImage)
1708 ctx->Driver.NewTextureImage = _mesa_new_texture_image;
1709
jtgafb833d1999-08-19 00:55:39 +00001710 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001711 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001712 ctx->Shared = share_list->Shared;
1713 }
1714 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001715 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001716 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001717 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001718 }
1719 }
Brian Paul9560f052000-01-31 23:11:39 +00001720 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001721 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001722 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001723
Brian Paul4d053dd2000-01-14 04:45:47 +00001724 init_attrib_groups( ctx );
1725
Brian Paulb6bcae52001-01-23 23:39:36 +00001726 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001727 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001728 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001729 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001730 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001731 }
1732 else {
1733 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001734 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001735 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001736 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001737 }
1738
jtgafb833d1999-08-19 00:55:39 +00001739 if (!alloc_proxy_textures(ctx)) {
1740 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001741 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001742 }
jtgafb833d1999-08-19 00:55:39 +00001743
Brian Paul8ad10762002-10-11 17:41:03 +00001744 /*
1745 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1746 * Basically, we should add all extension functions above offset 577.
1747 * This enables older libGL libraries to work with newer drivers that
1748 * have newer extensions.
1749 */
1750 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1751 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1752 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1753 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1754 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1755 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1756 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1757 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1758 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1759 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1760 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1761 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1762 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1763 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1764 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1765 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1766 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1767 /* new extension functions */
1768 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1769 _glapi_add_entrypoint("glBindProgramNV", 579);
1770 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1771 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1772 _glapi_add_entrypoint("glGenProgramsNV", 582);
1773 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1774 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1775 _glapi_add_entrypoint("glGetProgramivNV", 585);
1776 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1777 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1778 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1779 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1780 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1781 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1782 _glapi_add_entrypoint("glIsProgramNV", 592);
1783 _glapi_add_entrypoint("glLoadProgramNV", 593);
1784 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1785 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1786 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1787 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1788 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1789 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1790 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1791 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1792 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1793 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1794 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1795 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1796 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1797 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1798 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1799 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1800 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1801 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1802 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1803 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1804 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1805 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1806 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1807 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1808 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1809 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1810 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1811 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1812 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1813 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1814 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1815 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1816 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1817 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1818 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1819 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1820 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1821 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1822 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1823 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1824 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1825 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1826 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1827 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1828 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1829 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1830 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1831 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1832 _glapi_add_entrypoint("glPointParameteriNV", 642);
1833 _glapi_add_entrypoint("glPointParameterivNV", 643);
1834 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1835 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1836 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1837 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1838 _glapi_add_entrypoint("glGenFencesNV", 648);
1839 _glapi_add_entrypoint("glIsFenceNV", 649);
1840 _glapi_add_entrypoint("glTestFenceNV", 650);
1841 _glapi_add_entrypoint("glGetFenceivNV", 651);
1842 _glapi_add_entrypoint("glFinishFenceNV", 652);
1843 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paula3f13702003-04-01 16:41:50 +00001844 /* XXX add NV_fragment_program and ARB_vertex_program functions */
Brian Paulf59afc92000-05-23 23:23:00 +00001845
Brian Paul5fb84d22000-05-24 15:04:45 +00001846 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1847 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1848 * Mesa we do this to accomodate different versions of libGL and various
1849 * DRI drivers.
1850 */
1851 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1852 sizeof(struct _glapi_table) / sizeof(void *));
1853
Brian Paulfbd8f211999-11-11 01:22:25 +00001854 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001855 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1856 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001857 if (!ctx->Exec || !ctx->Save) {
1858 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001859 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001860 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001861 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001862 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1863 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001864 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001865
Keith Whitwellad2ac212000-11-24 10:25:05 +00001866 ctx->ExecPrefersFloat = GL_FALSE;
1867 ctx->SavePrefersFloat = GL_FALSE;
1868
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001869 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001870 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001871 ctx->TnlModule.Current = NULL;
1872 ctx->TnlModule.SwapCount = 0;
1873
Brian Paulb6bcae52001-01-23 23:39:36 +00001874 /* Z buffer stuff */
1875 if (ctx->Visual.depthBits == 0) {
1876 /* Special case. Even if we don't have a depth buffer we need
1877 * good values for DepthMax for Z vertex transformation purposes
1878 * and for per-fragment fog computation.
1879 */
1880 ctx->DepthMax = 1 << 16;
1881 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1882 }
1883 else if (ctx->Visual.depthBits < 32) {
1884 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1885 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1886 }
1887 else {
1888 /* Special case since shift values greater than or equal to the
1889 * number of bits in the left hand expression's type are undefined.
1890 */
1891 ctx->DepthMax = 0xffffffff;
1892 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1893 }
Brian Paulbc920f02001-05-07 16:32:51 +00001894 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001895
Brian Paul3c634522002-10-24 23:57:19 +00001896 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001897 if (c)
1898 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001899
Brian Paul3c634522002-10-24 23:57:19 +00001900 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001901 if (c)
1902 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001903
Brian Paul4d053dd2000-01-14 04:45:47 +00001904 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001905}
1906
jtgafb833d1999-08-19 00:55:39 +00001907
1908
1909/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001910 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001911 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001912 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001913 * driver_ctx - pointer to device driver's context state struct
1914 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001915 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001916 */
Brian Paul178a1c52000-04-22 01:05:00 +00001917GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001918_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001919 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001920 void *driver_ctx,
1921 GLboolean direct )
1922
Brian Paul4d053dd2000-01-14 04:45:47 +00001923{
Brian Paul4753d602002-06-15 02:38:15 +00001924 GLcontext *ctx;
1925
1926 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001927 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001928
Brian Paul3c634522002-10-24 23:57:19 +00001929 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001930 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001931 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001932
Brian Paul3c634522002-10-24 23:57:19 +00001933 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001934 return ctx;
1935 }
1936 else {
Brian Paul3c634522002-10-24 23:57:19 +00001937 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001938 return NULL;
1939 }
1940}
1941
1942
1943
1944/*
1945 * Free the data associated with the given context.
1946 * But don't free() the GLcontext struct itself!
1947 */
Brian Paul178a1c52000-04-22 01:05:00 +00001948void
Brian Paulb1394fa2000-09-26 20:53:53 +00001949_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001950{
Brian Paul4d053dd2000-01-14 04:45:47 +00001951 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001952 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001953
1954 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001955 if (ctx == _mesa_get_current_context()) {
1956 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001957 }
1958
Brian Paul30f51ae2001-12-18 04:06:44 +00001959 /*
1960 * Free transformation matrix stacks
1961 */
1962 free_matrix_stack(&ctx->ModelviewMatrixStack);
1963 free_matrix_stack(&ctx->ProjectionMatrixStack);
1964 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001965 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001966 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1967 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1968 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1969 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001970 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1971
Brian Paul30f51ae2001-12-18 04:06:44 +00001972
Brian Paul8dfc5b92002-10-16 17:57:51 +00001973#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001974 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001975 ctx->VertexProgram.Current->Base.RefCount--;
1976 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
Brian Paul451f3102003-04-17 01:48:19 +00001977 _mesa_delete_program(ctx, &(ctx->VertexProgram.Current->Base));
Brian Paul610d5992003-01-14 04:55:45 +00001978 }
1979#endif
1980#if FEATURE_NV_fragment_program
1981 if (ctx->FragmentProgram.Current) {
1982 ctx->FragmentProgram.Current->Base.RefCount--;
1983 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
Brian Paul451f3102003-04-17 01:48:19 +00001984 _mesa_delete_program(ctx, &(ctx->FragmentProgram.Current->Base));
Brian Paulfd284452001-07-19 15:54:34 +00001985 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001986#endif
Brian Paulfd284452001-07-19 15:54:34 +00001987
Brian Paul30f51ae2001-12-18 04:06:44 +00001988 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001989 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001990 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001991 assert(ctx->Shared->RefCount >= 0);
1992 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1993 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001994 /* free shared state */
1995 free_shared_state( ctx, ctx->Shared );
1996 }
1997
Brian Paul30f51ae2001-12-18 04:06:44 +00001998 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001999 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00002000 FREE( s );
2001 }
Keith Whitwell14940c42000-11-05 18:40:57 +00002002 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00002003
2004 /* Free proxy texture objects */
Brian Paula3f13702003-04-01 16:41:50 +00002005 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
2006 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
2007 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
2008 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
2009 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00002010
Brian Paul45b47d02003-01-26 14:37:15 +00002011 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
2012 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
2013
Brian Paul4d053dd2000-01-14 04:45:47 +00002014 /* Free evaluator data */
2015 if (ctx->EvalMap.Map1Vertex3.Points)
2016 FREE( ctx->EvalMap.Map1Vertex3.Points );
2017 if (ctx->EvalMap.Map1Vertex4.Points)
2018 FREE( ctx->EvalMap.Map1Vertex4.Points );
2019 if (ctx->EvalMap.Map1Index.Points)
2020 FREE( ctx->EvalMap.Map1Index.Points );
2021 if (ctx->EvalMap.Map1Color4.Points)
2022 FREE( ctx->EvalMap.Map1Color4.Points );
2023 if (ctx->EvalMap.Map1Normal.Points)
2024 FREE( ctx->EvalMap.Map1Normal.Points );
2025 if (ctx->EvalMap.Map1Texture1.Points)
2026 FREE( ctx->EvalMap.Map1Texture1.Points );
2027 if (ctx->EvalMap.Map1Texture2.Points)
2028 FREE( ctx->EvalMap.Map1Texture2.Points );
2029 if (ctx->EvalMap.Map1Texture3.Points)
2030 FREE( ctx->EvalMap.Map1Texture3.Points );
2031 if (ctx->EvalMap.Map1Texture4.Points)
2032 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002033 for (i = 0; i < 16; i++)
2034 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002035
2036 if (ctx->EvalMap.Map2Vertex3.Points)
2037 FREE( ctx->EvalMap.Map2Vertex3.Points );
2038 if (ctx->EvalMap.Map2Vertex4.Points)
2039 FREE( ctx->EvalMap.Map2Vertex4.Points );
2040 if (ctx->EvalMap.Map2Index.Points)
2041 FREE( ctx->EvalMap.Map2Index.Points );
2042 if (ctx->EvalMap.Map2Color4.Points)
2043 FREE( ctx->EvalMap.Map2Color4.Points );
2044 if (ctx->EvalMap.Map2Normal.Points)
2045 FREE( ctx->EvalMap.Map2Normal.Points );
2046 if (ctx->EvalMap.Map2Texture1.Points)
2047 FREE( ctx->EvalMap.Map2Texture1.Points );
2048 if (ctx->EvalMap.Map2Texture2.Points)
2049 FREE( ctx->EvalMap.Map2Texture2.Points );
2050 if (ctx->EvalMap.Map2Texture3.Points)
2051 FREE( ctx->EvalMap.Map2Texture3.Points );
2052 if (ctx->EvalMap.Map2Texture4.Points)
2053 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002054 for (i = 0; i < 16; i++)
2055 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002056
Brian Paul4bdcfe52000-04-17 17:57:04 +00002057 _mesa_free_colortable_data( &ctx->ColorTable );
2058 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2059 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2060 _mesa_free_colortable_data( &ctx->Texture.Palette );
2061
Brian Paulfd284452001-07-19 15:54:34 +00002062 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2063
Brian Paul69755402001-02-26 23:58:12 +00002064 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002065
2066 FREE(ctx->Exec);
2067 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002068}
2069
2070
2071
2072/*
2073 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002074 */
Brian Paul178a1c52000-04-22 01:05:00 +00002075void
Brian Paulb1394fa2000-09-26 20:53:53 +00002076_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002077{
2078 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002079 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002080 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002081 }
2082}
2083
2084
2085
2086/*
jtgafb833d1999-08-19 00:55:39 +00002087 * Copy attribute groups from one context to another.
2088 * Input: src - source context
2089 * dst - destination context
2090 * mask - bitwise OR of GL_*_BIT flags
2091 */
Brian Paul178a1c52000-04-22 01:05:00 +00002092void
Brian Paulb1394fa2000-09-26 20:53:53 +00002093_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002094{
2095 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002096 /* OK to memcpy */
2097 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002098 }
2099 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002100 /* OK to memcpy */
2101 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002102 }
2103 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002104 /* OK to memcpy */
2105 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002106 }
2107 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002108 /* OK to memcpy */
2109 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002110 }
2111 if (mask & GL_ENABLE_BIT) {
2112 /* no op */
2113 }
2114 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002115 /* OK to memcpy */
2116 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002117 }
2118 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002119 /* OK to memcpy */
2120 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002121 }
2122 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002123 /* OK to memcpy */
2124 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002125 }
2126 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002127 GLuint i;
2128 /* begin with memcpy */
2129 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2130 /* fixup linked lists to prevent pointer insanity */
2131 make_empty_list( &(dst->Light.EnabledList) );
2132 for (i = 0; i < MAX_LIGHTS; i++) {
2133 if (dst->Light.Light[i].Enabled) {
2134 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2135 }
2136 }
jtgafb833d1999-08-19 00:55:39 +00002137 }
2138 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002139 /* OK to memcpy */
2140 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002141 }
2142 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002143 /* OK to memcpy */
2144 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002145 }
2146 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002147 /* OK to memcpy */
2148 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002149 }
2150 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002151 /* OK to memcpy */
2152 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002153 }
2154 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002155 /* OK to memcpy */
2156 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002157 }
2158 if (mask & GL_POLYGON_STIPPLE_BIT) {
2159 /* Use loop instead of MEMCPY due to problem with Portland Group's
2160 * C compiler. Reported by John Stone.
2161 */
Brian Paul85d81602002-06-17 23:36:31 +00002162 GLuint i;
2163 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002164 dst->PolygonStipple[i] = src->PolygonStipple[i];
2165 }
2166 }
2167 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002168 /* OK to memcpy */
2169 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002170 }
2171 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002172 /* OK to memcpy */
2173 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002174 }
2175 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002176 /* Cannot memcpy because of pointers */
2177 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002178 }
2179 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002180 /* OK to memcpy */
2181 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002182 }
2183 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002184 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2185 dst->Viewport.X = src->Viewport.X;
2186 dst->Viewport.Y = src->Viewport.Y;
2187 dst->Viewport.Width = src->Viewport.Width;
2188 dst->Viewport.Height = src->Viewport.Height;
2189 dst->Viewport.Near = src->Viewport.Near;
2190 dst->Viewport.Far = src->Viewport.Far;
2191 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002192 }
Brian Paul85d81602002-06-17 23:36:31 +00002193
Keith Whitwella96308c2000-10-30 13:31:59 +00002194 /* XXX FIXME: Call callbacks?
2195 */
2196 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002197}
2198
2199
Brian Paul00037781999-12-17 14:52:35 +00002200
Keith Whitwell23caf202000-11-16 21:05:34 +00002201static void print_info( void )
2202{
Brian Paul4e9676f2002-06-29 19:48:15 +00002203 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002204 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002205 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002206 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002207 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002208 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002209 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002210 (char *) _mesa_GetString(GL_EXTENSIONS));
2211#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002212 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002213#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002214 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002215#endif
2216#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002217 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002218#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002219 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002220#endif
davem69e4f84b42001-06-05 03:58:20 +00002221#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002222 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002223#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002224 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002225#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002226}
2227
2228
Brian Paul00037781999-12-17 14:52:35 +00002229/*
Brian Paul9a33a112002-06-13 04:28:29 +00002230 * Set the current context, binding the given frame buffer to the context.
2231 */
2232void
2233_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2234{
2235 _mesa_make_current2( newCtx, buffer, buffer );
2236}
2237
2238
2239/*
Brian Paul00037781999-12-17 14:52:35 +00002240 * Bind the given context to the given draw-buffer and read-buffer
2241 * and make it the current context for this thread.
2242 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002243void
2244_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2245 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002246{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002247 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002248 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002249
Brian Paulbe3602d2001-02-28 00:27:48 +00002250 /* Check that the context's and framebuffer's visuals are compatible.
2251 * We could do a lot more checking here but this'll catch obvious
2252 * problems.
2253 */
2254 if (newCtx && drawBuffer && readBuffer) {
2255 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2256 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2257 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2258 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2259 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2260 return; /* incompatible */
2261 }
2262 }
2263
Brian Paul00037781999-12-17 14:52:35 +00002264 /* We call this function periodically (just here for now) in
2265 * order to detect when multithreading has begun.
2266 */
2267 _glapi_check_multithread();
2268
Brian Paulf9b97d92000-01-28 20:17:42 +00002269 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002270 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002271
2272
2273 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002274 _glapi_set_dispatch(NULL); /* none current */
2275 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002276 else {
2277 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002278
Keith Whitwell23caf202000-11-16 21:05:34 +00002279 if (drawBuffer && readBuffer) {
2280 /* TODO: check if newCtx and buffer's visual match??? */
2281 newCtx->DrawBuffer = drawBuffer;
2282 newCtx->ReadBuffer = readBuffer;
2283 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002284
2285 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2286 /* get initial window size */
2287 GLuint bufWidth, bufHeight;
2288
2289 /* ask device driver for size of output buffer */
2290 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2291
2292 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2293 return; /* size is as expected */
2294
2295 drawBuffer->Width = bufWidth;
2296 drawBuffer->Height = bufHeight;
2297
2298 newCtx->Driver.ResizeBuffers( drawBuffer );
2299 }
2300
2301 if (readBuffer != drawBuffer &&
2302 readBuffer->Width == 0 && readBuffer->Height == 0) {
2303 /* get initial window size */
2304 GLuint bufWidth, bufHeight;
2305
2306 /* ask device driver for size of output buffer */
2307 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2308
2309 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2310 return; /* size is as expected */
2311
2312 readBuffer->Width = bufWidth;
2313 readBuffer->Height = bufHeight;
2314
2315 newCtx->Driver.ResizeBuffers( readBuffer );
2316 }
Brian Paul00037781999-12-17 14:52:35 +00002317 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002318
Brian Paul8816c702002-06-16 01:10:41 +00002319 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002320 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002321 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2322
2323 /* We can use this to help debug user's problems. Tell them to set
2324 * the MESA_INFO env variable before running their app. Then the
2325 * first time each context is made current we'll print some useful
2326 * information.
2327 */
2328 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002329 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002330 print_info();
2331 }
2332 newCtx->FirstTimeCurrent = GL_FALSE;
2333 }
Brian Paul00037781999-12-17 14:52:35 +00002334 }
2335}
2336
2337
2338
2339/*
2340 * Return current context handle for the calling thread.
2341 * This isn't the fastest way to get the current context.
2342 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2343 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002344GLcontext *
2345_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002346{
Brian Paulf9b97d92000-01-28 20:17:42 +00002347 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002348}
2349
2350
Brian Paulfbd8f211999-11-11 01:22:25 +00002351/*
2352 * Return pointer to this context's current API dispatch table.
2353 * It'll either be the immediate-mode execute dispatcher or the
2354 * display list compile dispatcher.
2355 */
2356struct _glapi_table *
2357_mesa_get_dispatch(GLcontext *ctx)
2358{
2359 return ctx->CurrentDispatch;
2360}
2361
2362
2363
jtgafb833d1999-08-19 00:55:39 +00002364/**********************************************************************/
2365/***** Miscellaneous functions *****/
2366/**********************************************************************/
2367
2368
2369/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002370 * Record the given error code and call the driver's Error function if defined.
2371 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002372 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002373void
Brian Paul4e9676f2002-06-29 19:48:15 +00002374_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002375{
Brian Paul18a285a2002-03-16 00:53:15 +00002376 if (!ctx)
2377 return;
2378
Brian Paul7eb06032000-07-14 04:13:40 +00002379 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002380 ctx->ErrorValue = error;
2381 }
2382
2383 /* Call device driver's error handler, if any. This is used on the Mac. */
2384 if (ctx->Driver.Error) {
2385 (*ctx->Driver.Error)( ctx );
2386 }
2387}
2388
2389
Brian Paulfa9df402000-02-02 19:16:46 +00002390void
2391_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002392{
Brian Paulfa9df402000-02-02 19:16:46 +00002393 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002394 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002395 if (ctx->Driver.Finish) {
2396 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002397 }
2398}
2399
2400
2401
Brian Paulfa9df402000-02-02 19:16:46 +00002402void
2403_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002404{
Brian Paulfa9df402000-02-02 19:16:46 +00002405 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002406 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002407 if (ctx->Driver.Flush) {
2408 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002409 }
jtgafb833d1999-08-19 00:55:39 +00002410}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002411
2412
2413
Keith Whitwellcab974c2000-12-26 05:09:27 +00002414const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002415 "GL_POINTS",
2416 "GL_LINES",
2417 "GL_LINE_LOOP",
2418 "GL_LINE_STRIP",
2419 "GL_TRIANGLES",
2420 "GL_TRIANGLE_STRIP",
2421 "GL_TRIANGLE_FAN",
2422 "GL_QUADS",
2423 "GL_QUAD_STRIP",
2424 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002425 "outside begin/end",
2426 "inside unkown primitive",
2427 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002428};