blob: cb5674c0a7ff06af0d96a1dfd96f162efe5b9346 [file] [log] [blame]
Brian Paul30f51ae2001-12-18 04:06:44 +00001/* $Id: context.c,v 1.152 2001/12/18 04:06:45 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paul86b84272001-12-14 02:50:01 +00005 * Version: 4.1
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paulb6bcae52001-01-23 23:39:36 +00007 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
jtgafb833d1999-08-19 00:55:39 +000028#ifdef PC_HEADER
29#include "all.h"
30#else
Brian Paulfbd8f211999-11-11 01:22:25 +000031#include "glheader.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000032#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000034#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000035#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000036#include "dlist.h"
37#include "eval.h"
38#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000039#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000040#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000041#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000042#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "hash.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000044#include "imports.h"
jtgafb833d1999-08-19 00:55:39 +000045#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000046#include "macros.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000047#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000048#include "mmath.h"
jtgafb833d1999-08-19 00:55:39 +000049#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000050#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000051#include "teximage.h"
52#include "texobj.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000053#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000054#include "varray.h"
Brian Paul30f51ae2001-12-18 04:06:44 +000055#include "vpstate.h"
Gareth Hughesd4eb6652001-03-12 01:32:20 +000056#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000057#include "math/m_translate.h"
58#include "math/m_vertices.h"
59#include "math/m_matrix.h"
60#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000061#include "math/mathmod.h"
jtgafb833d1999-08-19 00:55:39 +000062#endif
63
Brian Paul3b18a362000-09-26 15:27:20 +000064#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000065#include "Trace/tr_context.h"
66#include "Trace/tr_wrapper.h"
67#endif
68
davem69775355a2001-06-05 23:54:00 +000069#ifdef USE_SPARC_ASM
70#include "SPARC/sparc.h"
71#endif
jtgafb833d1999-08-19 00:55:39 +000072
Keith Whitwell23caf202000-11-16 21:05:34 +000073#ifndef MESA_VERBOSE
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000074int MESA_VERBOSE = 0
Keith Whitwell23caf202000-11-16 21:05:34 +000075/* | VERBOSE_PIPELINE */
76/* | VERBOSE_IMMEDIATE */
77/* | VERBOSE_VARRAY */
78/* | VERBOSE_TEXTURE */
79/* | VERBOSE_API */
80/* | VERBOSE_DRIVER */
81/* | VERBOSE_STATE */
Keith Whitwell23caf202000-11-16 21:05:34 +000082/* | VERBOSE_DISPLAY_LIST */
83;
84#endif
85
86#ifndef MESA_DEBUG_FLAGS
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000087int MESA_DEBUG_FLAGS = 0
Keith Whitwell23caf202000-11-16 21:05:34 +000088/* | DEBUG_ALWAYS_FLUSH */
89;
90#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000091
Brian Paul86b84272001-12-14 02:50:01 +000092
93
Brian Paulb1394fa2000-09-26 20:53:53 +000094/**********************************************************************/
95/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
96/**********************************************************************/
97
98static GLboolean
99_mesa_DestroyContext(__GLcontext *gc)
100{
101 if (gc) {
102 _mesa_free_context_data(gc);
103 (*gc->imports.free)(gc, gc);
104 }
105 return GL_TRUE;
106}
107
108
109/* exported OpenGL SI interface */
110__GLcontext *
111__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
112{
113 GLcontext *ctx;
114
115 ctx = (GLcontext *) (*imports->calloc)(0, 1, sizeof(GLcontext));
116 if (ctx == NULL) {
117 return NULL;
118 }
Jouk Jansen12e875c2001-10-18 08:04:57 +0000119 ctx->Driver.CurrentExecPrimitive=0;
Brian Paulb1394fa2000-09-26 20:53:53 +0000120 ctx->imports = *imports;
121
122 _mesa_initialize_visual(&ctx->Visual,
123 modes->rgbMode,
124 modes->doubleBufferMode,
125 modes->stereoMode,
126 modes->redBits,
127 modes->greenBits,
128 modes->blueBits,
129 modes->alphaBits,
130 modes->indexBits,
131 modes->depthBits,
132 modes->stencilBits,
133 modes->accumRedBits,
134 modes->accumGreenBits,
135 modes->accumBlueBits,
136 modes->accumAlphaBits,
137 0);
138
Keith Whitwellb980b2e2001-01-08 04:09:41 +0000139 /* KW: was imports->wscx */
140 _mesa_initialize_context(ctx, &ctx->Visual, NULL, imports->other, GL_FALSE);
Brian Paulb1394fa2000-09-26 20:53:53 +0000141
142 ctx->exports.destroyContext = _mesa_DestroyContext;
143
144 return ctx;
145}
146
147
148/* exported OpenGL SI interface */
149void
150__glCoreNopDispatch(void)
151{
152#if 0
153 /* SI */
154 __gl_dispatch = __glNopDispatchState;
155#else
156 /* Mesa */
157 _glapi_set_dispatch(NULL);
158#endif
159}
160
161
jtgafb833d1999-08-19 00:55:39 +0000162/**********************************************************************/
163/***** Context and Thread management *****/
164/**********************************************************************/
165
166
jtgafb833d1999-08-19 00:55:39 +0000167
jtgafb833d1999-08-19 00:55:39 +0000168/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000169/***** GL Visual allocation/destruction *****/
170/**********************************************************************/
171
172
173/*
174 * Allocate a new GLvisual object.
175 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000176 * dbFlag - double buffering?
177 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000178 * depthBits - requested bits per depth buffer value
179 * Any value in [0, 32] is acceptable but the actual
180 * depth type will be GLushort or GLuint as needed.
181 * stencilBits - requested minimum bits per stencil buffer value
182 * accumBits - requested minimum bits per accum buffer component
183 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
184 * red/green/blue/alphaBits - number of bits per color component
185 * in frame buffer for RGB(A) mode.
186 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000187 * Return: pointer to new GLvisual or NULL if requested parameters can't
188 * be met.
189 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000190GLvisual *
191_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000192 GLboolean dbFlag,
193 GLboolean stereoFlag,
194 GLint redBits,
195 GLint greenBits,
196 GLint blueBits,
197 GLint alphaBits,
198 GLint indexBits,
199 GLint depthBits,
200 GLint stencilBits,
201 GLint accumRedBits,
202 GLint accumGreenBits,
203 GLint accumBlueBits,
204 GLint accumAlphaBits,
205 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000206{
Brian Paul178a1c52000-04-22 01:05:00 +0000207 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
208 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000209 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000210 redBits, greenBits, blueBits, alphaBits,
211 indexBits, depthBits, stencilBits,
212 accumRedBits, accumGreenBits,
213 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000214 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000215 FREE(vis);
216 return NULL;
217 }
218 }
219 return vis;
220}
221
222
223/*
224 * Initialize the fields of the given GLvisual.
225 * Input: see _mesa_create_visual() above.
226 * Return: GL_TRUE = success
227 * GL_FALSE = failure.
228 */
229GLboolean
230_mesa_initialize_visual( GLvisual *vis,
231 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000232 GLboolean dbFlag,
233 GLboolean stereoFlag,
234 GLint redBits,
235 GLint greenBits,
236 GLint blueBits,
237 GLint alphaBits,
238 GLint indexBits,
239 GLint depthBits,
240 GLint stencilBits,
241 GLint accumRedBits,
242 GLint accumGreenBits,
243 GLint accumBlueBits,
244 GLint accumAlphaBits,
245 GLint numSamples )
246{
Brian Paulb6bcae52001-01-23 23:39:36 +0000247 (void) numSamples;
248
Brian Paul178a1c52000-04-22 01:05:00 +0000249 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000250
Brian Pauled30dfa2000-03-03 17:47:39 +0000251 /* This is to catch bad values from device drivers not updated for
252 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
253 * bad value now (a 1-bit depth buffer!?!).
254 */
255 assert(depthBits == 0 || depthBits > 1);
256
257 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000258 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000259 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000260 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000261 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000262 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000263 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000264 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000265 }
266 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000267 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000268 }
269 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000270 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000271 }
272 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000273 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000274 }
275
Brian Paulb6bcae52001-01-23 23:39:36 +0000276 vis->rgbMode = rgbFlag;
277 vis->doubleBufferMode = dbFlag;
278 vis->stereoMode = stereoFlag;
279 vis->redBits = redBits;
280 vis->greenBits = greenBits;
281 vis->blueBits = blueBits;
282 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000283
Brian Paulb6bcae52001-01-23 23:39:36 +0000284 vis->indexBits = indexBits;
285 vis->depthBits = depthBits;
286 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
287 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
288 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
289 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
290 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000291
Brian Paul178a1c52000-04-22 01:05:00 +0000292 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000293}
294
295
Brian Paulb371e0d2000-03-31 01:05:51 +0000296void
297_mesa_destroy_visual( GLvisual *vis )
298{
299 FREE(vis);
300}
301
302
Brian Paul4d053dd2000-01-14 04:45:47 +0000303/**********************************************************************/
304/***** GL Framebuffer allocation/destruction *****/
305/**********************************************************************/
306
307
308/*
309 * Create a new framebuffer. A GLframebuffer is a struct which
310 * encapsulates the depth, stencil and accum buffers and related
311 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000312 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000313 * softwareDepth - create/use a software depth buffer?
314 * softwareStencil - create/use a software stencil buffer?
315 * softwareAccum - create/use a software accum buffer?
316 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000317 * Return: pointer to new GLframebuffer struct or NULL if error.
318 */
Brian Paul178a1c52000-04-22 01:05:00 +0000319GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000320_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000321 GLboolean softwareDepth,
322 GLboolean softwareStencil,
323 GLboolean softwareAccum,
324 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000325{
Brian Paul178a1c52000-04-22 01:05:00 +0000326 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
327 assert(visual);
328 if (buffer) {
329 _mesa_initialize_framebuffer(buffer, visual,
330 softwareDepth, softwareStencil,
331 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000332 }
Brian Paul178a1c52000-04-22 01:05:00 +0000333 return buffer;
334}
335
336
337/*
338 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000339 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000340 */
341void
342_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000343 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000344 GLboolean softwareDepth,
345 GLboolean softwareStencil,
346 GLboolean softwareAccum,
347 GLboolean softwareAlpha )
348{
349 assert(buffer);
350 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000351
352 /* sanity checks */
353 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000354 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000355 }
356 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000357 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000358 }
359 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000360 assert(visual->rgbMode);
361 assert(visual->accumRedBits > 0);
362 assert(visual->accumGreenBits > 0);
363 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000364 }
365 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000366 assert(visual->rgbMode);
367 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000368 }
369
Brian Paul75978bd2001-04-27 21:17:20 +0000370 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000371 buffer->UseSoftwareDepthBuffer = softwareDepth;
372 buffer->UseSoftwareStencilBuffer = softwareStencil;
373 buffer->UseSoftwareAccumBuffer = softwareAccum;
374 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000375}
376
377
Brian Paul4d053dd2000-01-14 04:45:47 +0000378/*
379 * Free a framebuffer struct and its buffers.
380 */
Brian Paul178a1c52000-04-22 01:05:00 +0000381void
Brian Paulb1394fa2000-09-26 20:53:53 +0000382_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000383{
384 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000385 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000386 FREE(buffer);
387 }
388}
389
390
Brian Paul75978bd2001-04-27 21:17:20 +0000391/*
392 * Free the data hanging off of <buffer>, but not <buffer> itself.
393 */
394void
395_mesa_free_framebuffer_data( GLframebuffer *buffer )
396{
397 if (!buffer)
398 return;
399
400 if (buffer->DepthBuffer) {
401 FREE( buffer->DepthBuffer );
402 buffer->DepthBuffer = NULL;
403 }
404 if (buffer->Accum) {
405 FREE( buffer->Accum );
406 buffer->Accum = NULL;
407 }
408 if (buffer->Stencil) {
409 FREE( buffer->Stencil );
410 buffer->Stencil = NULL;
411 }
412 if (buffer->FrontLeftAlpha) {
413 FREE( buffer->FrontLeftAlpha );
414 buffer->FrontLeftAlpha = NULL;
415 }
416 if (buffer->BackLeftAlpha) {
417 FREE( buffer->BackLeftAlpha );
418 buffer->BackLeftAlpha = NULL;
419 }
420 if (buffer->FrontRightAlpha) {
421 FREE( buffer->FrontRightAlpha );
422 buffer->FrontRightAlpha = NULL;
423 }
424 if (buffer->BackRightAlpha) {
425 FREE( buffer->BackRightAlpha );
426 buffer->BackRightAlpha = NULL;
427 }
428}
429
430
Brian Paul4d053dd2000-01-14 04:45:47 +0000431
432/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000433/***** Context allocation, initialization, destroying *****/
434/**********************************************************************/
435
436
Brian Paul9560f052000-01-31 23:11:39 +0000437_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
438
439
jtgafb833d1999-08-19 00:55:39 +0000440/*
441 * This function just calls all the various one-time-init functions in Mesa.
442 */
Brian Paul178a1c52000-04-22 01:05:00 +0000443static void
444one_time_init( void )
jtgafb833d1999-08-19 00:55:39 +0000445{
446 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000447 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000448 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000449 /* do some implementation tests */
450 assert( sizeof(GLbyte) == 1 );
451 assert( sizeof(GLshort) >= 2 );
452 assert( sizeof(GLint) >= 4 );
453 assert( sizeof(GLubyte) == 1 );
454 assert( sizeof(GLushort) >= 2 );
455 assert( sizeof(GLuint) >= 4 );
456
Brian Paul08836342001-03-03 20:33:27 +0000457 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000458
Keith Whitwell23caf202000-11-16 21:05:34 +0000459 _math_init();
Brian Paul69755402001-02-26 23:58:12 +0000460 _mesa_init_math();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000461
davem69775355a2001-06-05 23:54:00 +0000462#ifdef USE_SPARC_ASM
463 _mesa_init_sparc_glapi_relocs();
464#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000465 if (getenv("MESA_DEBUG")) {
466 _glapi_noop_enable_warnings(GL_TRUE);
467 }
468 else {
469 _glapi_noop_enable_warnings(GL_FALSE);
470 }
471
jtgafb833d1999-08-19 00:55:39 +0000472#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
473 fprintf(stderr, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
474#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000475
476 alreadyCalled = GL_TRUE;
477 }
Brian Paul9560f052000-01-31 23:11:39 +0000478 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000479}
480
481
Brian Paul86b84272001-12-14 02:50:01 +0000482static void
483init_matrix_stack( struct matrix_stack *stack,
484 GLuint maxDepth, GLuint dirtyFlag )
485{
486 GLuint i;
487
488 stack->Depth = 0;
489 stack->MaxDepth = maxDepth;
490 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000491 /* The stack */
Brian Paul30f51ae2001-12-18 04:06:44 +0000492 stack->Stack = CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000493 for (i = 0; i < maxDepth; i++) {
494 _math_matrix_ctr(&stack->Stack[i]);
495 _math_matrix_alloc_inv(&stack->Stack[i]);
496 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000497 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000498}
499
500
501static void
502free_matrix_stack( struct matrix_stack *stack )
503{
504 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000505 for (i = 0; i < stack->MaxDepth; i++) {
506 _math_matrix_dtr(&stack->Stack[i]);
507 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000508 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000509}
510
Brian Paul4d053dd2000-01-14 04:45:47 +0000511
jtgafb833d1999-08-19 00:55:39 +0000512/*
513 * Allocate and initialize a shared context state structure.
514 */
Brian Paul178a1c52000-04-22 01:05:00 +0000515static struct gl_shared_state *
516alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000517{
jtgafb833d1999-08-19 00:55:39 +0000518 struct gl_shared_state *ss;
519 GLboolean outOfMemory;
520
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000521 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000522 if (!ss)
523 return NULL;
524
Brian Paule4b684c2000-09-12 21:07:40 +0000525 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000526
Brian Paule4b684c2000-09-12 21:07:40 +0000527 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000528 ss->TexObjects = _mesa_NewHashTable();
Brian Paul30f51ae2001-12-18 04:06:44 +0000529 ss->VertexPrograms = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000530
531 /* Default Texture objects */
532 outOfMemory = GL_FALSE;
Brian Paula8523782000-11-19 23:10:25 +0000533
534 ss->Default1D = _mesa_alloc_texture_object(ss, 0, 1);
535 if (!ss->Default1D) {
536 outOfMemory = GL_TRUE;
537 }
jtgafb833d1999-08-19 00:55:39 +0000538
Brian Paula8523782000-11-19 23:10:25 +0000539 ss->Default2D = _mesa_alloc_texture_object(ss, 0, 2);
540 if (!ss->Default2D) {
541 outOfMemory = GL_TRUE;
542 }
Brian Paula8523782000-11-19 23:10:25 +0000543
544 ss->Default3D = _mesa_alloc_texture_object(ss, 0, 3);
545 if (!ss->Default3D) {
546 outOfMemory = GL_TRUE;
547 }
Brian Paula8523782000-11-19 23:10:25 +0000548
549 ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0, 6);
Brian Paul413d6a22000-05-26 14:44:59 +0000550 if (!ss->DefaultCubeMap) {
551 outOfMemory = GL_TRUE;
552 }
Brian Paul413d6a22000-05-26 14:44:59 +0000553
Brian Paul30f51ae2001-12-18 04:06:44 +0000554 if (!ss->DisplayList || !ss->TexObjects || !ss->VertexPrograms
555 || outOfMemory) {
jtgafb833d1999-08-19 00:55:39 +0000556 /* Ran out of memory at some point. Free everything and return NULL */
557 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000558 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000559 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000560 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul30f51ae2001-12-18 04:06:44 +0000561 if (ss->VertexPrograms)
562 _mesa_DeleteHashTable(ss->VertexPrograms);
Brian Paula8523782000-11-19 23:10:25 +0000563 if (ss->Default1D)
564 _mesa_free_texture_object(ss, ss->Default1D);
565 if (ss->Default2D)
566 _mesa_free_texture_object(ss, ss->Default2D);
567 if (ss->Default3D)
568 _mesa_free_texture_object(ss, ss->Default3D);
Brian Paul413d6a22000-05-26 14:44:59 +0000569 if (ss->DefaultCubeMap)
Brian Paula8523782000-11-19 23:10:25 +0000570 _mesa_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000571 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000572 return NULL;
573 }
574 else {
575 return ss;
576 }
577}
578
579
580/*
581 * Deallocate a shared state context and all children structures.
582 */
Brian Paul178a1c52000-04-22 01:05:00 +0000583static void
584free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000585{
586 /* Free display lists */
587 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000588 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000589 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000590 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000591 }
592 else {
593 break;
594 }
595 }
Brian Paulbb797902000-01-24 16:19:54 +0000596 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000597
598 /* Free texture objects */
Brian Paul5a2f32b2001-04-25 18:21:05 +0000599 while (ss->TexObjectList) {
jtgafb833d1999-08-19 00:55:39 +0000600 if (ctx->Driver.DeleteTexture)
601 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
602 /* this function removes from linked list too! */
Brian Paula8523782000-11-19 23:10:25 +0000603 _mesa_free_texture_object(ss, ss->TexObjectList);
jtgafb833d1999-08-19 00:55:39 +0000604 }
Brian Paulbb797902000-01-24 16:19:54 +0000605 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000606
Brian Paul30f51ae2001-12-18 04:06:44 +0000607 /* Free vertex programs */
608 while (1) {
609 GLuint prog = _mesa_HashFirstEntry(ss->VertexPrograms);
610 if (prog) {
611 _mesa_delete_program(ctx, prog);
612 }
613 else {
614 break;
615 }
616 }
617 _mesa_DeleteHashTable(ss->VertexPrograms);
618
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000619 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000620}
621
622
623
jtgafb833d1999-08-19 00:55:39 +0000624/*
625 * Initialize the nth light. Note that the defaults for light 0 are
626 * different than the other lights.
627 */
Brian Paul178a1c52000-04-22 01:05:00 +0000628static void
629init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000630{
631 make_empty_list( l );
632
633 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
634 if (n==0) {
635 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
636 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
637 }
638 else {
639 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
640 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
641 }
642 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
643 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
644 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000645 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000646 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000647 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000648 l->ConstantAttenuation = 1.0;
649 l->LinearAttenuation = 0.0;
650 l->QuadraticAttenuation = 0.0;
651 l->Enabled = GL_FALSE;
652}
653
654
655
Brian Paul178a1c52000-04-22 01:05:00 +0000656static void
657init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000658{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000659 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000660 lm->LocalViewer = GL_FALSE;
661 lm->TwoSide = GL_FALSE;
662 lm->ColorControl = GL_SINGLE_COLOR;
663}
664
665
Brian Paul178a1c52000-04-22 01:05:00 +0000666static void
667init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000668{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000669 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
670 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
671 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
672 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000673 m->Shininess = 0.0;
674 m->AmbientIndex = 0;
675 m->DiffuseIndex = 1;
676 m->SpecularIndex = 1;
677}
678
679
680
Brian Paul178a1c52000-04-22 01:05:00 +0000681static void
682init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000683{
684 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
685
686 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000687 texUnit->CombineModeRGB = GL_MODULATE;
688 texUnit->CombineModeA = GL_MODULATE;
689 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
690 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
691 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
692 texUnit->CombineSourceA[0] = GL_TEXTURE;
693 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
694 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
695 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
696 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
697 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
698 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
699 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
700 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
701 texUnit->CombineScaleShiftRGB = 0;
702 texUnit->CombineScaleShiftA = 0;
703
jtgafb833d1999-08-19 00:55:39 +0000704 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
705 texUnit->TexGenEnabled = 0;
706 texUnit->GenModeS = GL_EYE_LINEAR;
707 texUnit->GenModeT = GL_EYE_LINEAR;
708 texUnit->GenModeR = GL_EYE_LINEAR;
709 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000710 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
711 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
712 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
713 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000714
jtgafb833d1999-08-19 00:55:39 +0000715 /* Yes, these plane coefficients are correct! */
716 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
717 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
718 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
719 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
720 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
721 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
722 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
723 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
724
Brian Paula8523782000-11-19 23:10:25 +0000725 texUnit->Current1D = ctx->Shared->Default1D;
726 texUnit->Current2D = ctx->Shared->Default2D;
727 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000728 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
jtgafb833d1999-08-19 00:55:39 +0000729}
730
731
jtgafb833d1999-08-19 00:55:39 +0000732
Brian Paul4d053dd2000-01-14 04:45:47 +0000733
jtgafb833d1999-08-19 00:55:39 +0000734/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000735static void
736init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000737{
738 map->Order = 1;
739 map->u1 = 0.0;
740 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000741 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000742 if (map->Points) {
743 GLint i;
744 for (i=0;i<n;i++)
745 map->Points[i] = initial[i];
746 }
jtgafb833d1999-08-19 00:55:39 +0000747}
748
749
750/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000751static void
752init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000753{
754 map->Uorder = 1;
755 map->Vorder = 1;
756 map->u1 = 0.0;
757 map->u2 = 1.0;
758 map->v1 = 0.0;
759 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000760 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000761 if (map->Points) {
762 GLint i;
763 for (i=0;i<n;i++)
764 map->Points[i] = initial[i];
765 }
jtgafb833d1999-08-19 00:55:39 +0000766}
767
768
jtgafb833d1999-08-19 00:55:39 +0000769/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000770 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000771 */
Brian Paul178a1c52000-04-22 01:05:00 +0000772static void
773init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000774{
Brian Paul30f51ae2001-12-18 04:06:44 +0000775 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000776
Brian Paul4d053dd2000-01-14 04:45:47 +0000777 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000778
Brian Paulcd1cefa2001-06-13 14:56:14 +0000779 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
780 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
781
Brian Paul539cce52000-02-03 19:40:07 +0000782 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000783 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000784 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
785 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000786 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000787 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000788 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000789 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000790 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
791 ctx->Const.MinPointSize = MIN_POINT_SIZE;
792 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
793 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
794 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000795 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000796 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
797 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
798 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
799 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000800 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000801 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000802 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000803 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
804 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000805 ctx->Const.NumCompressedTextureFormats = 0;
Brian Paula8644322000-11-27 18:22:13 +0000806 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
807 ctx->Const.MaxLights = MAX_LIGHTS;
jtgafb833d1999-08-19 00:55:39 +0000808
Brian Paul30f51ae2001-12-18 04:06:44 +0000809 /* Initialize matrix stacks */
810 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
811 _NEW_MODELVIEW);
812 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
813 _NEW_PROJECTION);
814 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
815 _NEW_COLOR_MATRIX);
816 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
817 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
818 _NEW_TEXTURE_MATRIX);
819 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
820 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
821 _NEW_TRACK_MATRIX);
822 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +0000823
Brian Paul30f51ae2001-12-18 04:06:44 +0000824 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +0000825 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
826
Brian Paul4d053dd2000-01-14 04:45:47 +0000827 /* Accumulate buffer group */
828 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000829
Brian Paul4d053dd2000-01-14 04:45:47 +0000830 /* Color buffer group */
831 ctx->Color.IndexMask = 0xffffffff;
832 ctx->Color.ColorMask[0] = 0xff;
833 ctx->Color.ColorMask[1] = 0xff;
834 ctx->Color.ColorMask[2] = 0xff;
835 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000836 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +0000837 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000838 ctx->Color.DrawBuffer = GL_FRONT;
839 ctx->Color.AlphaEnabled = GL_FALSE;
840 ctx->Color.AlphaFunc = GL_ALWAYS;
841 ctx->Color.AlphaRef = 0;
842 ctx->Color.BlendEnabled = GL_FALSE;
843 ctx->Color.BlendSrcRGB = GL_ONE;
844 ctx->Color.BlendDstRGB = GL_ZERO;
845 ctx->Color.BlendSrcA = GL_ONE;
846 ctx->Color.BlendDstA = GL_ZERO;
847 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +0000848 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
849 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
850 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000851 ctx->Color.LogicOp = GL_COPY;
852 ctx->Color.DitherFlag = GL_TRUE;
853 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000854
Brian Paul4d053dd2000-01-14 04:45:47 +0000855 /* Current group */
Brian Paul86b84272001-12-14 02:50:01 +0000856 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
857 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
858 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
859 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
860 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
861 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
862 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000863 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +0000864 ctx->Current.EdgeFlag = GL_TRUE;
865
Brian Paul4d053dd2000-01-14 04:45:47 +0000866 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
867 ctx->Current.RasterDistance = 0.0;
868 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
869 ctx->Current.RasterIndex = 1;
870 for (i=0; i<MAX_TEXTURE_UNITS; i++)
871 ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
872 ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
873 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +0000874
jtgafb833d1999-08-19 00:55:39 +0000875
Brian Paul4d053dd2000-01-14 04:45:47 +0000876 /* Depth buffer group */
877 ctx->Depth.Test = GL_FALSE;
878 ctx->Depth.Clear = 1.0;
879 ctx->Depth.Func = GL_LESS;
880 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000881 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000882
Brian Paul4d053dd2000-01-14 04:45:47 +0000883 /* Evaluators group */
884 ctx->Eval.Map1Color4 = GL_FALSE;
885 ctx->Eval.Map1Index = GL_FALSE;
886 ctx->Eval.Map1Normal = GL_FALSE;
887 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
888 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
889 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
890 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
891 ctx->Eval.Map1Vertex3 = GL_FALSE;
892 ctx->Eval.Map1Vertex4 = GL_FALSE;
893 ctx->Eval.Map2Color4 = GL_FALSE;
894 ctx->Eval.Map2Index = GL_FALSE;
895 ctx->Eval.Map2Normal = GL_FALSE;
896 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
897 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
898 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
899 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
900 ctx->Eval.Map2Vertex3 = GL_FALSE;
901 ctx->Eval.Map2Vertex4 = GL_FALSE;
902 ctx->Eval.AutoNormal = GL_FALSE;
903 ctx->Eval.MapGrid1un = 1;
904 ctx->Eval.MapGrid1u1 = 0.0;
905 ctx->Eval.MapGrid1u2 = 1.0;
906 ctx->Eval.MapGrid2un = 1;
907 ctx->Eval.MapGrid2vn = 1;
908 ctx->Eval.MapGrid2u1 = 0.0;
909 ctx->Eval.MapGrid2u2 = 1.0;
910 ctx->Eval.MapGrid2v1 = 0.0;
911 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000912
Brian Paul4d053dd2000-01-14 04:45:47 +0000913 /* Evaluator data */
914 {
915 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
916 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
917 static GLfloat index[1] = { 1.0 };
918 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
919 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +0000920
Brian Paul4d053dd2000-01-14 04:45:47 +0000921 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
922 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
923 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
924 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
925 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
926 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
927 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
928 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
929 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
jtgafb833d1999-08-19 00:55:39 +0000930
Brian Paul4d053dd2000-01-14 04:45:47 +0000931 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
932 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
933 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
934 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
935 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
936 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
937 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
938 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
939 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
940 }
jtgafb833d1999-08-19 00:55:39 +0000941
Brian Paul4d053dd2000-01-14 04:45:47 +0000942 /* Fog group */
943 ctx->Fog.Enabled = GL_FALSE;
944 ctx->Fog.Mode = GL_EXP;
945 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
946 ctx->Fog.Index = 0.0;
947 ctx->Fog.Density = 1.0;
948 ctx->Fog.Start = 0.0;
949 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000950 ctx->Fog.ColorSumEnabled = GL_FALSE;
951 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +0000952
Brian Paul4d053dd2000-01-14 04:45:47 +0000953 /* Hint group */
954 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
955 ctx->Hint.PointSmooth = GL_DONT_CARE;
956 ctx->Hint.LineSmooth = GL_DONT_CARE;
957 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
958 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +0000959 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
960 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +0000961 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +0000962
Brian Paul0771d152000-04-07 00:19:41 +0000963 /* Histogram group */
964 ctx->Histogram.Width = 0;
965 ctx->Histogram.Format = GL_RGBA;
966 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +0000967 ctx->Histogram.RedSize = 0;
968 ctx->Histogram.GreenSize = 0;
969 ctx->Histogram.BlueSize = 0;
970 ctx->Histogram.AlphaSize = 0;
971 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +0000972 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
973 ctx->Histogram.Count[i][0] = 0;
974 ctx->Histogram.Count[i][1] = 0;
975 ctx->Histogram.Count[i][2] = 0;
976 ctx->Histogram.Count[i][3] = 0;
977 }
978
979 /* Min/Max group */
980 ctx->MinMax.Format = GL_RGBA;
981 ctx->MinMax.Sink = GL_FALSE;
982 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
983 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
984 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
985 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
986
Brian Paul4d053dd2000-01-14 04:45:47 +0000987 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +0000988 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +0000989
Brian Paul4d053dd2000-01-14 04:45:47 +0000990 /* Lighting group */
991 for (i=0;i<MAX_LIGHTS;i++) {
992 init_light( &ctx->Light.Light[i], i );
993 }
994 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +0000995
Brian Paul4d053dd2000-01-14 04:45:47 +0000996 init_lightmodel( &ctx->Light.Model );
997 init_material( &ctx->Light.Material[0] );
998 init_material( &ctx->Light.Material[1] );
999 ctx->Light.ShadeModel = GL_SMOOTH;
1000 ctx->Light.Enabled = GL_FALSE;
1001 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1002 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001003 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1004 GL_FRONT_AND_BACK,
1005 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001006
Brian Paul4d053dd2000-01-14 04:45:47 +00001007 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001008
Brian Paul4d053dd2000-01-14 04:45:47 +00001009 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001010 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1011 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001012 for (i = 0 ; i < 10 ; i++) {
1013 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1014 s->shininess = -1;
1015 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001016 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001017 }
Brian Paul77d61af2000-06-28 04:20:21 +00001018
jtgafb833d1999-08-19 00:55:39 +00001019
Brian Paul4d053dd2000-01-14 04:45:47 +00001020 /* Line group */
1021 ctx->Line.SmoothFlag = GL_FALSE;
1022 ctx->Line.StippleFlag = GL_FALSE;
1023 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001024 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001025 ctx->Line.StipplePattern = 0xffff;
1026 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001027
Brian Paul4d053dd2000-01-14 04:45:47 +00001028 /* Display List group */
1029 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001030
Brian Paul736fcbe2001-05-29 15:23:48 +00001031 /* Multisample */
1032 ctx->Multisample.Enabled = GL_FALSE;
1033 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1034 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1035 ctx->Multisample.SampleCoverage = GL_FALSE;
1036 ctx->Multisample.SampleCoverageValue = 1.0;
1037 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1038
Brian Paul4d053dd2000-01-14 04:45:47 +00001039 /* Pixel group */
1040 ctx->Pixel.RedBias = 0.0;
1041 ctx->Pixel.RedScale = 1.0;
1042 ctx->Pixel.GreenBias = 0.0;
1043 ctx->Pixel.GreenScale = 1.0;
1044 ctx->Pixel.BlueBias = 0.0;
1045 ctx->Pixel.BlueScale = 1.0;
1046 ctx->Pixel.AlphaBias = 0.0;
1047 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001048 ctx->Pixel.DepthBias = 0.0;
1049 ctx->Pixel.DepthScale = 1.0;
1050 ctx->Pixel.IndexOffset = 0;
1051 ctx->Pixel.IndexShift = 0;
1052 ctx->Pixel.ZoomX = 1.0;
1053 ctx->Pixel.ZoomY = 1.0;
1054 ctx->Pixel.MapColorFlag = GL_FALSE;
1055 ctx->Pixel.MapStencilFlag = GL_FALSE;
1056 ctx->Pixel.MapStoSsize = 1;
1057 ctx->Pixel.MapItoIsize = 1;
1058 ctx->Pixel.MapItoRsize = 1;
1059 ctx->Pixel.MapItoGsize = 1;
1060 ctx->Pixel.MapItoBsize = 1;
1061 ctx->Pixel.MapItoAsize = 1;
1062 ctx->Pixel.MapRtoRsize = 1;
1063 ctx->Pixel.MapGtoGsize = 1;
1064 ctx->Pixel.MapBtoBsize = 1;
1065 ctx->Pixel.MapAtoAsize = 1;
1066 ctx->Pixel.MapStoS[0] = 0;
1067 ctx->Pixel.MapItoI[0] = 0;
1068 ctx->Pixel.MapItoR[0] = 0.0;
1069 ctx->Pixel.MapItoG[0] = 0.0;
1070 ctx->Pixel.MapItoB[0] = 0.0;
1071 ctx->Pixel.MapItoA[0] = 0.0;
1072 ctx->Pixel.MapItoR8[0] = 0;
1073 ctx->Pixel.MapItoG8[0] = 0;
1074 ctx->Pixel.MapItoB8[0] = 0;
1075 ctx->Pixel.MapItoA8[0] = 0;
1076 ctx->Pixel.MapRtoR[0] = 0.0;
1077 ctx->Pixel.MapGtoG[0] = 0.0;
1078 ctx->Pixel.MapBtoB[0] = 0.0;
1079 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001080 ctx->Pixel.HistogramEnabled = GL_FALSE;
1081 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1082 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1083 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1084 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001085 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1086 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1087 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1088 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001089 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1090 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1091 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1092 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001093 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1094 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1095 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001096 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1097 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1098 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1099 for (i = 0; i < 3; i++) {
1100 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1101 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1102 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1103 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1104 }
Brian Paul67adba12000-12-09 20:35:54 +00001105 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1106 ctx->Convolution1D.Filter[i] = 0.0;
1107 ctx->Convolution2D.Filter[i] = 0.0;
1108 ctx->Separable2D.Filter[i] = 0.0;
1109 }
Brian Paul82b02f02000-05-07 20:37:40 +00001110 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1111 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001112
Brian Paul4d053dd2000-01-14 04:45:47 +00001113 /* Point group */
1114 ctx->Point.SmoothFlag = GL_FALSE;
1115 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001116 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001117 ctx->Point.Params[0] = 1.0;
1118 ctx->Point.Params[1] = 0.0;
1119 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001120 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001121 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001122 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001123 ctx->Point.Threshold = 1.0;
Brian Paul06d05af2000-12-08 00:20:15 +00001124 ctx->Point.SpriteMode = GL_FALSE; /* GL_MESA_sprite_point */
jtgafb833d1999-08-19 00:55:39 +00001125
Brian Paul4d053dd2000-01-14 04:45:47 +00001126 /* Polygon group */
1127 ctx->Polygon.CullFlag = GL_FALSE;
1128 ctx->Polygon.CullFaceMode = GL_BACK;
1129 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001130 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001131 ctx->Polygon.FrontMode = GL_FILL;
1132 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001133 ctx->Polygon.SmoothFlag = GL_FALSE;
1134 ctx->Polygon.StippleFlag = GL_FALSE;
1135 ctx->Polygon.OffsetFactor = 0.0F;
1136 ctx->Polygon.OffsetUnits = 0.0F;
Brian Pauld0d7d622000-10-21 00:02:47 +00001137 ctx->Polygon.OffsetMRD = 0.0F;
Brian Paul4d053dd2000-01-14 04:45:47 +00001138 ctx->Polygon.OffsetPoint = GL_FALSE;
1139 ctx->Polygon.OffsetLine = GL_FALSE;
1140 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001141
Brian Paul4d053dd2000-01-14 04:45:47 +00001142 /* Polygon Stipple group */
1143 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001144
Brian Paul4d053dd2000-01-14 04:45:47 +00001145 /* Scissor group */
1146 ctx->Scissor.Enabled = GL_FALSE;
1147 ctx->Scissor.X = 0;
1148 ctx->Scissor.Y = 0;
1149 ctx->Scissor.Width = 0;
1150 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001151
Brian Paul4d053dd2000-01-14 04:45:47 +00001152 /* Stencil group */
1153 ctx->Stencil.Enabled = GL_FALSE;
1154 ctx->Stencil.Function = GL_ALWAYS;
1155 ctx->Stencil.FailFunc = GL_KEEP;
1156 ctx->Stencil.ZPassFunc = GL_KEEP;
1157 ctx->Stencil.ZFailFunc = GL_KEEP;
1158 ctx->Stencil.Ref = 0;
1159 ctx->Stencil.ValueMask = STENCIL_MAX;
1160 ctx->Stencil.Clear = 0;
1161 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001162
Brian Paul4d053dd2000-01-14 04:45:47 +00001163 /* Texture group */
1164 ctx->Texture.CurrentUnit = 0; /* multitexture */
Keith Whitwell14940c42000-11-05 18:40:57 +00001165 ctx->Texture._ReallyEnabled = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001166 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1167 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001168 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001169 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001170
Brian Paul4d053dd2000-01-14 04:45:47 +00001171 /* Transformation group */
1172 ctx->Transform.MatrixMode = GL_MODELVIEW;
1173 ctx->Transform.Normalize = GL_FALSE;
1174 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001175 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001176 for (i=0;i<MAX_CLIP_PLANES;i++) {
1177 ctx->Transform.ClipEnabled[i] = GL_FALSE;
1178 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1179 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001180 ctx->Transform._AnyClip = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001181
Brian Paul4d053dd2000-01-14 04:45:47 +00001182 /* Viewport group */
1183 ctx->Viewport.X = 0;
1184 ctx->Viewport.Y = 0;
1185 ctx->Viewport.Width = 0;
1186 ctx->Viewport.Height = 0;
1187 ctx->Viewport.Near = 0.0;
1188 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001189 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001190
1191#define Sz 10
1192#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001193 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1194 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001195#undef Sz
1196#undef Tz
1197
Keith Whitwell14940c42000-11-05 18:40:57 +00001198 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1199 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001200
Brian Paul4d053dd2000-01-14 04:45:47 +00001201 /* Vertex arrays */
1202 ctx->Array.Vertex.Size = 4;
1203 ctx->Array.Vertex.Type = GL_FLOAT;
1204 ctx->Array.Vertex.Stride = 0;
1205 ctx->Array.Vertex.StrideB = 0;
1206 ctx->Array.Vertex.Ptr = NULL;
1207 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001208 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001209 ctx->Array.Normal.Type = GL_FLOAT;
1210 ctx->Array.Normal.Stride = 0;
1211 ctx->Array.Normal.StrideB = 0;
1212 ctx->Array.Normal.Ptr = NULL;
1213 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001214 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001215 ctx->Array.Color.Size = 4;
1216 ctx->Array.Color.Type = GL_FLOAT;
1217 ctx->Array.Color.Stride = 0;
1218 ctx->Array.Color.StrideB = 0;
1219 ctx->Array.Color.Ptr = NULL;
1220 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001221 ctx->Array.Color.Flags = CA_CLIENT_DATA;
1222 ctx->Array.SecondaryColor.Size = 4;
1223 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1224 ctx->Array.SecondaryColor.Stride = 0;
1225 ctx->Array.SecondaryColor.StrideB = 0;
1226 ctx->Array.SecondaryColor.Ptr = NULL;
1227 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1228 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1229 ctx->Array.FogCoord.Size = 1;
1230 ctx->Array.FogCoord.Type = GL_FLOAT;
1231 ctx->Array.FogCoord.Stride = 0;
1232 ctx->Array.FogCoord.StrideB = 0;
1233 ctx->Array.FogCoord.Ptr = NULL;
1234 ctx->Array.FogCoord.Enabled = GL_FALSE;
1235 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001236 ctx->Array.Index.Type = GL_FLOAT;
1237 ctx->Array.Index.Stride = 0;
1238 ctx->Array.Index.StrideB = 0;
1239 ctx->Array.Index.Ptr = NULL;
1240 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001241 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001242 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1243 ctx->Array.TexCoord[i].Size = 4;
1244 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1245 ctx->Array.TexCoord[i].Stride = 0;
1246 ctx->Array.TexCoord[i].StrideB = 0;
1247 ctx->Array.TexCoord[i].Ptr = NULL;
1248 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001249 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001250 }
1251 ctx->Array.TexCoordInterleaveFactor = 1;
1252 ctx->Array.EdgeFlag.Stride = 0;
1253 ctx->Array.EdgeFlag.StrideB = 0;
1254 ctx->Array.EdgeFlag.Ptr = NULL;
1255 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001256 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001257 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1258
1259 /* Pixel transfer */
1260 ctx->Pack.Alignment = 4;
1261 ctx->Pack.RowLength = 0;
1262 ctx->Pack.ImageHeight = 0;
1263 ctx->Pack.SkipPixels = 0;
1264 ctx->Pack.SkipRows = 0;
1265 ctx->Pack.SkipImages = 0;
1266 ctx->Pack.SwapBytes = GL_FALSE;
1267 ctx->Pack.LsbFirst = GL_FALSE;
1268 ctx->Unpack.Alignment = 4;
1269 ctx->Unpack.RowLength = 0;
1270 ctx->Unpack.ImageHeight = 0;
1271 ctx->Unpack.SkipPixels = 0;
1272 ctx->Unpack.SkipRows = 0;
1273 ctx->Unpack.SkipImages = 0;
1274 ctx->Unpack.SwapBytes = GL_FALSE;
1275 ctx->Unpack.LsbFirst = GL_FALSE;
1276
1277 /* Feedback */
1278 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1279 ctx->Feedback.Buffer = NULL;
1280 ctx->Feedback.BufferSize = 0;
1281 ctx->Feedback.Count = 0;
1282
1283 /* Selection/picking */
1284 ctx->Select.Buffer = NULL;
1285 ctx->Select.BufferSize = 0;
1286 ctx->Select.BufferCount = 0;
1287 ctx->Select.Hits = 0;
1288 ctx->Select.NameStackDepth = 0;
1289
Brian Paul4d053dd2000-01-14 04:45:47 +00001290 /* Renderer and client attribute stacks */
1291 ctx->AttribStackDepth = 0;
1292 ctx->ClientAttribStackDepth = 0;
1293
Brian Paul13811372000-04-12 00:27:37 +00001294 /* Display list */
1295 ctx->CallDepth = 0;
1296 ctx->ExecuteFlag = GL_TRUE;
1297 ctx->CompileFlag = GL_FALSE;
1298 ctx->CurrentListPtr = NULL;
1299 ctx->CurrentBlock = NULL;
1300 ctx->CurrentListNum = 0;
1301 ctx->CurrentPos = 0;
1302
1303 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001304 _mesa_init_colortable(&ctx->ColorTable);
1305 _mesa_init_colortable(&ctx->ProxyColorTable);
1306 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1307 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1308 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1309 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001310
Brian Paul86b84272001-12-14 02:50:01 +00001311 /* GL_NV_vertex_program */
Brian Paul30f51ae2001-12-18 04:06:44 +00001312 ctx->VertexProgram.Current = NULL;
1313 ctx->VertexProgram.CurrentID = 0;
Brian Paul86b84272001-12-14 02:50:01 +00001314 ctx->VertexProgram.Enabled = GL_FALSE;
1315 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1316 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
1317 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1318 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1319 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1320 }
1321
Brian Paul4d053dd2000-01-14 04:45:47 +00001322 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001323 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001324 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001325 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001326
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001327 ctx->_NeedNormals = 0;
1328 ctx->_NeedEyeCoords = 0;
1329 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001330
Brian Paul4d053dd2000-01-14 04:45:47 +00001331 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1332
1333 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001334 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001335 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001336
1337 /* For debug/development only */
1338 ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
1339 ctx->FirstTimeCurrent = GL_TRUE;
1340
1341 /* Dither disable */
1342 ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
1343 if (ctx->NoDither) {
1344 if (getenv("MESA_DEBUG")) {
1345 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001346 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001347 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001348 }
1349}
1350
1351
1352
1353
jtgafb833d1999-08-19 00:55:39 +00001354/*
1355 * Allocate the proxy textures. If we run out of memory part way through
1356 * the allocations clean up and return GL_FALSE.
1357 * Return: GL_TRUE=success, GL_FALSE=failure
1358 */
Brian Paul178a1c52000-04-22 01:05:00 +00001359static GLboolean
1360alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001361{
1362 GLboolean out_of_memory;
1363 GLint i;
1364
Brian Paula8523782000-11-19 23:10:25 +00001365 ctx->Texture.Proxy1D = _mesa_alloc_texture_object(NULL, 0, 1);
jtgafb833d1999-08-19 00:55:39 +00001366 if (!ctx->Texture.Proxy1D) {
1367 return GL_FALSE;
1368 }
1369
Brian Paula8523782000-11-19 23:10:25 +00001370 ctx->Texture.Proxy2D = _mesa_alloc_texture_object(NULL, 0, 2);
jtgafb833d1999-08-19 00:55:39 +00001371 if (!ctx->Texture.Proxy2D) {
Brian Paula8523782000-11-19 23:10:25 +00001372 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
jtgafb833d1999-08-19 00:55:39 +00001373 return GL_FALSE;
1374 }
1375
Brian Paula8523782000-11-19 23:10:25 +00001376 ctx->Texture.Proxy3D = _mesa_alloc_texture_object(NULL, 0, 3);
jtgafb833d1999-08-19 00:55:39 +00001377 if (!ctx->Texture.Proxy3D) {
Brian Paula8523782000-11-19 23:10:25 +00001378 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1379 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1380 return GL_FALSE;
1381 }
1382
1383 ctx->Texture.ProxyCubeMap = _mesa_alloc_texture_object(NULL, 0, 6);
1384 if (!ctx->Texture.ProxyCubeMap) {
1385 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1386 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1387 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
jtgafb833d1999-08-19 00:55:39 +00001388 return GL_FALSE;
1389 }
1390
1391 out_of_memory = GL_FALSE;
1392 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001393 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1394 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1395 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
Brian Paul172281d2001-07-26 20:02:10 +00001396 ctx->Texture.ProxyCubeMap->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001397 if (!ctx->Texture.Proxy1D->Image[i]
1398 || !ctx->Texture.Proxy2D->Image[i]
Brian Paul172281d2001-07-26 20:02:10 +00001399 || !ctx->Texture.Proxy3D->Image[i]
1400 || !ctx->Texture.ProxyCubeMap->Image[i]) {
jtgafb833d1999-08-19 00:55:39 +00001401 out_of_memory = GL_TRUE;
1402 }
1403 }
1404 if (out_of_memory) {
1405 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1406 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001407 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001408 }
1409 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001410 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001411 }
1412 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001413 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001414 }
Brian Paul172281d2001-07-26 20:02:10 +00001415 if (ctx->Texture.ProxyCubeMap->Image[i]) {
1416 _mesa_free_texture_image(ctx->Texture.ProxyCubeMap->Image[i]);
1417 }
jtgafb833d1999-08-19 00:55:39 +00001418 }
Brian Paula8523782000-11-19 23:10:25 +00001419 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1420 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1421 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
Brian Paul172281d2001-07-26 20:02:10 +00001422 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
jtgafb833d1999-08-19 00:55:39 +00001423 return GL_FALSE;
1424 }
1425 else {
1426 return GL_TRUE;
1427 }
1428}
1429
1430
jtgafb833d1999-08-19 00:55:39 +00001431/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001432 * Initialize a GLcontext struct. This includes allocating all the
1433 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001434 */
Brian Paul178a1c52000-04-22 01:05:00 +00001435GLboolean
1436_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001437 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001438 GLcontext *share_list,
1439 void *driver_ctx,
1440 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001441{
Brian Paul5fb84d22000-05-24 15:04:45 +00001442 GLuint dispatchSize;
1443
jtgafb833d1999-08-19 00:55:39 +00001444 (void) direct; /* not used */
1445
jtgafb833d1999-08-19 00:55:39 +00001446 /* misc one-time initializations */
1447 one_time_init();
1448
Brian Paulb1394fa2000-09-26 20:53:53 +00001449 /**
1450 ** OpenGL SI stuff
1451 **/
1452 if (!ctx->imports.malloc) {
1453 _mesa_InitDefaultImports(&ctx->imports, driver_ctx, NULL);
1454 }
1455 /* exports are setup by the device driver */
1456
jtgafb833d1999-08-19 00:55:39 +00001457 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001458 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001459 ctx->DrawBuffer = NULL;
1460 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001461
jtgafb833d1999-08-19 00:55:39 +00001462 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001463 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001464 ctx->Shared = share_list->Shared;
1465 }
1466 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001467 /* allocate new, unshared state */
jtgafb833d1999-08-19 00:55:39 +00001468 ctx->Shared = alloc_shared_state();
1469 if (!ctx->Shared) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001470 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001471 }
1472 }
Brian Paul9560f052000-01-31 23:11:39 +00001473 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001474 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001475 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001476
Brian Paul5a2f32b2001-04-25 18:21:05 +00001477 /* Effectively bind the default textures to all texture units */
1478 ctx->Shared->Default1D->RefCount += MAX_TEXTURE_UNITS;
1479 ctx->Shared->Default2D->RefCount += MAX_TEXTURE_UNITS;
1480 ctx->Shared->Default3D->RefCount += MAX_TEXTURE_UNITS;
1481 ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_UNITS;
1482
Brian Paul4d053dd2000-01-14 04:45:47 +00001483 init_attrib_groups( ctx );
1484
Brian Paulb6bcae52001-01-23 23:39:36 +00001485 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001486 ctx->Color.DrawBuffer = GL_BACK;
1487 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1488 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1489 ctx->Pixel.ReadBuffer = GL_BACK;
1490 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1491 }
1492 else {
1493 ctx->Color.DrawBuffer = GL_FRONT;
1494 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1495 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1496 ctx->Pixel.ReadBuffer = GL_FRONT;
1497 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1498 }
1499
jtgafb833d1999-08-19 00:55:39 +00001500 if (!alloc_proxy_textures(ctx)) {
1501 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001502 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001503 }
jtgafb833d1999-08-19 00:55:39 +00001504
Brian Paulf59afc92000-05-23 23:23:00 +00001505 /* register the most recent extension functions with libGL */
1506 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1507 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1508 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1509 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1510 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1511 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1512 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1513 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1514
Brian Paul5fb84d22000-05-24 15:04:45 +00001515 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1516 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1517 * Mesa we do this to accomodate different versions of libGL and various
1518 * DRI drivers.
1519 */
1520 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1521 sizeof(struct _glapi_table) / sizeof(void *));
1522
Brian Paulfbd8f211999-11-11 01:22:25 +00001523 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001524 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1525 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001526 if (!ctx->Exec || !ctx->Save) {
1527 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001528 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001529 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001530 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001531 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1532 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001533 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001534
Keith Whitwellad2ac212000-11-24 10:25:05 +00001535 ctx->ExecPrefersFloat = GL_FALSE;
1536 ctx->SavePrefersFloat = GL_FALSE;
1537
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001538 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001539 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001540 ctx->TnlModule.Current = NULL;
1541 ctx->TnlModule.SwapCount = 0;
1542
Brian Paulb6bcae52001-01-23 23:39:36 +00001543 /* Z buffer stuff */
1544 if (ctx->Visual.depthBits == 0) {
1545 /* Special case. Even if we don't have a depth buffer we need
1546 * good values for DepthMax for Z vertex transformation purposes
1547 * and for per-fragment fog computation.
1548 */
1549 ctx->DepthMax = 1 << 16;
1550 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1551 }
1552 else if (ctx->Visual.depthBits < 32) {
1553 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1554 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1555 }
1556 else {
1557 /* Special case since shift values greater than or equal to the
1558 * number of bits in the left hand expression's type are undefined.
1559 */
1560 ctx->DepthMax = 0xffffffff;
1561 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1562 }
Brian Paulbc920f02001-05-07 16:32:51 +00001563 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001564
1565
Brian Paul3b18a362000-09-26 15:27:20 +00001566#if defined(MESA_TRACE)
Brian Paul9e351d52001-05-03 14:11:18 +00001567 ctx->TraceCtx = (trace_context_t *) CALLOC( sizeof(trace_context_t) );
Brian Paul45f36342000-09-05 20:28:06 +00001568#if 0
1569 /* Brian: do you want to have CreateContext fail here,
1570 or should we just trap in NewTrace (currently done)? */
1571 if (!(ctx->TraceCtx)) {
1572 free_shared_state(ctx, ctx->Shared);
Brian Paul45f36342000-09-05 20:28:06 +00001573 FREE( ctx->Exec );
1574 FREE( ctx->Save );
1575 return GL_FALSE;
1576 }
1577#endif
1578 trInitContext(ctx->TraceCtx);
1579
1580 ctx->TraceDispatch = (struct _glapi_table *)
1581 CALLOC(dispatchSize * sizeof(void*));
1582#if 0
1583 if (!(ctx->TraceCtx)) {
1584 free_shared_state(ctx, ctx->Shared);
Brian Paul45f36342000-09-05 20:28:06 +00001585 FREE( ctx->Exec );
1586 FREE( ctx->Save );
1587 FREE( ctx->TraceCtx );
1588 return GL_FALSE;
1589 }
1590#endif
1591 trInitDispatch(ctx->TraceDispatch);
1592#endif
1593
Brian Paul4d053dd2000-01-14 04:45:47 +00001594 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001595}
1596
jtgafb833d1999-08-19 00:55:39 +00001597
1598
1599/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001600 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001601 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001602 * sharelist - another context to share display lists with or NULL
1603 * driver_ctx - pointer to device driver's context state struct
Brian Paulb1394fa2000-09-26 20:53:53 +00001604 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001605 */
Brian Paul178a1c52000-04-22 01:05:00 +00001606GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001607_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001608 GLcontext *share_list,
1609 void *driver_ctx,
1610 GLboolean direct )
Brian Paul4d053dd2000-01-14 04:45:47 +00001611{
1612 GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
1613 if (!ctx) {
1614 return NULL;
1615 }
Jouk Jansen12e875c2001-10-18 08:04:57 +00001616 ctx->Driver.CurrentExecPrimitive = 0;
Brian Paul178a1c52000-04-22 01:05:00 +00001617 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001618 return ctx;
1619 }
1620 else {
1621 FREE(ctx);
1622 return NULL;
1623 }
1624}
1625
1626
1627
1628/*
1629 * Free the data associated with the given context.
1630 * But don't free() the GLcontext struct itself!
1631 */
Brian Paul178a1c52000-04-22 01:05:00 +00001632void
Brian Paulb1394fa2000-09-26 20:53:53 +00001633_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001634{
Brian Paul4d053dd2000-01-14 04:45:47 +00001635 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001636 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001637
1638 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001639 if (ctx == _mesa_get_current_context()) {
1640 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001641 }
1642
Brian Paul30f51ae2001-12-18 04:06:44 +00001643 /*
1644 * Free transformation matrix stacks
1645 */
1646 free_matrix_stack(&ctx->ModelviewMatrixStack);
1647 free_matrix_stack(&ctx->ProjectionMatrixStack);
1648 free_matrix_stack(&ctx->ColorMatrixStack);
1649 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
1650 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1651 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1652 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1653 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001654 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1655
Brian Paul30f51ae2001-12-18 04:06:44 +00001656
1657 if (ctx->VertexProgram.Current) {
1658 ctx->VertexProgram.Current->RefCount--;
1659 if (ctx->VertexProgram.Current->RefCount <= 0)
1660 _mesa_delete_program(ctx, ctx->VertexProgram.CurrentID);
Brian Paulfd284452001-07-19 15:54:34 +00001661 }
1662
Brian Paul30f51ae2001-12-18 04:06:44 +00001663 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001664 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001665 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001666 assert(ctx->Shared->RefCount >= 0);
1667 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1668 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001669 /* free shared state */
1670 free_shared_state( ctx, ctx->Shared );
1671 }
1672
Brian Paul30f51ae2001-12-18 04:06:44 +00001673 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001674 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001675 FREE( s );
1676 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001677 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001678
1679 /* Free proxy texture objects */
Brian Paula8523782000-11-19 23:10:25 +00001680 _mesa_free_texture_object( NULL, ctx->Texture.Proxy1D );
1681 _mesa_free_texture_object( NULL, ctx->Texture.Proxy2D );
1682 _mesa_free_texture_object( NULL, ctx->Texture.Proxy3D );
Brian Paulfd284452001-07-19 15:54:34 +00001683 _mesa_free_texture_object( NULL, ctx->Texture.ProxyCubeMap );
Brian Paul4d053dd2000-01-14 04:45:47 +00001684
1685 /* Free evaluator data */
1686 if (ctx->EvalMap.Map1Vertex3.Points)
1687 FREE( ctx->EvalMap.Map1Vertex3.Points );
1688 if (ctx->EvalMap.Map1Vertex4.Points)
1689 FREE( ctx->EvalMap.Map1Vertex4.Points );
1690 if (ctx->EvalMap.Map1Index.Points)
1691 FREE( ctx->EvalMap.Map1Index.Points );
1692 if (ctx->EvalMap.Map1Color4.Points)
1693 FREE( ctx->EvalMap.Map1Color4.Points );
1694 if (ctx->EvalMap.Map1Normal.Points)
1695 FREE( ctx->EvalMap.Map1Normal.Points );
1696 if (ctx->EvalMap.Map1Texture1.Points)
1697 FREE( ctx->EvalMap.Map1Texture1.Points );
1698 if (ctx->EvalMap.Map1Texture2.Points)
1699 FREE( ctx->EvalMap.Map1Texture2.Points );
1700 if (ctx->EvalMap.Map1Texture3.Points)
1701 FREE( ctx->EvalMap.Map1Texture3.Points );
1702 if (ctx->EvalMap.Map1Texture4.Points)
1703 FREE( ctx->EvalMap.Map1Texture4.Points );
1704
1705 if (ctx->EvalMap.Map2Vertex3.Points)
1706 FREE( ctx->EvalMap.Map2Vertex3.Points );
1707 if (ctx->EvalMap.Map2Vertex4.Points)
1708 FREE( ctx->EvalMap.Map2Vertex4.Points );
1709 if (ctx->EvalMap.Map2Index.Points)
1710 FREE( ctx->EvalMap.Map2Index.Points );
1711 if (ctx->EvalMap.Map2Color4.Points)
1712 FREE( ctx->EvalMap.Map2Color4.Points );
1713 if (ctx->EvalMap.Map2Normal.Points)
1714 FREE( ctx->EvalMap.Map2Normal.Points );
1715 if (ctx->EvalMap.Map2Texture1.Points)
1716 FREE( ctx->EvalMap.Map2Texture1.Points );
1717 if (ctx->EvalMap.Map2Texture2.Points)
1718 FREE( ctx->EvalMap.Map2Texture2.Points );
1719 if (ctx->EvalMap.Map2Texture3.Points)
1720 FREE( ctx->EvalMap.Map2Texture3.Points );
1721 if (ctx->EvalMap.Map2Texture4.Points)
1722 FREE( ctx->EvalMap.Map2Texture4.Points );
1723
Brian Paul4bdcfe52000-04-17 17:57:04 +00001724 _mesa_free_colortable_data( &ctx->ColorTable );
1725 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1726 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1727 _mesa_free_colortable_data( &ctx->Texture.Palette );
1728
Brian Paulfd284452001-07-19 15:54:34 +00001729 _math_matrix_dtr(&ctx->Viewport._WindowMap);
1730
Brian Paul69755402001-02-26 23:58:12 +00001731 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001732
1733 FREE(ctx->Exec);
1734 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001735}
1736
1737
1738
1739/*
1740 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001741 */
Brian Paul178a1c52000-04-22 01:05:00 +00001742void
Brian Paulb1394fa2000-09-26 20:53:53 +00001743_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001744{
1745 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001746 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001747 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001748 }
1749}
1750
1751
1752
1753/*
jtgafb833d1999-08-19 00:55:39 +00001754 * Copy attribute groups from one context to another.
1755 * Input: src - source context
1756 * dst - destination context
1757 * mask - bitwise OR of GL_*_BIT flags
1758 */
Brian Paul178a1c52000-04-22 01:05:00 +00001759void
Brian Paulb1394fa2000-09-26 20:53:53 +00001760_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001761{
1762 if (mask & GL_ACCUM_BUFFER_BIT) {
1763 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1764 }
1765 if (mask & GL_COLOR_BUFFER_BIT) {
1766 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1767 }
1768 if (mask & GL_CURRENT_BIT) {
1769 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1770 }
1771 if (mask & GL_DEPTH_BUFFER_BIT) {
1772 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1773 }
1774 if (mask & GL_ENABLE_BIT) {
1775 /* no op */
1776 }
1777 if (mask & GL_EVAL_BIT) {
1778 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1779 }
1780 if (mask & GL_FOG_BIT) {
1781 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1782 }
1783 if (mask & GL_HINT_BIT) {
1784 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1785 }
1786 if (mask & GL_LIGHTING_BIT) {
1787 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001788 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001789 }
1790 if (mask & GL_LINE_BIT) {
1791 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1792 }
1793 if (mask & GL_LIST_BIT) {
1794 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1795 }
1796 if (mask & GL_PIXEL_MODE_BIT) {
1797 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1798 }
1799 if (mask & GL_POINT_BIT) {
1800 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1801 }
1802 if (mask & GL_POLYGON_BIT) {
1803 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1804 }
1805 if (mask & GL_POLYGON_STIPPLE_BIT) {
1806 /* Use loop instead of MEMCPY due to problem with Portland Group's
1807 * C compiler. Reported by John Stone.
1808 */
1809 int i;
1810 for (i=0;i<32;i++) {
1811 dst->PolygonStipple[i] = src->PolygonStipple[i];
1812 }
1813 }
1814 if (mask & GL_SCISSOR_BIT) {
1815 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
1816 }
1817 if (mask & GL_STENCIL_BUFFER_BIT) {
1818 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
1819 }
1820 if (mask & GL_TEXTURE_BIT) {
1821 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
1822 }
1823 if (mask & GL_TRANSFORM_BIT) {
1824 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
1825 }
1826 if (mask & GL_VIEWPORT_BIT) {
1827 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
1828 }
Keith Whitwella96308c2000-10-30 13:31:59 +00001829 /* XXX FIXME: Call callbacks?
1830 */
1831 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00001832}
1833
1834
jtgafb833d1999-08-19 00:55:39 +00001835/*
Brian Paul00037781999-12-17 14:52:35 +00001836 * Set the current context, binding the given frame buffer to the context.
1837 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001838void
1839_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
Brian Paul00037781999-12-17 14:52:35 +00001840{
Brian Paulb1394fa2000-09-26 20:53:53 +00001841 _mesa_make_current2( newCtx, buffer, buffer );
Brian Paul00037781999-12-17 14:52:35 +00001842}
1843
1844
Keith Whitwell23caf202000-11-16 21:05:34 +00001845static void print_info( void )
1846{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001847 fprintf(stderr, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00001848 (char *) _mesa_GetString(GL_VERSION));
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001849 fprintf(stderr, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00001850 (char *) _mesa_GetString(GL_RENDERER));
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001851 fprintf(stderr, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00001852 (char *) _mesa_GetString(GL_VENDOR));
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001853 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00001854 (char *) _mesa_GetString(GL_EXTENSIONS));
1855#if defined(THREADS)
1856 fprintf(stderr, "Mesa thread-safe: YES\n");
1857#else
1858 fprintf(stderr, "Mesa thread-safe: NO\n");
1859#endif
1860#if defined(USE_X86_ASM)
1861 fprintf(stderr, "Mesa x86-optimized: YES\n");
1862#else
1863 fprintf(stderr, "Mesa x86-optimized: NO\n");
1864#endif
davem69e4f84b42001-06-05 03:58:20 +00001865#if defined(USE_SPARC_ASM)
1866 fprintf(stderr, "Mesa sparc-optimized: YES\n");
1867#else
1868 fprintf(stderr, "Mesa sparc-optimized: NO\n");
1869#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00001870}
1871
1872
Brian Paul00037781999-12-17 14:52:35 +00001873/*
1874 * Bind the given context to the given draw-buffer and read-buffer
1875 * and make it the current context for this thread.
1876 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001877void
1878_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
1879 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00001880{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001881 if (MESA_VERBOSE)
Keith Whitwell23caf202000-11-16 21:05:34 +00001882 fprintf(stderr, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00001883
Brian Paulbe3602d2001-02-28 00:27:48 +00001884 /* Check that the context's and framebuffer's visuals are compatible.
1885 * We could do a lot more checking here but this'll catch obvious
1886 * problems.
1887 */
1888 if (newCtx && drawBuffer && readBuffer) {
1889 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
1890 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
1891 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
1892 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
1893 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
1894 return; /* incompatible */
1895 }
1896 }
1897
Brian Paul00037781999-12-17 14:52:35 +00001898 /* We call this function periodically (just here for now) in
1899 * order to detect when multithreading has begun.
1900 */
1901 _glapi_check_multithread();
1902
Brian Paulf9b97d92000-01-28 20:17:42 +00001903 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00001904 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00001905
1906
1907 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00001908 _glapi_set_dispatch(NULL); /* none current */
1909 }
Keith Whitwell23caf202000-11-16 21:05:34 +00001910 else {
1911 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00001912
Keith Whitwell23caf202000-11-16 21:05:34 +00001913 if (drawBuffer && readBuffer) {
1914 /* TODO: check if newCtx and buffer's visual match??? */
1915 newCtx->DrawBuffer = drawBuffer;
1916 newCtx->ReadBuffer = readBuffer;
1917 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul08836342001-03-03 20:33:27 +00001918 /* _mesa_update_state( newCtx ); */
Brian Paul00037781999-12-17 14:52:35 +00001919 }
Keith Whitwell23caf202000-11-16 21:05:34 +00001920
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001921 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00001922 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
1923
1924 /* We can use this to help debug user's problems. Tell them to set
1925 * the MESA_INFO env variable before running their app. Then the
1926 * first time each context is made current we'll print some useful
1927 * information.
1928 */
1929 if (newCtx->FirstTimeCurrent) {
1930 if (getenv("MESA_INFO")) {
1931 print_info();
1932 }
1933 newCtx->FirstTimeCurrent = GL_FALSE;
1934 }
Brian Paul00037781999-12-17 14:52:35 +00001935 }
1936}
1937
1938
1939
1940/*
1941 * Return current context handle for the calling thread.
1942 * This isn't the fastest way to get the current context.
1943 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
1944 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001945GLcontext *
1946_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00001947{
Brian Paulf9b97d92000-01-28 20:17:42 +00001948 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001949}
1950
1951
1952
1953/*
Brian Paulfbd8f211999-11-11 01:22:25 +00001954 * This should be called by device drivers just before they do a
1955 * swapbuffers. Any pending rendering commands will be executed.
jtgafb833d1999-08-19 00:55:39 +00001956 */
Brian Paulfbd8f211999-11-11 01:22:25 +00001957void
1958_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00001959{
Keith Whitwellcab974c2000-12-26 05:09:27 +00001960 FLUSH_VERTICES( ctx, 0 );
jtgafb833d1999-08-19 00:55:39 +00001961}
1962
1963
Brian Paul00037781999-12-17 14:52:35 +00001964
Brian Paulfbd8f211999-11-11 01:22:25 +00001965/*
1966 * Return pointer to this context's current API dispatch table.
1967 * It'll either be the immediate-mode execute dispatcher or the
1968 * display list compile dispatcher.
1969 */
1970struct _glapi_table *
1971_mesa_get_dispatch(GLcontext *ctx)
1972{
1973 return ctx->CurrentDispatch;
1974}
1975
1976
1977
jtgafb833d1999-08-19 00:55:39 +00001978/**********************************************************************/
1979/***** Miscellaneous functions *****/
1980/**********************************************************************/
1981
1982
1983/*
1984 * This function is called when the Mesa user has stumbled into a code
1985 * path which may not be implemented fully or correctly.
1986 */
Brian Paul08836342001-03-03 20:33:27 +00001987void _mesa_problem( const GLcontext *ctx, const char *s )
jtgafb833d1999-08-19 00:55:39 +00001988{
1989 fprintf( stderr, "Mesa implementation error: %s\n", s );
Brian Paulbb0830d2001-04-04 13:38:51 +00001990#ifdef XF86DRI
1991 fprintf( stderr, "Please report to the DRI bug database at dri.sourceforge.net\n");
1992#else
1993 fprintf( stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
1994#endif
jtgafb833d1999-08-19 00:55:39 +00001995 (void) ctx;
1996}
1997
1998
1999
2000/*
2001 * This is called to inform the user that he or she has tried to do
2002 * something illogical or if there's likely a bug in their program
2003 * (like enabled depth testing without a depth buffer).
2004 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002005void
2006_mesa_warning( const GLcontext *ctx, const char *s )
jtgafb833d1999-08-19 00:55:39 +00002007{
Brian Paulb1394fa2000-09-26 20:53:53 +00002008 (*ctx->imports.warning)((__GLcontext *) ctx, (char *) s);
jtgafb833d1999-08-19 00:55:39 +00002009}
2010
2011
2012
Brian Paulfa9df402000-02-02 19:16:46 +00002013/*
jtgafb833d1999-08-19 00:55:39 +00002014 * This is Mesa's error handler. Normally, all that's done is the updating
2015 * of the current error value. If Mesa is compiled with -DDEBUG or if the
2016 * environment variable "MESA_DEBUG" is defined then a real error message
2017 * is printed to stderr.
Brian Paul7eb06032000-07-14 04:13:40 +00002018 * Input: ctx - the GL context
2019 * error - the error value
2020 * where - usually the name of function where error was detected
jtgafb833d1999-08-19 00:55:39 +00002021 */
Brian Paul7eb06032000-07-14 04:13:40 +00002022void
Brian Paul08836342001-03-03 20:33:27 +00002023_mesa_error( GLcontext *ctx, GLenum error, const char *where )
jtgafb833d1999-08-19 00:55:39 +00002024{
Brian Paul7eb06032000-07-14 04:13:40 +00002025 const char *debugEnv = getenv("MESA_DEBUG");
jtgafb833d1999-08-19 00:55:39 +00002026 GLboolean debug;
2027
2028#ifdef DEBUG
Brian Paul7eb06032000-07-14 04:13:40 +00002029 if (debugEnv && strstr(debugEnv, "silent"))
jtgafb833d1999-08-19 00:55:39 +00002030 debug = GL_FALSE;
Brian Paul7eb06032000-07-14 04:13:40 +00002031 else
2032 debug = GL_TRUE;
2033#else
2034 if (debugEnv)
2035 debug = GL_TRUE;
2036 else
2037 debug = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00002038#endif
2039
2040 if (debug) {
Brian Paul7eb06032000-07-14 04:13:40 +00002041 const char *errstr;
jtgafb833d1999-08-19 00:55:39 +00002042 switch (error) {
2043 case GL_NO_ERROR:
Brian Paul7eb06032000-07-14 04:13:40 +00002044 errstr = "GL_NO_ERROR";
jtgafb833d1999-08-19 00:55:39 +00002045 break;
2046 case GL_INVALID_VALUE:
Brian Paul7eb06032000-07-14 04:13:40 +00002047 errstr = "GL_INVALID_VALUE";
jtgafb833d1999-08-19 00:55:39 +00002048 break;
2049 case GL_INVALID_ENUM:
Brian Paul7eb06032000-07-14 04:13:40 +00002050 errstr = "GL_INVALID_ENUM";
jtgafb833d1999-08-19 00:55:39 +00002051 break;
2052 case GL_INVALID_OPERATION:
Brian Paul7eb06032000-07-14 04:13:40 +00002053 errstr = "GL_INVALID_OPERATION";
jtgafb833d1999-08-19 00:55:39 +00002054 break;
2055 case GL_STACK_OVERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002056 errstr = "GL_STACK_OVERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002057 break;
2058 case GL_STACK_UNDERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002059 errstr = "GL_STACK_UNDERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002060 break;
2061 case GL_OUT_OF_MEMORY:
Brian Paul7eb06032000-07-14 04:13:40 +00002062 errstr = "GL_OUT_OF_MEMORY";
jtgafb833d1999-08-19 00:55:39 +00002063 break;
Brian Paul86586aa2000-06-29 18:55:52 +00002064 case GL_TABLE_TOO_LARGE:
Brian Paul7eb06032000-07-14 04:13:40 +00002065 errstr = "GL_TABLE_TOO_LARGE";
Brian Paul86586aa2000-06-29 18:55:52 +00002066 break;
jtgafb833d1999-08-19 00:55:39 +00002067 default:
Brian Paul7eb06032000-07-14 04:13:40 +00002068 errstr = "unknown";
jtgafb833d1999-08-19 00:55:39 +00002069 break;
2070 }
Brian Paul7eb06032000-07-14 04:13:40 +00002071 fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where);
jtgafb833d1999-08-19 00:55:39 +00002072 }
2073
Brian Paul7eb06032000-07-14 04:13:40 +00002074 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002075 ctx->ErrorValue = error;
2076 }
2077
2078 /* Call device driver's error handler, if any. This is used on the Mac. */
2079 if (ctx->Driver.Error) {
2080 (*ctx->Driver.Error)( ctx );
2081 }
2082}
2083
2084
2085
Brian Paulfa9df402000-02-02 19:16:46 +00002086void
2087_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002088{
Brian Paulfa9df402000-02-02 19:16:46 +00002089 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002090 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002091 if (ctx->Driver.Finish) {
2092 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002093 }
2094}
2095
2096
2097
Brian Paulfa9df402000-02-02 19:16:46 +00002098void
2099_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002100{
Brian Paulfa9df402000-02-02 19:16:46 +00002101 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002102 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002103 if (ctx->Driver.Flush) {
2104 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002105 }
jtgafb833d1999-08-19 00:55:39 +00002106}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002107
2108
2109
Keith Whitwellcab974c2000-12-26 05:09:27 +00002110const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002111 "GL_POINTS",
2112 "GL_LINES",
2113 "GL_LINE_LOOP",
2114 "GL_LINE_STRIP",
2115 "GL_TRIANGLES",
2116 "GL_TRIANGLE_STRIP",
2117 "GL_TRIANGLE_FAN",
2118 "GL_QUADS",
2119 "GL_QUAD_STRIP",
2120 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002121 "outside begin/end",
2122 "inside unkown primitive",
2123 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002124};