blob: e94e399a88f88dcb65fec3ecc9af5df52d5349eb [file] [log] [blame]
Brian Paul23316032000-09-14 23:13:23 +00001/* $Id: context.c,v 1.86 2000/09/14 23:13:23 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paule4b684c2000-09-12 21:07:40 +00005 * Version: 3.5
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paul54287052000-01-17 20:00:15 +00007 * Copyright (C) 1999-2000 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"
jtgafb833d1999-08-19 00:55:39 +000032#include "accum.h"
33#include "alphabuf.h"
jtgafb833d1999-08-19 00:55:39 +000034#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000035#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000036#include "context.h"
37#include "cva.h"
38#include "depth.h"
39#include "dlist.h"
40#include "eval.h"
41#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000042#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000044#include "get.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000045#include "glapi.h"
Brian Paulf9b97d92000-01-28 20:17:42 +000046#include "glapinoop.h"
Brian Paul9560f052000-01-31 23:11:39 +000047#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000048#include "hash.h"
49#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000050#include "macros.h"
51#include "matrix.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000052#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000053#include "mmath.h"
54#include "pb.h"
55#include "pipeline.h"
jtgafb833d1999-08-19 00:55:39 +000056#include "shade.h"
57#include "simple_list.h"
58#include "stencil.h"
59#include "stages.h"
Brian Paulfa9df402000-02-02 19:16:46 +000060#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000061#include "translate.h"
62#include "teximage.h"
63#include "texobj.h"
64#include "texstate.h"
65#include "texture.h"
66#include "types.h"
67#include "varray.h"
68#include "vb.h"
69#include "vbcull.h"
jtgafb833d1999-08-19 00:55:39 +000070#include "vbrender.h"
71#include "vbxform.h"
Keith Whitwell38756791999-08-29 10:26:31 +000072#include "vertices.h"
jtgafb833d1999-08-19 00:55:39 +000073#include "xform.h"
jtgafb833d1999-08-19 00:55:39 +000074#endif
75
76
Brian Paul45f36342000-09-05 20:28:06 +000077#if defined(TRACE)
78#include "Trace/tr_context.h"
79#include "Trace/tr_wrapper.h"
80#endif
81
jtgafb833d1999-08-19 00:55:39 +000082
83/**********************************************************************/
84/***** Context and Thread management *****/
85/**********************************************************************/
86
87
Brian Paul00037781999-12-17 14:52:35 +000088#if !defined(THREADS)
jtgafb833d1999-08-19 00:55:39 +000089
Brian Paul5666c632000-01-18 17:36:16 +000090struct immediate *_mesa_CurrentInput = NULL;
jtgafb833d1999-08-19 00:55:39 +000091
Brian Paul00037781999-12-17 14:52:35 +000092#endif
jtgafb833d1999-08-19 00:55:39 +000093
94
jtgafb833d1999-08-19 00:55:39 +000095/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +000096/***** GL Visual allocation/destruction *****/
97/**********************************************************************/
98
99
100/*
101 * Allocate a new GLvisual object.
102 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000103 * dbFlag - double buffering?
104 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000105 * depthBits - requested bits per depth buffer value
106 * Any value in [0, 32] is acceptable but the actual
107 * depth type will be GLushort or GLuint as needed.
108 * stencilBits - requested minimum bits per stencil buffer value
109 * accumBits - requested minimum bits per accum buffer component
110 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
111 * red/green/blue/alphaBits - number of bits per color component
112 * in frame buffer for RGB(A) mode.
113 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000114 * Return: pointer to new GLvisual or NULL if requested parameters can't
115 * be met.
116 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000117GLvisual *
118_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000119 GLboolean dbFlag,
120 GLboolean stereoFlag,
121 GLint redBits,
122 GLint greenBits,
123 GLint blueBits,
124 GLint alphaBits,
125 GLint indexBits,
126 GLint depthBits,
127 GLint stencilBits,
128 GLint accumRedBits,
129 GLint accumGreenBits,
130 GLint accumBlueBits,
131 GLint accumAlphaBits,
132 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000133{
Brian Paul178a1c52000-04-22 01:05:00 +0000134 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
135 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000136 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000137 redBits, greenBits, blueBits, alphaBits,
138 indexBits, depthBits, stencilBits,
139 accumRedBits, accumGreenBits,
140 accumBlueBits, accumAlphaBits,
141 numSamples )) {
142 FREE(vis);
143 return NULL;
144 }
145 }
146 return vis;
147}
148
149
150/*
151 * Initialize the fields of the given GLvisual.
152 * Input: see _mesa_create_visual() above.
153 * Return: GL_TRUE = success
154 * GL_FALSE = failure.
155 */
156GLboolean
157_mesa_initialize_visual( GLvisual *vis,
158 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000159 GLboolean dbFlag,
160 GLboolean stereoFlag,
161 GLint redBits,
162 GLint greenBits,
163 GLint blueBits,
164 GLint alphaBits,
165 GLint indexBits,
166 GLint depthBits,
167 GLint stencilBits,
168 GLint accumRedBits,
169 GLint accumGreenBits,
170 GLint accumBlueBits,
171 GLint accumAlphaBits,
172 GLint numSamples )
173{
174 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000175
Brian Pauled30dfa2000-03-03 17:47:39 +0000176 /* This is to catch bad values from device drivers not updated for
177 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
178 * bad value now (a 1-bit depth buffer!?!).
179 */
180 assert(depthBits == 0 || depthBits > 1);
181
182 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000183 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000184 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000185 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000186 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000187 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000188 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000189 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000190 }
191 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000192 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000193 }
194 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000195 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000196 }
197 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000198 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000199 }
200
201 vis->RGBAflag = rgbFlag;
202 vis->DBflag = dbFlag;
203 vis->StereoFlag = stereoFlag;
204 vis->RedBits = redBits;
205 vis->GreenBits = greenBits;
206 vis->BlueBits = blueBits;
Brian Paule70c6232000-05-04 13:53:55 +0000207 vis->AlphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000208
Brian Paulb371e0d2000-03-31 01:05:51 +0000209 vis->IndexBits = indexBits;
210 vis->DepthBits = depthBits;
211 vis->AccumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
212 vis->AccumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
213 vis->AccumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
214 vis->AccumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
215 vis->StencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Paul4d053dd2000-01-14 04:45:47 +0000216
Brian Pauled30dfa2000-03-03 17:47:39 +0000217 if (depthBits == 0) {
218 /* Special case. Even if we don't have a depth buffer we need
219 * good values for DepthMax for Z vertex transformation purposes.
220 */
221 vis->DepthMax = 1;
222 vis->DepthMaxF = 1.0F;
223 }
Brian Paul3a94f5c2000-05-18 18:12:36 +0000224 else if (depthBits < 32) {
Brian Pauled30dfa2000-03-03 17:47:39 +0000225 vis->DepthMax = (1 << depthBits) - 1;
226 vis->DepthMaxF = (GLfloat) vis->DepthMax;
227 }
Brian Paul3a94f5c2000-05-18 18:12:36 +0000228 else {
229 /* Special case since shift values greater than or equal to the
230 * number of bits in the left hand expression's type are
231 * undefined.
232 */
233 vis->DepthMax = 0xffffffff;
234 vis->DepthMaxF = (GLfloat) vis->DepthMax;
235 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000236
Brian Paul178a1c52000-04-22 01:05:00 +0000237 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000238}
239
240
Brian Paulb371e0d2000-03-31 01:05:51 +0000241/* This function should no longer be used. Use _mesa_create_visual() instead */
Brian Paul178a1c52000-04-22 01:05:00 +0000242GLvisual *
243gl_create_visual( GLboolean rgbFlag,
244 GLboolean alphaFlag,
245 GLboolean dbFlag,
246 GLboolean stereoFlag,
247 GLint depthBits,
248 GLint stencilBits,
249 GLint accumBits,
250 GLint indexBits,
251 GLint redBits,
252 GLint greenBits,
253 GLint blueBits,
254 GLint alphaBits )
Brian Paulb371e0d2000-03-31 01:05:51 +0000255{
Brian Paule70c6232000-05-04 13:53:55 +0000256 (void) alphaFlag;
257 return _mesa_create_visual(rgbFlag, dbFlag, stereoFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000258 redBits, greenBits, blueBits, alphaBits,
259 indexBits, depthBits, stencilBits,
260 accumBits, accumBits, accumBits, accumBits, 0);
261}
Brian Paul4d053dd2000-01-14 04:45:47 +0000262
Brian Paulb371e0d2000-03-31 01:05:51 +0000263
264void
265_mesa_destroy_visual( GLvisual *vis )
266{
267 FREE(vis);
268}
269
270
271/* obsolete */
Brian Paul178a1c52000-04-22 01:05:00 +0000272void
273gl_destroy_visual( GLvisual *vis )
Brian Paul4d053dd2000-01-14 04:45:47 +0000274{
Brian Paulb371e0d2000-03-31 01:05:51 +0000275 _mesa_destroy_visual(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000276}
277
278
279
280/**********************************************************************/
281/***** GL Framebuffer allocation/destruction *****/
282/**********************************************************************/
283
284
285/*
286 * Create a new framebuffer. A GLframebuffer is a struct which
287 * encapsulates the depth, stencil and accum buffers and related
288 * parameters.
289 * Input: visual - a GLvisual pointer
290 * softwareDepth - create/use a software depth buffer?
291 * softwareStencil - create/use a software stencil buffer?
292 * softwareAccum - create/use a software accum buffer?
293 * softwareAlpha - create/use a software alpha buffer?
294
295 * Return: pointer to new GLframebuffer struct or NULL if error.
296 */
Brian Paul178a1c52000-04-22 01:05:00 +0000297GLframebuffer *
298gl_create_framebuffer( GLvisual *visual,
299 GLboolean softwareDepth,
300 GLboolean softwareStencil,
301 GLboolean softwareAccum,
302 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000303{
Brian Paul178a1c52000-04-22 01:05:00 +0000304 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
305 assert(visual);
306 if (buffer) {
307 _mesa_initialize_framebuffer(buffer, visual,
308 softwareDepth, softwareStencil,
309 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000310 }
Brian Paul178a1c52000-04-22 01:05:00 +0000311 return buffer;
312}
313
314
315/*
316 * Initialize a GLframebuffer object.
317 * Input: See gl_create_framebuffer() above.
318 */
319void
320_mesa_initialize_framebuffer( GLframebuffer *buffer,
321 GLvisual *visual,
322 GLboolean softwareDepth,
323 GLboolean softwareStencil,
324 GLboolean softwareAccum,
325 GLboolean softwareAlpha )
326{
327 assert(buffer);
328 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000329
330 /* sanity checks */
331 if (softwareDepth ) {
332 assert(visual->DepthBits > 0);
333 }
334 if (softwareStencil) {
335 assert(visual->StencilBits > 0);
336 }
337 if (softwareAccum) {
338 assert(visual->RGBAflag);
Brian Paulb371e0d2000-03-31 01:05:51 +0000339 assert(visual->AccumRedBits > 0);
340 assert(visual->AccumGreenBits > 0);
341 assert(visual->AccumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000342 }
343 if (softwareAlpha) {
344 assert(visual->RGBAflag);
345 assert(visual->AlphaBits > 0);
346 }
347
348 buffer->Visual = visual;
349 buffer->UseSoftwareDepthBuffer = softwareDepth;
350 buffer->UseSoftwareStencilBuffer = softwareStencil;
351 buffer->UseSoftwareAccumBuffer = softwareAccum;
352 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000353}
354
355
Brian Paul4d053dd2000-01-14 04:45:47 +0000356/*
357 * Free a framebuffer struct and its buffers.
358 */
Brian Paul178a1c52000-04-22 01:05:00 +0000359void
360gl_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000361{
362 if (buffer) {
Brian Paul650cb742000-03-17 15:31:52 +0000363 if (buffer->DepthBuffer) {
364 FREE( buffer->DepthBuffer );
Brian Paul4d053dd2000-01-14 04:45:47 +0000365 }
366 if (buffer->Accum) {
367 FREE( buffer->Accum );
368 }
369 if (buffer->Stencil) {
370 FREE( buffer->Stencil );
371 }
372 if (buffer->FrontLeftAlpha) {
373 FREE( buffer->FrontLeftAlpha );
374 }
375 if (buffer->BackLeftAlpha) {
376 FREE( buffer->BackLeftAlpha );
377 }
378 if (buffer->FrontRightAlpha) {
379 FREE( buffer->FrontRightAlpha );
380 }
381 if (buffer->BackRightAlpha) {
382 FREE( buffer->BackRightAlpha );
383 }
384 FREE(buffer);
385 }
386}
387
388
389
390/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000391/***** Context allocation, initialization, destroying *****/
392/**********************************************************************/
393
394
Brian Paul9560f052000-01-31 23:11:39 +0000395_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
396
397
jtgafb833d1999-08-19 00:55:39 +0000398/*
399 * This function just calls all the various one-time-init functions in Mesa.
400 */
Brian Paul178a1c52000-04-22 01:05:00 +0000401static void
402one_time_init( void )
jtgafb833d1999-08-19 00:55:39 +0000403{
404 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000405 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000406 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000407 /* do some implementation tests */
408 assert( sizeof(GLbyte) == 1 );
409 assert( sizeof(GLshort) >= 2 );
410 assert( sizeof(GLint) >= 4 );
411 assert( sizeof(GLubyte) == 1 );
412 assert( sizeof(GLushort) >= 2 );
413 assert( sizeof(GLuint) >= 4 );
414
jtgafb833d1999-08-19 00:55:39 +0000415 gl_init_clip();
416 gl_init_eval();
Brian Paul5829f0c2000-02-02 22:21:39 +0000417 _mesa_init_fog();
Brian Paul780c4e02000-03-22 23:20:12 +0000418 _mesa_init_math();
jtgafb833d1999-08-19 00:55:39 +0000419 gl_init_lists();
420 gl_init_shade();
421 gl_init_texture();
422 gl_init_transformation();
423 gl_init_translate();
424 gl_init_vbrender();
425 gl_init_vbxform();
Keith Whitwell38756791999-08-29 10:26:31 +0000426 gl_init_vertices();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000427
428 if (getenv("MESA_DEBUG")) {
429 _glapi_noop_enable_warnings(GL_TRUE);
430 }
431 else {
432 _glapi_noop_enable_warnings(GL_FALSE);
433 }
434
jtgafb833d1999-08-19 00:55:39 +0000435#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
436 fprintf(stderr, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
437#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000438
439 alreadyCalled = GL_TRUE;
440 }
Brian Paul9560f052000-01-31 23:11:39 +0000441 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000442}
443
444
Brian Paul4d053dd2000-01-14 04:45:47 +0000445
jtgafb833d1999-08-19 00:55:39 +0000446/*
447 * Allocate and initialize a shared context state structure.
448 */
Brian Paul178a1c52000-04-22 01:05:00 +0000449static struct gl_shared_state *
450alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000451{
Brian Paul6e6d4c61999-10-09 20:17:07 +0000452 GLuint d;
jtgafb833d1999-08-19 00:55:39 +0000453 struct gl_shared_state *ss;
454 GLboolean outOfMemory;
455
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000456 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000457 if (!ss)
458 return NULL;
459
Brian Paule4b684c2000-09-12 21:07:40 +0000460 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000461
Brian Paule4b684c2000-09-12 21:07:40 +0000462 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000463 ss->TexObjects = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000464
465 /* Default Texture objects */
466 outOfMemory = GL_FALSE;
Brian Paul6e6d4c61999-10-09 20:17:07 +0000467 for (d = 1 ; d <= 3 ; d++) {
468 ss->DefaultD[d] = gl_alloc_texture_object(ss, 0, d);
469 if (!ss->DefaultD[d]) {
470 outOfMemory = GL_TRUE;
471 break;
jtgafb833d1999-08-19 00:55:39 +0000472 }
Brian Paul6e6d4c61999-10-09 20:17:07 +0000473 ss->DefaultD[d]->RefCount++; /* don't free if not in use */
jtgafb833d1999-08-19 00:55:39 +0000474 }
475
Brian Paul413d6a22000-05-26 14:44:59 +0000476 ss->DefaultCubeMap = gl_alloc_texture_object(ss, 0, 6);
477 if (!ss->DefaultCubeMap) {
478 outOfMemory = GL_TRUE;
479 }
480 else {
481 ss->DefaultCubeMap->RefCount++;
482 }
483
jtgafb833d1999-08-19 00:55:39 +0000484 if (!ss->DisplayList || !ss->TexObjects || outOfMemory) {
485 /* Ran out of memory at some point. Free everything and return NULL */
486 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000487 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000488 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000489 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul6e6d4c61999-10-09 20:17:07 +0000490 if (ss->DefaultD[1])
491 gl_free_texture_object(ss, ss->DefaultD[1]);
492 if (ss->DefaultD[2])
493 gl_free_texture_object(ss, ss->DefaultD[2]);
494 if (ss->DefaultD[3])
495 gl_free_texture_object(ss, ss->DefaultD[3]);
Brian Paul413d6a22000-05-26 14:44:59 +0000496 if (ss->DefaultCubeMap)
497 gl_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000498 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000499 return NULL;
500 }
501 else {
502 return ss;
503 }
504}
505
506
507/*
508 * Deallocate a shared state context and all children structures.
509 */
Brian Paul178a1c52000-04-22 01:05:00 +0000510static void
511free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000512{
513 /* Free display lists */
514 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000515 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000516 if (list) {
517 gl_destroy_list(ctx, list);
518 }
519 else {
520 break;
521 }
522 }
Brian Paulbb797902000-01-24 16:19:54 +0000523 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000524
525 /* Free texture objects */
526 while (ss->TexObjectList)
527 {
528 if (ctx->Driver.DeleteTexture)
529 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
530 /* this function removes from linked list too! */
531 gl_free_texture_object(ss, ss->TexObjectList);
532 }
Brian Paulbb797902000-01-24 16:19:54 +0000533 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000534
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000535 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000536}
537
538
539
jtgafb833d1999-08-19 00:55:39 +0000540/*
541 * Initialize the nth light. Note that the defaults for light 0 are
542 * different than the other lights.
543 */
Brian Paul178a1c52000-04-22 01:05:00 +0000544static void
545init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000546{
547 make_empty_list( l );
548
549 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
550 if (n==0) {
551 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
552 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
553 }
554 else {
555 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
556 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
557 }
558 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
559 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
560 l->SpotExponent = 0.0;
561 gl_compute_spot_exp_table( l );
562 l->SpotCutoff = 180.0;
563 l->CosCutoff = 0.0; /* KW: -ve values not admitted */
564 l->ConstantAttenuation = 1.0;
565 l->LinearAttenuation = 0.0;
566 l->QuadraticAttenuation = 0.0;
567 l->Enabled = GL_FALSE;
568}
569
570
571
Brian Paul178a1c52000-04-22 01:05:00 +0000572static void
573init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000574{
575 ASSIGN_4V( lm->Ambient, 0.2, 0.2, 0.2, 1.0 );
576 lm->LocalViewer = GL_FALSE;
577 lm->TwoSide = GL_FALSE;
578 lm->ColorControl = GL_SINGLE_COLOR;
579}
580
581
Brian Paul178a1c52000-04-22 01:05:00 +0000582static void
583init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000584{
585 ASSIGN_4V( m->Ambient, 0.2, 0.2, 0.2, 1.0 );
586 ASSIGN_4V( m->Diffuse, 0.8, 0.8, 0.8, 1.0 );
587 ASSIGN_4V( m->Specular, 0.0, 0.0, 0.0, 1.0 );
588 ASSIGN_4V( m->Emission, 0.0, 0.0, 0.0, 1.0 );
589 m->Shininess = 0.0;
590 m->AmbientIndex = 0;
591 m->DiffuseIndex = 1;
592 m->SpecularIndex = 1;
593}
594
595
596
Brian Paul178a1c52000-04-22 01:05:00 +0000597static void
598init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000599{
600 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
601
602 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000603 texUnit->CombineModeRGB = GL_MODULATE;
604 texUnit->CombineModeA = GL_MODULATE;
605 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
606 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
607 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
608 texUnit->CombineSourceA[0] = GL_TEXTURE;
609 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
610 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
611 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
612 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
613 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
614 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
615 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
616 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
617 texUnit->CombineScaleShiftRGB = 0;
618 texUnit->CombineScaleShiftA = 0;
619
jtgafb833d1999-08-19 00:55:39 +0000620 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
621 texUnit->TexGenEnabled = 0;
622 texUnit->GenModeS = GL_EYE_LINEAR;
623 texUnit->GenModeT = GL_EYE_LINEAR;
624 texUnit->GenModeR = GL_EYE_LINEAR;
625 texUnit->GenModeQ = GL_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000626 texUnit->GenBitS = TEXGEN_EYE_LINEAR;
627 texUnit->GenBitT = TEXGEN_EYE_LINEAR;
628 texUnit->GenBitR = TEXGEN_EYE_LINEAR;
629 texUnit->GenBitQ = TEXGEN_EYE_LINEAR;
630
jtgafb833d1999-08-19 00:55:39 +0000631 /* Yes, these plane coefficients are correct! */
632 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
633 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
634 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
635 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
636 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
637 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
638 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
639 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
640
Brian Paul6e6d4c61999-10-09 20:17:07 +0000641 texUnit->CurrentD[1] = ctx->Shared->DefaultD[1];
642 texUnit->CurrentD[2] = ctx->Shared->DefaultD[2];
643 texUnit->CurrentD[3] = ctx->Shared->DefaultD[3];
Brian Paul413d6a22000-05-26 14:44:59 +0000644 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
jtgafb833d1999-08-19 00:55:39 +0000645}
646
647
Brian Paul178a1c52000-04-22 01:05:00 +0000648static void
649init_fallback_arrays( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000650{
651 struct gl_client_array *cl;
652 GLuint i;
653
654 cl = &ctx->Fallback.Normal;
655 cl->Size = 3;
656 cl->Type = GL_FLOAT;
657 cl->Stride = 0;
658 cl->StrideB = 0;
659 cl->Ptr = (void *) ctx->Current.Normal;
660 cl->Enabled = 1;
661
662 cl = &ctx->Fallback.Color;
663 cl->Size = 4;
664 cl->Type = GL_UNSIGNED_BYTE;
665 cl->Stride = 0;
666 cl->StrideB = 0;
667 cl->Ptr = (void *) ctx->Current.ByteColor;
668 cl->Enabled = 1;
669
670 cl = &ctx->Fallback.Index;
671 cl->Size = 1;
672 cl->Type = GL_UNSIGNED_INT;
673 cl->Stride = 0;
674 cl->StrideB = 0;
675 cl->Ptr = (void *) &ctx->Current.Index;
676 cl->Enabled = 1;
677
678 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
679 cl = &ctx->Fallback.TexCoord[i];
680 cl->Size = 4;
681 cl->Type = GL_FLOAT;
682 cl->Stride = 0;
683 cl->StrideB = 0;
684 cl->Ptr = (void *) ctx->Current.Texcoord[i];
685 cl->Enabled = 1;
686 }
687
688 cl = &ctx->Fallback.EdgeFlag;
689 cl->Size = 1;
690 cl->Type = GL_UNSIGNED_BYTE;
691 cl->Stride = 0;
692 cl->StrideB = 0;
693 cl->Ptr = (void *) &ctx->Current.EdgeFlag;
694 cl->Enabled = 1;
695}
696
Brian Paul4d053dd2000-01-14 04:45:47 +0000697
jtgafb833d1999-08-19 00:55:39 +0000698/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000699static void
700init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000701{
702 map->Order = 1;
703 map->u1 = 0.0;
704 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000705 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000706 if (map->Points) {
707 GLint i;
708 for (i=0;i<n;i++)
709 map->Points[i] = initial[i];
710 }
jtgafb833d1999-08-19 00:55:39 +0000711}
712
713
714/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000715static void
716init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000717{
718 map->Uorder = 1;
719 map->Vorder = 1;
720 map->u1 = 0.0;
721 map->u2 = 1.0;
722 map->v1 = 0.0;
723 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000724 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000725 if (map->Points) {
726 GLint i;
727 for (i=0;i<n;i++)
728 map->Points[i] = initial[i];
729 }
jtgafb833d1999-08-19 00:55:39 +0000730}
731
732
jtgafb833d1999-08-19 00:55:39 +0000733/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000734 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000735 */
Brian Paul178a1c52000-04-22 01:05:00 +0000736static void
737init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000738{
739 GLuint i, j;
740
Brian Paul4d053dd2000-01-14 04:45:47 +0000741 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000742
Brian Paul539cce52000-02-03 19:40:07 +0000743 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000744 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
745 ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
Brian Paul86fc3702000-05-22 16:33:20 +0000746 ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize;
Brian Paul4d053dd2000-01-14 04:45:47 +0000747 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
748 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000749 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
750 ctx->Const.MinPointSize = MIN_POINT_SIZE;
751 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
752 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
753 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
754 ctx->Const.PointSizeGranularity = POINT_SIZE_GRANULARITY;
755 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
756 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
757 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
758 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
759 ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
760 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000761 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000762 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
763 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000764 ctx->Const.NumCompressedTextureFormats = 0;
jtgafb833d1999-08-19 00:55:39 +0000765
Brian Paul4d053dd2000-01-14 04:45:47 +0000766 /* Modelview matrix */
767 gl_matrix_ctr( &ctx->ModelView );
768 gl_matrix_alloc_inv( &ctx->ModelView );
769
770 ctx->ModelViewStackDepth = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000771 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000772 gl_matrix_ctr( &ctx->ModelViewStack[i] );
773 gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
774 }
775
776 /* Projection matrix - need inv for user clipping in clip space*/
777 gl_matrix_ctr( &ctx->ProjectionMatrix );
778 gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
779
780 gl_matrix_ctr( &ctx->ModelProjectMatrix );
781 gl_matrix_ctr( &ctx->ModelProjectWinMatrix );
782 ctx->ModelProjectWinMatrixUptodate = GL_FALSE;
783
784 ctx->ProjectionStackDepth = 0;
785 ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
786 ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
787
Brian Paul7fc29c52000-03-06 17:03:03 +0000788 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000789 gl_matrix_ctr( &ctx->ProjectionStack[i] );
790 gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
791 }
792
793 /* Texture matrix */
Brian Paul904ecb22000-06-27 23:38:45 +0000794 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000795 gl_matrix_ctr( &ctx->TextureMatrix[i] );
796 ctx->TextureStackDepth[i] = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000797 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
Brian Paul904ecb22000-06-27 23:38:45 +0000798 gl_matrix_ctr( &ctx->TextureStack[i][j] );
Brian Paul4d053dd2000-01-14 04:45:47 +0000799 ctx->TextureStack[i][j].inv = 0;
jtgafb833d1999-08-19 00:55:39 +0000800 }
Brian Paul4d053dd2000-01-14 04:45:47 +0000801 }
jtgafb833d1999-08-19 00:55:39 +0000802
Brian Paul250069d2000-04-08 18:57:45 +0000803 /* Color matrix */
804 gl_matrix_ctr(&ctx->ColorMatrix);
805 ctx->ColorStackDepth = 0;
806 for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
807 gl_matrix_ctr(&ctx->ColorStack[j]);
808 }
809
Brian Paul4d053dd2000-01-14 04:45:47 +0000810 /* Accumulate buffer group */
811 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000812
Brian Paul4d053dd2000-01-14 04:45:47 +0000813 /* Color buffer group */
814 ctx->Color.IndexMask = 0xffffffff;
815 ctx->Color.ColorMask[0] = 0xff;
816 ctx->Color.ColorMask[1] = 0xff;
817 ctx->Color.ColorMask[2] = 0xff;
818 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000819 ctx->Color.ClearIndex = 0;
820 ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
821 ctx->Color.DrawBuffer = GL_FRONT;
822 ctx->Color.AlphaEnabled = GL_FALSE;
823 ctx->Color.AlphaFunc = GL_ALWAYS;
824 ctx->Color.AlphaRef = 0;
825 ctx->Color.BlendEnabled = GL_FALSE;
826 ctx->Color.BlendSrcRGB = GL_ONE;
827 ctx->Color.BlendDstRGB = GL_ZERO;
828 ctx->Color.BlendSrcA = GL_ONE;
829 ctx->Color.BlendDstA = GL_ZERO;
830 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
831 ctx->Color.BlendFunc = NULL; /* this pointer set only when needed */
832 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
833 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
834 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000835 ctx->Color.LogicOp = GL_COPY;
836 ctx->Color.DitherFlag = GL_TRUE;
837 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000838
Brian Paul4d053dd2000-01-14 04:45:47 +0000839 /* Current group */
840 ASSIGN_4V( ctx->Current.ByteColor, 255, 255, 255, 255);
841 ctx->Current.Index = 1;
842 for (i=0; i<MAX_TEXTURE_UNITS; i++)
843 ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
844 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
845 ctx->Current.RasterDistance = 0.0;
846 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
847 ctx->Current.RasterIndex = 1;
848 for (i=0; i<MAX_TEXTURE_UNITS; i++)
849 ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
850 ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
851 ctx->Current.RasterPosValid = GL_TRUE;
852 ctx->Current.EdgeFlag = GL_TRUE;
853 ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
854 ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
jtgafb833d1999-08-19 00:55:39 +0000855
Brian Paul4d053dd2000-01-14 04:45:47 +0000856 ctx->Current.Flag = (VERT_NORM|VERT_INDEX|VERT_RGBA|VERT_EDGE|
857 VERT_TEX0_1|VERT_TEX1_1|VERT_MATERIAL);
jtgafb833d1999-08-19 00:55:39 +0000858
Brian Paul4d053dd2000-01-14 04:45:47 +0000859 init_fallback_arrays( ctx );
jtgafb833d1999-08-19 00:55:39 +0000860
Brian Paul4d053dd2000-01-14 04:45:47 +0000861 /* Depth buffer group */
862 ctx->Depth.Test = GL_FALSE;
863 ctx->Depth.Clear = 1.0;
864 ctx->Depth.Func = GL_LESS;
865 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000866 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000867
Brian Paul4d053dd2000-01-14 04:45:47 +0000868 /* Evaluators group */
869 ctx->Eval.Map1Color4 = GL_FALSE;
870 ctx->Eval.Map1Index = GL_FALSE;
871 ctx->Eval.Map1Normal = GL_FALSE;
872 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
873 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
874 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
875 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
876 ctx->Eval.Map1Vertex3 = GL_FALSE;
877 ctx->Eval.Map1Vertex4 = GL_FALSE;
878 ctx->Eval.Map2Color4 = GL_FALSE;
879 ctx->Eval.Map2Index = GL_FALSE;
880 ctx->Eval.Map2Normal = GL_FALSE;
881 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
882 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
883 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
884 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
885 ctx->Eval.Map2Vertex3 = GL_FALSE;
886 ctx->Eval.Map2Vertex4 = GL_FALSE;
887 ctx->Eval.AutoNormal = GL_FALSE;
888 ctx->Eval.MapGrid1un = 1;
889 ctx->Eval.MapGrid1u1 = 0.0;
890 ctx->Eval.MapGrid1u2 = 1.0;
891 ctx->Eval.MapGrid2un = 1;
892 ctx->Eval.MapGrid2vn = 1;
893 ctx->Eval.MapGrid2u1 = 0.0;
894 ctx->Eval.MapGrid2u2 = 1.0;
895 ctx->Eval.MapGrid2v1 = 0.0;
896 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000897
Brian Paul4d053dd2000-01-14 04:45:47 +0000898 /* Evaluator data */
899 {
900 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
901 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
902 static GLfloat index[1] = { 1.0 };
903 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
904 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +0000905
Brian Paul4d053dd2000-01-14 04:45:47 +0000906 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
907 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
908 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
909 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
910 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
911 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
912 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
913 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
914 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
jtgafb833d1999-08-19 00:55:39 +0000915
Brian Paul4d053dd2000-01-14 04:45:47 +0000916 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
917 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
918 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
919 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
920 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
921 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
922 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
923 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
924 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
925 }
jtgafb833d1999-08-19 00:55:39 +0000926
Brian Paul4d053dd2000-01-14 04:45:47 +0000927 /* Fog group */
928 ctx->Fog.Enabled = GL_FALSE;
929 ctx->Fog.Mode = GL_EXP;
930 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
931 ctx->Fog.Index = 0.0;
932 ctx->Fog.Density = 1.0;
933 ctx->Fog.Start = 0.0;
934 ctx->Fog.End = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000935
Brian Paul4d053dd2000-01-14 04:45:47 +0000936 /* Hint group */
937 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
938 ctx->Hint.PointSmooth = GL_DONT_CARE;
939 ctx->Hint.LineSmooth = GL_DONT_CARE;
940 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
941 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000942 ctx->Hint.AllowDrawWin = GL_TRUE;
Brian Paul8cce3142000-04-10 15:52:25 +0000943 ctx->Hint.AllowDrawFrg = GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000944 ctx->Hint.AllowDrawMem = GL_TRUE;
945 ctx->Hint.StrictLighting = GL_TRUE;
Brian Paul1207bf02000-05-23 20:10:49 +0000946 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
947 ctx->Hint.TextureCompression = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +0000948
Brian Paul0771d152000-04-07 00:19:41 +0000949 /* Histogram group */
950 ctx->Histogram.Width = 0;
951 ctx->Histogram.Format = GL_RGBA;
952 ctx->Histogram.Sink = GL_FALSE;
953 ctx->Histogram.RedSize = 0xffffffff;
954 ctx->Histogram.GreenSize = 0xffffffff;
955 ctx->Histogram.BlueSize = 0xffffffff;
956 ctx->Histogram.AlphaSize = 0xffffffff;
957 ctx->Histogram.LuminanceSize = 0xffffffff;
958 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
959 ctx->Histogram.Count[i][0] = 0;
960 ctx->Histogram.Count[i][1] = 0;
961 ctx->Histogram.Count[i][2] = 0;
962 ctx->Histogram.Count[i][3] = 0;
963 }
964
965 /* Min/Max group */
966 ctx->MinMax.Format = GL_RGBA;
967 ctx->MinMax.Sink = GL_FALSE;
968 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
969 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
970 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
971 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
972
973
974
Brian Paul4d053dd2000-01-14 04:45:47 +0000975 /* Pipeline */
976 gl_pipeline_init( ctx );
977 gl_cva_init( ctx );
jtgafb833d1999-08-19 00:55:39 +0000978
Brian Paul4d053dd2000-01-14 04:45:47 +0000979 /* Extensions */
980 gl_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +0000981
Brian Paul4d053dd2000-01-14 04:45:47 +0000982 ctx->AllowVertexCull = CLIP_CULLED_BIT;
jtgafb833d1999-08-19 00:55:39 +0000983
Brian Paul4d053dd2000-01-14 04:45:47 +0000984 /* Lighting group */
985 for (i=0;i<MAX_LIGHTS;i++) {
986 init_light( &ctx->Light.Light[i], i );
987 }
988 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +0000989
Brian Paul4d053dd2000-01-14 04:45:47 +0000990 init_lightmodel( &ctx->Light.Model );
991 init_material( &ctx->Light.Material[0] );
992 init_material( &ctx->Light.Material[1] );
993 ctx->Light.ShadeModel = GL_SMOOTH;
994 ctx->Light.Enabled = GL_FALSE;
995 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
996 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
997 ctx->Light.ColorMaterialBitmask
998 = gl_material_bitmask( ctx,
999 GL_FRONT_AND_BACK,
1000 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001001
Brian Paul4d053dd2000-01-14 04:45:47 +00001002 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001003
Brian Paul4d053dd2000-01-14 04:45:47 +00001004 /* Lighting miscellaneous */
1005 ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1006 make_empty_list( ctx->ShineTabList );
1007 for (i = 0 ; i < 10 ; i++) {
1008 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1009 s->shininess = -1;
1010 s->refcount = 0;
1011 insert_at_tail( ctx->ShineTabList, s );
1012 }
1013 for (i = 0 ; i < 4 ; i++) {
1014 ctx->ShineTable[i] = ctx->ShineTabList->prev;
1015 ctx->ShineTable[i]->refcount++;
1016 }
jtgafb833d1999-08-19 00:55:39 +00001017
Brian Paul77d61af2000-06-28 04:20:21 +00001018 gl_compute_shine_table( ctx, 0, ctx->Light.Material[0].Shininess );
1019 gl_compute_shine_table( ctx, 2, ctx->Light.Material[0].Shininess * .5 );
1020 gl_compute_shine_table( ctx, 1, ctx->Light.Material[1].Shininess );
1021 gl_compute_shine_table( ctx, 3, ctx->Light.Material[1].Shininess * .5 );
1022
jtgafb833d1999-08-19 00:55:39 +00001023
Brian Paul4d053dd2000-01-14 04:45:47 +00001024 /* Line group */
1025 ctx->Line.SmoothFlag = GL_FALSE;
1026 ctx->Line.StippleFlag = GL_FALSE;
1027 ctx->Line.Width = 1.0;
1028 ctx->Line.StipplePattern = 0xffff;
1029 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001030
Brian Paul4d053dd2000-01-14 04:45:47 +00001031 /* Display List group */
1032 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001033
Brian Paul4d053dd2000-01-14 04:45:47 +00001034 /* Pixel group */
1035 ctx->Pixel.RedBias = 0.0;
1036 ctx->Pixel.RedScale = 1.0;
1037 ctx->Pixel.GreenBias = 0.0;
1038 ctx->Pixel.GreenScale = 1.0;
1039 ctx->Pixel.BlueBias = 0.0;
1040 ctx->Pixel.BlueScale = 1.0;
1041 ctx->Pixel.AlphaBias = 0.0;
1042 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001043 ctx->Pixel.DepthBias = 0.0;
1044 ctx->Pixel.DepthScale = 1.0;
1045 ctx->Pixel.IndexOffset = 0;
1046 ctx->Pixel.IndexShift = 0;
1047 ctx->Pixel.ZoomX = 1.0;
1048 ctx->Pixel.ZoomY = 1.0;
1049 ctx->Pixel.MapColorFlag = GL_FALSE;
1050 ctx->Pixel.MapStencilFlag = GL_FALSE;
1051 ctx->Pixel.MapStoSsize = 1;
1052 ctx->Pixel.MapItoIsize = 1;
1053 ctx->Pixel.MapItoRsize = 1;
1054 ctx->Pixel.MapItoGsize = 1;
1055 ctx->Pixel.MapItoBsize = 1;
1056 ctx->Pixel.MapItoAsize = 1;
1057 ctx->Pixel.MapRtoRsize = 1;
1058 ctx->Pixel.MapGtoGsize = 1;
1059 ctx->Pixel.MapBtoBsize = 1;
1060 ctx->Pixel.MapAtoAsize = 1;
1061 ctx->Pixel.MapStoS[0] = 0;
1062 ctx->Pixel.MapItoI[0] = 0;
1063 ctx->Pixel.MapItoR[0] = 0.0;
1064 ctx->Pixel.MapItoG[0] = 0.0;
1065 ctx->Pixel.MapItoB[0] = 0.0;
1066 ctx->Pixel.MapItoA[0] = 0.0;
1067 ctx->Pixel.MapItoR8[0] = 0;
1068 ctx->Pixel.MapItoG8[0] = 0;
1069 ctx->Pixel.MapItoB8[0] = 0;
1070 ctx->Pixel.MapItoA8[0] = 0;
1071 ctx->Pixel.MapRtoR[0] = 0.0;
1072 ctx->Pixel.MapGtoG[0] = 0.0;
1073 ctx->Pixel.MapBtoB[0] = 0.0;
1074 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001075 ctx->Pixel.HistogramEnabled = GL_FALSE;
1076 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1077 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1078 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1079 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001080 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1081 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1082 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1083 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001084 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1085 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1086 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1087 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001088 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1089 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1090 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001091 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1092 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1093 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1094 for (i = 0; i < 3; i++) {
1095 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1096 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1097 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1098 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1099 }
1100 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1101 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001102
Brian Paul4d053dd2000-01-14 04:45:47 +00001103 /* Point group */
1104 ctx->Point.SmoothFlag = GL_FALSE;
Brian Paula25f7e12000-06-27 04:29:22 +00001105 ctx->Point.UserSize = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001106 ctx->Point.Size = 1.0;
1107 ctx->Point.Params[0] = 1.0;
1108 ctx->Point.Params[1] = 0.0;
1109 ctx->Point.Params[2] = 0.0;
1110 ctx->Point.Attenuated = GL_FALSE;
1111 ctx->Point.MinSize = 0.0;
1112 ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
1113 ctx->Point.Threshold = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001114
Brian Paul4d053dd2000-01-14 04:45:47 +00001115 /* Polygon group */
1116 ctx->Polygon.CullFlag = GL_FALSE;
1117 ctx->Polygon.CullFaceMode = GL_BACK;
1118 ctx->Polygon.FrontFace = GL_CCW;
1119 ctx->Polygon.FrontBit = 0;
1120 ctx->Polygon.FrontMode = GL_FILL;
1121 ctx->Polygon.BackMode = GL_FILL;
1122 ctx->Polygon.Unfilled = GL_FALSE;
1123 ctx->Polygon.SmoothFlag = GL_FALSE;
1124 ctx->Polygon.StippleFlag = GL_FALSE;
1125 ctx->Polygon.OffsetFactor = 0.0F;
1126 ctx->Polygon.OffsetUnits = 0.0F;
1127 ctx->Polygon.OffsetPoint = GL_FALSE;
1128 ctx->Polygon.OffsetLine = GL_FALSE;
1129 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001130
Brian Paul4d053dd2000-01-14 04:45:47 +00001131 /* Polygon Stipple group */
1132 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001133
Brian Paul4d053dd2000-01-14 04:45:47 +00001134 /* Scissor group */
1135 ctx->Scissor.Enabled = GL_FALSE;
1136 ctx->Scissor.X = 0;
1137 ctx->Scissor.Y = 0;
1138 ctx->Scissor.Width = 0;
1139 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001140
Brian Paul4d053dd2000-01-14 04:45:47 +00001141 /* Stencil group */
1142 ctx->Stencil.Enabled = GL_FALSE;
1143 ctx->Stencil.Function = GL_ALWAYS;
1144 ctx->Stencil.FailFunc = GL_KEEP;
1145 ctx->Stencil.ZPassFunc = GL_KEEP;
1146 ctx->Stencil.ZFailFunc = GL_KEEP;
1147 ctx->Stencil.Ref = 0;
1148 ctx->Stencil.ValueMask = STENCIL_MAX;
1149 ctx->Stencil.Clear = 0;
1150 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001151
Brian Paul4d053dd2000-01-14 04:45:47 +00001152 /* Texture group */
1153 ctx->Texture.CurrentUnit = 0; /* multitexture */
1154 ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
1155 ctx->Texture.Enabled = 0;
Brian Paul23316032000-09-14 23:13:23 +00001156 ctx->Texture.ReallyEnabled = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001157 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1158 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001159 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001160 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001161
Brian Paul4d053dd2000-01-14 04:45:47 +00001162 /* Transformation group */
1163 ctx->Transform.MatrixMode = GL_MODELVIEW;
1164 ctx->Transform.Normalize = GL_FALSE;
1165 ctx->Transform.RescaleNormals = GL_FALSE;
1166 for (i=0;i<MAX_CLIP_PLANES;i++) {
1167 ctx->Transform.ClipEnabled[i] = GL_FALSE;
1168 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1169 }
1170 ctx->Transform.AnyClip = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001171
Brian Paul4d053dd2000-01-14 04:45:47 +00001172 /* Viewport group */
1173 ctx->Viewport.X = 0;
1174 ctx->Viewport.Y = 0;
1175 ctx->Viewport.Width = 0;
1176 ctx->Viewport.Height = 0;
1177 ctx->Viewport.Near = 0.0;
1178 ctx->Viewport.Far = 1.0;
1179 gl_matrix_ctr(&ctx->Viewport.WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001180
1181#define Sz 10
1182#define Tz 14
Brian Pauled30dfa2000-03-03 17:47:39 +00001183 ctx->Viewport.WindowMap.m[Sz] = 0.5 * ctx->Visual->DepthMaxF;
1184 ctx->Viewport.WindowMap.m[Tz] = 0.5 * ctx->Visual->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001185#undef Sz
1186#undef Tz
1187
Brian Paul4d053dd2000-01-14 04:45:47 +00001188 ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1189 ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001190
Brian Paul4d053dd2000-01-14 04:45:47 +00001191 /* Vertex arrays */
1192 ctx->Array.Vertex.Size = 4;
1193 ctx->Array.Vertex.Type = GL_FLOAT;
1194 ctx->Array.Vertex.Stride = 0;
1195 ctx->Array.Vertex.StrideB = 0;
1196 ctx->Array.Vertex.Ptr = NULL;
1197 ctx->Array.Vertex.Enabled = GL_FALSE;
1198 ctx->Array.Normal.Type = GL_FLOAT;
1199 ctx->Array.Normal.Stride = 0;
1200 ctx->Array.Normal.StrideB = 0;
1201 ctx->Array.Normal.Ptr = NULL;
1202 ctx->Array.Normal.Enabled = GL_FALSE;
1203 ctx->Array.Color.Size = 4;
1204 ctx->Array.Color.Type = GL_FLOAT;
1205 ctx->Array.Color.Stride = 0;
1206 ctx->Array.Color.StrideB = 0;
1207 ctx->Array.Color.Ptr = NULL;
1208 ctx->Array.Color.Enabled = GL_FALSE;
1209 ctx->Array.Index.Type = GL_FLOAT;
1210 ctx->Array.Index.Stride = 0;
1211 ctx->Array.Index.StrideB = 0;
1212 ctx->Array.Index.Ptr = NULL;
1213 ctx->Array.Index.Enabled = GL_FALSE;
1214 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1215 ctx->Array.TexCoord[i].Size = 4;
1216 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1217 ctx->Array.TexCoord[i].Stride = 0;
1218 ctx->Array.TexCoord[i].StrideB = 0;
1219 ctx->Array.TexCoord[i].Ptr = NULL;
1220 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
1221 }
1222 ctx->Array.TexCoordInterleaveFactor = 1;
1223 ctx->Array.EdgeFlag.Stride = 0;
1224 ctx->Array.EdgeFlag.StrideB = 0;
1225 ctx->Array.EdgeFlag.Ptr = NULL;
1226 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
1227 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1228
1229 /* Pixel transfer */
1230 ctx->Pack.Alignment = 4;
1231 ctx->Pack.RowLength = 0;
1232 ctx->Pack.ImageHeight = 0;
1233 ctx->Pack.SkipPixels = 0;
1234 ctx->Pack.SkipRows = 0;
1235 ctx->Pack.SkipImages = 0;
1236 ctx->Pack.SwapBytes = GL_FALSE;
1237 ctx->Pack.LsbFirst = GL_FALSE;
1238 ctx->Unpack.Alignment = 4;
1239 ctx->Unpack.RowLength = 0;
1240 ctx->Unpack.ImageHeight = 0;
1241 ctx->Unpack.SkipPixels = 0;
1242 ctx->Unpack.SkipRows = 0;
1243 ctx->Unpack.SkipImages = 0;
1244 ctx->Unpack.SwapBytes = GL_FALSE;
1245 ctx->Unpack.LsbFirst = GL_FALSE;
1246
1247 /* Feedback */
1248 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1249 ctx->Feedback.Buffer = NULL;
1250 ctx->Feedback.BufferSize = 0;
1251 ctx->Feedback.Count = 0;
1252
1253 /* Selection/picking */
1254 ctx->Select.Buffer = NULL;
1255 ctx->Select.BufferSize = 0;
1256 ctx->Select.BufferCount = 0;
1257 ctx->Select.Hits = 0;
1258 ctx->Select.NameStackDepth = 0;
1259
1260 /* Optimized Accum buffer */
1261 ctx->IntegerAccumMode = GL_TRUE;
1262 ctx->IntegerAccumScaler = 0.0;
1263
1264 /* Renderer and client attribute stacks */
1265 ctx->AttribStackDepth = 0;
1266 ctx->ClientAttribStackDepth = 0;
1267
Brian Paul13811372000-04-12 00:27:37 +00001268 /* Display list */
1269 ctx->CallDepth = 0;
1270 ctx->ExecuteFlag = GL_TRUE;
1271 ctx->CompileFlag = GL_FALSE;
1272 ctx->CurrentListPtr = NULL;
1273 ctx->CurrentBlock = NULL;
1274 ctx->CurrentListNum = 0;
1275 ctx->CurrentPos = 0;
1276
1277 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001278 _mesa_init_colortable(&ctx->ColorTable);
1279 _mesa_init_colortable(&ctx->ProxyColorTable);
1280 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1281 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1282 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1283 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001284
Brian Paul4d053dd2000-01-14 04:45:47 +00001285 /* Miscellaneous */
1286 ctx->NewState = NEW_ALL;
1287 ctx->RenderMode = GL_RENDER;
1288 ctx->StippleCounter = 0;
1289 ctx->NeedNormals = GL_FALSE;
1290 ctx->DoViewportMapping = GL_TRUE;
Brian Paulfa4525e2000-08-21 14:22:24 +00001291 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001292
1293 ctx->NeedEyeCoords = GL_FALSE;
1294 ctx->NeedEyeNormals = GL_FALSE;
1295 ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
1296
Brian Paul4d053dd2000-01-14 04:45:47 +00001297 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1298
1299 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001300 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001301 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001302
1303 /* For debug/development only */
1304 ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
1305 ctx->FirstTimeCurrent = GL_TRUE;
1306
1307 /* Dither disable */
1308 ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
1309 if (ctx->NoDither) {
1310 if (getenv("MESA_DEBUG")) {
1311 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001312 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001313 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001314 }
1315}
1316
1317
1318
1319
jtgafb833d1999-08-19 00:55:39 +00001320/*
1321 * Allocate the proxy textures. If we run out of memory part way through
1322 * the allocations clean up and return GL_FALSE.
1323 * Return: GL_TRUE=success, GL_FALSE=failure
1324 */
Brian Paul178a1c52000-04-22 01:05:00 +00001325static GLboolean
1326alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001327{
1328 GLboolean out_of_memory;
1329 GLint i;
1330
1331 ctx->Texture.Proxy1D = gl_alloc_texture_object(NULL, 0, 1);
1332 if (!ctx->Texture.Proxy1D) {
1333 return GL_FALSE;
1334 }
1335
1336 ctx->Texture.Proxy2D = gl_alloc_texture_object(NULL, 0, 2);
1337 if (!ctx->Texture.Proxy2D) {
1338 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1339 return GL_FALSE;
1340 }
1341
1342 ctx->Texture.Proxy3D = gl_alloc_texture_object(NULL, 0, 3);
1343 if (!ctx->Texture.Proxy3D) {
1344 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1345 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1346 return GL_FALSE;
1347 }
1348
1349 out_of_memory = GL_FALSE;
1350 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001351 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1352 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1353 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001354 if (!ctx->Texture.Proxy1D->Image[i]
1355 || !ctx->Texture.Proxy2D->Image[i]
1356 || !ctx->Texture.Proxy3D->Image[i]) {
1357 out_of_memory = GL_TRUE;
1358 }
1359 }
1360 if (out_of_memory) {
1361 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1362 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001363 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001364 }
1365 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001366 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001367 }
1368 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001369 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001370 }
1371 }
1372 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1373 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1374 gl_free_texture_object(NULL, ctx->Texture.Proxy3D);
1375 return GL_FALSE;
1376 }
1377 else {
1378 return GL_TRUE;
1379 }
1380}
1381
1382
1383
jtgafb833d1999-08-19 00:55:39 +00001384/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001385 * Initialize a GLcontext struct. This includes allocating all the
1386 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001387 */
Brian Paul178a1c52000-04-22 01:05:00 +00001388GLboolean
1389_mesa_initialize_context( GLcontext *ctx,
1390 GLvisual *visual,
1391 GLcontext *share_list,
1392 void *driver_ctx,
1393 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001394{
Brian Paul5fb84d22000-05-24 15:04:45 +00001395 GLuint dispatchSize;
1396
jtgafb833d1999-08-19 00:55:39 +00001397 (void) direct; /* not used */
1398
jtgafb833d1999-08-19 00:55:39 +00001399 /* misc one-time initializations */
1400 one_time_init();
1401
jtgafb833d1999-08-19 00:55:39 +00001402 ctx->DriverCtx = driver_ctx;
1403 ctx->Visual = visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001404 ctx->DrawBuffer = NULL;
1405 ctx->ReadBuffer = NULL;
jtgafb833d1999-08-19 00:55:39 +00001406
1407 ctx->VB = gl_vb_create_for_immediate( ctx );
1408 if (!ctx->VB) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001409 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001410 }
1411 ctx->input = ctx->VB->IM;
1412
1413 ctx->PB = gl_alloc_pb();
1414 if (!ctx->PB) {
Brian Paul2d8db392000-06-27 22:10:00 +00001415 ALIGN_FREE( ctx->VB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001416 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001417 }
1418
1419 if (share_list) {
1420 /* share the group of display lists of another context */
1421 ctx->Shared = share_list->Shared;
1422 }
1423 else {
1424 /* allocate new group of display lists */
1425 ctx->Shared = alloc_shared_state();
1426 if (!ctx->Shared) {
Brian Paul2d8db392000-06-27 22:10:00 +00001427 ALIGN_FREE( ctx->VB );
1428 FREE( ctx->PB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001429 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001430 }
1431 }
Brian Paul9560f052000-01-31 23:11:39 +00001432 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001433 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001434 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001435
Brian Paul4d053dd2000-01-14 04:45:47 +00001436 init_attrib_groups( ctx );
1437
jtgafb833d1999-08-19 00:55:39 +00001438 gl_reset_vb( ctx->VB );
1439 gl_reset_input( ctx );
1440
jtgafb833d1999-08-19 00:55:39 +00001441 if (visual->DBflag) {
1442 ctx->Color.DrawBuffer = GL_BACK;
1443 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1444 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1445 ctx->Pixel.ReadBuffer = GL_BACK;
1446 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1447 }
1448 else {
1449 ctx->Color.DrawBuffer = GL_FRONT;
1450 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1451 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1452 ctx->Pixel.ReadBuffer = GL_FRONT;
1453 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1454 }
1455
jtgafb833d1999-08-19 00:55:39 +00001456 if (!alloc_proxy_textures(ctx)) {
1457 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001458 ALIGN_FREE( ctx->VB );
1459 FREE( ctx->PB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001460 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001461 }
jtgafb833d1999-08-19 00:55:39 +00001462
Brian Paulf59afc92000-05-23 23:23:00 +00001463 /* register the most recent extension functions with libGL */
1464 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1465 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1466 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1467 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1468 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1469 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1470 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1471 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1472
Brian Paul5fb84d22000-05-24 15:04:45 +00001473 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1474 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1475 * Mesa we do this to accomodate different versions of libGL and various
1476 * DRI drivers.
1477 */
1478 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1479 sizeof(struct _glapi_table) / sizeof(void *));
1480
Brian Paulfbd8f211999-11-11 01:22:25 +00001481 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001482 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1483 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001484 if (!ctx->Exec || !ctx->Save) {
1485 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001486 ALIGN_FREE( ctx->VB );
1487 FREE( ctx->PB );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001488 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001489 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001490 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001491 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1492 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001493 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001494
Brian Paul45f36342000-09-05 20:28:06 +00001495#if defined(TRACE)
1496 ctx->TraceCtx = CALLOC( sizeof(trace_context_t) );
1497#if 0
1498 /* Brian: do you want to have CreateContext fail here,
1499 or should we just trap in NewTrace (currently done)? */
1500 if (!(ctx->TraceCtx)) {
1501 free_shared_state(ctx, ctx->Shared);
1502 ALIGN_FREE( ctx->VB );
1503 FREE( ctx->PB );
1504 FREE( ctx->Exec );
1505 FREE( ctx->Save );
1506 return GL_FALSE;
1507 }
1508#endif
1509 trInitContext(ctx->TraceCtx);
1510
1511 ctx->TraceDispatch = (struct _glapi_table *)
1512 CALLOC(dispatchSize * sizeof(void*));
1513#if 0
1514 if (!(ctx->TraceCtx)) {
1515 free_shared_state(ctx, ctx->Shared);
1516 ALIGN_FREE( ctx->VB );
1517 FREE( ctx->PB );
1518 FREE( ctx->Exec );
1519 FREE( ctx->Save );
1520 FREE( ctx->TraceCtx );
1521 return GL_FALSE;
1522 }
1523#endif
1524 trInitDispatch(ctx->TraceDispatch);
1525#endif
1526
Brian Paul4d053dd2000-01-14 04:45:47 +00001527 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001528}
1529
jtgafb833d1999-08-19 00:55:39 +00001530
1531
1532/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001533 * Allocate and initialize a GLcontext structure.
1534 * Input: visual - a GLvisual pointer
1535 * sharelist - another context to share display lists with or NULL
1536 * driver_ctx - pointer to device driver's context state struct
1537 * Return: pointer to a new gl_context struct or NULL if error.
1538 */
Brian Paul178a1c52000-04-22 01:05:00 +00001539GLcontext *
1540gl_create_context( GLvisual *visual,
1541 GLcontext *share_list,
1542 void *driver_ctx,
1543 GLboolean direct )
Brian Paul4d053dd2000-01-14 04:45:47 +00001544{
1545 GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
1546 if (!ctx) {
1547 return NULL;
1548 }
1549
Brian Paul178a1c52000-04-22 01:05:00 +00001550 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001551 return ctx;
1552 }
1553 else {
1554 FREE(ctx);
1555 return NULL;
1556 }
1557}
1558
1559
1560
1561/*
1562 * Free the data associated with the given context.
1563 * But don't free() the GLcontext struct itself!
1564 */
Brian Paul178a1c52000-04-22 01:05:00 +00001565void
1566gl_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001567{
Brian Paul4d053dd2000-01-14 04:45:47 +00001568 struct gl_shine_tab *s, *tmps;
Brian Paul7fc29c52000-03-06 17:03:03 +00001569 GLuint i, j;
Brian Paul4d053dd2000-01-14 04:45:47 +00001570
1571 /* if we're destroying the current context, unbind it first */
1572 if (ctx == gl_get_current_context()) {
1573 gl_make_current(NULL, NULL);
1574 }
1575
Brian Paul4d053dd2000-01-14 04:45:47 +00001576 gl_matrix_dtr( &ctx->ModelView );
Brian Paul7fc29c52000-03-06 17:03:03 +00001577 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001578 gl_matrix_dtr( &ctx->ModelViewStack[i] );
1579 }
1580 gl_matrix_dtr( &ctx->ProjectionMatrix );
Brian Paul7fc29c52000-03-06 17:03:03 +00001581 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001582 gl_matrix_dtr( &ctx->ProjectionStack[i] );
1583 }
Brian Paul7fc29c52000-03-06 17:03:03 +00001584 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1585 gl_matrix_dtr( &ctx->TextureMatrix[i] );
1586 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
1587 gl_matrix_dtr( &ctx->TextureStack[i][j] );
1588 }
1589 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001590
1591 FREE( ctx->PB );
1592
Brian Paul4bdcfe52000-04-17 17:57:04 +00001593 if (ctx->input != ctx->VB->IM)
Brian Paul4d053dd2000-01-14 04:45:47 +00001594 gl_immediate_free( ctx->input );
1595
1596 gl_vb_free( ctx->VB );
1597
Brian Paul9560f052000-01-31 23:11:39 +00001598 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001599 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001600 assert(ctx->Shared->RefCount >= 0);
1601 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1602 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001603 /* free shared state */
1604 free_shared_state( ctx, ctx->Shared );
1605 }
1606
1607 foreach_s( s, tmps, ctx->ShineTabList ) {
1608 FREE( s );
1609 }
1610 FREE( ctx->ShineTabList );
1611
1612 /* Free proxy texture objects */
1613 gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
1614 gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
1615 gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
1616
1617 /* Free evaluator data */
1618 if (ctx->EvalMap.Map1Vertex3.Points)
1619 FREE( ctx->EvalMap.Map1Vertex3.Points );
1620 if (ctx->EvalMap.Map1Vertex4.Points)
1621 FREE( ctx->EvalMap.Map1Vertex4.Points );
1622 if (ctx->EvalMap.Map1Index.Points)
1623 FREE( ctx->EvalMap.Map1Index.Points );
1624 if (ctx->EvalMap.Map1Color4.Points)
1625 FREE( ctx->EvalMap.Map1Color4.Points );
1626 if (ctx->EvalMap.Map1Normal.Points)
1627 FREE( ctx->EvalMap.Map1Normal.Points );
1628 if (ctx->EvalMap.Map1Texture1.Points)
1629 FREE( ctx->EvalMap.Map1Texture1.Points );
1630 if (ctx->EvalMap.Map1Texture2.Points)
1631 FREE( ctx->EvalMap.Map1Texture2.Points );
1632 if (ctx->EvalMap.Map1Texture3.Points)
1633 FREE( ctx->EvalMap.Map1Texture3.Points );
1634 if (ctx->EvalMap.Map1Texture4.Points)
1635 FREE( ctx->EvalMap.Map1Texture4.Points );
1636
1637 if (ctx->EvalMap.Map2Vertex3.Points)
1638 FREE( ctx->EvalMap.Map2Vertex3.Points );
1639 if (ctx->EvalMap.Map2Vertex4.Points)
1640 FREE( ctx->EvalMap.Map2Vertex4.Points );
1641 if (ctx->EvalMap.Map2Index.Points)
1642 FREE( ctx->EvalMap.Map2Index.Points );
1643 if (ctx->EvalMap.Map2Color4.Points)
1644 FREE( ctx->EvalMap.Map2Color4.Points );
1645 if (ctx->EvalMap.Map2Normal.Points)
1646 FREE( ctx->EvalMap.Map2Normal.Points );
1647 if (ctx->EvalMap.Map2Texture1.Points)
1648 FREE( ctx->EvalMap.Map2Texture1.Points );
1649 if (ctx->EvalMap.Map2Texture2.Points)
1650 FREE( ctx->EvalMap.Map2Texture2.Points );
1651 if (ctx->EvalMap.Map2Texture3.Points)
1652 FREE( ctx->EvalMap.Map2Texture3.Points );
1653 if (ctx->EvalMap.Map2Texture4.Points)
1654 FREE( ctx->EvalMap.Map2Texture4.Points );
1655
Brian Paul4bdcfe52000-04-17 17:57:04 +00001656 _mesa_free_colortable_data( &ctx->ColorTable );
1657 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1658 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1659 _mesa_free_colortable_data( &ctx->Texture.Palette );
1660
Brian Paul4d053dd2000-01-14 04:45:47 +00001661 /* Free cache of immediate buffers. */
1662 while (ctx->nr_im_queued-- > 0) {
1663 struct immediate * next = ctx->freed_im_queue->next;
Brian Paul2d8db392000-06-27 22:10:00 +00001664 ALIGN_FREE( ctx->freed_im_queue );
Brian Paul4d053dd2000-01-14 04:45:47 +00001665 ctx->freed_im_queue = next;
1666 }
1667 gl_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001668
1669 FREE(ctx->Exec);
1670 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001671}
1672
1673
1674
1675/*
1676 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001677 */
Brian Paul178a1c52000-04-22 01:05:00 +00001678void
1679gl_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001680{
1681 if (ctx) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001682 gl_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001683 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001684 }
1685}
1686
1687
1688
1689/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001690 * Called by the driver after both the context and driver are fully
1691 * initialized. Currently just reads the config file.
jtgafb833d1999-08-19 00:55:39 +00001692 */
Brian Paul178a1c52000-04-22 01:05:00 +00001693void
1694gl_context_initialize( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001695{
Brian Paul00037781999-12-17 14:52:35 +00001696 gl_read_config_file( ctx );
jtgafb833d1999-08-19 00:55:39 +00001697}
1698
1699
1700
1701/*
1702 * Copy attribute groups from one context to another.
1703 * Input: src - source context
1704 * dst - destination context
1705 * mask - bitwise OR of GL_*_BIT flags
1706 */
Brian Paul178a1c52000-04-22 01:05:00 +00001707void
1708gl_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001709{
1710 if (mask & GL_ACCUM_BUFFER_BIT) {
1711 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1712 }
1713 if (mask & GL_COLOR_BUFFER_BIT) {
1714 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1715 }
1716 if (mask & GL_CURRENT_BIT) {
1717 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1718 }
1719 if (mask & GL_DEPTH_BUFFER_BIT) {
1720 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1721 }
1722 if (mask & GL_ENABLE_BIT) {
1723 /* no op */
1724 }
1725 if (mask & GL_EVAL_BIT) {
1726 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1727 }
1728 if (mask & GL_FOG_BIT) {
1729 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1730 }
1731 if (mask & GL_HINT_BIT) {
1732 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1733 }
1734 if (mask & GL_LIGHTING_BIT) {
1735 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001736 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001737 }
1738 if (mask & GL_LINE_BIT) {
1739 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1740 }
1741 if (mask & GL_LIST_BIT) {
1742 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1743 }
1744 if (mask & GL_PIXEL_MODE_BIT) {
1745 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1746 }
1747 if (mask & GL_POINT_BIT) {
1748 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1749 }
1750 if (mask & GL_POLYGON_BIT) {
1751 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1752 }
1753 if (mask & GL_POLYGON_STIPPLE_BIT) {
1754 /* Use loop instead of MEMCPY due to problem with Portland Group's
1755 * C compiler. Reported by John Stone.
1756 */
1757 int i;
1758 for (i=0;i<32;i++) {
1759 dst->PolygonStipple[i] = src->PolygonStipple[i];
1760 }
1761 }
1762 if (mask & GL_SCISSOR_BIT) {
1763 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
1764 }
1765 if (mask & GL_STENCIL_BUFFER_BIT) {
1766 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
1767 }
1768 if (mask & GL_TEXTURE_BIT) {
1769 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
1770 }
1771 if (mask & GL_TRANSFORM_BIT) {
1772 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
1773 }
1774 if (mask & GL_VIEWPORT_BIT) {
1775 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
1776 }
1777}
1778
1779
jtgafb833d1999-08-19 00:55:39 +00001780/*
Brian Paul00037781999-12-17 14:52:35 +00001781 * Set the current context, binding the given frame buffer to the context.
1782 */
1783void gl_make_current( GLcontext *newCtx, GLframebuffer *buffer )
1784{
1785 gl_make_current2( newCtx, buffer, buffer );
1786}
1787
1788
1789/*
1790 * Bind the given context to the given draw-buffer and read-buffer
1791 * and make it the current context for this thread.
1792 */
1793void gl_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
1794 GLframebuffer *readBuffer )
1795{
1796#if 0
Brian Paulf9b97d92000-01-28 20:17:42 +00001797 GLcontext *oldCtx = gl_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001798
1799 /* Flush the old context
1800 */
1801 if (oldCtx) {
1802 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(oldCtx, "gl_make_current");
1803
1804 /* unbind frame buffers from context */
1805 if (oldCtx->DrawBuffer) {
1806 oldCtx->DrawBuffer = NULL;
1807 }
1808 if (oldCtx->ReadBuffer) {
1809 oldCtx->ReadBuffer = NULL;
1810 }
1811 }
1812#endif
1813
1814 /* We call this function periodically (just here for now) in
1815 * order to detect when multithreading has begun.
1816 */
1817 _glapi_check_multithread();
1818
Brian Paulf9b97d92000-01-28 20:17:42 +00001819 _glapi_set_context((void *) newCtx);
Brian Paul00037781999-12-17 14:52:35 +00001820 ASSERT(gl_get_current_context() == newCtx);
1821 if (newCtx) {
1822 SET_IMMEDIATE(newCtx, newCtx->input);
1823 _glapi_set_dispatch(newCtx->CurrentDispatch);
1824 }
1825 else {
1826 _glapi_set_dispatch(NULL); /* none current */
1827 }
1828
1829 if (MESA_VERBOSE) fprintf(stderr, "gl_make_current()\n");
1830
1831 if (newCtx && drawBuffer && readBuffer) {
1832 /* TODO: check if newCtx and buffer's visual match??? */
1833 newCtx->DrawBuffer = drawBuffer;
1834 newCtx->ReadBuffer = readBuffer;
1835 newCtx->NewState = NEW_ALL; /* just to be safe */
1836 gl_update_state( newCtx );
1837 }
1838
1839 /* We can use this to help debug user's problems. Tell the to set
1840 * the MESA_INFO env variable before running their app. Then the
1841 * first time each context is made current we'll print some useful
1842 * information.
1843 */
1844 if (newCtx && newCtx->FirstTimeCurrent) {
1845 if (getenv("MESA_INFO")) {
1846 fprintf(stderr, "Mesa GL_VERSION = %s\n", (char *) _mesa_GetString(GL_VERSION));
1847 fprintf(stderr, "Mesa GL_RENDERER = %s\n", (char *) _mesa_GetString(GL_RENDERER));
1848 fprintf(stderr, "Mesa GL_VENDOR = %s\n", (char *) _mesa_GetString(GL_VENDOR));
1849 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n", (char *) _mesa_GetString(GL_EXTENSIONS));
Brian Paul09cb1481999-12-17 17:00:32 +00001850#if defined(THREADS)
1851 fprintf(stderr, "Mesa thread-safe: YES\n");
1852#else
1853 fprintf(stderr, "Mesa thread-safe: NO\n");
1854#endif
Brian Paul54287052000-01-17 20:00:15 +00001855#if defined(USE_X86_ASM)
1856 fprintf(stderr, "Mesa x86-optimized: YES\n");
1857#else
1858 fprintf(stderr, "Mesa x86-optimized: NO\n");
1859#endif
Brian Paul00037781999-12-17 14:52:35 +00001860 }
1861 newCtx->FirstTimeCurrent = GL_FALSE;
1862 }
1863}
1864
1865
1866
1867/*
1868 * Return current context handle for the calling thread.
1869 * This isn't the fastest way to get the current context.
1870 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
1871 */
1872GLcontext *gl_get_current_context( void )
1873{
Brian Paulf9b97d92000-01-28 20:17:42 +00001874 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001875}
1876
1877
1878
1879/*
Brian Paulfbd8f211999-11-11 01:22:25 +00001880 * This should be called by device drivers just before they do a
1881 * swapbuffers. Any pending rendering commands will be executed.
jtgafb833d1999-08-19 00:55:39 +00001882 */
Brian Paulfbd8f211999-11-11 01:22:25 +00001883void
1884_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00001885{
Brian Paulfbd8f211999-11-11 01:22:25 +00001886 FLUSH_VB( ctx, "swap buffers" );
jtgafb833d1999-08-19 00:55:39 +00001887}
1888
1889
Brian Paul00037781999-12-17 14:52:35 +00001890
Brian Paulfbd8f211999-11-11 01:22:25 +00001891/*
1892 * Return pointer to this context's current API dispatch table.
1893 * It'll either be the immediate-mode execute dispatcher or the
1894 * display list compile dispatcher.
1895 */
1896struct _glapi_table *
1897_mesa_get_dispatch(GLcontext *ctx)
1898{
1899 return ctx->CurrentDispatch;
1900}
1901
1902
1903
jtgafb833d1999-08-19 00:55:39 +00001904/**********************************************************************/
1905/***** Miscellaneous functions *****/
1906/**********************************************************************/
1907
1908
1909/*
1910 * This function is called when the Mesa user has stumbled into a code
1911 * path which may not be implemented fully or correctly.
1912 */
1913void gl_problem( const GLcontext *ctx, const char *s )
1914{
1915 fprintf( stderr, "Mesa implementation error: %s\n", s );
Brian Paul413d6a22000-05-26 14:44:59 +00001916 fprintf( stderr, "Report to Mesa bug database at www.mesa3d.org\n" );
jtgafb833d1999-08-19 00:55:39 +00001917 (void) ctx;
1918}
1919
1920
1921
1922/*
1923 * This is called to inform the user that he or she has tried to do
1924 * something illogical or if there's likely a bug in their program
1925 * (like enabled depth testing without a depth buffer).
1926 */
1927void gl_warning( const GLcontext *ctx, const char *s )
1928{
1929 GLboolean debug;
1930#ifdef DEBUG
1931 debug = GL_TRUE;
1932#else
1933 if (getenv("MESA_DEBUG")) {
1934 debug = GL_TRUE;
1935 }
1936 else {
1937 debug = GL_FALSE;
1938 }
1939#endif
1940 if (debug) {
1941 fprintf( stderr, "Mesa warning: %s\n", s );
1942 }
1943 (void) ctx;
1944}
1945
1946
1947
Brian Paulfa9df402000-02-02 19:16:46 +00001948/*
1949 * Compile an error into current display list.
1950 */
jtgafb833d1999-08-19 00:55:39 +00001951void gl_compile_error( GLcontext *ctx, GLenum error, const char *s )
1952{
1953 if (ctx->CompileFlag)
1954 gl_save_error( ctx, error, s );
1955
1956 if (ctx->ExecuteFlag)
1957 gl_error( ctx, error, s );
1958}
1959
1960
Brian Paulfa9df402000-02-02 19:16:46 +00001961
jtgafb833d1999-08-19 00:55:39 +00001962/*
1963 * This is Mesa's error handler. Normally, all that's done is the updating
1964 * of the current error value. If Mesa is compiled with -DDEBUG or if the
1965 * environment variable "MESA_DEBUG" is defined then a real error message
1966 * is printed to stderr.
Brian Paul7eb06032000-07-14 04:13:40 +00001967 * Input: ctx - the GL context
1968 * error - the error value
1969 * where - usually the name of function where error was detected
jtgafb833d1999-08-19 00:55:39 +00001970 */
Brian Paul7eb06032000-07-14 04:13:40 +00001971void
1972gl_error( GLcontext *ctx, GLenum error, const char *where )
jtgafb833d1999-08-19 00:55:39 +00001973{
Brian Paul7eb06032000-07-14 04:13:40 +00001974 const char *debugEnv = getenv("MESA_DEBUG");
jtgafb833d1999-08-19 00:55:39 +00001975 GLboolean debug;
1976
1977#ifdef DEBUG
Brian Paul7eb06032000-07-14 04:13:40 +00001978 if (debugEnv && strstr(debugEnv, "silent"))
jtgafb833d1999-08-19 00:55:39 +00001979 debug = GL_FALSE;
Brian Paul7eb06032000-07-14 04:13:40 +00001980 else
1981 debug = GL_TRUE;
1982#else
1983 if (debugEnv)
1984 debug = GL_TRUE;
1985 else
1986 debug = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001987#endif
1988
1989 if (debug) {
Brian Paul7eb06032000-07-14 04:13:40 +00001990 const char *errstr;
jtgafb833d1999-08-19 00:55:39 +00001991 switch (error) {
1992 case GL_NO_ERROR:
Brian Paul7eb06032000-07-14 04:13:40 +00001993 errstr = "GL_NO_ERROR";
jtgafb833d1999-08-19 00:55:39 +00001994 break;
1995 case GL_INVALID_VALUE:
Brian Paul7eb06032000-07-14 04:13:40 +00001996 errstr = "GL_INVALID_VALUE";
jtgafb833d1999-08-19 00:55:39 +00001997 break;
1998 case GL_INVALID_ENUM:
Brian Paul7eb06032000-07-14 04:13:40 +00001999 errstr = "GL_INVALID_ENUM";
jtgafb833d1999-08-19 00:55:39 +00002000 break;
2001 case GL_INVALID_OPERATION:
Brian Paul7eb06032000-07-14 04:13:40 +00002002 errstr = "GL_INVALID_OPERATION";
jtgafb833d1999-08-19 00:55:39 +00002003 break;
2004 case GL_STACK_OVERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002005 errstr = "GL_STACK_OVERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002006 break;
2007 case GL_STACK_UNDERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002008 errstr = "GL_STACK_UNDERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002009 break;
2010 case GL_OUT_OF_MEMORY:
Brian Paul7eb06032000-07-14 04:13:40 +00002011 errstr = "GL_OUT_OF_MEMORY";
jtgafb833d1999-08-19 00:55:39 +00002012 break;
Brian Paul86586aa2000-06-29 18:55:52 +00002013 case GL_TABLE_TOO_LARGE:
Brian Paul7eb06032000-07-14 04:13:40 +00002014 errstr = "GL_TABLE_TOO_LARGE";
Brian Paul86586aa2000-06-29 18:55:52 +00002015 break;
jtgafb833d1999-08-19 00:55:39 +00002016 default:
Brian Paul7eb06032000-07-14 04:13:40 +00002017 errstr = "unknown";
jtgafb833d1999-08-19 00:55:39 +00002018 break;
2019 }
Brian Paul7eb06032000-07-14 04:13:40 +00002020 fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where);
jtgafb833d1999-08-19 00:55:39 +00002021 }
2022
Brian Paul7eb06032000-07-14 04:13:40 +00002023 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002024 ctx->ErrorValue = error;
2025 }
2026
2027 /* Call device driver's error handler, if any. This is used on the Mac. */
2028 if (ctx->Driver.Error) {
2029 (*ctx->Driver.Error)( ctx );
2030 }
2031}
2032
2033
2034
Brian Paulfa9df402000-02-02 19:16:46 +00002035void
2036_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002037{
Brian Paulfa9df402000-02-02 19:16:46 +00002038 GET_CURRENT_CONTEXT(ctx);
2039 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
2040 if (ctx->Driver.Finish) {
2041 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002042 }
2043}
2044
2045
2046
Brian Paulfa9df402000-02-02 19:16:46 +00002047void
2048_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002049{
Brian Paulfa9df402000-02-02 19:16:46 +00002050 GET_CURRENT_CONTEXT(ctx);
2051 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
2052 if (ctx->Driver.Flush) {
2053 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002054 }
jtgafb833d1999-08-19 00:55:39 +00002055}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002056
2057
2058
2059const char *_mesa_prim_name[GL_POLYGON+2] = {
2060 "GL_POINTS",
2061 "GL_LINES",
2062 "GL_LINE_LOOP",
2063 "GL_LINE_STRIP",
2064 "GL_TRIANGLES",
2065 "GL_TRIANGLE_STRIP",
2066 "GL_TRIANGLE_FAN",
2067 "GL_QUADS",
2068 "GL_QUAD_STRIP",
2069 "GL_POLYGON",
2070 "culled primitive"
2071};
2072