blob: c5fb8148b9e1a07f1217ac28067af231b8bf4241 [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001/*
2 * Mesa 3-D graphics library
Brian Paul3a212032002-11-19 15:25:00 +00003 * Version: 5.1
jtgafb833d1999-08-19 00:55:39 +00004 *
Brian Paulbc42c192002-01-05 21:53:20 +00005 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00006 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
Brian Paulfbd8f211999-11-11 01:22:25 +000026#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000027#include "imports.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000028#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000029#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000030#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000032#include "dlist.h"
33#include "eval.h"
34#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000035#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000036#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000037#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000038#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000039#include "hash.h"
40#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "macros.h"
jtgafb833d1999-08-19 00:55:39 +000042#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000043#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000044#include "teximage.h"
45#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +000046#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000047#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000048#include "varray.h"
Brian Paul3a212032002-11-19 15:25:00 +000049#if FEATURE_NV_vertex_program
Brian Paul610d5992003-01-14 04:55:45 +000050#include "nvprogram.h"
51#include "nvvertprog.h"
52#endif
53#if FEATURE_NV_fragment_program
54#include "nvfragprog.h"
Brian Paul3a212032002-11-19 15:25:00 +000055#endif
Gareth Hughesd4eb6652001-03-12 01:32:20 +000056#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000057#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000058#include "math/m_matrix.h"
59#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000060#include "math/mathmod.h"
Brian Paul3c634522002-10-24 23:57:19 +000061
jtgafb833d1999-08-19 00:55:39 +000062
Brian Paul3b18a362000-09-26 15:27:20 +000063#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000064#include "Trace/tr_context.h"
65#include "Trace/tr_wrapper.h"
66#endif
67
davem69775355a2001-06-05 23:54:00 +000068#ifdef USE_SPARC_ASM
69#include "SPARC/sparc.h"
70#endif
jtgafb833d1999-08-19 00:55:39 +000071
Keith Whitwell23caf202000-11-16 21:05:34 +000072#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000073int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000074#endif
75
76#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000077int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000078#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000079
Brian Paul86b84272001-12-14 02:50:01 +000080
Brian Paul27558a12003-03-01 01:50:20 +000081/* ubyte -> float conversion */
82GLfloat _mesa_ubyte_to_float_color_tab[256];
83
Brian Paul9a33a112002-06-13 04:28:29 +000084static void
85free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
86
Brian Paul86b84272001-12-14 02:50:01 +000087
Brian Paulb1394fa2000-09-26 20:53:53 +000088/**********************************************************************/
89/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
90/**********************************************************************/
91
Brian Paul9a33a112002-06-13 04:28:29 +000092/* Called by window system/device driver (via gc->exports.destroyCurrent())
93 * when the rendering context is to be destroyed.
94 */
95GLboolean
96_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000097{
98 if (gc) {
99 _mesa_free_context_data(gc);
Brian Paul3c634522002-10-24 23:57:19 +0000100 _mesa_free(gc);
Brian Paulb1394fa2000-09-26 20:53:53 +0000101 }
102 return GL_TRUE;
103}
104
Brian Paul9a33a112002-06-13 04:28:29 +0000105/* Called by window system/device driver (via gc->exports.loseCurrent())
106 * when the rendering context is made non-current.
107 */
108GLboolean
109_mesa_loseCurrent(__GLcontext *gc)
110{
111 /* XXX unbind context from thread */
112 return GL_TRUE;
113}
114
115/* Called by window system/device driver (via gc->exports.makeCurrent())
116 * when the rendering context is made current.
117 */
118GLboolean
119_mesa_makeCurrent(__GLcontext *gc)
120{
121 /* XXX bind context to thread */
122 return GL_TRUE;
123}
124
125/* Called by window system/device driver - yadda, yadda, yadda.
126 * See above comments.
127 */
128GLboolean
129_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
130{
131 if (gc && gcShare && gc->Shared && gcShare->Shared) {
132 gc->Shared->RefCount--;
133 if (gc->Shared->RefCount == 0) {
134 free_shared_state(gc, gc->Shared);
135 }
136 gc->Shared = gcShare->Shared;
137 gc->Shared->RefCount++;
138 return GL_TRUE;
139 }
140 else {
141 return GL_FALSE;
142 }
143}
144
145GLboolean
146_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
147{
148 if (dst && src) {
149 _mesa_copy_context( src, dst, mask );
150 return GL_TRUE;
151 }
152 else {
153 return GL_FALSE;
154 }
155}
156
157GLboolean
158_mesa_forceCurrent(__GLcontext *gc)
159{
160 return GL_TRUE;
161}
162
163GLboolean
164_mesa_notifyResize(__GLcontext *gc)
165{
166 GLint x, y;
167 GLuint width, height;
168 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
169 if (!d || !d->getDrawableSize)
170 return GL_FALSE;
171 d->getDrawableSize( d, &x, &y, &width, &height );
172 /* update viewport, resize software buffers, etc. */
173 return GL_TRUE;
174}
175
176void
177_mesa_notifyDestroy(__GLcontext *gc)
178{
Brian Paul60b6e4f2002-10-14 17:08:17 +0000179 /* Called when the context's window/buffer is going to be destroyed. */
180 /* Unbind from it. */
Brian Paul9a33a112002-06-13 04:28:29 +0000181}
182
183/* Called by window system just before swapping buffers.
184 * We have to finish any pending rendering.
185 */
186void
187_mesa_notifySwapBuffers(__GLcontext *gc)
188{
189 FLUSH_VERTICES( gc, 0 );
190}
191
192struct __GLdispatchStateRec *
193_mesa_dispatchExec(__GLcontext *gc)
194{
195 return NULL;
196}
197
198void
199_mesa_beginDispatchOverride(__GLcontext *gc)
200{
201}
202
203void
204_mesa_endDispatchOverride(__GLcontext *gc)
205{
206}
207
208/* Setup the exports. The window system will call these functions
209 * when it needs Mesa to do something.
210 * NOTE: Device drivers should override these functions! For example,
211 * the Xlib driver should plug in the XMesa*-style functions into this
212 * structure. The XMesa-style functions should then call the _mesa_*
213 * version of these functions. This is an approximation to OO design
214 * (inheritance and virtual functions).
215 */
216static void
217_mesa_init_default_exports(__GLexports *exports)
218{
219 exports->destroyContext = _mesa_destroyContext;
220 exports->loseCurrent = _mesa_loseCurrent;
221 exports->makeCurrent = _mesa_makeCurrent;
222 exports->shareContext = _mesa_shareContext;
223 exports->copyContext = _mesa_copyContext;
224 exports->forceCurrent = _mesa_forceCurrent;
225 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000226 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000227 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
228 exports->dispatchExec = _mesa_dispatchExec;
229 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
230 exports->endDispatchOverride = _mesa_endDispatchOverride;
231}
232
233
Brian Paulb1394fa2000-09-26 20:53:53 +0000234
235/* exported OpenGL SI interface */
236__GLcontext *
237__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
238{
239 GLcontext *ctx;
240
Brian Paul4753d602002-06-15 02:38:15 +0000241 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000242 if (ctx == NULL) {
243 return NULL;
244 }
Brian Paul60b6e4f2002-10-14 17:08:17 +0000245
Brian Paul3c634522002-10-24 23:57:19 +0000246 _mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000247 ctx->imports = *imports;
Brian Paulb1394fa2000-09-26 20:53:53 +0000248
249 return ctx;
250}
251
252
253/* exported OpenGL SI interface */
254void
255__glCoreNopDispatch(void)
256{
257#if 0
258 /* SI */
259 __gl_dispatch = __glNopDispatchState;
260#else
261 /* Mesa */
262 _glapi_set_dispatch(NULL);
263#endif
264}
265
266
jtgafb833d1999-08-19 00:55:39 +0000267/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000268/***** GL Visual allocation/destruction *****/
269/**********************************************************************/
270
271
272/*
273 * Allocate a new GLvisual object.
274 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000275 * dbFlag - double buffering?
276 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000277 * depthBits - requested bits per depth buffer value
278 * Any value in [0, 32] is acceptable but the actual
279 * depth type will be GLushort or GLuint as needed.
280 * stencilBits - requested minimum bits per stencil buffer value
281 * accumBits - requested minimum bits per accum buffer component
282 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
283 * red/green/blue/alphaBits - number of bits per color component
284 * in frame buffer for RGB(A) mode.
285 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000286 * Return: pointer to new GLvisual or NULL if requested parameters can't
287 * be met.
288 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000289GLvisual *
290_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000291 GLboolean dbFlag,
292 GLboolean stereoFlag,
293 GLint redBits,
294 GLint greenBits,
295 GLint blueBits,
296 GLint alphaBits,
297 GLint indexBits,
298 GLint depthBits,
299 GLint stencilBits,
300 GLint accumRedBits,
301 GLint accumGreenBits,
302 GLint accumBlueBits,
303 GLint accumAlphaBits,
304 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000305{
Brian Paul178a1c52000-04-22 01:05:00 +0000306 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
307 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000308 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000309 redBits, greenBits, blueBits, alphaBits,
310 indexBits, depthBits, stencilBits,
311 accumRedBits, accumGreenBits,
312 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000313 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000314 FREE(vis);
315 return NULL;
316 }
317 }
318 return vis;
319}
320
321
322/*
323 * Initialize the fields of the given GLvisual.
324 * Input: see _mesa_create_visual() above.
325 * Return: GL_TRUE = success
326 * GL_FALSE = failure.
327 */
328GLboolean
329_mesa_initialize_visual( GLvisual *vis,
330 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000331 GLboolean dbFlag,
332 GLboolean stereoFlag,
333 GLint redBits,
334 GLint greenBits,
335 GLint blueBits,
336 GLint alphaBits,
337 GLint indexBits,
338 GLint depthBits,
339 GLint stencilBits,
340 GLint accumRedBits,
341 GLint accumGreenBits,
342 GLint accumBlueBits,
343 GLint accumAlphaBits,
344 GLint numSamples )
345{
Brian Paulb6bcae52001-01-23 23:39:36 +0000346 (void) numSamples;
347
Brian Paul178a1c52000-04-22 01:05:00 +0000348 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000349
Brian Pauled30dfa2000-03-03 17:47:39 +0000350 /* This is to catch bad values from device drivers not updated for
351 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
352 * bad value now (a 1-bit depth buffer!?!).
353 */
354 assert(depthBits == 0 || depthBits > 1);
355
356 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000357 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000358 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000359 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000360 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000361 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000362 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000363 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000364 }
365 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000366 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000367 }
368 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000369 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000370 }
371 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000372 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000373 }
374
Brian Paulb6bcae52001-01-23 23:39:36 +0000375 vis->rgbMode = rgbFlag;
376 vis->doubleBufferMode = dbFlag;
377 vis->stereoMode = stereoFlag;
Brian Paul153f1542002-10-29 15:04:35 +0000378
Brian Paulb6bcae52001-01-23 23:39:36 +0000379 vis->redBits = redBits;
380 vis->greenBits = greenBits;
381 vis->blueBits = blueBits;
382 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000383
Brian Paulb6bcae52001-01-23 23:39:36 +0000384 vis->indexBits = indexBits;
385 vis->depthBits = depthBits;
386 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
387 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
388 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
389 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
390 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000391
Brian Paul153f1542002-10-29 15:04:35 +0000392 vis->haveAccumBuffer = accumRedBits > 0;
393 vis->haveDepthBuffer = depthBits > 0;
394 vis->haveStencilBuffer = stencilBits > 0;
395
396 vis->numAuxBuffers = 0;
397 vis->level = 0;
398 vis->pixmapMode = 0;
399
Brian Paul178a1c52000-04-22 01:05:00 +0000400 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000401}
402
403
Brian Paulb371e0d2000-03-31 01:05:51 +0000404void
405_mesa_destroy_visual( GLvisual *vis )
406{
407 FREE(vis);
408}
409
410
Brian Paul4d053dd2000-01-14 04:45:47 +0000411/**********************************************************************/
412/***** GL Framebuffer allocation/destruction *****/
413/**********************************************************************/
414
415
416/*
417 * Create a new framebuffer. A GLframebuffer is a struct which
418 * encapsulates the depth, stencil and accum buffers and related
419 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000420 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000421 * softwareDepth - create/use a software depth buffer?
422 * softwareStencil - create/use a software stencil buffer?
423 * softwareAccum - create/use a software accum buffer?
424 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000425 * Return: pointer to new GLframebuffer struct or NULL if error.
426 */
Brian Paul178a1c52000-04-22 01:05:00 +0000427GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000428_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000429 GLboolean softwareDepth,
430 GLboolean softwareStencil,
431 GLboolean softwareAccum,
432 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000433{
Brian Paul178a1c52000-04-22 01:05:00 +0000434 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
435 assert(visual);
436 if (buffer) {
437 _mesa_initialize_framebuffer(buffer, visual,
438 softwareDepth, softwareStencil,
439 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000440 }
Brian Paul178a1c52000-04-22 01:05:00 +0000441 return buffer;
442}
443
444
445/*
446 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000447 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000448 */
449void
450_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000451 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000452 GLboolean softwareDepth,
453 GLboolean softwareStencil,
454 GLboolean softwareAccum,
455 GLboolean softwareAlpha )
456{
457 assert(buffer);
458 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000459
Brian Paul6ec6b842002-10-30 19:49:29 +0000460 _mesa_bzero(buffer, sizeof(GLframebuffer));
Brian Paul85d81602002-06-17 23:36:31 +0000461
Brian Paul4d053dd2000-01-14 04:45:47 +0000462 /* sanity checks */
463 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000464 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000465 }
466 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000467 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000468 }
469 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000470 assert(visual->rgbMode);
471 assert(visual->accumRedBits > 0);
472 assert(visual->accumGreenBits > 0);
473 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000474 }
475 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000476 assert(visual->rgbMode);
477 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000478 }
479
Brian Paul75978bd2001-04-27 21:17:20 +0000480 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000481 buffer->UseSoftwareDepthBuffer = softwareDepth;
482 buffer->UseSoftwareStencilBuffer = softwareStencil;
483 buffer->UseSoftwareAccumBuffer = softwareAccum;
484 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000485}
486
487
Brian Paul4d053dd2000-01-14 04:45:47 +0000488/*
489 * Free a framebuffer struct and its buffers.
490 */
Brian Paul178a1c52000-04-22 01:05:00 +0000491void
Brian Paulb1394fa2000-09-26 20:53:53 +0000492_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000493{
494 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000495 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000496 FREE(buffer);
497 }
498}
499
500
Brian Paul75978bd2001-04-27 21:17:20 +0000501/*
502 * Free the data hanging off of <buffer>, but not <buffer> itself.
503 */
504void
505_mesa_free_framebuffer_data( GLframebuffer *buffer )
506{
507 if (!buffer)
508 return;
509
510 if (buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000511 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000512 buffer->DepthBuffer = NULL;
513 }
514 if (buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000515 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000516 buffer->Accum = NULL;
517 }
518 if (buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000519 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000520 buffer->Stencil = NULL;
521 }
522 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000523 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000524 buffer->FrontLeftAlpha = NULL;
525 }
526 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000527 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000528 buffer->BackLeftAlpha = NULL;
529 }
530 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000531 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000532 buffer->FrontRightAlpha = NULL;
533 }
534 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000535 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000536 buffer->BackRightAlpha = NULL;
537 }
538}
539
540
Brian Paul4d053dd2000-01-14 04:45:47 +0000541
542/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000543/***** Context allocation, initialization, destroying *****/
544/**********************************************************************/
545
546
Brian Paul9560f052000-01-31 23:11:39 +0000547_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
548
549
jtgafb833d1999-08-19 00:55:39 +0000550/*
551 * This function just calls all the various one-time-init functions in Mesa.
552 */
Brian Paul178a1c52000-04-22 01:05:00 +0000553static void
Brian Paul4753d602002-06-15 02:38:15 +0000554one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000555{
556 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000557 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000558 if (!alreadyCalled) {
Brian Paul27558a12003-03-01 01:50:20 +0000559 GLuint i;
560
Brian Paul4d053dd2000-01-14 04:45:47 +0000561 /* do some implementation tests */
562 assert( sizeof(GLbyte) == 1 );
563 assert( sizeof(GLshort) >= 2 );
564 assert( sizeof(GLint) >= 4 );
565 assert( sizeof(GLubyte) == 1 );
566 assert( sizeof(GLushort) >= 2 );
567 assert( sizeof(GLuint) >= 4 );
568
Brian Paul08836342001-03-03 20:33:27 +0000569 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000570
Keith Whitwell23caf202000-11-16 21:05:34 +0000571 _math_init();
Brian Paul27558a12003-03-01 01:50:20 +0000572
573 for (i = 0; i < 256; i++) {
574 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
575 }
Brian Paul68ee4bc2000-01-28 19:02:22 +0000576
davem69775355a2001-06-05 23:54:00 +0000577#ifdef USE_SPARC_ASM
578 _mesa_init_sparc_glapi_relocs();
579#endif
Brian Paul3c634522002-10-24 23:57:19 +0000580 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000581 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul71072be2002-10-10 00:22:13 +0000582#ifndef GLX_DIRECT_RENDERING
583 /* libGL from before 2002/06/28 don't have this function. Someday,
584 * when newer libGL libs are common, remove the #ifdef test. This
585 * only serves to print warnings when calling undefined GL functions.
586 */
Brian Paul4e9676f2002-06-29 19:48:15 +0000587 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul71072be2002-10-10 00:22:13 +0000588#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000589 }
590 else {
591 _glapi_noop_enable_warnings(GL_FALSE);
592 }
593
jtgafb833d1999-08-19 00:55:39 +0000594#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4e9676f2002-06-29 19:48:15 +0000595 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000596#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000597
598 alreadyCalled = GL_TRUE;
599 }
Brian Paul9560f052000-01-31 23:11:39 +0000600 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000601}
602
603
Brian Paul86b84272001-12-14 02:50:01 +0000604static void
605init_matrix_stack( struct matrix_stack *stack,
606 GLuint maxDepth, GLuint dirtyFlag )
607{
608 GLuint i;
609
610 stack->Depth = 0;
611 stack->MaxDepth = maxDepth;
612 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000613 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000614 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000615 for (i = 0; i < maxDepth; i++) {
616 _math_matrix_ctr(&stack->Stack[i]);
617 _math_matrix_alloc_inv(&stack->Stack[i]);
618 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000619 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000620}
621
622
623static void
624free_matrix_stack( struct matrix_stack *stack )
625{
626 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000627 for (i = 0; i < stack->MaxDepth; i++) {
628 _math_matrix_dtr(&stack->Stack[i]);
629 }
Brian Paulc4afba32002-02-05 23:21:45 +0000630 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000631 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000632}
633
Brian Paul4d053dd2000-01-14 04:45:47 +0000634
jtgafb833d1999-08-19 00:55:39 +0000635/*
636 * Allocate and initialize a shared context state structure.
637 */
Brian Paula3f13702003-04-01 16:41:50 +0000638static GLboolean
639alloc_shared_state( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000640{
Brian Paula3f13702003-04-01 16:41:50 +0000641 struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000642 if (!ss)
Brian Paula3f13702003-04-01 16:41:50 +0000643 return GL_FALSE;
644
645 ctx->Shared = ss;
jtgafb833d1999-08-19 00:55:39 +0000646
Brian Paule4b684c2000-09-12 21:07:40 +0000647 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000648
Brian Paule4b684c2000-09-12 21:07:40 +0000649 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000650 ss->TexObjects = _mesa_NewHashTable();
Brian Paul451f3102003-04-17 01:48:19 +0000651#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
Brian Paul610d5992003-01-14 04:55:45 +0000652 ss->Programs = _mesa_NewHashTable();
Brian Paul8dfc5b92002-10-16 17:57:51 +0000653#endif
jtgafb833d1999-08-19 00:55:39 +0000654
Brian Paul451f3102003-04-17 01:48:19 +0000655#if FEATURE_ARB_vertex_program
656 ss->DefaultVertexProgram = _mesa_alloc_program(ctx, GL_VERTEX_PROGRAM_ARB, 0);
657 if (!ss->DefaultVertexProgram)
658 goto cleanup;
659#endif
660#if FEATURE_ARB_fragment_program
661 ss->DefaultFragmentProgram = _mesa_alloc_program(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
662 if (!ss->DefaultFragmentProgram)
663 goto cleanup;
664#endif
665
Brian Paula3f13702003-04-01 16:41:50 +0000666 ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
667 if (!ss->Default1D)
668 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000669
Brian Paula3f13702003-04-01 16:41:50 +0000670 ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
671 if (!ss->Default2D)
672 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +0000673
Brian Paula3f13702003-04-01 16:41:50 +0000674 ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
675 if (!ss->Default3D)
676 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000677
Brian Paula3f13702003-04-01 16:41:50 +0000678 ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
679 if (!ss->DefaultCubeMap)
680 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +0000681
Brian Paula3f13702003-04-01 16:41:50 +0000682 ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
683 if (!ss->DefaultRect)
684 goto cleanup;
Brian Paul413d6a22000-05-26 14:44:59 +0000685
Brian Paula3f13702003-04-01 16:41:50 +0000686#if 0
687 _mesa_save_texture_object(ctx, ss->Default1D);
688 _mesa_save_texture_object(ctx, ss->Default2D);
689 _mesa_save_texture_object(ctx, ss->Default3D);
690 _mesa_save_texture_object(ctx, ss->DefaultCubeMap);
691 _mesa_save_texture_object(ctx, ss->DefaultRect);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000692#endif
Brian Paula3f13702003-04-01 16:41:50 +0000693
694 /* Effectively bind the default textures to all texture units */
695 ss->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
696 ss->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
697 ss->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
698 ss->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
699 ss->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
700
701 return GL_TRUE;
702
703 cleanup:
704 /* Ran out of memory at some point. Free everything and return NULL */
705 if (ss->DisplayList)
706 _mesa_DeleteHashTable(ss->DisplayList);
707 if (ss->TexObjects)
708 _mesa_DeleteHashTable(ss->TexObjects);
709#if FEATURE_NV_vertex_program
710 if (ss->Programs)
711 _mesa_DeleteHashTable(ss->Programs);
712#endif
Brian Paul451f3102003-04-17 01:48:19 +0000713#if FEATURE_ARB_vertex_program
714 if (ss->DefaultVertexProgram)
715 _mesa_delete_program(ctx, ss->DefaultVertexProgram);
716#endif
717#if FEATURE_ARB_fragment_program
718 if (ss->DefaultFragmentProgram)
719 _mesa_delete_program(ctx, ss->DefaultFragmentProgram);
720#endif
Brian Paula3f13702003-04-01 16:41:50 +0000721 if (ss->Default1D)
722 (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
723 if (ss->Default2D)
724 (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
725 if (ss->Default3D)
726 (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
727 if (ss->DefaultCubeMap)
728 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
729 if (ss->DefaultRect)
730 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
731 if (ss)
732 _mesa_free(ss);
733 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000734}
735
736
737/*
738 * Deallocate a shared state context and all children structures.
739 */
Brian Paul178a1c52000-04-22 01:05:00 +0000740static void
741free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000742{
743 /* Free display lists */
744 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000745 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000746 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000747 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000748 }
749 else {
750 break;
751 }
752 }
Brian Paulbb797902000-01-24 16:19:54 +0000753 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000754
755 /* Free texture objects */
Brian Paula3f13702003-04-01 16:41:50 +0000756 ASSERT(ctx->Driver.DeleteTexture);
757 while (1) {
758 GLuint texName = _mesa_HashFirstEntry(ss->TexObjects);
759 if (texName) {
760 struct gl_texture_object *texObj = (struct gl_texture_object *)
761 _mesa_HashLookup(ss->TexObjects, texName);
762 ASSERT(texObj);
763 (*ctx->Driver.DeleteTexture)(ctx, texObj);
764 _mesa_HashRemove(ss->TexObjects, texName);
765 }
766 else {
767 break;
768 }
jtgafb833d1999-08-19 00:55:39 +0000769 }
Brian Paulbb797902000-01-24 16:19:54 +0000770 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000771
Brian Paul8dfc5b92002-10-16 17:57:51 +0000772#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +0000773 /* Free vertex programs */
774 while (1) {
Brian Paul610d5992003-01-14 04:55:45 +0000775 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
Brian Paul30f51ae2001-12-18 04:06:44 +0000776 if (prog) {
Brian Paul451f3102003-04-17 01:48:19 +0000777 struct program *p = (struct program *) _mesa_HashLookup(ss->Programs,
778 prog);
779 ASSERT(p);
780 _mesa_delete_program(ctx, p);
781 _mesa_HashRemove(ss->Programs, prog);
Brian Paul30f51ae2001-12-18 04:06:44 +0000782 }
783 else {
784 break;
785 }
786 }
Brian Paul610d5992003-01-14 04:55:45 +0000787 _mesa_DeleteHashTable(ss->Programs);
Brian Paul8dfc5b92002-10-16 17:57:51 +0000788#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000789
Keith Whitwelle15fd852002-12-12 13:03:15 +0000790 _glthread_DESTROY_MUTEX(ss->Mutex);
791
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000792 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000793}
794
795
796
jtgafb833d1999-08-19 00:55:39 +0000797/*
798 * Initialize the nth light. Note that the defaults for light 0 are
799 * different than the other lights.
800 */
Brian Paul178a1c52000-04-22 01:05:00 +0000801static void
802init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000803{
804 make_empty_list( l );
805
806 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
807 if (n==0) {
808 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
809 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
810 }
811 else {
812 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
813 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
814 }
815 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
816 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
817 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000818 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000819 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000820 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000821 l->ConstantAttenuation = 1.0;
822 l->LinearAttenuation = 0.0;
823 l->QuadraticAttenuation = 0.0;
824 l->Enabled = GL_FALSE;
825}
826
827
828
Brian Paul178a1c52000-04-22 01:05:00 +0000829static void
830init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000831{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000832 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000833 lm->LocalViewer = GL_FALSE;
834 lm->TwoSide = GL_FALSE;
835 lm->ColorControl = GL_SINGLE_COLOR;
836}
837
838
Brian Paul178a1c52000-04-22 01:05:00 +0000839static void
840init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000841{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000842 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
843 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
844 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
845 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000846 m->Shininess = 0.0;
847 m->AmbientIndex = 0;
848 m->DiffuseIndex = 1;
849 m->SpecularIndex = 1;
850}
851
852
853
Brian Paul178a1c52000-04-22 01:05:00 +0000854static void
855init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000856{
857 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
858
859 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000860 texUnit->CombineModeRGB = GL_MODULATE;
861 texUnit->CombineModeA = GL_MODULATE;
862 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
863 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
864 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
865 texUnit->CombineSourceA[0] = GL_TEXTURE;
866 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
867 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
868 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
869 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
870 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
871 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
872 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
873 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
874 texUnit->CombineScaleShiftRGB = 0;
875 texUnit->CombineScaleShiftA = 0;
876
jtgafb833d1999-08-19 00:55:39 +0000877 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
878 texUnit->TexGenEnabled = 0;
879 texUnit->GenModeS = GL_EYE_LINEAR;
880 texUnit->GenModeT = GL_EYE_LINEAR;
881 texUnit->GenModeR = GL_EYE_LINEAR;
882 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000883 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
884 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
885 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
886 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000887
jtgafb833d1999-08-19 00:55:39 +0000888 /* Yes, these plane coefficients are correct! */
889 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
890 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
891 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
892 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
893 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
894 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
895 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
896 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
897
Brian Paula8523782000-11-19 23:10:25 +0000898 texUnit->Current1D = ctx->Shared->Default1D;
899 texUnit->Current2D = ctx->Shared->Default2D;
900 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000901 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
Brian Paul8afe7de2002-06-15 03:03:06 +0000902 texUnit->CurrentRect = ctx->Shared->DefaultRect;
Brian Paul45b47d02003-01-26 14:37:15 +0000903
904 /* GL_SGI_texture_color_table */
905 texUnit->ColorTableEnabled = GL_FALSE;
906 _mesa_init_colortable(&texUnit->ColorTable);
907 _mesa_init_colortable(&texUnit->ProxyColorTable);
jtgafb833d1999-08-19 00:55:39 +0000908}
909
910
jtgafb833d1999-08-19 00:55:39 +0000911
Brian Paul4d053dd2000-01-14 04:45:47 +0000912
jtgafb833d1999-08-19 00:55:39 +0000913/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000914static void
915init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000916{
917 map->Order = 1;
918 map->u1 = 0.0;
919 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000920 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000921 if (map->Points) {
922 GLint i;
923 for (i=0;i<n;i++)
924 map->Points[i] = initial[i];
925 }
jtgafb833d1999-08-19 00:55:39 +0000926}
927
928
929/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000930static void
931init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000932{
933 map->Uorder = 1;
934 map->Vorder = 1;
935 map->u1 = 0.0;
936 map->u2 = 1.0;
937 map->v1 = 0.0;
938 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000939 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000940 if (map->Points) {
941 GLint i;
942 for (i=0;i<n;i++)
943 map->Points[i] = initial[i];
944 }
jtgafb833d1999-08-19 00:55:39 +0000945}
946
947
jtgafb833d1999-08-19 00:55:39 +0000948/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000949 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000950 */
Brian Paul178a1c52000-04-22 01:05:00 +0000951static void
952init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000953{
Brian Paul30f51ae2001-12-18 04:06:44 +0000954 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000955
Brian Paul4d053dd2000-01-14 04:45:47 +0000956 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000957
Brian Paulcd1cefa2001-06-13 14:56:14 +0000958 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
959 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
960
Brian Paul539cce52000-02-03 19:40:07 +0000961 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000962 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000963 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
964 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000965 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000966 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Brian Paul610d5992003-01-14 04:55:45 +0000967 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
968 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000969 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000970 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000971 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000972 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
973 ctx->Const.MinPointSize = MIN_POINT_SIZE;
974 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
975 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
976 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000977 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000978 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
979 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
980 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
981 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000982 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000983 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000984 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000985 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
986 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000987 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
988 ctx->Const.MaxLights = MAX_LIGHTS;
Brian Pauld0492cf2003-04-11 01:20:06 +0000989#if FEATURE_ARB_vertex_program
Brian Pauld0492cf2003-04-11 01:20:06 +0000990 ctx->Const.MaxVertexProgramInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;
Brian Paul451f3102003-04-17 01:48:19 +0000991 ctx->Const.MaxVertexProgramAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
992 ctx->Const.MaxVertexProgramTemps = MAX_NV_VERTEX_PROGRAM_TEMPS;
993 ctx->Const.MaxVertexProgramLocalParams = MAX_NV_VERTEX_PROGRAM_PARAMS;
994 ctx->Const.MaxVertexProgramEnvParams = MAX_NV_VERTEX_PROGRAM_PARAMS;/*XXX*/
995 ctx->Const.MaxVertexProgramAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
Brian Pauld0492cf2003-04-11 01:20:06 +0000996#endif
997#if FEATURE_ARB_fragment_program
Brian Pauld0492cf2003-04-11 01:20:06 +0000998 ctx->Const.MaxFragmentProgramInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;
Brian Paul451f3102003-04-17 01:48:19 +0000999 ctx->Const.MaxFragmentProgramAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
1000 ctx->Const.MaxFragmentProgramTemps = MAX_NV_FRAGMENT_PROGRAM_TEMPS;
1001 ctx->Const.MaxFragmentProgramLocalParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
1002 ctx->Const.MaxFragmentProgramEnvParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;/*XXX*/
1003 ctx->Const.MaxFragmentProgramAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
1004 ctx->Const.MaxFragmentProgramAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;
1005 ctx->Const.MaxFragmentProgramTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
1006 ctx->Const.MaxFragmentProgramTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
Brian Pauld0492cf2003-04-11 01:20:06 +00001007#endif
Brian Pauledd67742003-04-18 18:02:43 +00001008 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
1009 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
Brian Pauld0492cf2003-04-11 01:20:06 +00001010
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++)
Brian Pauledd67742003-04-18 18:02:43 +00001023 init_matrix_stack(&ctx->ProgramMatrixStack[i],
1024 MAX_PROGRAM_MATRIX_STACK_DEPTH, _NEW_TRACK_MATRIX);
Brian Paul30f51ae2001-12-18 04:06:44 +00001025 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;
Brian Paulb0b9b792003-04-21 14:53:40 +00001084 ctx->Depth.BoundsTest = GL_FALSE;
1085 ctx->Depth.BoundsMin = 0.0F;
1086 ctx->Depth.BoundsMax = 1.0F;
jtgafb833d1999-08-19 00:55:39 +00001087
Brian Paul4d053dd2000-01-14 04:45:47 +00001088 /* Evaluators group */
1089 ctx->Eval.Map1Color4 = GL_FALSE;
1090 ctx->Eval.Map1Index = GL_FALSE;
1091 ctx->Eval.Map1Normal = GL_FALSE;
1092 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1093 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1094 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1095 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1096 ctx->Eval.Map1Vertex3 = GL_FALSE;
1097 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001098 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001099 ctx->Eval.Map2Color4 = GL_FALSE;
1100 ctx->Eval.Map2Index = GL_FALSE;
1101 ctx->Eval.Map2Normal = GL_FALSE;
1102 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1103 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1104 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1105 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1106 ctx->Eval.Map2Vertex3 = GL_FALSE;
1107 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001108 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001109 ctx->Eval.AutoNormal = GL_FALSE;
1110 ctx->Eval.MapGrid1un = 1;
1111 ctx->Eval.MapGrid1u1 = 0.0;
1112 ctx->Eval.MapGrid1u2 = 1.0;
1113 ctx->Eval.MapGrid2un = 1;
1114 ctx->Eval.MapGrid2vn = 1;
1115 ctx->Eval.MapGrid2u1 = 0.0;
1116 ctx->Eval.MapGrid2u2 = 1.0;
1117 ctx->Eval.MapGrid2v1 = 0.0;
1118 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001119
Brian Paul4d053dd2000-01-14 04:45:47 +00001120 /* Evaluator data */
1121 {
1122 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1123 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1124 static GLfloat index[1] = { 1.0 };
1125 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1126 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001127 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001128
Brian Paul4d053dd2000-01-14 04:45:47 +00001129 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1130 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1131 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1132 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1133 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1134 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1135 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1136 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1137 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001138 for (i = 0; i < 16; i++)
1139 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001140
Brian Paul4d053dd2000-01-14 04:45:47 +00001141 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1142 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1143 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1144 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1145 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1146 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1147 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1148 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1149 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001150 for (i = 0; i < 16; i++)
1151 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001152 }
jtgafb833d1999-08-19 00:55:39 +00001153
Brian Paul4d053dd2000-01-14 04:45:47 +00001154 /* Fog group */
1155 ctx->Fog.Enabled = GL_FALSE;
1156 ctx->Fog.Mode = GL_EXP;
1157 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1158 ctx->Fog.Index = 0.0;
1159 ctx->Fog.Density = 1.0;
1160 ctx->Fog.Start = 0.0;
1161 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001162 ctx->Fog.ColorSumEnabled = GL_FALSE;
1163 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001164
Brian Paul4d053dd2000-01-14 04:45:47 +00001165 /* Hint group */
1166 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1167 ctx->Hint.PointSmooth = GL_DONT_CARE;
1168 ctx->Hint.LineSmooth = GL_DONT_CARE;
1169 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1170 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001171 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1172 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001173 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001174
Brian Paul0771d152000-04-07 00:19:41 +00001175 /* Histogram group */
1176 ctx->Histogram.Width = 0;
1177 ctx->Histogram.Format = GL_RGBA;
1178 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001179 ctx->Histogram.RedSize = 0;
1180 ctx->Histogram.GreenSize = 0;
1181 ctx->Histogram.BlueSize = 0;
1182 ctx->Histogram.AlphaSize = 0;
1183 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001184 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1185 ctx->Histogram.Count[i][0] = 0;
1186 ctx->Histogram.Count[i][1] = 0;
1187 ctx->Histogram.Count[i][2] = 0;
1188 ctx->Histogram.Count[i][3] = 0;
1189 }
1190
1191 /* Min/Max group */
1192 ctx->MinMax.Format = GL_RGBA;
1193 ctx->MinMax.Sink = GL_FALSE;
1194 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1195 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1196 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1197 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1198
Brian Paul4d053dd2000-01-14 04:45:47 +00001199 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001200 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001201
Brian Paul4d053dd2000-01-14 04:45:47 +00001202 /* Lighting group */
1203 for (i=0;i<MAX_LIGHTS;i++) {
1204 init_light( &ctx->Light.Light[i], i );
1205 }
1206 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001207
Brian Paul4d053dd2000-01-14 04:45:47 +00001208 init_lightmodel( &ctx->Light.Model );
1209 init_material( &ctx->Light.Material[0] );
1210 init_material( &ctx->Light.Material[1] );
1211 ctx->Light.ShadeModel = GL_SMOOTH;
1212 ctx->Light.Enabled = GL_FALSE;
1213 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1214 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001215 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1216 GL_FRONT_AND_BACK,
1217 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001218
Brian Paul4d053dd2000-01-14 04:45:47 +00001219 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001220
Brian Paul4d053dd2000-01-14 04:45:47 +00001221 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001222 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1223 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001224 for (i = 0 ; i < 10 ; i++) {
1225 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1226 s->shininess = -1;
1227 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001228 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001229 }
Brian Paul77d61af2000-06-28 04:20:21 +00001230
jtgafb833d1999-08-19 00:55:39 +00001231
Brian Paul4d053dd2000-01-14 04:45:47 +00001232 /* Line group */
1233 ctx->Line.SmoothFlag = GL_FALSE;
1234 ctx->Line.StippleFlag = GL_FALSE;
1235 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001236 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001237 ctx->Line.StipplePattern = 0xffff;
1238 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001239
Brian Paul4d053dd2000-01-14 04:45:47 +00001240 /* Display List group */
1241 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001242
Brian Paul736fcbe2001-05-29 15:23:48 +00001243 /* Multisample */
1244 ctx->Multisample.Enabled = GL_FALSE;
1245 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1246 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1247 ctx->Multisample.SampleCoverage = GL_FALSE;
1248 ctx->Multisample.SampleCoverageValue = 1.0;
1249 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1250
Brian Paul4d053dd2000-01-14 04:45:47 +00001251 /* Pixel group */
1252 ctx->Pixel.RedBias = 0.0;
1253 ctx->Pixel.RedScale = 1.0;
1254 ctx->Pixel.GreenBias = 0.0;
1255 ctx->Pixel.GreenScale = 1.0;
1256 ctx->Pixel.BlueBias = 0.0;
1257 ctx->Pixel.BlueScale = 1.0;
1258 ctx->Pixel.AlphaBias = 0.0;
1259 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001260 ctx->Pixel.DepthBias = 0.0;
1261 ctx->Pixel.DepthScale = 1.0;
1262 ctx->Pixel.IndexOffset = 0;
1263 ctx->Pixel.IndexShift = 0;
1264 ctx->Pixel.ZoomX = 1.0;
1265 ctx->Pixel.ZoomY = 1.0;
1266 ctx->Pixel.MapColorFlag = GL_FALSE;
1267 ctx->Pixel.MapStencilFlag = GL_FALSE;
1268 ctx->Pixel.MapStoSsize = 1;
1269 ctx->Pixel.MapItoIsize = 1;
1270 ctx->Pixel.MapItoRsize = 1;
1271 ctx->Pixel.MapItoGsize = 1;
1272 ctx->Pixel.MapItoBsize = 1;
1273 ctx->Pixel.MapItoAsize = 1;
1274 ctx->Pixel.MapRtoRsize = 1;
1275 ctx->Pixel.MapGtoGsize = 1;
1276 ctx->Pixel.MapBtoBsize = 1;
1277 ctx->Pixel.MapAtoAsize = 1;
1278 ctx->Pixel.MapStoS[0] = 0;
1279 ctx->Pixel.MapItoI[0] = 0;
1280 ctx->Pixel.MapItoR[0] = 0.0;
1281 ctx->Pixel.MapItoG[0] = 0.0;
1282 ctx->Pixel.MapItoB[0] = 0.0;
1283 ctx->Pixel.MapItoA[0] = 0.0;
1284 ctx->Pixel.MapItoR8[0] = 0;
1285 ctx->Pixel.MapItoG8[0] = 0;
1286 ctx->Pixel.MapItoB8[0] = 0;
1287 ctx->Pixel.MapItoA8[0] = 0;
1288 ctx->Pixel.MapRtoR[0] = 0.0;
1289 ctx->Pixel.MapGtoG[0] = 0.0;
1290 ctx->Pixel.MapBtoB[0] = 0.0;
1291 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001292 ctx->Pixel.HistogramEnabled = GL_FALSE;
1293 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1294 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1295 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1296 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001297 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1298 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1299 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1300 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001301 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1302 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1303 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1304 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001305 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1306 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1307 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001308 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1309 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1310 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1311 for (i = 0; i < 3; i++) {
1312 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1313 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1314 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1315 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1316 }
Brian Paul67adba12000-12-09 20:35:54 +00001317 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1318 ctx->Convolution1D.Filter[i] = 0.0;
1319 ctx->Convolution2D.Filter[i] = 0.0;
1320 ctx->Separable2D.Filter[i] = 0.0;
1321 }
Brian Paul82b02f02000-05-07 20:37:40 +00001322 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1323 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul45b47d02003-01-26 14:37:15 +00001324 /* GL_SGI_texture_color_table */
1325 ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);
1326 ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001327
Brian Paul4d053dd2000-01-14 04:45:47 +00001328 /* Point group */
1329 ctx->Point.SmoothFlag = GL_FALSE;
1330 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001331 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001332 ctx->Point.Params[0] = 1.0;
1333 ctx->Point.Params[1] = 0.0;
1334 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001335 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001336 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001337 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001338 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001339 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1340 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
Brian Paul610d5992003-01-14 04:55:45 +00001341 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul6c408b42002-05-27 17:04:52 +00001342 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1343 }
jtgafb833d1999-08-19 00:55:39 +00001344
Brian Paul4d053dd2000-01-14 04:45:47 +00001345 /* Polygon group */
1346 ctx->Polygon.CullFlag = GL_FALSE;
1347 ctx->Polygon.CullFaceMode = GL_BACK;
1348 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001349 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001350 ctx->Polygon.FrontMode = GL_FILL;
1351 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001352 ctx->Polygon.SmoothFlag = GL_FALSE;
1353 ctx->Polygon.StippleFlag = GL_FALSE;
1354 ctx->Polygon.OffsetFactor = 0.0F;
1355 ctx->Polygon.OffsetUnits = 0.0F;
1356 ctx->Polygon.OffsetPoint = GL_FALSE;
1357 ctx->Polygon.OffsetLine = GL_FALSE;
1358 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001359
Brian Paul4d053dd2000-01-14 04:45:47 +00001360 /* Polygon Stipple group */
1361 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001362
Brian Paul4d053dd2000-01-14 04:45:47 +00001363 /* Scissor group */
1364 ctx->Scissor.Enabled = GL_FALSE;
1365 ctx->Scissor.X = 0;
1366 ctx->Scissor.Y = 0;
1367 ctx->Scissor.Width = 0;
1368 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001369
Brian Paul4d053dd2000-01-14 04:45:47 +00001370 /* Stencil group */
1371 ctx->Stencil.Enabled = GL_FALSE;
Brian Paul5f60a0b2002-09-06 02:56:08 +00001372 ctx->Stencil.TestTwoSide = GL_FALSE;
1373 ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
1374 ctx->Stencil.Function[0] = GL_ALWAYS;
1375 ctx->Stencil.Function[1] = GL_ALWAYS;
1376 ctx->Stencil.FailFunc[0] = GL_KEEP;
1377 ctx->Stencil.FailFunc[1] = GL_KEEP;
1378 ctx->Stencil.ZPassFunc[0] = GL_KEEP;
1379 ctx->Stencil.ZPassFunc[1] = GL_KEEP;
1380 ctx->Stencil.ZFailFunc[0] = GL_KEEP;
1381 ctx->Stencil.ZFailFunc[1] = GL_KEEP;
1382 ctx->Stencil.Ref[0] = 0;
1383 ctx->Stencil.Ref[1] = 0;
1384 ctx->Stencil.ValueMask[0] = STENCIL_MAX;
1385 ctx->Stencil.ValueMask[1] = STENCIL_MAX;
1386 ctx->Stencil.WriteMask[0] = STENCIL_MAX;
1387 ctx->Stencil.WriteMask[1] = STENCIL_MAX;
Brian Paul4d053dd2000-01-14 04:45:47 +00001388 ctx->Stencil.Clear = 0;
jtgafb833d1999-08-19 00:55:39 +00001389
Brian Paul4d053dd2000-01-14 04:45:47 +00001390 /* Texture group */
1391 ctx->Texture.CurrentUnit = 0; /* multitexture */
Brian Paul8afe7de2002-06-15 03:03:06 +00001392 ctx->Texture._EnabledUnits = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001393 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1394 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001395 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001396 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001397
Brian Paul4d053dd2000-01-14 04:45:47 +00001398 /* Transformation group */
1399 ctx->Transform.MatrixMode = GL_MODELVIEW;
1400 ctx->Transform.Normalize = GL_FALSE;
1401 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001402 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001403 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001404 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1405 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001406 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001407
Brian Paul4d053dd2000-01-14 04:45:47 +00001408 /* Viewport group */
1409 ctx->Viewport.X = 0;
1410 ctx->Viewport.Y = 0;
1411 ctx->Viewport.Width = 0;
1412 ctx->Viewport.Height = 0;
1413 ctx->Viewport.Near = 0.0;
1414 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001415 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001416
1417#define Sz 10
1418#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001419 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1420 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001421#undef Sz
1422#undef Tz
1423
Keith Whitwell14940c42000-11-05 18:40:57 +00001424 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1425 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001426
Brian Paul4d053dd2000-01-14 04:45:47 +00001427 /* Vertex arrays */
1428 ctx->Array.Vertex.Size = 4;
1429 ctx->Array.Vertex.Type = GL_FLOAT;
1430 ctx->Array.Vertex.Stride = 0;
1431 ctx->Array.Vertex.StrideB = 0;
1432 ctx->Array.Vertex.Ptr = NULL;
1433 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001434 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001435 ctx->Array.Normal.Type = GL_FLOAT;
1436 ctx->Array.Normal.Stride = 0;
1437 ctx->Array.Normal.StrideB = 0;
1438 ctx->Array.Normal.Ptr = NULL;
1439 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001440 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001441 ctx->Array.Color.Size = 4;
1442 ctx->Array.Color.Type = GL_FLOAT;
1443 ctx->Array.Color.Stride = 0;
1444 ctx->Array.Color.StrideB = 0;
1445 ctx->Array.Color.Ptr = NULL;
1446 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001447 ctx->Array.Color.Flags = CA_CLIENT_DATA;
Brian Paulb852f042003-04-01 18:57:36 +00001448 ctx->Array.SecondaryColor.Size = 3;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001449 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1450 ctx->Array.SecondaryColor.Stride = 0;
1451 ctx->Array.SecondaryColor.StrideB = 0;
1452 ctx->Array.SecondaryColor.Ptr = NULL;
1453 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1454 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1455 ctx->Array.FogCoord.Size = 1;
1456 ctx->Array.FogCoord.Type = GL_FLOAT;
1457 ctx->Array.FogCoord.Stride = 0;
1458 ctx->Array.FogCoord.StrideB = 0;
1459 ctx->Array.FogCoord.Ptr = NULL;
1460 ctx->Array.FogCoord.Enabled = GL_FALSE;
1461 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001462 ctx->Array.Index.Type = GL_FLOAT;
1463 ctx->Array.Index.Stride = 0;
1464 ctx->Array.Index.StrideB = 0;
1465 ctx->Array.Index.Ptr = NULL;
1466 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001467 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul610d5992003-01-14 04:55:45 +00001468 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001469 ctx->Array.TexCoord[i].Size = 4;
1470 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1471 ctx->Array.TexCoord[i].Stride = 0;
1472 ctx->Array.TexCoord[i].StrideB = 0;
1473 ctx->Array.TexCoord[i].Ptr = NULL;
1474 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001475 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001476 }
1477 ctx->Array.TexCoordInterleaveFactor = 1;
1478 ctx->Array.EdgeFlag.Stride = 0;
1479 ctx->Array.EdgeFlag.StrideB = 0;
1480 ctx->Array.EdgeFlag.Ptr = NULL;
1481 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001482 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001483 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1484
1485 /* Pixel transfer */
1486 ctx->Pack.Alignment = 4;
1487 ctx->Pack.RowLength = 0;
1488 ctx->Pack.ImageHeight = 0;
1489 ctx->Pack.SkipPixels = 0;
1490 ctx->Pack.SkipRows = 0;
1491 ctx->Pack.SkipImages = 0;
1492 ctx->Pack.SwapBytes = GL_FALSE;
1493 ctx->Pack.LsbFirst = GL_FALSE;
1494 ctx->Unpack.Alignment = 4;
1495 ctx->Unpack.RowLength = 0;
1496 ctx->Unpack.ImageHeight = 0;
1497 ctx->Unpack.SkipPixels = 0;
1498 ctx->Unpack.SkipRows = 0;
1499 ctx->Unpack.SkipImages = 0;
1500 ctx->Unpack.SwapBytes = GL_FALSE;
1501 ctx->Unpack.LsbFirst = GL_FALSE;
1502
1503 /* Feedback */
1504 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1505 ctx->Feedback.Buffer = NULL;
1506 ctx->Feedback.BufferSize = 0;
1507 ctx->Feedback.Count = 0;
1508
1509 /* Selection/picking */
1510 ctx->Select.Buffer = NULL;
1511 ctx->Select.BufferSize = 0;
1512 ctx->Select.BufferCount = 0;
1513 ctx->Select.Hits = 0;
1514 ctx->Select.NameStackDepth = 0;
1515
Brian Paul4d053dd2000-01-14 04:45:47 +00001516 /* Renderer and client attribute stacks */
1517 ctx->AttribStackDepth = 0;
1518 ctx->ClientAttribStackDepth = 0;
1519
Brian Paul13811372000-04-12 00:27:37 +00001520 /* Display list */
1521 ctx->CallDepth = 0;
1522 ctx->ExecuteFlag = GL_TRUE;
1523 ctx->CompileFlag = GL_FALSE;
1524 ctx->CurrentListPtr = NULL;
1525 ctx->CurrentBlock = NULL;
1526 ctx->CurrentListNum = 0;
1527 ctx->CurrentPos = 0;
1528
1529 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001530 _mesa_init_colortable(&ctx->ColorTable);
1531 _mesa_init_colortable(&ctx->ProxyColorTable);
1532 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1533 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1534 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1535 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001536
Brian Paul610d5992003-01-14 04:55:45 +00001537 /* Vertex/fragment programs */
1538 ctx->Program.ErrorPos = -1;
1539 ctx->Program.ErrorString = _mesa_strdup("");
1540#if FEATURE_NV_vertex_program
Brian Paul86b84272001-12-14 02:50:01 +00001541 ctx->VertexProgram.Enabled = GL_FALSE;
1542 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1543 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
Brian Paul02c03ef2002-06-18 16:53:46 +00001544 ctx->VertexProgram.Current = NULL;
Brian Paul86b84272001-12-14 02:50:01 +00001545 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1546 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1547 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1548 }
Brian Paul610d5992003-01-14 04:55:45 +00001549#endif
1550#if FEATURE_NV_fragment_program
1551 ctx->FragmentProgram.Enabled = GL_FALSE;
1552 ctx->FragmentProgram.Current = NULL;
1553#endif
Brian Paul86b84272001-12-14 02:50:01 +00001554
Brian Paul4d053dd2000-01-14 04:45:47 +00001555 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001556 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001557 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001558 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001559
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001560 ctx->_NeedNormals = 0;
1561 ctx->_NeedEyeCoords = 0;
1562 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001563
Brian Paul4d053dd2000-01-14 04:45:47 +00001564 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1565
1566 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001567 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001568 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paulf782b812002-10-04 17:37:45 +00001569 ctx->_Facing = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001570
1571 /* For debug/development only */
Brian Paul3c634522002-10-24 23:57:19 +00001572 ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001573 ctx->FirstTimeCurrent = GL_TRUE;
1574
1575 /* Dither disable */
Brian Paul3c634522002-10-24 23:57:19 +00001576 ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001577 if (ctx->NoDither) {
Brian Paul3c634522002-10-24 23:57:19 +00001578 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul4e9676f2002-06-29 19:48:15 +00001579 _mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001580 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001581 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001582 }
1583}
1584
1585
1586
1587
Brian Paula3f13702003-04-01 16:41:50 +00001588/**
1589 * Allocate the proxy textures for the given context.
1590 * \param ctx the context to allocate proxies for.
1591 * \return GL_TRUE if success, GL_FALSE if failure.
jtgafb833d1999-08-19 00:55:39 +00001592 */
Brian Paul178a1c52000-04-22 01:05:00 +00001593static GLboolean
1594alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001595{
Brian Paula3f13702003-04-01 16:41:50 +00001596 ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
1597 if (!ctx->Texture.Proxy1D)
1598 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001599
Brian Paula3f13702003-04-01 16:41:50 +00001600 ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
1601 if (!ctx->Texture.Proxy2D)
1602 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001603
Brian Paula3f13702003-04-01 16:41:50 +00001604 ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
1605 if (!ctx->Texture.Proxy3D)
1606 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001607
Brian Paula3f13702003-04-01 16:41:50 +00001608 ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
1609 if (!ctx->Texture.ProxyCubeMap)
1610 goto cleanup;
Brian Paula8523782000-11-19 23:10:25 +00001611
Brian Paula3f13702003-04-01 16:41:50 +00001612 ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
1613 if (!ctx->Texture.ProxyRect)
1614 goto cleanup;
jtgafb833d1999-08-19 00:55:39 +00001615
Brian Paula3f13702003-04-01 16:41:50 +00001616 return GL_TRUE;
Brian Paul8afe7de2002-06-15 03:03:06 +00001617
Brian Paula3f13702003-04-01 16:41:50 +00001618 cleanup:
1619 if (ctx->Texture.Proxy1D)
1620 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
1621 if (ctx->Texture.Proxy2D)
1622 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
1623 if (ctx->Texture.Proxy3D)
1624 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
1625 if (ctx->Texture.ProxyCubeMap)
1626 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
1627 if (ctx->Texture.ProxyRect)
1628 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
1629 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001630}
1631
1632
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001633static void add_debug_flags( const char *debug )
1634{
1635#ifdef MESA_DEBUG
Brian Paul3c634522002-10-24 23:57:19 +00001636 if (_mesa_strstr(debug, "varray"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001637 MESA_VERBOSE |= VERBOSE_VARRAY;
1638
Brian Paul3c634522002-10-24 23:57:19 +00001639 if (_mesa_strstr(debug, "tex"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001640 MESA_VERBOSE |= VERBOSE_TEXTURE;
1641
Brian Paul3c634522002-10-24 23:57:19 +00001642 if (_mesa_strstr(debug, "imm"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001643 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1644
Brian Paul3c634522002-10-24 23:57:19 +00001645 if (_mesa_strstr(debug, "pipe"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001646 MESA_VERBOSE |= VERBOSE_PIPELINE;
1647
Brian Paul3c634522002-10-24 23:57:19 +00001648 if (_mesa_strstr(debug, "driver"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001649 MESA_VERBOSE |= VERBOSE_DRIVER;
1650
Brian Paul3c634522002-10-24 23:57:19 +00001651 if (_mesa_strstr(debug, "state"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001652 MESA_VERBOSE |= VERBOSE_STATE;
1653
Brian Paul3c634522002-10-24 23:57:19 +00001654 if (_mesa_strstr(debug, "api"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001655 MESA_VERBOSE |= VERBOSE_API;
1656
Brian Paul3c634522002-10-24 23:57:19 +00001657 if (_mesa_strstr(debug, "list"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001658 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1659
Brian Paul3c634522002-10-24 23:57:19 +00001660 if (_mesa_strstr(debug, "lighting"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001661 MESA_VERBOSE |= VERBOSE_LIGHTING;
1662
1663 /* Debug flag:
1664 */
Brian Paul3c634522002-10-24 23:57:19 +00001665 if (_mesa_strstr(debug, "flush"))
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001666 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1667#endif
1668}
1669
1670
jtgafb833d1999-08-19 00:55:39 +00001671/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001672 * Initialize a GLcontext struct. This includes allocating all the
1673 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001674 */
Brian Paul178a1c52000-04-22 01:05:00 +00001675GLboolean
1676_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001677 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001678 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001679 void *driver_ctx,
1680 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001681{
Brian Paul5fb84d22000-05-24 15:04:45 +00001682 GLuint dispatchSize;
Brian Paul60b6e4f2002-10-14 17:08:17 +00001683 const char *c;
Brian Paul5fb84d22000-05-24 15:04:45 +00001684
Brian Paul3c634522002-10-24 23:57:19 +00001685 ASSERT(driver_ctx);
jtgafb833d1999-08-19 00:55:39 +00001686
Brian Paul3c634522002-10-24 23:57:19 +00001687 /* If the driver wants core Mesa to use special imports, it'll have to
1688 * override these defaults.
1689 */
1690 _mesa_init_default_imports( &(ctx->imports), driver_ctx );
jtgafb833d1999-08-19 00:55:39 +00001691
Brian Paul9a33a112002-06-13 04:28:29 +00001692 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001693 _mesa_init_default_exports( &(ctx->exports) );
1694
1695 /* misc one-time initializations */
1696 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001697
Brian Paul3c634522002-10-24 23:57:19 +00001698 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001699 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001700 ctx->DrawBuffer = NULL;
1701 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001702
Brian Paula3f13702003-04-01 16:41:50 +00001703 /* Set these pointers to defaults now in case they're not set since
1704 * we need them while creating the default textures.
1705 */
1706 if (!ctx->Driver.NewTextureObject)
1707 ctx->Driver.NewTextureObject = _mesa_new_texture_object;
1708 if (!ctx->Driver.DeleteTexture)
1709 ctx->Driver.DeleteTexture = _mesa_delete_texture_object;
1710 if (!ctx->Driver.NewTextureImage)
1711 ctx->Driver.NewTextureImage = _mesa_new_texture_image;
1712
jtgafb833d1999-08-19 00:55:39 +00001713 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001714 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001715 ctx->Shared = share_list->Shared;
1716 }
1717 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001718 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001719 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001720 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001721 }
1722 }
Brian Paul9560f052000-01-31 23:11:39 +00001723 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001724 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001725 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001726
Brian Paul4d053dd2000-01-14 04:45:47 +00001727 init_attrib_groups( ctx );
1728
Brian Paulb6bcae52001-01-23 23:39:36 +00001729 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001730 ctx->Color.DrawBuffer = GL_BACK;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001731 ctx->Color._DrawDestMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001732 ctx->Pixel.ReadBuffer = GL_BACK;
Brian Paul8ad10762002-10-11 17:41:03 +00001733 ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001734 }
1735 else {
1736 ctx->Color.DrawBuffer = GL_FRONT;
Brian Paul3b4fbbc2002-07-09 01:22:50 +00001737 ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001738 ctx->Pixel.ReadBuffer = GL_FRONT;
Brian Paul8ad10762002-10-11 17:41:03 +00001739 ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
jtgafb833d1999-08-19 00:55:39 +00001740 }
1741
jtgafb833d1999-08-19 00:55:39 +00001742 if (!alloc_proxy_textures(ctx)) {
1743 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001744 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001745 }
jtgafb833d1999-08-19 00:55:39 +00001746
Brian Paul8ad10762002-10-11 17:41:03 +00001747 /*
1748 * For XFree86/DRI: tell libGL to add these functions to the dispatcher.
1749 * Basically, we should add all extension functions above offset 577.
1750 * This enables older libGL libraries to work with newer drivers that
1751 * have newer extensions.
1752 */
1753 /* GL_ARB_window_pos aliases with GL_MESA_window_pos */
1754 _glapi_add_entrypoint("glWindowPos2dARB", 513);
1755 _glapi_add_entrypoint("glWindowPos2dvARB", 514);
1756 _glapi_add_entrypoint("glWindowPos2fARB", 515);
1757 _glapi_add_entrypoint("glWindowPos2fvARB", 516);
1758 _glapi_add_entrypoint("glWindowPos2iARB", 517);
1759 _glapi_add_entrypoint("glWindowPos2ivARB", 518);
1760 _glapi_add_entrypoint("glWindowPos2sARB", 519);
1761 _glapi_add_entrypoint("glWindowPos2svARB", 520);
1762 _glapi_add_entrypoint("glWindowPos3dARB", 521);
1763 _glapi_add_entrypoint("glWindowPos3dvARB", 522);
1764 _glapi_add_entrypoint("glWindowPos3fARB", 523);
1765 _glapi_add_entrypoint("glWindowPos3fvARB", 524);
1766 _glapi_add_entrypoint("glWindowPos3iARB", 525);
1767 _glapi_add_entrypoint("glWindowPos3ivARB", 526);
1768 _glapi_add_entrypoint("glWindowPos3sARB", 527);
1769 _glapi_add_entrypoint("glWindowPos3svARB", 528);
1770 /* new extension functions */
1771 _glapi_add_entrypoint("glAreProgramsResidentNV", 578);
1772 _glapi_add_entrypoint("glBindProgramNV", 579);
1773 _glapi_add_entrypoint("glDeleteProgramsNV", 580);
1774 _glapi_add_entrypoint("glExecuteProgramNV", 581);
1775 _glapi_add_entrypoint("glGenProgramsNV", 582);
1776 _glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
1777 _glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
1778 _glapi_add_entrypoint("glGetProgramivNV", 585);
1779 _glapi_add_entrypoint("glGetProgramStringNV", 586);
1780 _glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
1781 _glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
1782 _glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
1783 _glapi_add_entrypoint("glGetVertexAttribivNV", 590);
1784 _glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
1785 _glapi_add_entrypoint("glIsProgramNV", 592);
1786 _glapi_add_entrypoint("glLoadProgramNV", 593);
1787 _glapi_add_entrypoint("glProgramParameter4dNV", 594);
1788 _glapi_add_entrypoint("glProgramParameter4dvNV", 595);
1789 _glapi_add_entrypoint("glProgramParameter4fNV", 596);
1790 _glapi_add_entrypoint("glProgramParameter4fvNV", 597);
1791 _glapi_add_entrypoint("glProgramParameters4dvNV", 598);
1792 _glapi_add_entrypoint("glProgramParameters4fvNV", 599);
1793 _glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
1794 _glapi_add_entrypoint("glTrackMatrixNV", 601);
1795 _glapi_add_entrypoint("glVertexAttribPointerNV", 602);
1796 _glapi_add_entrypoint("glVertexAttrib1dNV", 603);
1797 _glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
1798 _glapi_add_entrypoint("glVertexAttrib1fNV", 605);
1799 _glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
1800 _glapi_add_entrypoint("glVertexAttrib1sNV", 607);
1801 _glapi_add_entrypoint("glVertexAttrib1svNV", 608);
1802 _glapi_add_entrypoint("glVertexAttrib2dNV", 609);
1803 _glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
1804 _glapi_add_entrypoint("glVertexAttrib2fNV", 611);
1805 _glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
1806 _glapi_add_entrypoint("glVertexAttrib2sNV", 613);
1807 _glapi_add_entrypoint("glVertexAttrib2svNV", 614);
1808 _glapi_add_entrypoint("glVertexAttrib3dNV", 615);
1809 _glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
1810 _glapi_add_entrypoint("glVertexAttrib3fNV", 617);
1811 _glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
1812 _glapi_add_entrypoint("glVertexAttrib3sNV", 619);
1813 _glapi_add_entrypoint("glVertexAttrib3svNV", 620);
1814 _glapi_add_entrypoint("glVertexAttrib4dNV", 621);
1815 _glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
1816 _glapi_add_entrypoint("glVertexAttrib4fNV", 623);
1817 _glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
1818 _glapi_add_entrypoint("glVertexAttrib4sNV", 625);
1819 _glapi_add_entrypoint("glVertexAttrib4svNV", 626);
1820 _glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
1821 _glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
1822 _glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
1823 _glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
1824 _glapi_add_entrypoint("glVertexAttribs1svNV", 631);
1825 _glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
1826 _glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
1827 _glapi_add_entrypoint("glVertexAttribs2svNV", 634);
1828 _glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
1829 _glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
1830 _glapi_add_entrypoint("glVertexAttribs3svNV", 637);
1831 _glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
1832 _glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
1833 _glapi_add_entrypoint("glVertexAttribs4svNV", 640);
1834 _glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
1835 _glapi_add_entrypoint("glPointParameteriNV", 642);
1836 _glapi_add_entrypoint("glPointParameterivNV", 643);
1837 _glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
1838 _glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
1839 _glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
1840 _glapi_add_entrypoint("glDeleteFencesNV", 647);
1841 _glapi_add_entrypoint("glGenFencesNV", 648);
1842 _glapi_add_entrypoint("glIsFenceNV", 649);
1843 _glapi_add_entrypoint("glTestFenceNV", 650);
1844 _glapi_add_entrypoint("glGetFenceivNV", 651);
1845 _glapi_add_entrypoint("glFinishFenceNV", 652);
1846 _glapi_add_entrypoint("glSetFenceNV", 653);
Brian Paula3f13702003-04-01 16:41:50 +00001847 /* XXX add NV_fragment_program and ARB_vertex_program functions */
Brian Paulf59afc92000-05-23 23:23:00 +00001848
Brian Paul5fb84d22000-05-24 15:04:45 +00001849 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1850 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1851 * Mesa we do this to accomodate different versions of libGL and various
1852 * DRI drivers.
1853 */
1854 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1855 sizeof(struct _glapi_table) / sizeof(void *));
1856
Brian Paulfbd8f211999-11-11 01:22:25 +00001857 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001858 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1859 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001860 if (!ctx->Exec || !ctx->Save) {
1861 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001862 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001863 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001864 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001865 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1866 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001867 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001868
Keith Whitwellad2ac212000-11-24 10:25:05 +00001869 ctx->ExecPrefersFloat = GL_FALSE;
1870 ctx->SavePrefersFloat = GL_FALSE;
1871
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001872 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001873 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001874 ctx->TnlModule.Current = NULL;
1875 ctx->TnlModule.SwapCount = 0;
1876
Brian Paulb6bcae52001-01-23 23:39:36 +00001877 /* Z buffer stuff */
1878 if (ctx->Visual.depthBits == 0) {
1879 /* Special case. Even if we don't have a depth buffer we need
1880 * good values for DepthMax for Z vertex transformation purposes
1881 * and for per-fragment fog computation.
1882 */
1883 ctx->DepthMax = 1 << 16;
1884 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1885 }
1886 else if (ctx->Visual.depthBits < 32) {
1887 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1888 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1889 }
1890 else {
1891 /* Special case since shift values greater than or equal to the
1892 * number of bits in the left hand expression's type are undefined.
1893 */
1894 ctx->DepthMax = 0xffffffff;
1895 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1896 }
Brian Paulbc920f02001-05-07 16:32:51 +00001897 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001898
Brian Paul3c634522002-10-24 23:57:19 +00001899 c = _mesa_getenv("MESA_DEBUG");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001900 if (c)
1901 add_debug_flags(c);
Brian Paulb6bcae52001-01-23 23:39:36 +00001902
Brian Paul3c634522002-10-24 23:57:19 +00001903 c = _mesa_getenv("MESA_VERBOSE");
Brian Paul60b6e4f2002-10-14 17:08:17 +00001904 if (c)
1905 add_debug_flags(c);
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001906
Brian Paul4d053dd2000-01-14 04:45:47 +00001907 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001908}
1909
jtgafb833d1999-08-19 00:55:39 +00001910
1911
1912/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001913 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001914 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001915 * sharelist - another context to share display lists with or NULL
Brian Paul3c634522002-10-24 23:57:19 +00001916 * driver_ctx - pointer to device driver's context state struct
1917 * direct - direct rendering?
Brian Paulb1394fa2000-09-26 20:53:53 +00001918 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001919 */
Brian Paul178a1c52000-04-22 01:05:00 +00001920GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001921_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001922 GLcontext *share_list,
Brian Paul3c634522002-10-24 23:57:19 +00001923 void *driver_ctx,
1924 GLboolean direct )
1925
Brian Paul4d053dd2000-01-14 04:45:47 +00001926{
Brian Paul4753d602002-06-15 02:38:15 +00001927 GLcontext *ctx;
1928
1929 ASSERT(visual);
Brian Paul3c634522002-10-24 23:57:19 +00001930 ASSERT(driver_ctx);
Brian Paul4753d602002-06-15 02:38:15 +00001931
Brian Paul3c634522002-10-24 23:57:19 +00001932 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001933 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001934 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001935
Brian Paul3c634522002-10-24 23:57:19 +00001936 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001937 return ctx;
1938 }
1939 else {
Brian Paul3c634522002-10-24 23:57:19 +00001940 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001941 return NULL;
1942 }
1943}
1944
1945
1946
1947/*
1948 * Free the data associated with the given context.
1949 * But don't free() the GLcontext struct itself!
1950 */
Brian Paul178a1c52000-04-22 01:05:00 +00001951void
Brian Paulb1394fa2000-09-26 20:53:53 +00001952_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001953{
Brian Paul4d053dd2000-01-14 04:45:47 +00001954 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001955 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001956
1957 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001958 if (ctx == _mesa_get_current_context()) {
1959 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001960 }
1961
Brian Paul30f51ae2001-12-18 04:06:44 +00001962 /*
1963 * Free transformation matrix stacks
1964 */
1965 free_matrix_stack(&ctx->ModelviewMatrixStack);
1966 free_matrix_stack(&ctx->ProjectionMatrixStack);
1967 free_matrix_stack(&ctx->ColorMatrixStack);
Brian Paul610d5992003-01-14 04:55:45 +00001968 for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
Brian Paul30f51ae2001-12-18 04:06:44 +00001969 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1970 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1971 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1972 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001973 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1974
Brian Paul30f51ae2001-12-18 04:06:44 +00001975
Brian Paul8dfc5b92002-10-16 17:57:51 +00001976#if FEATURE_NV_vertex_program
Brian Paul30f51ae2001-12-18 04:06:44 +00001977 if (ctx->VertexProgram.Current) {
Brian Paul610d5992003-01-14 04:55:45 +00001978 ctx->VertexProgram.Current->Base.RefCount--;
1979 if (ctx->VertexProgram.Current->Base.RefCount <= 0)
Brian Paul451f3102003-04-17 01:48:19 +00001980 _mesa_delete_program(ctx, &(ctx->VertexProgram.Current->Base));
Brian Paul610d5992003-01-14 04:55:45 +00001981 }
1982#endif
1983#if FEATURE_NV_fragment_program
1984 if (ctx->FragmentProgram.Current) {
1985 ctx->FragmentProgram.Current->Base.RefCount--;
1986 if (ctx->FragmentProgram.Current->Base.RefCount <= 0)
Brian Paul451f3102003-04-17 01:48:19 +00001987 _mesa_delete_program(ctx, &(ctx->FragmentProgram.Current->Base));
Brian Paulfd284452001-07-19 15:54:34 +00001988 }
Brian Paul8dfc5b92002-10-16 17:57:51 +00001989#endif
Brian Paulfd284452001-07-19 15:54:34 +00001990
Brian Paul30f51ae2001-12-18 04:06:44 +00001991 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001992 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001993 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001994 assert(ctx->Shared->RefCount >= 0);
1995 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1996 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001997 /* free shared state */
1998 free_shared_state( ctx, ctx->Shared );
1999 }
2000
Brian Paul30f51ae2001-12-18 04:06:44 +00002001 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00002002 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00002003 FREE( s );
2004 }
Keith Whitwell14940c42000-11-05 18:40:57 +00002005 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00002006
2007 /* Free proxy texture objects */
Brian Paula3f13702003-04-01 16:41:50 +00002008 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
2009 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
2010 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
2011 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
2012 (ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
Brian Paul4d053dd2000-01-14 04:45:47 +00002013
Brian Paul45b47d02003-01-26 14:37:15 +00002014 for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
2015 _mesa_free_colortable_data( &ctx->Texture.Unit[i].ColorTable );
2016
Brian Paul4d053dd2000-01-14 04:45:47 +00002017 /* Free evaluator data */
2018 if (ctx->EvalMap.Map1Vertex3.Points)
2019 FREE( ctx->EvalMap.Map1Vertex3.Points );
2020 if (ctx->EvalMap.Map1Vertex4.Points)
2021 FREE( ctx->EvalMap.Map1Vertex4.Points );
2022 if (ctx->EvalMap.Map1Index.Points)
2023 FREE( ctx->EvalMap.Map1Index.Points );
2024 if (ctx->EvalMap.Map1Color4.Points)
2025 FREE( ctx->EvalMap.Map1Color4.Points );
2026 if (ctx->EvalMap.Map1Normal.Points)
2027 FREE( ctx->EvalMap.Map1Normal.Points );
2028 if (ctx->EvalMap.Map1Texture1.Points)
2029 FREE( ctx->EvalMap.Map1Texture1.Points );
2030 if (ctx->EvalMap.Map1Texture2.Points)
2031 FREE( ctx->EvalMap.Map1Texture2.Points );
2032 if (ctx->EvalMap.Map1Texture3.Points)
2033 FREE( ctx->EvalMap.Map1Texture3.Points );
2034 if (ctx->EvalMap.Map1Texture4.Points)
2035 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002036 for (i = 0; i < 16; i++)
2037 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002038
2039 if (ctx->EvalMap.Map2Vertex3.Points)
2040 FREE( ctx->EvalMap.Map2Vertex3.Points );
2041 if (ctx->EvalMap.Map2Vertex4.Points)
2042 FREE( ctx->EvalMap.Map2Vertex4.Points );
2043 if (ctx->EvalMap.Map2Index.Points)
2044 FREE( ctx->EvalMap.Map2Index.Points );
2045 if (ctx->EvalMap.Map2Color4.Points)
2046 FREE( ctx->EvalMap.Map2Color4.Points );
2047 if (ctx->EvalMap.Map2Normal.Points)
2048 FREE( ctx->EvalMap.Map2Normal.Points );
2049 if (ctx->EvalMap.Map2Texture1.Points)
2050 FREE( ctx->EvalMap.Map2Texture1.Points );
2051 if (ctx->EvalMap.Map2Texture2.Points)
2052 FREE( ctx->EvalMap.Map2Texture2.Points );
2053 if (ctx->EvalMap.Map2Texture3.Points)
2054 FREE( ctx->EvalMap.Map2Texture3.Points );
2055 if (ctx->EvalMap.Map2Texture4.Points)
2056 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00002057 for (i = 0; i < 16; i++)
2058 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00002059
Brian Paul4bdcfe52000-04-17 17:57:04 +00002060 _mesa_free_colortable_data( &ctx->ColorTable );
2061 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
2062 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
2063 _mesa_free_colortable_data( &ctx->Texture.Palette );
2064
Brian Paulfd284452001-07-19 15:54:34 +00002065 _math_matrix_dtr(&ctx->Viewport._WindowMap);
2066
Brian Paul69755402001-02-26 23:58:12 +00002067 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00002068
2069 FREE(ctx->Exec);
2070 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00002071}
2072
2073
2074
2075/*
2076 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00002077 */
Brian Paul178a1c52000-04-22 01:05:00 +00002078void
Brian Paulb1394fa2000-09-26 20:53:53 +00002079_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00002080{
2081 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00002082 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00002083 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00002084 }
2085}
2086
2087
2088
2089/*
jtgafb833d1999-08-19 00:55:39 +00002090 * Copy attribute groups from one context to another.
2091 * Input: src - source context
2092 * dst - destination context
2093 * mask - bitwise OR of GL_*_BIT flags
2094 */
Brian Paul178a1c52000-04-22 01:05:00 +00002095void
Brian Paulb1394fa2000-09-26 20:53:53 +00002096_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00002097{
2098 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002099 /* OK to memcpy */
2100 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00002101 }
2102 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002103 /* OK to memcpy */
2104 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00002105 }
2106 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002107 /* OK to memcpy */
2108 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00002109 }
2110 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002111 /* OK to memcpy */
2112 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00002113 }
2114 if (mask & GL_ENABLE_BIT) {
2115 /* no op */
2116 }
2117 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002118 /* OK to memcpy */
2119 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00002120 }
2121 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002122 /* OK to memcpy */
2123 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00002124 }
2125 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002126 /* OK to memcpy */
2127 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00002128 }
2129 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002130 GLuint i;
2131 /* begin with memcpy */
2132 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
2133 /* fixup linked lists to prevent pointer insanity */
2134 make_empty_list( &(dst->Light.EnabledList) );
2135 for (i = 0; i < MAX_LIGHTS; i++) {
2136 if (dst->Light.Light[i].Enabled) {
2137 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
2138 }
2139 }
jtgafb833d1999-08-19 00:55:39 +00002140 }
2141 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002142 /* OK to memcpy */
2143 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00002144 }
2145 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002146 /* OK to memcpy */
2147 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00002148 }
2149 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002150 /* OK to memcpy */
2151 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00002152 }
2153 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002154 /* OK to memcpy */
2155 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00002156 }
2157 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002158 /* OK to memcpy */
2159 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00002160 }
2161 if (mask & GL_POLYGON_STIPPLE_BIT) {
2162 /* Use loop instead of MEMCPY due to problem with Portland Group's
2163 * C compiler. Reported by John Stone.
2164 */
Brian Paul85d81602002-06-17 23:36:31 +00002165 GLuint i;
2166 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00002167 dst->PolygonStipple[i] = src->PolygonStipple[i];
2168 }
2169 }
2170 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002171 /* OK to memcpy */
2172 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00002173 }
2174 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002175 /* OK to memcpy */
2176 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00002177 }
2178 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002179 /* Cannot memcpy because of pointers */
2180 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00002181 }
2182 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002183 /* OK to memcpy */
2184 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00002185 }
2186 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00002187 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
2188 dst->Viewport.X = src->Viewport.X;
2189 dst->Viewport.Y = src->Viewport.Y;
2190 dst->Viewport.Width = src->Viewport.Width;
2191 dst->Viewport.Height = src->Viewport.Height;
2192 dst->Viewport.Near = src->Viewport.Near;
2193 dst->Viewport.Far = src->Viewport.Far;
2194 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00002195 }
Brian Paul85d81602002-06-17 23:36:31 +00002196
Keith Whitwella96308c2000-10-30 13:31:59 +00002197 /* XXX FIXME: Call callbacks?
2198 */
2199 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002200}
2201
2202
Brian Paul00037781999-12-17 14:52:35 +00002203
Keith Whitwell23caf202000-11-16 21:05:34 +00002204static void print_info( void )
2205{
Brian Paul4e9676f2002-06-29 19:48:15 +00002206 _mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002207 (char *) _mesa_GetString(GL_VERSION));
Brian Paul4e9676f2002-06-29 19:48:15 +00002208 _mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002209 (char *) _mesa_GetString(GL_RENDERER));
Brian Paul4e9676f2002-06-29 19:48:15 +00002210 _mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002211 (char *) _mesa_GetString(GL_VENDOR));
Brian Paul4e9676f2002-06-29 19:48:15 +00002212 _mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002213 (char *) _mesa_GetString(GL_EXTENSIONS));
2214#if defined(THREADS)
Brian Paul4e9676f2002-06-29 19:48:15 +00002215 _mesa_debug(NULL, "Mesa thread-safe: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002216#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002217 _mesa_debug(NULL, "Mesa thread-safe: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002218#endif
2219#if defined(USE_X86_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002220 _mesa_debug(NULL, "Mesa x86-optimized: YES\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002221#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002222 _mesa_debug(NULL, "Mesa x86-optimized: NO\n");
Keith Whitwell23caf202000-11-16 21:05:34 +00002223#endif
davem69e4f84b42001-06-05 03:58:20 +00002224#if defined(USE_SPARC_ASM)
Brian Paul4e9676f2002-06-29 19:48:15 +00002225 _mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
davem69e4f84b42001-06-05 03:58:20 +00002226#else
Brian Paul4e9676f2002-06-29 19:48:15 +00002227 _mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
davem69e4f84b42001-06-05 03:58:20 +00002228#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002229}
2230
2231
Brian Paul00037781999-12-17 14:52:35 +00002232/*
Brian Paul9a33a112002-06-13 04:28:29 +00002233 * Set the current context, binding the given frame buffer to the context.
2234 */
2235void
2236_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2237{
2238 _mesa_make_current2( newCtx, buffer, buffer );
2239}
2240
2241
2242/*
Brian Paul00037781999-12-17 14:52:35 +00002243 * Bind the given context to the given draw-buffer and read-buffer
2244 * and make it the current context for this thread.
2245 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002246void
2247_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2248 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002249{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002250 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002251 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002252
Brian Paulbe3602d2001-02-28 00:27:48 +00002253 /* Check that the context's and framebuffer's visuals are compatible.
2254 * We could do a lot more checking here but this'll catch obvious
2255 * problems.
2256 */
2257 if (newCtx && drawBuffer && readBuffer) {
2258 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2259 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2260 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2261 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2262 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2263 return; /* incompatible */
2264 }
2265 }
2266
Brian Paul00037781999-12-17 14:52:35 +00002267 /* We call this function periodically (just here for now) in
2268 * order to detect when multithreading has begun.
2269 */
2270 _glapi_check_multithread();
2271
Brian Paulf9b97d92000-01-28 20:17:42 +00002272 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002273 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002274
2275
2276 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002277 _glapi_set_dispatch(NULL); /* none current */
2278 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002279 else {
2280 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002281
Keith Whitwell23caf202000-11-16 21:05:34 +00002282 if (drawBuffer && readBuffer) {
2283 /* TODO: check if newCtx and buffer's visual match??? */
2284 newCtx->DrawBuffer = drawBuffer;
2285 newCtx->ReadBuffer = readBuffer;
2286 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00002287
2288 if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
2289 /* get initial window size */
2290 GLuint bufWidth, bufHeight;
2291
2292 /* ask device driver for size of output buffer */
2293 (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
2294
2295 if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
2296 return; /* size is as expected */
2297
2298 drawBuffer->Width = bufWidth;
2299 drawBuffer->Height = bufHeight;
2300
2301 newCtx->Driver.ResizeBuffers( drawBuffer );
2302 }
2303
2304 if (readBuffer != drawBuffer &&
2305 readBuffer->Width == 0 && readBuffer->Height == 0) {
2306 /* get initial window size */
2307 GLuint bufWidth, bufHeight;
2308
2309 /* ask device driver for size of output buffer */
2310 (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
2311
2312 if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
2313 return; /* size is as expected */
2314
2315 readBuffer->Width = bufWidth;
2316 readBuffer->Height = bufHeight;
2317
2318 newCtx->Driver.ResizeBuffers( readBuffer );
2319 }
Brian Paul00037781999-12-17 14:52:35 +00002320 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002321
Brian Paul8816c702002-06-16 01:10:41 +00002322 /* This is only for T&L - a bit out of place, or misnamed (BP) */
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002323 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002324 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2325
2326 /* We can use this to help debug user's problems. Tell them to set
2327 * the MESA_INFO env variable before running their app. Then the
2328 * first time each context is made current we'll print some useful
2329 * information.
2330 */
2331 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00002332 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002333 print_info();
2334 }
2335 newCtx->FirstTimeCurrent = GL_FALSE;
2336 }
Brian Paul00037781999-12-17 14:52:35 +00002337 }
2338}
2339
2340
2341
2342/*
2343 * Return current context handle for the calling thread.
2344 * This isn't the fastest way to get the current context.
2345 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2346 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002347GLcontext *
2348_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002349{
Brian Paulf9b97d92000-01-28 20:17:42 +00002350 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002351}
2352
2353
Brian Paulfbd8f211999-11-11 01:22:25 +00002354/*
2355 * Return pointer to this context's current API dispatch table.
2356 * It'll either be the immediate-mode execute dispatcher or the
2357 * display list compile dispatcher.
2358 */
2359struct _glapi_table *
2360_mesa_get_dispatch(GLcontext *ctx)
2361{
2362 return ctx->CurrentDispatch;
2363}
2364
2365
2366
jtgafb833d1999-08-19 00:55:39 +00002367/**********************************************************************/
2368/***** Miscellaneous functions *****/
2369/**********************************************************************/
2370
2371
2372/*
Brian Paul4e9676f2002-06-29 19:48:15 +00002373 * Record the given error code and call the driver's Error function if defined.
2374 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00002375 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002376void
Brian Paul4e9676f2002-06-29 19:48:15 +00002377_mesa_record_error( GLcontext *ctx, GLenum error )
jtgafb833d1999-08-19 00:55:39 +00002378{
Brian Paul18a285a2002-03-16 00:53:15 +00002379 if (!ctx)
2380 return;
2381
Brian Paul7eb06032000-07-14 04:13:40 +00002382 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002383 ctx->ErrorValue = error;
2384 }
2385
2386 /* Call device driver's error handler, if any. This is used on the Mac. */
2387 if (ctx->Driver.Error) {
2388 (*ctx->Driver.Error)( ctx );
2389 }
2390}
2391
2392
Brian Paulfa9df402000-02-02 19:16:46 +00002393void
2394_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002395{
Brian Paulfa9df402000-02-02 19:16:46 +00002396 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002397 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002398 if (ctx->Driver.Finish) {
2399 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002400 }
2401}
2402
2403
2404
Brian Paulfa9df402000-02-02 19:16:46 +00002405void
2406_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002407{
Brian Paulfa9df402000-02-02 19:16:46 +00002408 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002409 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002410 if (ctx->Driver.Flush) {
2411 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002412 }
jtgafb833d1999-08-19 00:55:39 +00002413}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002414
2415
2416
Keith Whitwellcab974c2000-12-26 05:09:27 +00002417const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002418 "GL_POINTS",
2419 "GL_LINES",
2420 "GL_LINE_LOOP",
2421 "GL_LINE_STRIP",
2422 "GL_TRIANGLES",
2423 "GL_TRIANGLE_STRIP",
2424 "GL_TRIANGLE_FAN",
2425 "GL_QUADS",
2426 "GL_QUAD_STRIP",
2427 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002428 "outside begin/end",
2429 "inside unkown primitive",
2430 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002431};