blob: 5adbeb87714a601790a818250b101ec073a9d82c [file] [log] [blame]
Brian Paul26f3b052000-07-19 20:58:59 +00001/* $Id: context.c,v 1.79 2000/07/19 20:58:59 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paulfbd8f211999-11-11 01:22:25 +00005 * Version: 3.3
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
77
78/**********************************************************************/
79/***** Context and Thread management *****/
80/**********************************************************************/
81
82
Brian Paul00037781999-12-17 14:52:35 +000083#if !defined(THREADS)
jtgafb833d1999-08-19 00:55:39 +000084
Brian Paul5666c632000-01-18 17:36:16 +000085struct immediate *_mesa_CurrentInput = NULL;
jtgafb833d1999-08-19 00:55:39 +000086
Brian Paul00037781999-12-17 14:52:35 +000087#endif
jtgafb833d1999-08-19 00:55:39 +000088
89
jtgafb833d1999-08-19 00:55:39 +000090/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +000091/***** GL Visual allocation/destruction *****/
92/**********************************************************************/
93
94
95/*
96 * Allocate a new GLvisual object.
97 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +000098 * dbFlag - double buffering?
99 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000100 * depthBits - requested bits per depth buffer value
101 * Any value in [0, 32] is acceptable but the actual
102 * depth type will be GLushort or GLuint as needed.
103 * stencilBits - requested minimum bits per stencil buffer value
104 * accumBits - requested minimum bits per accum buffer component
105 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
106 * red/green/blue/alphaBits - number of bits per color component
107 * in frame buffer for RGB(A) mode.
108 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000109 * Return: pointer to new GLvisual or NULL if requested parameters can't
110 * be met.
111 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000112GLvisual *
113_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000114 GLboolean dbFlag,
115 GLboolean stereoFlag,
116 GLint redBits,
117 GLint greenBits,
118 GLint blueBits,
119 GLint alphaBits,
120 GLint indexBits,
121 GLint depthBits,
122 GLint stencilBits,
123 GLint accumRedBits,
124 GLint accumGreenBits,
125 GLint accumBlueBits,
126 GLint accumAlphaBits,
127 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000128{
Brian Paul178a1c52000-04-22 01:05:00 +0000129 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
130 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000131 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000132 redBits, greenBits, blueBits, alphaBits,
133 indexBits, depthBits, stencilBits,
134 accumRedBits, accumGreenBits,
135 accumBlueBits, accumAlphaBits,
136 numSamples )) {
137 FREE(vis);
138 return NULL;
139 }
140 }
141 return vis;
142}
143
144
145/*
146 * Initialize the fields of the given GLvisual.
147 * Input: see _mesa_create_visual() above.
148 * Return: GL_TRUE = success
149 * GL_FALSE = failure.
150 */
151GLboolean
152_mesa_initialize_visual( GLvisual *vis,
153 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000154 GLboolean dbFlag,
155 GLboolean stereoFlag,
156 GLint redBits,
157 GLint greenBits,
158 GLint blueBits,
159 GLint alphaBits,
160 GLint indexBits,
161 GLint depthBits,
162 GLint stencilBits,
163 GLint accumRedBits,
164 GLint accumGreenBits,
165 GLint accumBlueBits,
166 GLint accumAlphaBits,
167 GLint numSamples )
168{
169 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000170
Brian Pauled30dfa2000-03-03 17:47:39 +0000171 /* This is to catch bad values from device drivers not updated for
172 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
173 * bad value now (a 1-bit depth buffer!?!).
174 */
175 assert(depthBits == 0 || depthBits > 1);
176
177 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000178 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000179 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000180 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000181 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000182 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000183 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000184 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000185 }
186 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000187 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000188 }
189 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000190 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000191 }
192 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000193 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000194 }
195
196 vis->RGBAflag = rgbFlag;
197 vis->DBflag = dbFlag;
198 vis->StereoFlag = stereoFlag;
199 vis->RedBits = redBits;
200 vis->GreenBits = greenBits;
201 vis->BlueBits = blueBits;
Brian Paule70c6232000-05-04 13:53:55 +0000202 vis->AlphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000203
Brian Paulb371e0d2000-03-31 01:05:51 +0000204 vis->IndexBits = indexBits;
205 vis->DepthBits = depthBits;
206 vis->AccumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
207 vis->AccumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
208 vis->AccumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
209 vis->AccumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
210 vis->StencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Paul4d053dd2000-01-14 04:45:47 +0000211
Brian Pauled30dfa2000-03-03 17:47:39 +0000212 if (depthBits == 0) {
213 /* Special case. Even if we don't have a depth buffer we need
214 * good values for DepthMax for Z vertex transformation purposes.
215 */
216 vis->DepthMax = 1;
217 vis->DepthMaxF = 1.0F;
218 }
Brian Paul3a94f5c2000-05-18 18:12:36 +0000219 else if (depthBits < 32) {
Brian Pauled30dfa2000-03-03 17:47:39 +0000220 vis->DepthMax = (1 << depthBits) - 1;
221 vis->DepthMaxF = (GLfloat) vis->DepthMax;
222 }
Brian Paul3a94f5c2000-05-18 18:12:36 +0000223 else {
224 /* Special case since shift values greater than or equal to the
225 * number of bits in the left hand expression's type are
226 * undefined.
227 */
228 vis->DepthMax = 0xffffffff;
229 vis->DepthMaxF = (GLfloat) vis->DepthMax;
230 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000231
Brian Paul178a1c52000-04-22 01:05:00 +0000232 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000233}
234
235
Brian Paulb371e0d2000-03-31 01:05:51 +0000236/* This function should no longer be used. Use _mesa_create_visual() instead */
Brian Paul178a1c52000-04-22 01:05:00 +0000237GLvisual *
238gl_create_visual( GLboolean rgbFlag,
239 GLboolean alphaFlag,
240 GLboolean dbFlag,
241 GLboolean stereoFlag,
242 GLint depthBits,
243 GLint stencilBits,
244 GLint accumBits,
245 GLint indexBits,
246 GLint redBits,
247 GLint greenBits,
248 GLint blueBits,
249 GLint alphaBits )
Brian Paulb371e0d2000-03-31 01:05:51 +0000250{
Brian Paule70c6232000-05-04 13:53:55 +0000251 (void) alphaFlag;
252 return _mesa_create_visual(rgbFlag, dbFlag, stereoFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000253 redBits, greenBits, blueBits, alphaBits,
254 indexBits, depthBits, stencilBits,
255 accumBits, accumBits, accumBits, accumBits, 0);
256}
Brian Paul4d053dd2000-01-14 04:45:47 +0000257
Brian Paulb371e0d2000-03-31 01:05:51 +0000258
259void
260_mesa_destroy_visual( GLvisual *vis )
261{
262 FREE(vis);
263}
264
265
266/* obsolete */
Brian Paul178a1c52000-04-22 01:05:00 +0000267void
268gl_destroy_visual( GLvisual *vis )
Brian Paul4d053dd2000-01-14 04:45:47 +0000269{
Brian Paulb371e0d2000-03-31 01:05:51 +0000270 _mesa_destroy_visual(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000271}
272
273
274
275/**********************************************************************/
276/***** GL Framebuffer allocation/destruction *****/
277/**********************************************************************/
278
279
280/*
281 * Create a new framebuffer. A GLframebuffer is a struct which
282 * encapsulates the depth, stencil and accum buffers and related
283 * parameters.
284 * Input: visual - a GLvisual pointer
285 * softwareDepth - create/use a software depth buffer?
286 * softwareStencil - create/use a software stencil buffer?
287 * softwareAccum - create/use a software accum buffer?
288 * softwareAlpha - create/use a software alpha buffer?
289
290 * Return: pointer to new GLframebuffer struct or NULL if error.
291 */
Brian Paul178a1c52000-04-22 01:05:00 +0000292GLframebuffer *
293gl_create_framebuffer( GLvisual *visual,
294 GLboolean softwareDepth,
295 GLboolean softwareStencil,
296 GLboolean softwareAccum,
297 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000298{
Brian Paul178a1c52000-04-22 01:05:00 +0000299 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
300 assert(visual);
301 if (buffer) {
302 _mesa_initialize_framebuffer(buffer, visual,
303 softwareDepth, softwareStencil,
304 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000305 }
Brian Paul178a1c52000-04-22 01:05:00 +0000306 return buffer;
307}
308
309
310/*
311 * Initialize a GLframebuffer object.
312 * Input: See gl_create_framebuffer() above.
313 */
314void
315_mesa_initialize_framebuffer( GLframebuffer *buffer,
316 GLvisual *visual,
317 GLboolean softwareDepth,
318 GLboolean softwareStencil,
319 GLboolean softwareAccum,
320 GLboolean softwareAlpha )
321{
322 assert(buffer);
323 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000324
325 /* sanity checks */
326 if (softwareDepth ) {
327 assert(visual->DepthBits > 0);
328 }
329 if (softwareStencil) {
330 assert(visual->StencilBits > 0);
331 }
332 if (softwareAccum) {
333 assert(visual->RGBAflag);
Brian Paulb371e0d2000-03-31 01:05:51 +0000334 assert(visual->AccumRedBits > 0);
335 assert(visual->AccumGreenBits > 0);
336 assert(visual->AccumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000337 }
338 if (softwareAlpha) {
339 assert(visual->RGBAflag);
340 assert(visual->AlphaBits > 0);
341 }
342
343 buffer->Visual = visual;
344 buffer->UseSoftwareDepthBuffer = softwareDepth;
345 buffer->UseSoftwareStencilBuffer = softwareStencil;
346 buffer->UseSoftwareAccumBuffer = softwareAccum;
347 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000348}
349
350
Brian Paul4d053dd2000-01-14 04:45:47 +0000351/*
352 * Free a framebuffer struct and its buffers.
353 */
Brian Paul178a1c52000-04-22 01:05:00 +0000354void
355gl_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000356{
357 if (buffer) {
Brian Paul650cb742000-03-17 15:31:52 +0000358 if (buffer->DepthBuffer) {
359 FREE( buffer->DepthBuffer );
Brian Paul4d053dd2000-01-14 04:45:47 +0000360 }
361 if (buffer->Accum) {
362 FREE( buffer->Accum );
363 }
364 if (buffer->Stencil) {
365 FREE( buffer->Stencil );
366 }
367 if (buffer->FrontLeftAlpha) {
368 FREE( buffer->FrontLeftAlpha );
369 }
370 if (buffer->BackLeftAlpha) {
371 FREE( buffer->BackLeftAlpha );
372 }
373 if (buffer->FrontRightAlpha) {
374 FREE( buffer->FrontRightAlpha );
375 }
376 if (buffer->BackRightAlpha) {
377 FREE( buffer->BackRightAlpha );
378 }
379 FREE(buffer);
380 }
381}
382
383
384
385/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000386/***** Context allocation, initialization, destroying *****/
387/**********************************************************************/
388
389
Brian Paul9560f052000-01-31 23:11:39 +0000390_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
391
392
jtgafb833d1999-08-19 00:55:39 +0000393/*
394 * This function just calls all the various one-time-init functions in Mesa.
395 */
Brian Paul178a1c52000-04-22 01:05:00 +0000396static void
397one_time_init( void )
jtgafb833d1999-08-19 00:55:39 +0000398{
399 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000400 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000401 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000402 /* do some implementation tests */
403 assert( sizeof(GLbyte) == 1 );
404 assert( sizeof(GLshort) >= 2 );
405 assert( sizeof(GLint) >= 4 );
406 assert( sizeof(GLubyte) == 1 );
407 assert( sizeof(GLushort) >= 2 );
408 assert( sizeof(GLuint) >= 4 );
409
jtgafb833d1999-08-19 00:55:39 +0000410 gl_init_clip();
411 gl_init_eval();
Brian Paul5829f0c2000-02-02 22:21:39 +0000412 _mesa_init_fog();
Brian Paul780c4e02000-03-22 23:20:12 +0000413 _mesa_init_math();
jtgafb833d1999-08-19 00:55:39 +0000414 gl_init_lists();
415 gl_init_shade();
416 gl_init_texture();
417 gl_init_transformation();
418 gl_init_translate();
419 gl_init_vbrender();
420 gl_init_vbxform();
Keith Whitwell38756791999-08-29 10:26:31 +0000421 gl_init_vertices();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000422
423 if (getenv("MESA_DEBUG")) {
424 _glapi_noop_enable_warnings(GL_TRUE);
425 }
426 else {
427 _glapi_noop_enable_warnings(GL_FALSE);
428 }
429
jtgafb833d1999-08-19 00:55:39 +0000430#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
431 fprintf(stderr, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
432#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000433
434 alreadyCalled = GL_TRUE;
435 }
Brian Paul9560f052000-01-31 23:11:39 +0000436 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000437}
438
439
Brian Paul4d053dd2000-01-14 04:45:47 +0000440
jtgafb833d1999-08-19 00:55:39 +0000441/*
442 * Allocate and initialize a shared context state structure.
443 */
Brian Paul178a1c52000-04-22 01:05:00 +0000444static struct gl_shared_state *
445alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000446{
Brian Paul6e6d4c61999-10-09 20:17:07 +0000447 GLuint d;
jtgafb833d1999-08-19 00:55:39 +0000448 struct gl_shared_state *ss;
449 GLboolean outOfMemory;
450
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000451 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000452 if (!ss)
453 return NULL;
454
Brian Paulbb797902000-01-24 16:19:54 +0000455 ss->DisplayList = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000456
Brian Paulbb797902000-01-24 16:19:54 +0000457 ss->TexObjects = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000458
459 /* Default Texture objects */
460 outOfMemory = GL_FALSE;
Brian Paul6e6d4c61999-10-09 20:17:07 +0000461 for (d = 1 ; d <= 3 ; d++) {
462 ss->DefaultD[d] = gl_alloc_texture_object(ss, 0, d);
463 if (!ss->DefaultD[d]) {
464 outOfMemory = GL_TRUE;
465 break;
jtgafb833d1999-08-19 00:55:39 +0000466 }
Brian Paul6e6d4c61999-10-09 20:17:07 +0000467 ss->DefaultD[d]->RefCount++; /* don't free if not in use */
jtgafb833d1999-08-19 00:55:39 +0000468 }
469
Brian Paul413d6a22000-05-26 14:44:59 +0000470 ss->DefaultCubeMap = gl_alloc_texture_object(ss, 0, 6);
471 if (!ss->DefaultCubeMap) {
472 outOfMemory = GL_TRUE;
473 }
474 else {
475 ss->DefaultCubeMap->RefCount++;
476 }
477
jtgafb833d1999-08-19 00:55:39 +0000478 if (!ss->DisplayList || !ss->TexObjects || outOfMemory) {
479 /* Ran out of memory at some point. Free everything and return NULL */
480 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000481 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000482 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000483 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul6e6d4c61999-10-09 20:17:07 +0000484 if (ss->DefaultD[1])
485 gl_free_texture_object(ss, ss->DefaultD[1]);
486 if (ss->DefaultD[2])
487 gl_free_texture_object(ss, ss->DefaultD[2]);
488 if (ss->DefaultD[3])
489 gl_free_texture_object(ss, ss->DefaultD[3]);
Brian Paul413d6a22000-05-26 14:44:59 +0000490 if (ss->DefaultCubeMap)
491 gl_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000492 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000493 return NULL;
494 }
495 else {
496 return ss;
497 }
498}
499
500
501/*
502 * Deallocate a shared state context and all children structures.
503 */
Brian Paul178a1c52000-04-22 01:05:00 +0000504static void
505free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000506{
507 /* Free display lists */
508 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000509 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000510 if (list) {
511 gl_destroy_list(ctx, list);
512 }
513 else {
514 break;
515 }
516 }
Brian Paulbb797902000-01-24 16:19:54 +0000517 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000518
519 /* Free texture objects */
520 while (ss->TexObjectList)
521 {
522 if (ctx->Driver.DeleteTexture)
523 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
524 /* this function removes from linked list too! */
525 gl_free_texture_object(ss, ss->TexObjectList);
526 }
Brian Paulbb797902000-01-24 16:19:54 +0000527 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000528
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000529 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000530}
531
532
533
jtgafb833d1999-08-19 00:55:39 +0000534/*
535 * Initialize the nth light. Note that the defaults for light 0 are
536 * different than the other lights.
537 */
Brian Paul178a1c52000-04-22 01:05:00 +0000538static void
539init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000540{
541 make_empty_list( l );
542
543 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
544 if (n==0) {
545 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
546 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
547 }
548 else {
549 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
550 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
551 }
552 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
553 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
554 l->SpotExponent = 0.0;
555 gl_compute_spot_exp_table( l );
556 l->SpotCutoff = 180.0;
557 l->CosCutoff = 0.0; /* KW: -ve values not admitted */
558 l->ConstantAttenuation = 1.0;
559 l->LinearAttenuation = 0.0;
560 l->QuadraticAttenuation = 0.0;
561 l->Enabled = GL_FALSE;
562}
563
564
565
Brian Paul178a1c52000-04-22 01:05:00 +0000566static void
567init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000568{
569 ASSIGN_4V( lm->Ambient, 0.2, 0.2, 0.2, 1.0 );
570 lm->LocalViewer = GL_FALSE;
571 lm->TwoSide = GL_FALSE;
572 lm->ColorControl = GL_SINGLE_COLOR;
573}
574
575
Brian Paul178a1c52000-04-22 01:05:00 +0000576static void
577init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000578{
579 ASSIGN_4V( m->Ambient, 0.2, 0.2, 0.2, 1.0 );
580 ASSIGN_4V( m->Diffuse, 0.8, 0.8, 0.8, 1.0 );
581 ASSIGN_4V( m->Specular, 0.0, 0.0, 0.0, 1.0 );
582 ASSIGN_4V( m->Emission, 0.0, 0.0, 0.0, 1.0 );
583 m->Shininess = 0.0;
584 m->AmbientIndex = 0;
585 m->DiffuseIndex = 1;
586 m->SpecularIndex = 1;
587}
588
589
590
Brian Paul178a1c52000-04-22 01:05:00 +0000591static void
592init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000593{
594 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
595
596 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000597 texUnit->CombineModeRGB = GL_MODULATE;
598 texUnit->CombineModeA = GL_MODULATE;
599 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
600 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
601 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
602 texUnit->CombineSourceA[0] = GL_TEXTURE;
603 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
604 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
605 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
606 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
607 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
608 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
609 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
610 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
611 texUnit->CombineScaleShiftRGB = 0;
612 texUnit->CombineScaleShiftA = 0;
613
jtgafb833d1999-08-19 00:55:39 +0000614 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
615 texUnit->TexGenEnabled = 0;
616 texUnit->GenModeS = GL_EYE_LINEAR;
617 texUnit->GenModeT = GL_EYE_LINEAR;
618 texUnit->GenModeR = GL_EYE_LINEAR;
619 texUnit->GenModeQ = GL_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000620 texUnit->GenBitS = TEXGEN_EYE_LINEAR;
621 texUnit->GenBitT = TEXGEN_EYE_LINEAR;
622 texUnit->GenBitR = TEXGEN_EYE_LINEAR;
623 texUnit->GenBitQ = TEXGEN_EYE_LINEAR;
624
jtgafb833d1999-08-19 00:55:39 +0000625 /* Yes, these plane coefficients are correct! */
626 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
627 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
628 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
629 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
630 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
631 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
632 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
633 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
634
Brian Paul6e6d4c61999-10-09 20:17:07 +0000635 texUnit->CurrentD[1] = ctx->Shared->DefaultD[1];
636 texUnit->CurrentD[2] = ctx->Shared->DefaultD[2];
637 texUnit->CurrentD[3] = ctx->Shared->DefaultD[3];
Brian Paul413d6a22000-05-26 14:44:59 +0000638 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
jtgafb833d1999-08-19 00:55:39 +0000639}
640
641
Brian Paul178a1c52000-04-22 01:05:00 +0000642static void
643init_fallback_arrays( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000644{
645 struct gl_client_array *cl;
646 GLuint i;
647
648 cl = &ctx->Fallback.Normal;
649 cl->Size = 3;
650 cl->Type = GL_FLOAT;
651 cl->Stride = 0;
652 cl->StrideB = 0;
653 cl->Ptr = (void *) ctx->Current.Normal;
654 cl->Enabled = 1;
655
656 cl = &ctx->Fallback.Color;
657 cl->Size = 4;
658 cl->Type = GL_UNSIGNED_BYTE;
659 cl->Stride = 0;
660 cl->StrideB = 0;
661 cl->Ptr = (void *) ctx->Current.ByteColor;
662 cl->Enabled = 1;
663
664 cl = &ctx->Fallback.Index;
665 cl->Size = 1;
666 cl->Type = GL_UNSIGNED_INT;
667 cl->Stride = 0;
668 cl->StrideB = 0;
669 cl->Ptr = (void *) &ctx->Current.Index;
670 cl->Enabled = 1;
671
672 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
673 cl = &ctx->Fallback.TexCoord[i];
674 cl->Size = 4;
675 cl->Type = GL_FLOAT;
676 cl->Stride = 0;
677 cl->StrideB = 0;
678 cl->Ptr = (void *) ctx->Current.Texcoord[i];
679 cl->Enabled = 1;
680 }
681
682 cl = &ctx->Fallback.EdgeFlag;
683 cl->Size = 1;
684 cl->Type = GL_UNSIGNED_BYTE;
685 cl->Stride = 0;
686 cl->StrideB = 0;
687 cl->Ptr = (void *) &ctx->Current.EdgeFlag;
688 cl->Enabled = 1;
689}
690
Brian Paul4d053dd2000-01-14 04:45:47 +0000691
jtgafb833d1999-08-19 00:55:39 +0000692/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000693static void
694init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000695{
696 map->Order = 1;
697 map->u1 = 0.0;
698 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000699 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000700 if (map->Points) {
701 GLint i;
702 for (i=0;i<n;i++)
703 map->Points[i] = initial[i];
704 }
jtgafb833d1999-08-19 00:55:39 +0000705}
706
707
708/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000709static void
710init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000711{
712 map->Uorder = 1;
713 map->Vorder = 1;
714 map->u1 = 0.0;
715 map->u2 = 1.0;
716 map->v1 = 0.0;
717 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000718 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000719 if (map->Points) {
720 GLint i;
721 for (i=0;i<n;i++)
722 map->Points[i] = initial[i];
723 }
jtgafb833d1999-08-19 00:55:39 +0000724}
725
726
jtgafb833d1999-08-19 00:55:39 +0000727/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000728 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000729 */
Brian Paul178a1c52000-04-22 01:05:00 +0000730static void
731init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000732{
733 GLuint i, j;
734
Brian Paul4d053dd2000-01-14 04:45:47 +0000735 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000736
Brian Paul539cce52000-02-03 19:40:07 +0000737 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000738 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
739 ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
Brian Paul86fc3702000-05-22 16:33:20 +0000740 ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize;
Brian Paul4d053dd2000-01-14 04:45:47 +0000741 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
742 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000743 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
744 ctx->Const.MinPointSize = MIN_POINT_SIZE;
745 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
746 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
747 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
748 ctx->Const.PointSizeGranularity = POINT_SIZE_GRANULARITY;
749 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
750 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
751 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
752 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
753 ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
754 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000755 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000756 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
757 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000758 ctx->Const.NumCompressedTextureFormats = 0;
jtgafb833d1999-08-19 00:55:39 +0000759
Brian Paul4d053dd2000-01-14 04:45:47 +0000760 /* Modelview matrix */
761 gl_matrix_ctr( &ctx->ModelView );
762 gl_matrix_alloc_inv( &ctx->ModelView );
763
764 ctx->ModelViewStackDepth = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000765 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000766 gl_matrix_ctr( &ctx->ModelViewStack[i] );
767 gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
768 }
769
770 /* Projection matrix - need inv for user clipping in clip space*/
771 gl_matrix_ctr( &ctx->ProjectionMatrix );
772 gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
773
774 gl_matrix_ctr( &ctx->ModelProjectMatrix );
775 gl_matrix_ctr( &ctx->ModelProjectWinMatrix );
776 ctx->ModelProjectWinMatrixUptodate = GL_FALSE;
777
778 ctx->ProjectionStackDepth = 0;
779 ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
780 ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
781
Brian Paul7fc29c52000-03-06 17:03:03 +0000782 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000783 gl_matrix_ctr( &ctx->ProjectionStack[i] );
784 gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
785 }
786
787 /* Texture matrix */
Brian Paul904ecb22000-06-27 23:38:45 +0000788 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000789 gl_matrix_ctr( &ctx->TextureMatrix[i] );
790 ctx->TextureStackDepth[i] = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000791 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
Brian Paul904ecb22000-06-27 23:38:45 +0000792 gl_matrix_ctr( &ctx->TextureStack[i][j] );
Brian Paul4d053dd2000-01-14 04:45:47 +0000793 ctx->TextureStack[i][j].inv = 0;
jtgafb833d1999-08-19 00:55:39 +0000794 }
Brian Paul4d053dd2000-01-14 04:45:47 +0000795 }
jtgafb833d1999-08-19 00:55:39 +0000796
Brian Paul250069d2000-04-08 18:57:45 +0000797 /* Color matrix */
798 gl_matrix_ctr(&ctx->ColorMatrix);
799 ctx->ColorStackDepth = 0;
800 for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
801 gl_matrix_ctr(&ctx->ColorStack[j]);
802 }
803
Brian Paul4d053dd2000-01-14 04:45:47 +0000804 /* Accumulate buffer group */
805 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000806
Brian Paul4d053dd2000-01-14 04:45:47 +0000807 /* Color buffer group */
808 ctx->Color.IndexMask = 0xffffffff;
809 ctx->Color.ColorMask[0] = 0xff;
810 ctx->Color.ColorMask[1] = 0xff;
811 ctx->Color.ColorMask[2] = 0xff;
812 ctx->Color.ColorMask[3] = 0xff;
813 ctx->Color.SWmasking = GL_FALSE;
814 ctx->Color.ClearIndex = 0;
815 ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
816 ctx->Color.DrawBuffer = GL_FRONT;
817 ctx->Color.AlphaEnabled = GL_FALSE;
818 ctx->Color.AlphaFunc = GL_ALWAYS;
819 ctx->Color.AlphaRef = 0;
820 ctx->Color.BlendEnabled = GL_FALSE;
821 ctx->Color.BlendSrcRGB = GL_ONE;
822 ctx->Color.BlendDstRGB = GL_ZERO;
823 ctx->Color.BlendSrcA = GL_ONE;
824 ctx->Color.BlendDstA = GL_ZERO;
825 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
826 ctx->Color.BlendFunc = NULL; /* this pointer set only when needed */
827 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
828 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
829 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
830 ctx->Color.SWLogicOpEnabled = GL_FALSE;
831 ctx->Color.LogicOp = GL_COPY;
832 ctx->Color.DitherFlag = GL_TRUE;
833 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000834
Brian Paul4d053dd2000-01-14 04:45:47 +0000835 /* Current group */
836 ASSIGN_4V( ctx->Current.ByteColor, 255, 255, 255, 255);
837 ctx->Current.Index = 1;
838 for (i=0; i<MAX_TEXTURE_UNITS; i++)
839 ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
840 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
841 ctx->Current.RasterDistance = 0.0;
842 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
843 ctx->Current.RasterIndex = 1;
844 for (i=0; i<MAX_TEXTURE_UNITS; i++)
845 ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
846 ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
847 ctx->Current.RasterPosValid = GL_TRUE;
848 ctx->Current.EdgeFlag = GL_TRUE;
849 ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
850 ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
jtgafb833d1999-08-19 00:55:39 +0000851
Brian Paul4d053dd2000-01-14 04:45:47 +0000852 ctx->Current.Flag = (VERT_NORM|VERT_INDEX|VERT_RGBA|VERT_EDGE|
853 VERT_TEX0_1|VERT_TEX1_1|VERT_MATERIAL);
jtgafb833d1999-08-19 00:55:39 +0000854
Brian Paul4d053dd2000-01-14 04:45:47 +0000855 init_fallback_arrays( ctx );
jtgafb833d1999-08-19 00:55:39 +0000856
Brian Paul4d053dd2000-01-14 04:45:47 +0000857 /* Depth buffer group */
858 ctx->Depth.Test = GL_FALSE;
859 ctx->Depth.Clear = 1.0;
860 ctx->Depth.Func = GL_LESS;
861 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000862 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000863
Brian Paul4d053dd2000-01-14 04:45:47 +0000864 /* Evaluators group */
865 ctx->Eval.Map1Color4 = GL_FALSE;
866 ctx->Eval.Map1Index = GL_FALSE;
867 ctx->Eval.Map1Normal = GL_FALSE;
868 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
869 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
870 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
871 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
872 ctx->Eval.Map1Vertex3 = GL_FALSE;
873 ctx->Eval.Map1Vertex4 = GL_FALSE;
874 ctx->Eval.Map2Color4 = GL_FALSE;
875 ctx->Eval.Map2Index = GL_FALSE;
876 ctx->Eval.Map2Normal = GL_FALSE;
877 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
878 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
879 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
880 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
881 ctx->Eval.Map2Vertex3 = GL_FALSE;
882 ctx->Eval.Map2Vertex4 = GL_FALSE;
883 ctx->Eval.AutoNormal = GL_FALSE;
884 ctx->Eval.MapGrid1un = 1;
885 ctx->Eval.MapGrid1u1 = 0.0;
886 ctx->Eval.MapGrid1u2 = 1.0;
887 ctx->Eval.MapGrid2un = 1;
888 ctx->Eval.MapGrid2vn = 1;
889 ctx->Eval.MapGrid2u1 = 0.0;
890 ctx->Eval.MapGrid2u2 = 1.0;
891 ctx->Eval.MapGrid2v1 = 0.0;
892 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000893
Brian Paul4d053dd2000-01-14 04:45:47 +0000894 /* Evaluator data */
895 {
896 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
897 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
898 static GLfloat index[1] = { 1.0 };
899 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
900 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +0000901
Brian Paul4d053dd2000-01-14 04:45:47 +0000902 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
903 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
904 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
905 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
906 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
907 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
908 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
909 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
910 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
jtgafb833d1999-08-19 00:55:39 +0000911
Brian Paul4d053dd2000-01-14 04:45:47 +0000912 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
913 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
914 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
915 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
916 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
917 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
918 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
919 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
920 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
921 }
jtgafb833d1999-08-19 00:55:39 +0000922
Brian Paul4d053dd2000-01-14 04:45:47 +0000923 /* Fog group */
924 ctx->Fog.Enabled = GL_FALSE;
925 ctx->Fog.Mode = GL_EXP;
926 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
927 ctx->Fog.Index = 0.0;
928 ctx->Fog.Density = 1.0;
929 ctx->Fog.Start = 0.0;
930 ctx->Fog.End = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000931
Brian Paul4d053dd2000-01-14 04:45:47 +0000932 /* Hint group */
933 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
934 ctx->Hint.PointSmooth = GL_DONT_CARE;
935 ctx->Hint.LineSmooth = GL_DONT_CARE;
936 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
937 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000938 ctx->Hint.AllowDrawWin = GL_TRUE;
Brian Paul8cce3142000-04-10 15:52:25 +0000939 ctx->Hint.AllowDrawFrg = GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000940 ctx->Hint.AllowDrawMem = GL_TRUE;
941 ctx->Hint.StrictLighting = GL_TRUE;
Brian Paul1207bf02000-05-23 20:10:49 +0000942 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
943 ctx->Hint.TextureCompression = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +0000944
Brian Paul0771d152000-04-07 00:19:41 +0000945 /* Histogram group */
946 ctx->Histogram.Width = 0;
947 ctx->Histogram.Format = GL_RGBA;
948 ctx->Histogram.Sink = GL_FALSE;
949 ctx->Histogram.RedSize = 0xffffffff;
950 ctx->Histogram.GreenSize = 0xffffffff;
951 ctx->Histogram.BlueSize = 0xffffffff;
952 ctx->Histogram.AlphaSize = 0xffffffff;
953 ctx->Histogram.LuminanceSize = 0xffffffff;
954 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
955 ctx->Histogram.Count[i][0] = 0;
956 ctx->Histogram.Count[i][1] = 0;
957 ctx->Histogram.Count[i][2] = 0;
958 ctx->Histogram.Count[i][3] = 0;
959 }
960
961 /* Min/Max group */
962 ctx->MinMax.Format = GL_RGBA;
963 ctx->MinMax.Sink = GL_FALSE;
964 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
965 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
966 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
967 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
968
969
970
Brian Paul4d053dd2000-01-14 04:45:47 +0000971 /* Pipeline */
972 gl_pipeline_init( ctx );
973 gl_cva_init( ctx );
jtgafb833d1999-08-19 00:55:39 +0000974
Brian Paul4d053dd2000-01-14 04:45:47 +0000975 /* Extensions */
976 gl_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +0000977
Brian Paul4d053dd2000-01-14 04:45:47 +0000978 ctx->AllowVertexCull = CLIP_CULLED_BIT;
jtgafb833d1999-08-19 00:55:39 +0000979
Brian Paul4d053dd2000-01-14 04:45:47 +0000980 /* Lighting group */
981 for (i=0;i<MAX_LIGHTS;i++) {
982 init_light( &ctx->Light.Light[i], i );
983 }
984 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +0000985
Brian Paul4d053dd2000-01-14 04:45:47 +0000986 init_lightmodel( &ctx->Light.Model );
987 init_material( &ctx->Light.Material[0] );
988 init_material( &ctx->Light.Material[1] );
989 ctx->Light.ShadeModel = GL_SMOOTH;
990 ctx->Light.Enabled = GL_FALSE;
991 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
992 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
993 ctx->Light.ColorMaterialBitmask
994 = gl_material_bitmask( ctx,
995 GL_FRONT_AND_BACK,
996 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +0000997
Brian Paul4d053dd2000-01-14 04:45:47 +0000998 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000999
Brian Paul4d053dd2000-01-14 04:45:47 +00001000 /* Lighting miscellaneous */
1001 ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1002 make_empty_list( ctx->ShineTabList );
1003 for (i = 0 ; i < 10 ; i++) {
1004 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1005 s->shininess = -1;
1006 s->refcount = 0;
1007 insert_at_tail( ctx->ShineTabList, s );
1008 }
1009 for (i = 0 ; i < 4 ; i++) {
1010 ctx->ShineTable[i] = ctx->ShineTabList->prev;
1011 ctx->ShineTable[i]->refcount++;
1012 }
jtgafb833d1999-08-19 00:55:39 +00001013
Brian Paul77d61af2000-06-28 04:20:21 +00001014 gl_compute_shine_table( ctx, 0, ctx->Light.Material[0].Shininess );
1015 gl_compute_shine_table( ctx, 2, ctx->Light.Material[0].Shininess * .5 );
1016 gl_compute_shine_table( ctx, 1, ctx->Light.Material[1].Shininess );
1017 gl_compute_shine_table( ctx, 3, ctx->Light.Material[1].Shininess * .5 );
1018
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;
1024 ctx->Line.StipplePattern = 0xffff;
1025 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001026
Brian Paul4d053dd2000-01-14 04:45:47 +00001027 /* Display List group */
1028 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001029
Brian Paul4d053dd2000-01-14 04:45:47 +00001030 /* Pixel group */
1031 ctx->Pixel.RedBias = 0.0;
1032 ctx->Pixel.RedScale = 1.0;
1033 ctx->Pixel.GreenBias = 0.0;
1034 ctx->Pixel.GreenScale = 1.0;
1035 ctx->Pixel.BlueBias = 0.0;
1036 ctx->Pixel.BlueScale = 1.0;
1037 ctx->Pixel.AlphaBias = 0.0;
1038 ctx->Pixel.AlphaScale = 1.0;
1039 ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
1040 ctx->Pixel.DepthBias = 0.0;
1041 ctx->Pixel.DepthScale = 1.0;
1042 ctx->Pixel.IndexOffset = 0;
1043 ctx->Pixel.IndexShift = 0;
1044 ctx->Pixel.ZoomX = 1.0;
1045 ctx->Pixel.ZoomY = 1.0;
1046 ctx->Pixel.MapColorFlag = GL_FALSE;
1047 ctx->Pixel.MapStencilFlag = GL_FALSE;
1048 ctx->Pixel.MapStoSsize = 1;
1049 ctx->Pixel.MapItoIsize = 1;
1050 ctx->Pixel.MapItoRsize = 1;
1051 ctx->Pixel.MapItoGsize = 1;
1052 ctx->Pixel.MapItoBsize = 1;
1053 ctx->Pixel.MapItoAsize = 1;
1054 ctx->Pixel.MapRtoRsize = 1;
1055 ctx->Pixel.MapGtoGsize = 1;
1056 ctx->Pixel.MapBtoBsize = 1;
1057 ctx->Pixel.MapAtoAsize = 1;
1058 ctx->Pixel.MapStoS[0] = 0;
1059 ctx->Pixel.MapItoI[0] = 0;
1060 ctx->Pixel.MapItoR[0] = 0.0;
1061 ctx->Pixel.MapItoG[0] = 0.0;
1062 ctx->Pixel.MapItoB[0] = 0.0;
1063 ctx->Pixel.MapItoA[0] = 0.0;
1064 ctx->Pixel.MapItoR8[0] = 0;
1065 ctx->Pixel.MapItoG8[0] = 0;
1066 ctx->Pixel.MapItoB8[0] = 0;
1067 ctx->Pixel.MapItoA8[0] = 0;
1068 ctx->Pixel.MapRtoR[0] = 0.0;
1069 ctx->Pixel.MapGtoG[0] = 0.0;
1070 ctx->Pixel.MapBtoB[0] = 0.0;
1071 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001072 ctx->Pixel.HistogramEnabled = GL_FALSE;
1073 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1074 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1075 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1076 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001077 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1078 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1079 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1080 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001081 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1082 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1083 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1084 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001085 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1086 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1087 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001088 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1089 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1090 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1091 for (i = 0; i < 3; i++) {
1092 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1093 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1094 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1095 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1096 }
1097 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1098 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001099
Brian Paul4d053dd2000-01-14 04:45:47 +00001100 /* Point group */
1101 ctx->Point.SmoothFlag = GL_FALSE;
Brian Paula25f7e12000-06-27 04:29:22 +00001102 ctx->Point.UserSize = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001103 ctx->Point.Size = 1.0;
1104 ctx->Point.Params[0] = 1.0;
1105 ctx->Point.Params[1] = 0.0;
1106 ctx->Point.Params[2] = 0.0;
1107 ctx->Point.Attenuated = GL_FALSE;
1108 ctx->Point.MinSize = 0.0;
1109 ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
1110 ctx->Point.Threshold = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001111
Brian Paul4d053dd2000-01-14 04:45:47 +00001112 /* Polygon group */
1113 ctx->Polygon.CullFlag = GL_FALSE;
1114 ctx->Polygon.CullFaceMode = GL_BACK;
1115 ctx->Polygon.FrontFace = GL_CCW;
1116 ctx->Polygon.FrontBit = 0;
1117 ctx->Polygon.FrontMode = GL_FILL;
1118 ctx->Polygon.BackMode = GL_FILL;
1119 ctx->Polygon.Unfilled = GL_FALSE;
1120 ctx->Polygon.SmoothFlag = GL_FALSE;
1121 ctx->Polygon.StippleFlag = GL_FALSE;
1122 ctx->Polygon.OffsetFactor = 0.0F;
1123 ctx->Polygon.OffsetUnits = 0.0F;
1124 ctx->Polygon.OffsetPoint = GL_FALSE;
1125 ctx->Polygon.OffsetLine = GL_FALSE;
1126 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001127
Brian Paul4d053dd2000-01-14 04:45:47 +00001128 /* Polygon Stipple group */
1129 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001130
Brian Paul4d053dd2000-01-14 04:45:47 +00001131 /* Scissor group */
1132 ctx->Scissor.Enabled = GL_FALSE;
1133 ctx->Scissor.X = 0;
1134 ctx->Scissor.Y = 0;
1135 ctx->Scissor.Width = 0;
1136 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001137
Brian Paul4d053dd2000-01-14 04:45:47 +00001138 /* Stencil group */
1139 ctx->Stencil.Enabled = GL_FALSE;
1140 ctx->Stencil.Function = GL_ALWAYS;
1141 ctx->Stencil.FailFunc = GL_KEEP;
1142 ctx->Stencil.ZPassFunc = GL_KEEP;
1143 ctx->Stencil.ZFailFunc = GL_KEEP;
1144 ctx->Stencil.Ref = 0;
1145 ctx->Stencil.ValueMask = STENCIL_MAX;
1146 ctx->Stencil.Clear = 0;
1147 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001148
Brian Paul4d053dd2000-01-14 04:45:47 +00001149 /* Texture group */
1150 ctx->Texture.CurrentUnit = 0; /* multitexture */
1151 ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
1152 ctx->Texture.Enabled = 0;
1153 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1154 init_texture_unit( ctx, i );
Brian Paul4bdcfe52000-04-17 17:57:04 +00001155 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001156
Brian Paul4d053dd2000-01-14 04:45:47 +00001157 /* Transformation group */
1158 ctx->Transform.MatrixMode = GL_MODELVIEW;
1159 ctx->Transform.Normalize = GL_FALSE;
1160 ctx->Transform.RescaleNormals = GL_FALSE;
1161 for (i=0;i<MAX_CLIP_PLANES;i++) {
1162 ctx->Transform.ClipEnabled[i] = GL_FALSE;
1163 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1164 }
1165 ctx->Transform.AnyClip = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001166
Brian Paul4d053dd2000-01-14 04:45:47 +00001167 /* Viewport group */
1168 ctx->Viewport.X = 0;
1169 ctx->Viewport.Y = 0;
1170 ctx->Viewport.Width = 0;
1171 ctx->Viewport.Height = 0;
1172 ctx->Viewport.Near = 0.0;
1173 ctx->Viewport.Far = 1.0;
1174 gl_matrix_ctr(&ctx->Viewport.WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001175
1176#define Sz 10
1177#define Tz 14
Brian Pauled30dfa2000-03-03 17:47:39 +00001178 ctx->Viewport.WindowMap.m[Sz] = 0.5 * ctx->Visual->DepthMaxF;
1179 ctx->Viewport.WindowMap.m[Tz] = 0.5 * ctx->Visual->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001180#undef Sz
1181#undef Tz
1182
Brian Paul4d053dd2000-01-14 04:45:47 +00001183 ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1184 ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001185
Brian Paul4d053dd2000-01-14 04:45:47 +00001186 /* Vertex arrays */
1187 ctx->Array.Vertex.Size = 4;
1188 ctx->Array.Vertex.Type = GL_FLOAT;
1189 ctx->Array.Vertex.Stride = 0;
1190 ctx->Array.Vertex.StrideB = 0;
1191 ctx->Array.Vertex.Ptr = NULL;
1192 ctx->Array.Vertex.Enabled = GL_FALSE;
1193 ctx->Array.Normal.Type = GL_FLOAT;
1194 ctx->Array.Normal.Stride = 0;
1195 ctx->Array.Normal.StrideB = 0;
1196 ctx->Array.Normal.Ptr = NULL;
1197 ctx->Array.Normal.Enabled = GL_FALSE;
1198 ctx->Array.Color.Size = 4;
1199 ctx->Array.Color.Type = GL_FLOAT;
1200 ctx->Array.Color.Stride = 0;
1201 ctx->Array.Color.StrideB = 0;
1202 ctx->Array.Color.Ptr = NULL;
1203 ctx->Array.Color.Enabled = GL_FALSE;
1204 ctx->Array.Index.Type = GL_FLOAT;
1205 ctx->Array.Index.Stride = 0;
1206 ctx->Array.Index.StrideB = 0;
1207 ctx->Array.Index.Ptr = NULL;
1208 ctx->Array.Index.Enabled = GL_FALSE;
1209 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1210 ctx->Array.TexCoord[i].Size = 4;
1211 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1212 ctx->Array.TexCoord[i].Stride = 0;
1213 ctx->Array.TexCoord[i].StrideB = 0;
1214 ctx->Array.TexCoord[i].Ptr = NULL;
1215 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
1216 }
1217 ctx->Array.TexCoordInterleaveFactor = 1;
1218 ctx->Array.EdgeFlag.Stride = 0;
1219 ctx->Array.EdgeFlag.StrideB = 0;
1220 ctx->Array.EdgeFlag.Ptr = NULL;
1221 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
1222 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1223
1224 /* Pixel transfer */
1225 ctx->Pack.Alignment = 4;
1226 ctx->Pack.RowLength = 0;
1227 ctx->Pack.ImageHeight = 0;
1228 ctx->Pack.SkipPixels = 0;
1229 ctx->Pack.SkipRows = 0;
1230 ctx->Pack.SkipImages = 0;
1231 ctx->Pack.SwapBytes = GL_FALSE;
1232 ctx->Pack.LsbFirst = GL_FALSE;
1233 ctx->Unpack.Alignment = 4;
1234 ctx->Unpack.RowLength = 0;
1235 ctx->Unpack.ImageHeight = 0;
1236 ctx->Unpack.SkipPixels = 0;
1237 ctx->Unpack.SkipRows = 0;
1238 ctx->Unpack.SkipImages = 0;
1239 ctx->Unpack.SwapBytes = GL_FALSE;
1240 ctx->Unpack.LsbFirst = GL_FALSE;
1241
1242 /* Feedback */
1243 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1244 ctx->Feedback.Buffer = NULL;
1245 ctx->Feedback.BufferSize = 0;
1246 ctx->Feedback.Count = 0;
1247
1248 /* Selection/picking */
1249 ctx->Select.Buffer = NULL;
1250 ctx->Select.BufferSize = 0;
1251 ctx->Select.BufferCount = 0;
1252 ctx->Select.Hits = 0;
1253 ctx->Select.NameStackDepth = 0;
1254
1255 /* Optimized Accum buffer */
1256 ctx->IntegerAccumMode = GL_TRUE;
1257 ctx->IntegerAccumScaler = 0.0;
1258
1259 /* Renderer and client attribute stacks */
1260 ctx->AttribStackDepth = 0;
1261 ctx->ClientAttribStackDepth = 0;
1262
Brian Paul13811372000-04-12 00:27:37 +00001263 /* Display list */
1264 ctx->CallDepth = 0;
1265 ctx->ExecuteFlag = GL_TRUE;
1266 ctx->CompileFlag = GL_FALSE;
1267 ctx->CurrentListPtr = NULL;
1268 ctx->CurrentBlock = NULL;
1269 ctx->CurrentListNum = 0;
1270 ctx->CurrentPos = 0;
1271
1272 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001273 _mesa_init_colortable(&ctx->ColorTable);
1274 _mesa_init_colortable(&ctx->ProxyColorTable);
1275 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1276 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1277 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1278 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001279
Brian Paul4d053dd2000-01-14 04:45:47 +00001280 /* Miscellaneous */
1281 ctx->NewState = NEW_ALL;
1282 ctx->RenderMode = GL_RENDER;
1283 ctx->StippleCounter = 0;
1284 ctx->NeedNormals = GL_FALSE;
1285 ctx->DoViewportMapping = GL_TRUE;
1286
1287 ctx->NeedEyeCoords = GL_FALSE;
1288 ctx->NeedEyeNormals = GL_FALSE;
1289 ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
1290
Brian Paul4d053dd2000-01-14 04:45:47 +00001291 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1292
1293 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001294 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001295 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001296
1297 /* For debug/development only */
1298 ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
1299 ctx->FirstTimeCurrent = GL_TRUE;
1300
1301 /* Dither disable */
1302 ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
1303 if (ctx->NoDither) {
1304 if (getenv("MESA_DEBUG")) {
1305 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001306 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001307 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001308 }
1309}
1310
1311
1312
1313
jtgafb833d1999-08-19 00:55:39 +00001314/*
1315 * Allocate the proxy textures. If we run out of memory part way through
1316 * the allocations clean up and return GL_FALSE.
1317 * Return: GL_TRUE=success, GL_FALSE=failure
1318 */
Brian Paul178a1c52000-04-22 01:05:00 +00001319static GLboolean
1320alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001321{
1322 GLboolean out_of_memory;
1323 GLint i;
1324
1325 ctx->Texture.Proxy1D = gl_alloc_texture_object(NULL, 0, 1);
1326 if (!ctx->Texture.Proxy1D) {
1327 return GL_FALSE;
1328 }
1329
1330 ctx->Texture.Proxy2D = gl_alloc_texture_object(NULL, 0, 2);
1331 if (!ctx->Texture.Proxy2D) {
1332 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1333 return GL_FALSE;
1334 }
1335
1336 ctx->Texture.Proxy3D = gl_alloc_texture_object(NULL, 0, 3);
1337 if (!ctx->Texture.Proxy3D) {
1338 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1339 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1340 return GL_FALSE;
1341 }
1342
1343 out_of_memory = GL_FALSE;
1344 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001345 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1346 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1347 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001348 if (!ctx->Texture.Proxy1D->Image[i]
1349 || !ctx->Texture.Proxy2D->Image[i]
1350 || !ctx->Texture.Proxy3D->Image[i]) {
1351 out_of_memory = GL_TRUE;
1352 }
1353 }
1354 if (out_of_memory) {
1355 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1356 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001357 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001358 }
1359 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001360 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001361 }
1362 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001363 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001364 }
1365 }
1366 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1367 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1368 gl_free_texture_object(NULL, ctx->Texture.Proxy3D);
1369 return GL_FALSE;
1370 }
1371 else {
1372 return GL_TRUE;
1373 }
1374}
1375
1376
1377
jtgafb833d1999-08-19 00:55:39 +00001378/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001379 * Initialize a GLcontext struct.
jtgafb833d1999-08-19 00:55:39 +00001380 */
Brian Paul178a1c52000-04-22 01:05:00 +00001381GLboolean
1382_mesa_initialize_context( GLcontext *ctx,
1383 GLvisual *visual,
1384 GLcontext *share_list,
1385 void *driver_ctx,
1386 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001387{
Brian Paul5fb84d22000-05-24 15:04:45 +00001388 GLuint dispatchSize;
1389
jtgafb833d1999-08-19 00:55:39 +00001390 (void) direct; /* not used */
1391
jtgafb833d1999-08-19 00:55:39 +00001392 /* misc one-time initializations */
1393 one_time_init();
1394
jtgafb833d1999-08-19 00:55:39 +00001395 ctx->DriverCtx = driver_ctx;
1396 ctx->Visual = visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001397 ctx->DrawBuffer = NULL;
1398 ctx->ReadBuffer = NULL;
jtgafb833d1999-08-19 00:55:39 +00001399
1400 ctx->VB = gl_vb_create_for_immediate( ctx );
1401 if (!ctx->VB) {
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001402 FREE( ctx );
Brian Paul4d053dd2000-01-14 04:45:47 +00001403 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001404 }
1405 ctx->input = ctx->VB->IM;
1406
1407 ctx->PB = gl_alloc_pb();
1408 if (!ctx->PB) {
Brian Paul2d8db392000-06-27 22:10:00 +00001409 ALIGN_FREE( ctx->VB );
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001410 FREE( ctx );
Brian Paul4d053dd2000-01-14 04:45:47 +00001411 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001412 }
1413
1414 if (share_list) {
1415 /* share the group of display lists of another context */
1416 ctx->Shared = share_list->Shared;
1417 }
1418 else {
1419 /* allocate new group of display lists */
1420 ctx->Shared = alloc_shared_state();
1421 if (!ctx->Shared) {
Brian Paul2d8db392000-06-27 22:10:00 +00001422 ALIGN_FREE( ctx->VB );
1423 FREE( ctx->PB );
1424 FREE( ctx );
Brian Paul4d053dd2000-01-14 04:45:47 +00001425 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001426 }
1427 }
Brian Paul9560f052000-01-31 23:11:39 +00001428 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001429 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001430 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001431
Brian Paul4d053dd2000-01-14 04:45:47 +00001432 init_attrib_groups( ctx );
1433
jtgafb833d1999-08-19 00:55:39 +00001434 gl_reset_vb( ctx->VB );
1435 gl_reset_input( ctx );
1436
jtgafb833d1999-08-19 00:55:39 +00001437 if (visual->DBflag) {
1438 ctx->Color.DrawBuffer = GL_BACK;
1439 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1440 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1441 ctx->Pixel.ReadBuffer = GL_BACK;
1442 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1443 }
1444 else {
1445 ctx->Color.DrawBuffer = GL_FRONT;
1446 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1447 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1448 ctx->Pixel.ReadBuffer = GL_FRONT;
1449 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1450 }
1451
jtgafb833d1999-08-19 00:55:39 +00001452 if (!alloc_proxy_textures(ctx)) {
1453 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001454 ALIGN_FREE( ctx->VB );
1455 FREE( ctx->PB );
1456 FREE( ctx );
Brian Paul4d053dd2000-01-14 04:45:47 +00001457 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001458 }
jtgafb833d1999-08-19 00:55:39 +00001459
Brian Paulf59afc92000-05-23 23:23:00 +00001460 /* register the most recent extension functions with libGL */
1461 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1462 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1463 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1464 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1465 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1466 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1467 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1468 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1469
Brian Paul5fb84d22000-05-24 15:04:45 +00001470 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1471 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1472 * Mesa we do this to accomodate different versions of libGL and various
1473 * DRI drivers.
1474 */
1475 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1476 sizeof(struct _glapi_table) / sizeof(void *));
1477
Brian Paulfbd8f211999-11-11 01:22:25 +00001478 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001479 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1480 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001481 if (!ctx->Exec || !ctx->Save) {
1482 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001483 ALIGN_FREE( ctx->VB );
1484 FREE( ctx->PB );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001485 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001486 FREE( ctx->Exec );
1487 FREE( ctx );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001488 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001489 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1490 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001491 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001492
Brian Paul4d053dd2000-01-14 04:45:47 +00001493 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001494}
1495
jtgafb833d1999-08-19 00:55:39 +00001496
1497
1498/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001499 * Allocate and initialize a GLcontext structure.
1500 * Input: visual - a GLvisual pointer
1501 * sharelist - another context to share display lists with or NULL
1502 * driver_ctx - pointer to device driver's context state struct
1503 * Return: pointer to a new gl_context struct or NULL if error.
1504 */
Brian Paul178a1c52000-04-22 01:05:00 +00001505GLcontext *
1506gl_create_context( GLvisual *visual,
1507 GLcontext *share_list,
1508 void *driver_ctx,
1509 GLboolean direct )
Brian Paul4d053dd2000-01-14 04:45:47 +00001510{
1511 GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
1512 if (!ctx) {
1513 return NULL;
1514 }
1515
Brian Paul178a1c52000-04-22 01:05:00 +00001516 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001517 return ctx;
1518 }
1519 else {
1520 FREE(ctx);
1521 return NULL;
1522 }
1523}
1524
1525
1526
1527/*
1528 * Free the data associated with the given context.
1529 * But don't free() the GLcontext struct itself!
1530 */
Brian Paul178a1c52000-04-22 01:05:00 +00001531void
1532gl_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001533{
Brian Paul4d053dd2000-01-14 04:45:47 +00001534 struct gl_shine_tab *s, *tmps;
Brian Paul7fc29c52000-03-06 17:03:03 +00001535 GLuint i, j;
Brian Paul4d053dd2000-01-14 04:45:47 +00001536
1537 /* if we're destroying the current context, unbind it first */
1538 if (ctx == gl_get_current_context()) {
1539 gl_make_current(NULL, NULL);
1540 }
1541
Brian Paul4d053dd2000-01-14 04:45:47 +00001542 gl_matrix_dtr( &ctx->ModelView );
Brian Paul7fc29c52000-03-06 17:03:03 +00001543 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001544 gl_matrix_dtr( &ctx->ModelViewStack[i] );
1545 }
1546 gl_matrix_dtr( &ctx->ProjectionMatrix );
Brian Paul7fc29c52000-03-06 17:03:03 +00001547 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001548 gl_matrix_dtr( &ctx->ProjectionStack[i] );
1549 }
Brian Paul7fc29c52000-03-06 17:03:03 +00001550 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1551 gl_matrix_dtr( &ctx->TextureMatrix[i] );
1552 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
1553 gl_matrix_dtr( &ctx->TextureStack[i][j] );
1554 }
1555 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001556
1557 FREE( ctx->PB );
1558
Brian Paul4bdcfe52000-04-17 17:57:04 +00001559 if (ctx->input != ctx->VB->IM)
Brian Paul4d053dd2000-01-14 04:45:47 +00001560 gl_immediate_free( ctx->input );
1561
1562 gl_vb_free( ctx->VB );
1563
Brian Paul9560f052000-01-31 23:11:39 +00001564 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001565 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001566 assert(ctx->Shared->RefCount >= 0);
1567 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1568 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001569 /* free shared state */
1570 free_shared_state( ctx, ctx->Shared );
1571 }
1572
1573 foreach_s( s, tmps, ctx->ShineTabList ) {
1574 FREE( s );
1575 }
1576 FREE( ctx->ShineTabList );
1577
1578 /* Free proxy texture objects */
1579 gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
1580 gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
1581 gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
1582
1583 /* Free evaluator data */
1584 if (ctx->EvalMap.Map1Vertex3.Points)
1585 FREE( ctx->EvalMap.Map1Vertex3.Points );
1586 if (ctx->EvalMap.Map1Vertex4.Points)
1587 FREE( ctx->EvalMap.Map1Vertex4.Points );
1588 if (ctx->EvalMap.Map1Index.Points)
1589 FREE( ctx->EvalMap.Map1Index.Points );
1590 if (ctx->EvalMap.Map1Color4.Points)
1591 FREE( ctx->EvalMap.Map1Color4.Points );
1592 if (ctx->EvalMap.Map1Normal.Points)
1593 FREE( ctx->EvalMap.Map1Normal.Points );
1594 if (ctx->EvalMap.Map1Texture1.Points)
1595 FREE( ctx->EvalMap.Map1Texture1.Points );
1596 if (ctx->EvalMap.Map1Texture2.Points)
1597 FREE( ctx->EvalMap.Map1Texture2.Points );
1598 if (ctx->EvalMap.Map1Texture3.Points)
1599 FREE( ctx->EvalMap.Map1Texture3.Points );
1600 if (ctx->EvalMap.Map1Texture4.Points)
1601 FREE( ctx->EvalMap.Map1Texture4.Points );
1602
1603 if (ctx->EvalMap.Map2Vertex3.Points)
1604 FREE( ctx->EvalMap.Map2Vertex3.Points );
1605 if (ctx->EvalMap.Map2Vertex4.Points)
1606 FREE( ctx->EvalMap.Map2Vertex4.Points );
1607 if (ctx->EvalMap.Map2Index.Points)
1608 FREE( ctx->EvalMap.Map2Index.Points );
1609 if (ctx->EvalMap.Map2Color4.Points)
1610 FREE( ctx->EvalMap.Map2Color4.Points );
1611 if (ctx->EvalMap.Map2Normal.Points)
1612 FREE( ctx->EvalMap.Map2Normal.Points );
1613 if (ctx->EvalMap.Map2Texture1.Points)
1614 FREE( ctx->EvalMap.Map2Texture1.Points );
1615 if (ctx->EvalMap.Map2Texture2.Points)
1616 FREE( ctx->EvalMap.Map2Texture2.Points );
1617 if (ctx->EvalMap.Map2Texture3.Points)
1618 FREE( ctx->EvalMap.Map2Texture3.Points );
1619 if (ctx->EvalMap.Map2Texture4.Points)
1620 FREE( ctx->EvalMap.Map2Texture4.Points );
1621
Brian Paul4bdcfe52000-04-17 17:57:04 +00001622 _mesa_free_colortable_data( &ctx->ColorTable );
1623 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1624 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1625 _mesa_free_colortable_data( &ctx->Texture.Palette );
1626
Brian Paul4d053dd2000-01-14 04:45:47 +00001627 /* Free cache of immediate buffers. */
1628 while (ctx->nr_im_queued-- > 0) {
1629 struct immediate * next = ctx->freed_im_queue->next;
Brian Paul2d8db392000-06-27 22:10:00 +00001630 ALIGN_FREE( ctx->freed_im_queue );
Brian Paul4d053dd2000-01-14 04:45:47 +00001631 ctx->freed_im_queue = next;
1632 }
1633 gl_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001634
1635 FREE(ctx->Exec);
1636 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001637}
1638
1639
1640
1641/*
1642 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001643 */
Brian Paul178a1c52000-04-22 01:05:00 +00001644void
1645gl_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001646{
1647 if (ctx) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001648 gl_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001649 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001650 }
1651}
1652
1653
1654
1655/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001656 * Called by the driver after both the context and driver are fully
1657 * initialized. Currently just reads the config file.
jtgafb833d1999-08-19 00:55:39 +00001658 */
Brian Paul178a1c52000-04-22 01:05:00 +00001659void
1660gl_context_initialize( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001661{
Brian Paul00037781999-12-17 14:52:35 +00001662 gl_read_config_file( ctx );
jtgafb833d1999-08-19 00:55:39 +00001663}
1664
1665
1666
1667/*
1668 * Copy attribute groups from one context to another.
1669 * Input: src - source context
1670 * dst - destination context
1671 * mask - bitwise OR of GL_*_BIT flags
1672 */
Brian Paul178a1c52000-04-22 01:05:00 +00001673void
1674gl_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001675{
1676 if (mask & GL_ACCUM_BUFFER_BIT) {
1677 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1678 }
1679 if (mask & GL_COLOR_BUFFER_BIT) {
1680 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1681 }
1682 if (mask & GL_CURRENT_BIT) {
1683 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1684 }
1685 if (mask & GL_DEPTH_BUFFER_BIT) {
1686 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1687 }
1688 if (mask & GL_ENABLE_BIT) {
1689 /* no op */
1690 }
1691 if (mask & GL_EVAL_BIT) {
1692 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1693 }
1694 if (mask & GL_FOG_BIT) {
1695 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1696 }
1697 if (mask & GL_HINT_BIT) {
1698 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1699 }
1700 if (mask & GL_LIGHTING_BIT) {
1701 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001702 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001703 }
1704 if (mask & GL_LINE_BIT) {
1705 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1706 }
1707 if (mask & GL_LIST_BIT) {
1708 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1709 }
1710 if (mask & GL_PIXEL_MODE_BIT) {
1711 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1712 }
1713 if (mask & GL_POINT_BIT) {
1714 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1715 }
1716 if (mask & GL_POLYGON_BIT) {
1717 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1718 }
1719 if (mask & GL_POLYGON_STIPPLE_BIT) {
1720 /* Use loop instead of MEMCPY due to problem with Portland Group's
1721 * C compiler. Reported by John Stone.
1722 */
1723 int i;
1724 for (i=0;i<32;i++) {
1725 dst->PolygonStipple[i] = src->PolygonStipple[i];
1726 }
1727 }
1728 if (mask & GL_SCISSOR_BIT) {
1729 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
1730 }
1731 if (mask & GL_STENCIL_BUFFER_BIT) {
1732 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
1733 }
1734 if (mask & GL_TEXTURE_BIT) {
1735 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
1736 }
1737 if (mask & GL_TRANSFORM_BIT) {
1738 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
1739 }
1740 if (mask & GL_VIEWPORT_BIT) {
1741 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
1742 }
1743}
1744
1745
jtgafb833d1999-08-19 00:55:39 +00001746/*
Brian Paul00037781999-12-17 14:52:35 +00001747 * Set the current context, binding the given frame buffer to the context.
1748 */
1749void gl_make_current( GLcontext *newCtx, GLframebuffer *buffer )
1750{
1751 gl_make_current2( newCtx, buffer, buffer );
1752}
1753
1754
1755/*
1756 * Bind the given context to the given draw-buffer and read-buffer
1757 * and make it the current context for this thread.
1758 */
1759void gl_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
1760 GLframebuffer *readBuffer )
1761{
1762#if 0
Brian Paulf9b97d92000-01-28 20:17:42 +00001763 GLcontext *oldCtx = gl_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001764
1765 /* Flush the old context
1766 */
1767 if (oldCtx) {
1768 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(oldCtx, "gl_make_current");
1769
1770 /* unbind frame buffers from context */
1771 if (oldCtx->DrawBuffer) {
1772 oldCtx->DrawBuffer = NULL;
1773 }
1774 if (oldCtx->ReadBuffer) {
1775 oldCtx->ReadBuffer = NULL;
1776 }
1777 }
1778#endif
1779
1780 /* We call this function periodically (just here for now) in
1781 * order to detect when multithreading has begun.
1782 */
1783 _glapi_check_multithread();
1784
Brian Paulf9b97d92000-01-28 20:17:42 +00001785 _glapi_set_context((void *) newCtx);
Brian Paul00037781999-12-17 14:52:35 +00001786 ASSERT(gl_get_current_context() == newCtx);
1787 if (newCtx) {
1788 SET_IMMEDIATE(newCtx, newCtx->input);
1789 _glapi_set_dispatch(newCtx->CurrentDispatch);
1790 }
1791 else {
1792 _glapi_set_dispatch(NULL); /* none current */
1793 }
1794
1795 if (MESA_VERBOSE) fprintf(stderr, "gl_make_current()\n");
1796
1797 if (newCtx && drawBuffer && readBuffer) {
1798 /* TODO: check if newCtx and buffer's visual match??? */
1799 newCtx->DrawBuffer = drawBuffer;
1800 newCtx->ReadBuffer = readBuffer;
1801 newCtx->NewState = NEW_ALL; /* just to be safe */
1802 gl_update_state( newCtx );
1803 }
1804
1805 /* We can use this to help debug user's problems. Tell the to set
1806 * the MESA_INFO env variable before running their app. Then the
1807 * first time each context is made current we'll print some useful
1808 * information.
1809 */
1810 if (newCtx && newCtx->FirstTimeCurrent) {
1811 if (getenv("MESA_INFO")) {
1812 fprintf(stderr, "Mesa GL_VERSION = %s\n", (char *) _mesa_GetString(GL_VERSION));
1813 fprintf(stderr, "Mesa GL_RENDERER = %s\n", (char *) _mesa_GetString(GL_RENDERER));
1814 fprintf(stderr, "Mesa GL_VENDOR = %s\n", (char *) _mesa_GetString(GL_VENDOR));
1815 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n", (char *) _mesa_GetString(GL_EXTENSIONS));
Brian Paul09cb1481999-12-17 17:00:32 +00001816#if defined(THREADS)
1817 fprintf(stderr, "Mesa thread-safe: YES\n");
1818#else
1819 fprintf(stderr, "Mesa thread-safe: NO\n");
1820#endif
Brian Paul54287052000-01-17 20:00:15 +00001821#if defined(USE_X86_ASM)
1822 fprintf(stderr, "Mesa x86-optimized: YES\n");
1823#else
1824 fprintf(stderr, "Mesa x86-optimized: NO\n");
1825#endif
Brian Paul00037781999-12-17 14:52:35 +00001826 }
1827 newCtx->FirstTimeCurrent = GL_FALSE;
1828 }
1829}
1830
1831
1832
1833/*
1834 * Return current context handle for the calling thread.
1835 * This isn't the fastest way to get the current context.
1836 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
1837 */
1838GLcontext *gl_get_current_context( void )
1839{
Brian Paulf9b97d92000-01-28 20:17:42 +00001840 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001841}
1842
1843
1844
1845/*
Brian Paulfbd8f211999-11-11 01:22:25 +00001846 * This should be called by device drivers just before they do a
1847 * swapbuffers. Any pending rendering commands will be executed.
jtgafb833d1999-08-19 00:55:39 +00001848 */
Brian Paulfbd8f211999-11-11 01:22:25 +00001849void
1850_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00001851{
Brian Paulfbd8f211999-11-11 01:22:25 +00001852 FLUSH_VB( ctx, "swap buffers" );
jtgafb833d1999-08-19 00:55:39 +00001853}
1854
1855
Brian Paul00037781999-12-17 14:52:35 +00001856
Brian Paulfbd8f211999-11-11 01:22:25 +00001857/*
1858 * Return pointer to this context's current API dispatch table.
1859 * It'll either be the immediate-mode execute dispatcher or the
1860 * display list compile dispatcher.
1861 */
1862struct _glapi_table *
1863_mesa_get_dispatch(GLcontext *ctx)
1864{
1865 return ctx->CurrentDispatch;
1866}
1867
1868
1869
jtgafb833d1999-08-19 00:55:39 +00001870/**********************************************************************/
1871/***** Miscellaneous functions *****/
1872/**********************************************************************/
1873
1874
1875/*
1876 * This function is called when the Mesa user has stumbled into a code
1877 * path which may not be implemented fully or correctly.
1878 */
1879void gl_problem( const GLcontext *ctx, const char *s )
1880{
1881 fprintf( stderr, "Mesa implementation error: %s\n", s );
Brian Paul413d6a22000-05-26 14:44:59 +00001882 fprintf( stderr, "Report to Mesa bug database at www.mesa3d.org\n" );
jtgafb833d1999-08-19 00:55:39 +00001883 (void) ctx;
1884}
1885
1886
1887
1888/*
1889 * This is called to inform the user that he or she has tried to do
1890 * something illogical or if there's likely a bug in their program
1891 * (like enabled depth testing without a depth buffer).
1892 */
1893void gl_warning( const GLcontext *ctx, const char *s )
1894{
1895 GLboolean debug;
1896#ifdef DEBUG
1897 debug = GL_TRUE;
1898#else
1899 if (getenv("MESA_DEBUG")) {
1900 debug = GL_TRUE;
1901 }
1902 else {
1903 debug = GL_FALSE;
1904 }
1905#endif
1906 if (debug) {
1907 fprintf( stderr, "Mesa warning: %s\n", s );
1908 }
1909 (void) ctx;
1910}
1911
1912
1913
Brian Paulfa9df402000-02-02 19:16:46 +00001914/*
1915 * Compile an error into current display list.
1916 */
jtgafb833d1999-08-19 00:55:39 +00001917void gl_compile_error( GLcontext *ctx, GLenum error, const char *s )
1918{
1919 if (ctx->CompileFlag)
1920 gl_save_error( ctx, error, s );
1921
1922 if (ctx->ExecuteFlag)
1923 gl_error( ctx, error, s );
1924}
1925
1926
Brian Paulfa9df402000-02-02 19:16:46 +00001927
jtgafb833d1999-08-19 00:55:39 +00001928/*
1929 * This is Mesa's error handler. Normally, all that's done is the updating
1930 * of the current error value. If Mesa is compiled with -DDEBUG or if the
1931 * environment variable "MESA_DEBUG" is defined then a real error message
1932 * is printed to stderr.
Brian Paul7eb06032000-07-14 04:13:40 +00001933 * Input: ctx - the GL context
1934 * error - the error value
1935 * where - usually the name of function where error was detected
jtgafb833d1999-08-19 00:55:39 +00001936 */
Brian Paul7eb06032000-07-14 04:13:40 +00001937void
1938gl_error( GLcontext *ctx, GLenum error, const char *where )
jtgafb833d1999-08-19 00:55:39 +00001939{
Brian Paul7eb06032000-07-14 04:13:40 +00001940 const char *debugEnv = getenv("MESA_DEBUG");
jtgafb833d1999-08-19 00:55:39 +00001941 GLboolean debug;
1942
1943#ifdef DEBUG
Brian Paul7eb06032000-07-14 04:13:40 +00001944 if (debugEnv && strstr(debugEnv, "silent"))
jtgafb833d1999-08-19 00:55:39 +00001945 debug = GL_FALSE;
Brian Paul7eb06032000-07-14 04:13:40 +00001946 else
1947 debug = GL_TRUE;
1948#else
1949 if (debugEnv)
1950 debug = GL_TRUE;
1951 else
1952 debug = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001953#endif
1954
1955 if (debug) {
Brian Paul7eb06032000-07-14 04:13:40 +00001956 const char *errstr;
jtgafb833d1999-08-19 00:55:39 +00001957 switch (error) {
1958 case GL_NO_ERROR:
Brian Paul7eb06032000-07-14 04:13:40 +00001959 errstr = "GL_NO_ERROR";
jtgafb833d1999-08-19 00:55:39 +00001960 break;
1961 case GL_INVALID_VALUE:
Brian Paul7eb06032000-07-14 04:13:40 +00001962 errstr = "GL_INVALID_VALUE";
jtgafb833d1999-08-19 00:55:39 +00001963 break;
1964 case GL_INVALID_ENUM:
Brian Paul7eb06032000-07-14 04:13:40 +00001965 errstr = "GL_INVALID_ENUM";
jtgafb833d1999-08-19 00:55:39 +00001966 break;
1967 case GL_INVALID_OPERATION:
Brian Paul7eb06032000-07-14 04:13:40 +00001968 errstr = "GL_INVALID_OPERATION";
jtgafb833d1999-08-19 00:55:39 +00001969 break;
1970 case GL_STACK_OVERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00001971 errstr = "GL_STACK_OVERFLOW";
jtgafb833d1999-08-19 00:55:39 +00001972 break;
1973 case GL_STACK_UNDERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00001974 errstr = "GL_STACK_UNDERFLOW";
jtgafb833d1999-08-19 00:55:39 +00001975 break;
1976 case GL_OUT_OF_MEMORY:
Brian Paul7eb06032000-07-14 04:13:40 +00001977 errstr = "GL_OUT_OF_MEMORY";
jtgafb833d1999-08-19 00:55:39 +00001978 break;
Brian Paul86586aa2000-06-29 18:55:52 +00001979 case GL_TABLE_TOO_LARGE:
Brian Paul7eb06032000-07-14 04:13:40 +00001980 errstr = "GL_TABLE_TOO_LARGE";
Brian Paul86586aa2000-06-29 18:55:52 +00001981 break;
jtgafb833d1999-08-19 00:55:39 +00001982 default:
Brian Paul7eb06032000-07-14 04:13:40 +00001983 errstr = "unknown";
jtgafb833d1999-08-19 00:55:39 +00001984 break;
1985 }
Brian Paul7eb06032000-07-14 04:13:40 +00001986 fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where);
jtgafb833d1999-08-19 00:55:39 +00001987 }
1988
Brian Paul7eb06032000-07-14 04:13:40 +00001989 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00001990 ctx->ErrorValue = error;
1991 }
1992
1993 /* Call device driver's error handler, if any. This is used on the Mac. */
1994 if (ctx->Driver.Error) {
1995 (*ctx->Driver.Error)( ctx );
1996 }
1997}
1998
1999
2000
Brian Paulfa9df402000-02-02 19:16:46 +00002001void
2002_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002003{
Brian Paulfa9df402000-02-02 19:16:46 +00002004 GET_CURRENT_CONTEXT(ctx);
2005 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
2006 if (ctx->Driver.Finish) {
2007 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002008 }
2009}
2010
2011
2012
Brian Paulfa9df402000-02-02 19:16:46 +00002013void
2014_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002015{
Brian Paulfa9df402000-02-02 19:16:46 +00002016 GET_CURRENT_CONTEXT(ctx);
2017 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
2018 if (ctx->Driver.Flush) {
2019 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002020 }
jtgafb833d1999-08-19 00:55:39 +00002021}