blob: d17897a7dff533c9fcfbb5174e8925a2e3ad6ef7 [file] [log] [blame]
Brian Paula25f7e12000-06-27 04:29:22 +00001/* $Id: context.c,v 1.71 2000/06/27 04:29:22 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;
597 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
598 texUnit->TexGenEnabled = 0;
599 texUnit->GenModeS = GL_EYE_LINEAR;
600 texUnit->GenModeT = GL_EYE_LINEAR;
601 texUnit->GenModeR = GL_EYE_LINEAR;
602 texUnit->GenModeQ = GL_EYE_LINEAR;
603 /* Yes, these plane coefficients are correct! */
604 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
605 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
606 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
607 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
608 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
609 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
610 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
611 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
612
Brian Paul6e6d4c61999-10-09 20:17:07 +0000613 texUnit->CurrentD[1] = ctx->Shared->DefaultD[1];
614 texUnit->CurrentD[2] = ctx->Shared->DefaultD[2];
615 texUnit->CurrentD[3] = ctx->Shared->DefaultD[3];
Brian Paul413d6a22000-05-26 14:44:59 +0000616 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
jtgafb833d1999-08-19 00:55:39 +0000617}
618
619
Brian Paul178a1c52000-04-22 01:05:00 +0000620static void
621init_fallback_arrays( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000622{
623 struct gl_client_array *cl;
624 GLuint i;
625
626 cl = &ctx->Fallback.Normal;
627 cl->Size = 3;
628 cl->Type = GL_FLOAT;
629 cl->Stride = 0;
630 cl->StrideB = 0;
631 cl->Ptr = (void *) ctx->Current.Normal;
632 cl->Enabled = 1;
633
634 cl = &ctx->Fallback.Color;
635 cl->Size = 4;
636 cl->Type = GL_UNSIGNED_BYTE;
637 cl->Stride = 0;
638 cl->StrideB = 0;
639 cl->Ptr = (void *) ctx->Current.ByteColor;
640 cl->Enabled = 1;
641
642 cl = &ctx->Fallback.Index;
643 cl->Size = 1;
644 cl->Type = GL_UNSIGNED_INT;
645 cl->Stride = 0;
646 cl->StrideB = 0;
647 cl->Ptr = (void *) &ctx->Current.Index;
648 cl->Enabled = 1;
649
650 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
651 cl = &ctx->Fallback.TexCoord[i];
652 cl->Size = 4;
653 cl->Type = GL_FLOAT;
654 cl->Stride = 0;
655 cl->StrideB = 0;
656 cl->Ptr = (void *) ctx->Current.Texcoord[i];
657 cl->Enabled = 1;
658 }
659
660 cl = &ctx->Fallback.EdgeFlag;
661 cl->Size = 1;
662 cl->Type = GL_UNSIGNED_BYTE;
663 cl->Stride = 0;
664 cl->StrideB = 0;
665 cl->Ptr = (void *) &ctx->Current.EdgeFlag;
666 cl->Enabled = 1;
667}
668
Brian Paul4d053dd2000-01-14 04:45:47 +0000669
jtgafb833d1999-08-19 00:55:39 +0000670/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000671static void
672init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000673{
674 map->Order = 1;
675 map->u1 = 0.0;
676 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000677 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000678 if (map->Points) {
679 GLint i;
680 for (i=0;i<n;i++)
681 map->Points[i] = initial[i];
682 }
jtgafb833d1999-08-19 00:55:39 +0000683}
684
685
686/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000687static void
688init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000689{
690 map->Uorder = 1;
691 map->Vorder = 1;
692 map->u1 = 0.0;
693 map->u2 = 1.0;
694 map->v1 = 0.0;
695 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000696 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000697 if (map->Points) {
698 GLint i;
699 for (i=0;i<n;i++)
700 map->Points[i] = initial[i];
701 }
jtgafb833d1999-08-19 00:55:39 +0000702}
703
704
jtgafb833d1999-08-19 00:55:39 +0000705/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000706 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000707 */
Brian Paul178a1c52000-04-22 01:05:00 +0000708static void
709init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000710{
711 GLuint i, j;
712
Brian Paul4d053dd2000-01-14 04:45:47 +0000713 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000714
Brian Paul539cce52000-02-03 19:40:07 +0000715 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000716 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
717 ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
Brian Paul86fc3702000-05-22 16:33:20 +0000718 ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize;
Brian Paul4d053dd2000-01-14 04:45:47 +0000719 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
720 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000721 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
722 ctx->Const.MinPointSize = MIN_POINT_SIZE;
723 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
724 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
725 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
726 ctx->Const.PointSizeGranularity = POINT_SIZE_GRANULARITY;
727 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
728 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
729 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
730 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
731 ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
732 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000733 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000734 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
735 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000736 ctx->Const.NumCompressedTextureFormats = 0;
jtgafb833d1999-08-19 00:55:39 +0000737
Brian Paul4d053dd2000-01-14 04:45:47 +0000738 /* Modelview matrix */
739 gl_matrix_ctr( &ctx->ModelView );
740 gl_matrix_alloc_inv( &ctx->ModelView );
741
742 ctx->ModelViewStackDepth = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000743 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000744 gl_matrix_ctr( &ctx->ModelViewStack[i] );
745 gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
746 }
747
748 /* Projection matrix - need inv for user clipping in clip space*/
749 gl_matrix_ctr( &ctx->ProjectionMatrix );
750 gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
751
752 gl_matrix_ctr( &ctx->ModelProjectMatrix );
753 gl_matrix_ctr( &ctx->ModelProjectWinMatrix );
754 ctx->ModelProjectWinMatrixUptodate = GL_FALSE;
755
756 ctx->ProjectionStackDepth = 0;
757 ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
758 ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
759
Brian Paul7fc29c52000-03-06 17:03:03 +0000760 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000761 gl_matrix_ctr( &ctx->ProjectionStack[i] );
762 gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
763 }
764
765 /* Texture matrix */
766 for (i=0; i<MAX_TEXTURE_UNITS; i++) {
767 gl_matrix_ctr( &ctx->TextureMatrix[i] );
768 ctx->TextureStackDepth[i] = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000769 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000770 ctx->TextureStack[i][j].inv = 0;
jtgafb833d1999-08-19 00:55:39 +0000771 }
Brian Paul4d053dd2000-01-14 04:45:47 +0000772 }
jtgafb833d1999-08-19 00:55:39 +0000773
Brian Paul250069d2000-04-08 18:57:45 +0000774 /* Color matrix */
775 gl_matrix_ctr(&ctx->ColorMatrix);
776 ctx->ColorStackDepth = 0;
777 for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
778 gl_matrix_ctr(&ctx->ColorStack[j]);
779 }
780
Brian Paul4d053dd2000-01-14 04:45:47 +0000781 /* Accumulate buffer group */
782 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000783
Brian Paul4d053dd2000-01-14 04:45:47 +0000784 /* Color buffer group */
785 ctx->Color.IndexMask = 0xffffffff;
786 ctx->Color.ColorMask[0] = 0xff;
787 ctx->Color.ColorMask[1] = 0xff;
788 ctx->Color.ColorMask[2] = 0xff;
789 ctx->Color.ColorMask[3] = 0xff;
790 ctx->Color.SWmasking = GL_FALSE;
791 ctx->Color.ClearIndex = 0;
792 ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
793 ctx->Color.DrawBuffer = GL_FRONT;
794 ctx->Color.AlphaEnabled = GL_FALSE;
795 ctx->Color.AlphaFunc = GL_ALWAYS;
796 ctx->Color.AlphaRef = 0;
797 ctx->Color.BlendEnabled = GL_FALSE;
798 ctx->Color.BlendSrcRGB = GL_ONE;
799 ctx->Color.BlendDstRGB = GL_ZERO;
800 ctx->Color.BlendSrcA = GL_ONE;
801 ctx->Color.BlendDstA = GL_ZERO;
802 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
803 ctx->Color.BlendFunc = NULL; /* this pointer set only when needed */
804 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
805 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
806 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
807 ctx->Color.SWLogicOpEnabled = GL_FALSE;
808 ctx->Color.LogicOp = GL_COPY;
809 ctx->Color.DitherFlag = GL_TRUE;
810 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000811
Brian Paul4d053dd2000-01-14 04:45:47 +0000812 /* Current group */
813 ASSIGN_4V( ctx->Current.ByteColor, 255, 255, 255, 255);
814 ctx->Current.Index = 1;
815 for (i=0; i<MAX_TEXTURE_UNITS; i++)
816 ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
817 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
818 ctx->Current.RasterDistance = 0.0;
819 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
820 ctx->Current.RasterIndex = 1;
821 for (i=0; i<MAX_TEXTURE_UNITS; i++)
822 ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
823 ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
824 ctx->Current.RasterPosValid = GL_TRUE;
825 ctx->Current.EdgeFlag = GL_TRUE;
826 ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
827 ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
jtgafb833d1999-08-19 00:55:39 +0000828
Brian Paul4d053dd2000-01-14 04:45:47 +0000829 ctx->Current.Flag = (VERT_NORM|VERT_INDEX|VERT_RGBA|VERT_EDGE|
830 VERT_TEX0_1|VERT_TEX1_1|VERT_MATERIAL);
jtgafb833d1999-08-19 00:55:39 +0000831
Brian Paul4d053dd2000-01-14 04:45:47 +0000832 init_fallback_arrays( ctx );
jtgafb833d1999-08-19 00:55:39 +0000833
Brian Paul4d053dd2000-01-14 04:45:47 +0000834 /* Depth buffer group */
835 ctx->Depth.Test = GL_FALSE;
836 ctx->Depth.Clear = 1.0;
837 ctx->Depth.Func = GL_LESS;
838 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000839 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000840
Brian Paul4d053dd2000-01-14 04:45:47 +0000841 /* Evaluators group */
842 ctx->Eval.Map1Color4 = GL_FALSE;
843 ctx->Eval.Map1Index = GL_FALSE;
844 ctx->Eval.Map1Normal = GL_FALSE;
845 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
846 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
847 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
848 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
849 ctx->Eval.Map1Vertex3 = GL_FALSE;
850 ctx->Eval.Map1Vertex4 = GL_FALSE;
851 ctx->Eval.Map2Color4 = GL_FALSE;
852 ctx->Eval.Map2Index = GL_FALSE;
853 ctx->Eval.Map2Normal = GL_FALSE;
854 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
855 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
856 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
857 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
858 ctx->Eval.Map2Vertex3 = GL_FALSE;
859 ctx->Eval.Map2Vertex4 = GL_FALSE;
860 ctx->Eval.AutoNormal = GL_FALSE;
861 ctx->Eval.MapGrid1un = 1;
862 ctx->Eval.MapGrid1u1 = 0.0;
863 ctx->Eval.MapGrid1u2 = 1.0;
864 ctx->Eval.MapGrid2un = 1;
865 ctx->Eval.MapGrid2vn = 1;
866 ctx->Eval.MapGrid2u1 = 0.0;
867 ctx->Eval.MapGrid2u2 = 1.0;
868 ctx->Eval.MapGrid2v1 = 0.0;
869 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000870
Brian Paul4d053dd2000-01-14 04:45:47 +0000871 /* Evaluator data */
872 {
873 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
874 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
875 static GLfloat index[1] = { 1.0 };
876 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
877 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +0000878
Brian Paul4d053dd2000-01-14 04:45:47 +0000879 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
880 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
881 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
882 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
883 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
884 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
885 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
886 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
887 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
jtgafb833d1999-08-19 00:55:39 +0000888
Brian Paul4d053dd2000-01-14 04:45:47 +0000889 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
890 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
891 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
892 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
893 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
894 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
895 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
896 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
897 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
898 }
jtgafb833d1999-08-19 00:55:39 +0000899
Brian Paul4d053dd2000-01-14 04:45:47 +0000900 /* Fog group */
901 ctx->Fog.Enabled = GL_FALSE;
902 ctx->Fog.Mode = GL_EXP;
903 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
904 ctx->Fog.Index = 0.0;
905 ctx->Fog.Density = 1.0;
906 ctx->Fog.Start = 0.0;
907 ctx->Fog.End = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000908
Brian Paul4d053dd2000-01-14 04:45:47 +0000909 /* Hint group */
910 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
911 ctx->Hint.PointSmooth = GL_DONT_CARE;
912 ctx->Hint.LineSmooth = GL_DONT_CARE;
913 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
914 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000915 ctx->Hint.AllowDrawWin = GL_TRUE;
Brian Paul8cce3142000-04-10 15:52:25 +0000916 ctx->Hint.AllowDrawFrg = GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000917 ctx->Hint.AllowDrawMem = GL_TRUE;
918 ctx->Hint.StrictLighting = GL_TRUE;
Brian Paul1207bf02000-05-23 20:10:49 +0000919 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
920 ctx->Hint.TextureCompression = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +0000921
Brian Paul0771d152000-04-07 00:19:41 +0000922 /* Histogram group */
923 ctx->Histogram.Width = 0;
924 ctx->Histogram.Format = GL_RGBA;
925 ctx->Histogram.Sink = GL_FALSE;
926 ctx->Histogram.RedSize = 0xffffffff;
927 ctx->Histogram.GreenSize = 0xffffffff;
928 ctx->Histogram.BlueSize = 0xffffffff;
929 ctx->Histogram.AlphaSize = 0xffffffff;
930 ctx->Histogram.LuminanceSize = 0xffffffff;
931 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
932 ctx->Histogram.Count[i][0] = 0;
933 ctx->Histogram.Count[i][1] = 0;
934 ctx->Histogram.Count[i][2] = 0;
935 ctx->Histogram.Count[i][3] = 0;
936 }
937
938 /* Min/Max group */
939 ctx->MinMax.Format = GL_RGBA;
940 ctx->MinMax.Sink = GL_FALSE;
941 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
942 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
943 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
944 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
945
946
947
Brian Paul4d053dd2000-01-14 04:45:47 +0000948 /* Pipeline */
949 gl_pipeline_init( ctx );
950 gl_cva_init( ctx );
jtgafb833d1999-08-19 00:55:39 +0000951
Brian Paul4d053dd2000-01-14 04:45:47 +0000952 /* Extensions */
953 gl_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +0000954
Brian Paul4d053dd2000-01-14 04:45:47 +0000955 ctx->AllowVertexCull = CLIP_CULLED_BIT;
jtgafb833d1999-08-19 00:55:39 +0000956
Brian Paul4d053dd2000-01-14 04:45:47 +0000957 /* Lighting group */
958 for (i=0;i<MAX_LIGHTS;i++) {
959 init_light( &ctx->Light.Light[i], i );
960 }
961 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +0000962
Brian Paul4d053dd2000-01-14 04:45:47 +0000963 init_lightmodel( &ctx->Light.Model );
964 init_material( &ctx->Light.Material[0] );
965 init_material( &ctx->Light.Material[1] );
966 ctx->Light.ShadeModel = GL_SMOOTH;
967 ctx->Light.Enabled = GL_FALSE;
968 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
969 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
970 ctx->Light.ColorMaterialBitmask
971 = gl_material_bitmask( ctx,
972 GL_FRONT_AND_BACK,
973 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +0000974
Brian Paul4d053dd2000-01-14 04:45:47 +0000975 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000976
Brian Paul4d053dd2000-01-14 04:45:47 +0000977 /* Lighting miscellaneous */
978 ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
979 make_empty_list( ctx->ShineTabList );
980 for (i = 0 ; i < 10 ; i++) {
981 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
982 s->shininess = -1;
983 s->refcount = 0;
984 insert_at_tail( ctx->ShineTabList, s );
985 }
986 for (i = 0 ; i < 4 ; i++) {
987 ctx->ShineTable[i] = ctx->ShineTabList->prev;
988 ctx->ShineTable[i]->refcount++;
989 }
jtgafb833d1999-08-19 00:55:39 +0000990
jtgafb833d1999-08-19 00:55:39 +0000991
Brian Paul4d053dd2000-01-14 04:45:47 +0000992 /* Line group */
993 ctx->Line.SmoothFlag = GL_FALSE;
994 ctx->Line.StippleFlag = GL_FALSE;
995 ctx->Line.Width = 1.0;
996 ctx->Line.StipplePattern = 0xffff;
997 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +0000998
Brian Paul4d053dd2000-01-14 04:45:47 +0000999 /* Display List group */
1000 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001001
Brian Paul4d053dd2000-01-14 04:45:47 +00001002 /* Pixel group */
1003 ctx->Pixel.RedBias = 0.0;
1004 ctx->Pixel.RedScale = 1.0;
1005 ctx->Pixel.GreenBias = 0.0;
1006 ctx->Pixel.GreenScale = 1.0;
1007 ctx->Pixel.BlueBias = 0.0;
1008 ctx->Pixel.BlueScale = 1.0;
1009 ctx->Pixel.AlphaBias = 0.0;
1010 ctx->Pixel.AlphaScale = 1.0;
1011 ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
1012 ctx->Pixel.DepthBias = 0.0;
1013 ctx->Pixel.DepthScale = 1.0;
1014 ctx->Pixel.IndexOffset = 0;
1015 ctx->Pixel.IndexShift = 0;
1016 ctx->Pixel.ZoomX = 1.0;
1017 ctx->Pixel.ZoomY = 1.0;
1018 ctx->Pixel.MapColorFlag = GL_FALSE;
1019 ctx->Pixel.MapStencilFlag = GL_FALSE;
1020 ctx->Pixel.MapStoSsize = 1;
1021 ctx->Pixel.MapItoIsize = 1;
1022 ctx->Pixel.MapItoRsize = 1;
1023 ctx->Pixel.MapItoGsize = 1;
1024 ctx->Pixel.MapItoBsize = 1;
1025 ctx->Pixel.MapItoAsize = 1;
1026 ctx->Pixel.MapRtoRsize = 1;
1027 ctx->Pixel.MapGtoGsize = 1;
1028 ctx->Pixel.MapBtoBsize = 1;
1029 ctx->Pixel.MapAtoAsize = 1;
1030 ctx->Pixel.MapStoS[0] = 0;
1031 ctx->Pixel.MapItoI[0] = 0;
1032 ctx->Pixel.MapItoR[0] = 0.0;
1033 ctx->Pixel.MapItoG[0] = 0.0;
1034 ctx->Pixel.MapItoB[0] = 0.0;
1035 ctx->Pixel.MapItoA[0] = 0.0;
1036 ctx->Pixel.MapItoR8[0] = 0;
1037 ctx->Pixel.MapItoG8[0] = 0;
1038 ctx->Pixel.MapItoB8[0] = 0;
1039 ctx->Pixel.MapItoA8[0] = 0;
1040 ctx->Pixel.MapRtoR[0] = 0.0;
1041 ctx->Pixel.MapGtoG[0] = 0.0;
1042 ctx->Pixel.MapBtoB[0] = 0.0;
1043 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001044 ctx->Pixel.HistogramEnabled = GL_FALSE;
1045 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1046 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1047 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1048 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001049 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1050 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1051 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1052 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001053 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1054 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1055 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001056 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1057 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1058 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1059 for (i = 0; i < 3; i++) {
1060 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1061 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1062 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1063 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1064 }
1065 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1066 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001067
Brian Paul4d053dd2000-01-14 04:45:47 +00001068 /* Point group */
1069 ctx->Point.SmoothFlag = GL_FALSE;
Brian Paula25f7e12000-06-27 04:29:22 +00001070 ctx->Point.UserSize = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001071 ctx->Point.Size = 1.0;
1072 ctx->Point.Params[0] = 1.0;
1073 ctx->Point.Params[1] = 0.0;
1074 ctx->Point.Params[2] = 0.0;
1075 ctx->Point.Attenuated = GL_FALSE;
1076 ctx->Point.MinSize = 0.0;
1077 ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
1078 ctx->Point.Threshold = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001079
Brian Paul4d053dd2000-01-14 04:45:47 +00001080 /* Polygon group */
1081 ctx->Polygon.CullFlag = GL_FALSE;
1082 ctx->Polygon.CullFaceMode = GL_BACK;
1083 ctx->Polygon.FrontFace = GL_CCW;
1084 ctx->Polygon.FrontBit = 0;
1085 ctx->Polygon.FrontMode = GL_FILL;
1086 ctx->Polygon.BackMode = GL_FILL;
1087 ctx->Polygon.Unfilled = GL_FALSE;
1088 ctx->Polygon.SmoothFlag = GL_FALSE;
1089 ctx->Polygon.StippleFlag = GL_FALSE;
1090 ctx->Polygon.OffsetFactor = 0.0F;
1091 ctx->Polygon.OffsetUnits = 0.0F;
1092 ctx->Polygon.OffsetPoint = GL_FALSE;
1093 ctx->Polygon.OffsetLine = GL_FALSE;
1094 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001095
Brian Paul4d053dd2000-01-14 04:45:47 +00001096 /* Polygon Stipple group */
1097 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001098
Brian Paul4d053dd2000-01-14 04:45:47 +00001099 /* Scissor group */
1100 ctx->Scissor.Enabled = GL_FALSE;
1101 ctx->Scissor.X = 0;
1102 ctx->Scissor.Y = 0;
1103 ctx->Scissor.Width = 0;
1104 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001105
Brian Paul4d053dd2000-01-14 04:45:47 +00001106 /* Stencil group */
1107 ctx->Stencil.Enabled = GL_FALSE;
1108 ctx->Stencil.Function = GL_ALWAYS;
1109 ctx->Stencil.FailFunc = GL_KEEP;
1110 ctx->Stencil.ZPassFunc = GL_KEEP;
1111 ctx->Stencil.ZFailFunc = GL_KEEP;
1112 ctx->Stencil.Ref = 0;
1113 ctx->Stencil.ValueMask = STENCIL_MAX;
1114 ctx->Stencil.Clear = 0;
1115 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001116
Brian Paul4d053dd2000-01-14 04:45:47 +00001117 /* Texture group */
1118 ctx->Texture.CurrentUnit = 0; /* multitexture */
1119 ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
1120 ctx->Texture.Enabled = 0;
1121 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1122 init_texture_unit( ctx, i );
Brian Paul4bdcfe52000-04-17 17:57:04 +00001123 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001124
Brian Paul4d053dd2000-01-14 04:45:47 +00001125 /* Transformation group */
1126 ctx->Transform.MatrixMode = GL_MODELVIEW;
1127 ctx->Transform.Normalize = GL_FALSE;
1128 ctx->Transform.RescaleNormals = GL_FALSE;
1129 for (i=0;i<MAX_CLIP_PLANES;i++) {
1130 ctx->Transform.ClipEnabled[i] = GL_FALSE;
1131 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1132 }
1133 ctx->Transform.AnyClip = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001134
Brian Paul4d053dd2000-01-14 04:45:47 +00001135 /* Viewport group */
1136 ctx->Viewport.X = 0;
1137 ctx->Viewport.Y = 0;
1138 ctx->Viewport.Width = 0;
1139 ctx->Viewport.Height = 0;
1140 ctx->Viewport.Near = 0.0;
1141 ctx->Viewport.Far = 1.0;
1142 gl_matrix_ctr(&ctx->Viewport.WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001143
1144#define Sz 10
1145#define Tz 14
Brian Pauled30dfa2000-03-03 17:47:39 +00001146 ctx->Viewport.WindowMap.m[Sz] = 0.5 * ctx->Visual->DepthMaxF;
1147 ctx->Viewport.WindowMap.m[Tz] = 0.5 * ctx->Visual->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001148#undef Sz
1149#undef Tz
1150
Brian Paul4d053dd2000-01-14 04:45:47 +00001151 ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1152 ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001153
Brian Paul4d053dd2000-01-14 04:45:47 +00001154 /* Vertex arrays */
1155 ctx->Array.Vertex.Size = 4;
1156 ctx->Array.Vertex.Type = GL_FLOAT;
1157 ctx->Array.Vertex.Stride = 0;
1158 ctx->Array.Vertex.StrideB = 0;
1159 ctx->Array.Vertex.Ptr = NULL;
1160 ctx->Array.Vertex.Enabled = GL_FALSE;
1161 ctx->Array.Normal.Type = GL_FLOAT;
1162 ctx->Array.Normal.Stride = 0;
1163 ctx->Array.Normal.StrideB = 0;
1164 ctx->Array.Normal.Ptr = NULL;
1165 ctx->Array.Normal.Enabled = GL_FALSE;
1166 ctx->Array.Color.Size = 4;
1167 ctx->Array.Color.Type = GL_FLOAT;
1168 ctx->Array.Color.Stride = 0;
1169 ctx->Array.Color.StrideB = 0;
1170 ctx->Array.Color.Ptr = NULL;
1171 ctx->Array.Color.Enabled = GL_FALSE;
1172 ctx->Array.Index.Type = GL_FLOAT;
1173 ctx->Array.Index.Stride = 0;
1174 ctx->Array.Index.StrideB = 0;
1175 ctx->Array.Index.Ptr = NULL;
1176 ctx->Array.Index.Enabled = GL_FALSE;
1177 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1178 ctx->Array.TexCoord[i].Size = 4;
1179 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1180 ctx->Array.TexCoord[i].Stride = 0;
1181 ctx->Array.TexCoord[i].StrideB = 0;
1182 ctx->Array.TexCoord[i].Ptr = NULL;
1183 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
1184 }
1185 ctx->Array.TexCoordInterleaveFactor = 1;
1186 ctx->Array.EdgeFlag.Stride = 0;
1187 ctx->Array.EdgeFlag.StrideB = 0;
1188 ctx->Array.EdgeFlag.Ptr = NULL;
1189 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
1190 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1191
1192 /* Pixel transfer */
1193 ctx->Pack.Alignment = 4;
1194 ctx->Pack.RowLength = 0;
1195 ctx->Pack.ImageHeight = 0;
1196 ctx->Pack.SkipPixels = 0;
1197 ctx->Pack.SkipRows = 0;
1198 ctx->Pack.SkipImages = 0;
1199 ctx->Pack.SwapBytes = GL_FALSE;
1200 ctx->Pack.LsbFirst = GL_FALSE;
1201 ctx->Unpack.Alignment = 4;
1202 ctx->Unpack.RowLength = 0;
1203 ctx->Unpack.ImageHeight = 0;
1204 ctx->Unpack.SkipPixels = 0;
1205 ctx->Unpack.SkipRows = 0;
1206 ctx->Unpack.SkipImages = 0;
1207 ctx->Unpack.SwapBytes = GL_FALSE;
1208 ctx->Unpack.LsbFirst = GL_FALSE;
1209
1210 /* Feedback */
1211 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1212 ctx->Feedback.Buffer = NULL;
1213 ctx->Feedback.BufferSize = 0;
1214 ctx->Feedback.Count = 0;
1215
1216 /* Selection/picking */
1217 ctx->Select.Buffer = NULL;
1218 ctx->Select.BufferSize = 0;
1219 ctx->Select.BufferCount = 0;
1220 ctx->Select.Hits = 0;
1221 ctx->Select.NameStackDepth = 0;
1222
1223 /* Optimized Accum buffer */
1224 ctx->IntegerAccumMode = GL_TRUE;
1225 ctx->IntegerAccumScaler = 0.0;
1226
1227 /* Renderer and client attribute stacks */
1228 ctx->AttribStackDepth = 0;
1229 ctx->ClientAttribStackDepth = 0;
1230
Brian Paul13811372000-04-12 00:27:37 +00001231 /* Display list */
1232 ctx->CallDepth = 0;
1233 ctx->ExecuteFlag = GL_TRUE;
1234 ctx->CompileFlag = GL_FALSE;
1235 ctx->CurrentListPtr = NULL;
1236 ctx->CurrentBlock = NULL;
1237 ctx->CurrentListNum = 0;
1238 ctx->CurrentPos = 0;
1239
1240 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001241 _mesa_init_colortable(&ctx->ColorTable);
1242 _mesa_init_colortable(&ctx->ProxyColorTable);
1243 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1244 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1245 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1246 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001247
Brian Paul4d053dd2000-01-14 04:45:47 +00001248 /* Miscellaneous */
1249 ctx->NewState = NEW_ALL;
1250 ctx->RenderMode = GL_RENDER;
1251 ctx->StippleCounter = 0;
1252 ctx->NeedNormals = GL_FALSE;
1253 ctx->DoViewportMapping = GL_TRUE;
1254
1255 ctx->NeedEyeCoords = GL_FALSE;
1256 ctx->NeedEyeNormals = GL_FALSE;
1257 ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
1258
Brian Paul4d053dd2000-01-14 04:45:47 +00001259 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1260
1261 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001262 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001263 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001264
1265 /* For debug/development only */
1266 ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
1267 ctx->FirstTimeCurrent = GL_TRUE;
1268
1269 /* Dither disable */
1270 ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
1271 if (ctx->NoDither) {
1272 if (getenv("MESA_DEBUG")) {
1273 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001274 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001275 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001276 }
1277}
1278
1279
1280
1281
jtgafb833d1999-08-19 00:55:39 +00001282/*
1283 * Allocate the proxy textures. If we run out of memory part way through
1284 * the allocations clean up and return GL_FALSE.
1285 * Return: GL_TRUE=success, GL_FALSE=failure
1286 */
Brian Paul178a1c52000-04-22 01:05:00 +00001287static GLboolean
1288alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001289{
1290 GLboolean out_of_memory;
1291 GLint i;
1292
1293 ctx->Texture.Proxy1D = gl_alloc_texture_object(NULL, 0, 1);
1294 if (!ctx->Texture.Proxy1D) {
1295 return GL_FALSE;
1296 }
1297
1298 ctx->Texture.Proxy2D = gl_alloc_texture_object(NULL, 0, 2);
1299 if (!ctx->Texture.Proxy2D) {
1300 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1301 return GL_FALSE;
1302 }
1303
1304 ctx->Texture.Proxy3D = gl_alloc_texture_object(NULL, 0, 3);
1305 if (!ctx->Texture.Proxy3D) {
1306 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1307 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1308 return GL_FALSE;
1309 }
1310
1311 out_of_memory = GL_FALSE;
1312 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001313 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1314 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1315 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001316 if (!ctx->Texture.Proxy1D->Image[i]
1317 || !ctx->Texture.Proxy2D->Image[i]
1318 || !ctx->Texture.Proxy3D->Image[i]) {
1319 out_of_memory = GL_TRUE;
1320 }
1321 }
1322 if (out_of_memory) {
1323 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1324 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001325 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001326 }
1327 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001328 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001329 }
1330 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001331 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001332 }
1333 }
1334 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1335 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1336 gl_free_texture_object(NULL, ctx->Texture.Proxy3D);
1337 return GL_FALSE;
1338 }
1339 else {
1340 return GL_TRUE;
1341 }
1342}
1343
1344
1345
jtgafb833d1999-08-19 00:55:39 +00001346/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001347 * Initialize a GLcontext struct.
jtgafb833d1999-08-19 00:55:39 +00001348 */
Brian Paul178a1c52000-04-22 01:05:00 +00001349GLboolean
1350_mesa_initialize_context( GLcontext *ctx,
1351 GLvisual *visual,
1352 GLcontext *share_list,
1353 void *driver_ctx,
1354 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001355{
Brian Paul5fb84d22000-05-24 15:04:45 +00001356 GLuint dispatchSize;
1357
jtgafb833d1999-08-19 00:55:39 +00001358 (void) direct; /* not used */
1359
jtgafb833d1999-08-19 00:55:39 +00001360 /* misc one-time initializations */
1361 one_time_init();
1362
jtgafb833d1999-08-19 00:55:39 +00001363 ctx->DriverCtx = driver_ctx;
1364 ctx->Visual = visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001365 ctx->DrawBuffer = NULL;
1366 ctx->ReadBuffer = NULL;
jtgafb833d1999-08-19 00:55:39 +00001367
1368 ctx->VB = gl_vb_create_for_immediate( ctx );
1369 if (!ctx->VB) {
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001370 FREE( ctx );
Brian Paul4d053dd2000-01-14 04:45:47 +00001371 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001372 }
1373 ctx->input = ctx->VB->IM;
1374
1375 ctx->PB = gl_alloc_pb();
1376 if (!ctx->PB) {
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001377 FREE( ctx->VB );
1378 FREE( ctx );
Brian Paul4d053dd2000-01-14 04:45:47 +00001379 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001380 }
1381
1382 if (share_list) {
1383 /* share the group of display lists of another context */
1384 ctx->Shared = share_list->Shared;
1385 }
1386 else {
1387 /* allocate new group of display lists */
1388 ctx->Shared = alloc_shared_state();
1389 if (!ctx->Shared) {
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001390 FREE(ctx->VB);
1391 FREE(ctx->PB);
1392 FREE(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001393 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001394 }
1395 }
Brian Paul9560f052000-01-31 23:11:39 +00001396 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001397 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001398 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001399
Brian Paul4d053dd2000-01-14 04:45:47 +00001400 init_attrib_groups( ctx );
1401
jtgafb833d1999-08-19 00:55:39 +00001402 gl_reset_vb( ctx->VB );
1403 gl_reset_input( ctx );
1404
jtgafb833d1999-08-19 00:55:39 +00001405 if (visual->DBflag) {
1406 ctx->Color.DrawBuffer = GL_BACK;
1407 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1408 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1409 ctx->Pixel.ReadBuffer = GL_BACK;
1410 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1411 }
1412 else {
1413 ctx->Color.DrawBuffer = GL_FRONT;
1414 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1415 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1416 ctx->Pixel.ReadBuffer = GL_FRONT;
1417 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1418 }
1419
jtgafb833d1999-08-19 00:55:39 +00001420 if (!alloc_proxy_textures(ctx)) {
1421 free_shared_state(ctx, ctx->Shared);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001422 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 }
jtgafb833d1999-08-19 00:55:39 +00001427
Brian Paulf59afc92000-05-23 23:23:00 +00001428 /* register the most recent extension functions with libGL */
1429 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1430 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1431 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1432 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1433 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1434 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1435 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1436 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1437
Brian Paul5fb84d22000-05-24 15:04:45 +00001438 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1439 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1440 * Mesa we do this to accomodate different versions of libGL and various
1441 * DRI drivers.
1442 */
1443 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1444 sizeof(struct _glapi_table) / sizeof(void *));
1445
Brian Paulfbd8f211999-11-11 01:22:25 +00001446 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001447 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1448 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001449 if (!ctx->Exec || !ctx->Save) {
1450 free_shared_state(ctx, ctx->Shared);
1451 FREE(ctx->VB);
1452 FREE(ctx->PB);
1453 if (ctx->Exec)
1454 FREE(ctx->Exec);
1455 FREE(ctx);
1456 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001457 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1458 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001459 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001460
Brian Paul4d053dd2000-01-14 04:45:47 +00001461 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001462}
1463
jtgafb833d1999-08-19 00:55:39 +00001464
1465
1466/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001467 * Allocate and initialize a GLcontext structure.
1468 * Input: visual - a GLvisual pointer
1469 * sharelist - another context to share display lists with or NULL
1470 * driver_ctx - pointer to device driver's context state struct
1471 * Return: pointer to a new gl_context struct or NULL if error.
1472 */
Brian Paul178a1c52000-04-22 01:05:00 +00001473GLcontext *
1474gl_create_context( GLvisual *visual,
1475 GLcontext *share_list,
1476 void *driver_ctx,
1477 GLboolean direct )
Brian Paul4d053dd2000-01-14 04:45:47 +00001478{
1479 GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
1480 if (!ctx) {
1481 return NULL;
1482 }
1483
Brian Paul178a1c52000-04-22 01:05:00 +00001484 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001485 return ctx;
1486 }
1487 else {
1488 FREE(ctx);
1489 return NULL;
1490 }
1491}
1492
1493
1494
1495/*
1496 * Free the data associated with the given context.
1497 * But don't free() the GLcontext struct itself!
1498 */
Brian Paul178a1c52000-04-22 01:05:00 +00001499void
1500gl_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001501{
Brian Paul4d053dd2000-01-14 04:45:47 +00001502 struct gl_shine_tab *s, *tmps;
Brian Paul7fc29c52000-03-06 17:03:03 +00001503 GLuint i, j;
Brian Paul4d053dd2000-01-14 04:45:47 +00001504
1505 /* if we're destroying the current context, unbind it first */
1506 if (ctx == gl_get_current_context()) {
1507 gl_make_current(NULL, NULL);
1508 }
1509
Brian Paul4d053dd2000-01-14 04:45:47 +00001510 gl_matrix_dtr( &ctx->ModelView );
Brian Paul7fc29c52000-03-06 17:03:03 +00001511 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001512 gl_matrix_dtr( &ctx->ModelViewStack[i] );
1513 }
1514 gl_matrix_dtr( &ctx->ProjectionMatrix );
Brian Paul7fc29c52000-03-06 17:03:03 +00001515 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001516 gl_matrix_dtr( &ctx->ProjectionStack[i] );
1517 }
Brian Paul7fc29c52000-03-06 17:03:03 +00001518 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1519 gl_matrix_dtr( &ctx->TextureMatrix[i] );
1520 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
1521 gl_matrix_dtr( &ctx->TextureStack[i][j] );
1522 }
1523 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001524
1525 FREE( ctx->PB );
1526
Brian Paul4bdcfe52000-04-17 17:57:04 +00001527 if (ctx->input != ctx->VB->IM)
Brian Paul4d053dd2000-01-14 04:45:47 +00001528 gl_immediate_free( ctx->input );
1529
1530 gl_vb_free( ctx->VB );
1531
Brian Paul9560f052000-01-31 23:11:39 +00001532 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001533 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001534 assert(ctx->Shared->RefCount >= 0);
1535 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1536 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001537 /* free shared state */
1538 free_shared_state( ctx, ctx->Shared );
1539 }
1540
1541 foreach_s( s, tmps, ctx->ShineTabList ) {
1542 FREE( s );
1543 }
1544 FREE( ctx->ShineTabList );
1545
1546 /* Free proxy texture objects */
1547 gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
1548 gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
1549 gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
1550
1551 /* Free evaluator data */
1552 if (ctx->EvalMap.Map1Vertex3.Points)
1553 FREE( ctx->EvalMap.Map1Vertex3.Points );
1554 if (ctx->EvalMap.Map1Vertex4.Points)
1555 FREE( ctx->EvalMap.Map1Vertex4.Points );
1556 if (ctx->EvalMap.Map1Index.Points)
1557 FREE( ctx->EvalMap.Map1Index.Points );
1558 if (ctx->EvalMap.Map1Color4.Points)
1559 FREE( ctx->EvalMap.Map1Color4.Points );
1560 if (ctx->EvalMap.Map1Normal.Points)
1561 FREE( ctx->EvalMap.Map1Normal.Points );
1562 if (ctx->EvalMap.Map1Texture1.Points)
1563 FREE( ctx->EvalMap.Map1Texture1.Points );
1564 if (ctx->EvalMap.Map1Texture2.Points)
1565 FREE( ctx->EvalMap.Map1Texture2.Points );
1566 if (ctx->EvalMap.Map1Texture3.Points)
1567 FREE( ctx->EvalMap.Map1Texture3.Points );
1568 if (ctx->EvalMap.Map1Texture4.Points)
1569 FREE( ctx->EvalMap.Map1Texture4.Points );
1570
1571 if (ctx->EvalMap.Map2Vertex3.Points)
1572 FREE( ctx->EvalMap.Map2Vertex3.Points );
1573 if (ctx->EvalMap.Map2Vertex4.Points)
1574 FREE( ctx->EvalMap.Map2Vertex4.Points );
1575 if (ctx->EvalMap.Map2Index.Points)
1576 FREE( ctx->EvalMap.Map2Index.Points );
1577 if (ctx->EvalMap.Map2Color4.Points)
1578 FREE( ctx->EvalMap.Map2Color4.Points );
1579 if (ctx->EvalMap.Map2Normal.Points)
1580 FREE( ctx->EvalMap.Map2Normal.Points );
1581 if (ctx->EvalMap.Map2Texture1.Points)
1582 FREE( ctx->EvalMap.Map2Texture1.Points );
1583 if (ctx->EvalMap.Map2Texture2.Points)
1584 FREE( ctx->EvalMap.Map2Texture2.Points );
1585 if (ctx->EvalMap.Map2Texture3.Points)
1586 FREE( ctx->EvalMap.Map2Texture3.Points );
1587 if (ctx->EvalMap.Map2Texture4.Points)
1588 FREE( ctx->EvalMap.Map2Texture4.Points );
1589
Brian Paul4bdcfe52000-04-17 17:57:04 +00001590 _mesa_free_colortable_data( &ctx->ColorTable );
1591 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1592 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1593 _mesa_free_colortable_data( &ctx->Texture.Palette );
1594
Brian Paul4d053dd2000-01-14 04:45:47 +00001595 /* Free cache of immediate buffers. */
1596 while (ctx->nr_im_queued-- > 0) {
1597 struct immediate * next = ctx->freed_im_queue->next;
1598 FREE( ctx->freed_im_queue );
1599 ctx->freed_im_queue = next;
1600 }
1601 gl_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001602
1603 FREE(ctx->Exec);
1604 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001605}
1606
1607
1608
1609/*
1610 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001611 */
Brian Paul178a1c52000-04-22 01:05:00 +00001612void
1613gl_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001614{
1615 if (ctx) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001616 gl_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001617 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001618 }
1619}
1620
1621
1622
1623/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001624 * Called by the driver after both the context and driver are fully
1625 * initialized. Currently just reads the config file.
jtgafb833d1999-08-19 00:55:39 +00001626 */
Brian Paul178a1c52000-04-22 01:05:00 +00001627void
1628gl_context_initialize( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001629{
Brian Paul00037781999-12-17 14:52:35 +00001630 gl_read_config_file( ctx );
jtgafb833d1999-08-19 00:55:39 +00001631}
1632
1633
1634
1635/*
1636 * Copy attribute groups from one context to another.
1637 * Input: src - source context
1638 * dst - destination context
1639 * mask - bitwise OR of GL_*_BIT flags
1640 */
Brian Paul178a1c52000-04-22 01:05:00 +00001641void
1642gl_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001643{
1644 if (mask & GL_ACCUM_BUFFER_BIT) {
1645 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1646 }
1647 if (mask & GL_COLOR_BUFFER_BIT) {
1648 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1649 }
1650 if (mask & GL_CURRENT_BIT) {
1651 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1652 }
1653 if (mask & GL_DEPTH_BUFFER_BIT) {
1654 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1655 }
1656 if (mask & GL_ENABLE_BIT) {
1657 /* no op */
1658 }
1659 if (mask & GL_EVAL_BIT) {
1660 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1661 }
1662 if (mask & GL_FOG_BIT) {
1663 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1664 }
1665 if (mask & GL_HINT_BIT) {
1666 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1667 }
1668 if (mask & GL_LIGHTING_BIT) {
1669 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001670 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001671 }
1672 if (mask & GL_LINE_BIT) {
1673 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1674 }
1675 if (mask & GL_LIST_BIT) {
1676 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1677 }
1678 if (mask & GL_PIXEL_MODE_BIT) {
1679 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1680 }
1681 if (mask & GL_POINT_BIT) {
1682 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1683 }
1684 if (mask & GL_POLYGON_BIT) {
1685 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1686 }
1687 if (mask & GL_POLYGON_STIPPLE_BIT) {
1688 /* Use loop instead of MEMCPY due to problem with Portland Group's
1689 * C compiler. Reported by John Stone.
1690 */
1691 int i;
1692 for (i=0;i<32;i++) {
1693 dst->PolygonStipple[i] = src->PolygonStipple[i];
1694 }
1695 }
1696 if (mask & GL_SCISSOR_BIT) {
1697 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
1698 }
1699 if (mask & GL_STENCIL_BUFFER_BIT) {
1700 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
1701 }
1702 if (mask & GL_TEXTURE_BIT) {
1703 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
1704 }
1705 if (mask & GL_TRANSFORM_BIT) {
1706 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
1707 }
1708 if (mask & GL_VIEWPORT_BIT) {
1709 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
1710 }
1711}
1712
1713
jtgafb833d1999-08-19 00:55:39 +00001714/*
Brian Paul00037781999-12-17 14:52:35 +00001715 * Set the current context, binding the given frame buffer to the context.
1716 */
1717void gl_make_current( GLcontext *newCtx, GLframebuffer *buffer )
1718{
1719 gl_make_current2( newCtx, buffer, buffer );
1720}
1721
1722
1723/*
1724 * Bind the given context to the given draw-buffer and read-buffer
1725 * and make it the current context for this thread.
1726 */
1727void gl_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
1728 GLframebuffer *readBuffer )
1729{
1730#if 0
Brian Paulf9b97d92000-01-28 20:17:42 +00001731 GLcontext *oldCtx = gl_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001732
1733 /* Flush the old context
1734 */
1735 if (oldCtx) {
1736 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(oldCtx, "gl_make_current");
1737
1738 /* unbind frame buffers from context */
1739 if (oldCtx->DrawBuffer) {
1740 oldCtx->DrawBuffer = NULL;
1741 }
1742 if (oldCtx->ReadBuffer) {
1743 oldCtx->ReadBuffer = NULL;
1744 }
1745 }
1746#endif
1747
1748 /* We call this function periodically (just here for now) in
1749 * order to detect when multithreading has begun.
1750 */
1751 _glapi_check_multithread();
1752
Brian Paulf9b97d92000-01-28 20:17:42 +00001753 _glapi_set_context((void *) newCtx);
Brian Paul00037781999-12-17 14:52:35 +00001754 ASSERT(gl_get_current_context() == newCtx);
1755 if (newCtx) {
1756 SET_IMMEDIATE(newCtx, newCtx->input);
1757 _glapi_set_dispatch(newCtx->CurrentDispatch);
1758 }
1759 else {
1760 _glapi_set_dispatch(NULL); /* none current */
1761 }
1762
1763 if (MESA_VERBOSE) fprintf(stderr, "gl_make_current()\n");
1764
1765 if (newCtx && drawBuffer && readBuffer) {
1766 /* TODO: check if newCtx and buffer's visual match??? */
1767 newCtx->DrawBuffer = drawBuffer;
1768 newCtx->ReadBuffer = readBuffer;
1769 newCtx->NewState = NEW_ALL; /* just to be safe */
1770 gl_update_state( newCtx );
1771 }
1772
1773 /* We can use this to help debug user's problems. Tell the to set
1774 * the MESA_INFO env variable before running their app. Then the
1775 * first time each context is made current we'll print some useful
1776 * information.
1777 */
1778 if (newCtx && newCtx->FirstTimeCurrent) {
1779 if (getenv("MESA_INFO")) {
1780 fprintf(stderr, "Mesa GL_VERSION = %s\n", (char *) _mesa_GetString(GL_VERSION));
1781 fprintf(stderr, "Mesa GL_RENDERER = %s\n", (char *) _mesa_GetString(GL_RENDERER));
1782 fprintf(stderr, "Mesa GL_VENDOR = %s\n", (char *) _mesa_GetString(GL_VENDOR));
1783 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n", (char *) _mesa_GetString(GL_EXTENSIONS));
Brian Paul09cb1481999-12-17 17:00:32 +00001784#if defined(THREADS)
1785 fprintf(stderr, "Mesa thread-safe: YES\n");
1786#else
1787 fprintf(stderr, "Mesa thread-safe: NO\n");
1788#endif
Brian Paul54287052000-01-17 20:00:15 +00001789#if defined(USE_X86_ASM)
1790 fprintf(stderr, "Mesa x86-optimized: YES\n");
1791#else
1792 fprintf(stderr, "Mesa x86-optimized: NO\n");
1793#endif
Brian Paul00037781999-12-17 14:52:35 +00001794 }
1795 newCtx->FirstTimeCurrent = GL_FALSE;
1796 }
1797}
1798
1799
1800
1801/*
1802 * Return current context handle for the calling thread.
1803 * This isn't the fastest way to get the current context.
1804 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
1805 */
1806GLcontext *gl_get_current_context( void )
1807{
Brian Paulf9b97d92000-01-28 20:17:42 +00001808 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001809}
1810
1811
1812
1813/*
Brian Paulfbd8f211999-11-11 01:22:25 +00001814 * This should be called by device drivers just before they do a
1815 * swapbuffers. Any pending rendering commands will be executed.
jtgafb833d1999-08-19 00:55:39 +00001816 */
Brian Paulfbd8f211999-11-11 01:22:25 +00001817void
1818_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00001819{
Brian Paulfbd8f211999-11-11 01:22:25 +00001820 FLUSH_VB( ctx, "swap buffers" );
jtgafb833d1999-08-19 00:55:39 +00001821}
1822
1823
Brian Paul00037781999-12-17 14:52:35 +00001824
Brian Paulfbd8f211999-11-11 01:22:25 +00001825/*
1826 * Return pointer to this context's current API dispatch table.
1827 * It'll either be the immediate-mode execute dispatcher or the
1828 * display list compile dispatcher.
1829 */
1830struct _glapi_table *
1831_mesa_get_dispatch(GLcontext *ctx)
1832{
1833 return ctx->CurrentDispatch;
1834}
1835
1836
1837
jtgafb833d1999-08-19 00:55:39 +00001838/**********************************************************************/
1839/***** Miscellaneous functions *****/
1840/**********************************************************************/
1841
1842
1843/*
1844 * This function is called when the Mesa user has stumbled into a code
1845 * path which may not be implemented fully or correctly.
1846 */
1847void gl_problem( const GLcontext *ctx, const char *s )
1848{
1849 fprintf( stderr, "Mesa implementation error: %s\n", s );
Brian Paul413d6a22000-05-26 14:44:59 +00001850 fprintf( stderr, "Report to Mesa bug database at www.mesa3d.org\n" );
jtgafb833d1999-08-19 00:55:39 +00001851 (void) ctx;
1852}
1853
1854
1855
1856/*
1857 * This is called to inform the user that he or she has tried to do
1858 * something illogical or if there's likely a bug in their program
1859 * (like enabled depth testing without a depth buffer).
1860 */
1861void gl_warning( const GLcontext *ctx, const char *s )
1862{
1863 GLboolean debug;
1864#ifdef DEBUG
1865 debug = GL_TRUE;
1866#else
1867 if (getenv("MESA_DEBUG")) {
1868 debug = GL_TRUE;
1869 }
1870 else {
1871 debug = GL_FALSE;
1872 }
1873#endif
1874 if (debug) {
1875 fprintf( stderr, "Mesa warning: %s\n", s );
1876 }
1877 (void) ctx;
1878}
1879
1880
1881
Brian Paulfa9df402000-02-02 19:16:46 +00001882/*
1883 * Compile an error into current display list.
1884 */
jtgafb833d1999-08-19 00:55:39 +00001885void gl_compile_error( GLcontext *ctx, GLenum error, const char *s )
1886{
1887 if (ctx->CompileFlag)
1888 gl_save_error( ctx, error, s );
1889
1890 if (ctx->ExecuteFlag)
1891 gl_error( ctx, error, s );
1892}
1893
1894
Brian Paulfa9df402000-02-02 19:16:46 +00001895
jtgafb833d1999-08-19 00:55:39 +00001896/*
1897 * This is Mesa's error handler. Normally, all that's done is the updating
1898 * of the current error value. If Mesa is compiled with -DDEBUG or if the
1899 * environment variable "MESA_DEBUG" is defined then a real error message
1900 * is printed to stderr.
1901 * Input: error - the error value
1902 * s - a diagnostic string
1903 */
1904void gl_error( GLcontext *ctx, GLenum error, const char *s )
1905{
1906 GLboolean debug;
1907
1908#ifdef DEBUG
1909 debug = GL_TRUE;
1910#else
1911 if (getenv("MESA_DEBUG")) {
1912 debug = GL_TRUE;
1913 }
1914 else {
1915 debug = GL_FALSE;
1916 }
1917#endif
1918
1919 if (debug) {
1920 char errstr[1000];
1921
1922 switch (error) {
1923 case GL_NO_ERROR:
1924 strcpy( errstr, "GL_NO_ERROR" );
1925 break;
1926 case GL_INVALID_VALUE:
1927 strcpy( errstr, "GL_INVALID_VALUE" );
1928 break;
1929 case GL_INVALID_ENUM:
1930 strcpy( errstr, "GL_INVALID_ENUM" );
1931 break;
1932 case GL_INVALID_OPERATION:
1933 strcpy( errstr, "GL_INVALID_OPERATION" );
1934 break;
1935 case GL_STACK_OVERFLOW:
1936 strcpy( errstr, "GL_STACK_OVERFLOW" );
1937 break;
1938 case GL_STACK_UNDERFLOW:
1939 strcpy( errstr, "GL_STACK_UNDERFLOW" );
1940 break;
1941 case GL_OUT_OF_MEMORY:
1942 strcpy( errstr, "GL_OUT_OF_MEMORY" );
1943 break;
1944 default:
1945 strcpy( errstr, "unknown" );
1946 break;
1947 }
1948 fprintf( stderr, "Mesa user error: %s in %s\n", errstr, s );
1949 }
1950
1951 if (ctx->ErrorValue==GL_NO_ERROR) {
1952 ctx->ErrorValue = error;
1953 }
1954
1955 /* Call device driver's error handler, if any. This is used on the Mac. */
1956 if (ctx->Driver.Error) {
1957 (*ctx->Driver.Error)( ctx );
1958 }
1959}
1960
1961
1962
Brian Paulfa9df402000-02-02 19:16:46 +00001963void
1964_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00001965{
Brian Paulfa9df402000-02-02 19:16:46 +00001966 GET_CURRENT_CONTEXT(ctx);
1967 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
1968 if (ctx->Driver.Finish) {
1969 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00001970 }
1971}
1972
1973
1974
Brian Paulfa9df402000-02-02 19:16:46 +00001975void
1976_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00001977{
Brian Paulfa9df402000-02-02 19:16:46 +00001978 GET_CURRENT_CONTEXT(ctx);
1979 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
1980 if (ctx->Driver.Flush) {
1981 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00001982 }
jtgafb833d1999-08-19 00:55:39 +00001983}